Grundsätzlich arbeite ich für die Zeitschaltfunktionen mit Fry's Logikprozessor. Um es meiner Gemahlin möglich zu machen, bestimmte Zeitautomatiken selbst einzustellen, habe ich heute eine sehr einfache Lösung in der CometVisu umgesetzt.
Sie benötigt ein Wiregate-Plugin (das sämtliche Zeitschaltfunktionen bedient) und pro Zeitschaltfunktion drei GA, nämlich
- Zeitschaltfunktion ein/aus (DPT 1.001)
- Zeitschaltfunktion Stunde (DPT 7.007)
- Zeitschaltfunktion Minute (DPT 7.006)
(als spätere Erweiterung wäre denkbar, auch noch einen Wochentag einzufügen).
Die Bedienung in der CV kann frei gestaltet werden. Meine Lösung sieht wie folgt aus:

Das Plugin
und die zugehörige Conf-Datei:
Vielleicht dient dies auch einem anderen CV-Andwender.
Beste Grüsse - und herzlichen Dank an die CV-Entwickler
Diego
Sie benötigt ein Wiregate-Plugin (das sämtliche Zeitschaltfunktionen bedient) und pro Zeitschaltfunktion drei GA, nämlich
- Zeitschaltfunktion ein/aus (DPT 1.001)
- Zeitschaltfunktion Stunde (DPT 7.007)
- Zeitschaltfunktion Minute (DPT 7.006)
(als spätere Erweiterung wäre denkbar, auch noch einen Wochentag einzufügen).
Die Bedienung in der CV kann frei gestaltet werden. Meine Lösung sieht wie folgt aus:
Code:
<mapping name="ZeitAutomatik"> <entry value="0"><icon name="control_x" color="red"/></entry> <entry value="1"><icon name="control_on_off" color="green"/></entry> </mapping> <styling name="RedGreen"> <entry value="0">red</entry> <entry value="1">green</entry> </styling> <group name="Licht zeitgesteuert ausschalten"> <layout colspan="3"/> <group name=" " flavour="black" nowidget="true" > <layout rowspan="3" colspan="1"/> <switch on_value="1" off_value="0" mapping="ZeitAutomatik" styling="RedGreen"> <layout colspan="1"/> <address transform="DPT:1.001" mode="readwrite">10/0/63</address> </switch> </group> <group name="Stunde" flavour="black" nowidget="true"> <layout colspan="1"/> <infotrigger format="%02s:" uplabel="+" downlabel="-" upvalue="1" downvalue="-1" align="right" change="absolute" min="0" max="23" infoposition="middle"> <layout colspan="1"/> <address transform="DPT:7.007" mode="readwrite">10/0/61</address> </infotrigger> </group> <group name="Minute" flavour="black" nowidget="true"> <layout colspan="1"/> <infotrigger format="%02s" uplabel="+" downlabel="-" upvalue="5" downvalue="-5" align="right" change="absolute" min="0" max="55" infoposition="middle">> <layout colspan="1"/> <address transform="DPT:7.006" mode="readwrite">10/0/62</address> </infotrigger> </group> </group>
Code:
# Einfaches Plugin, um über Einstellungen in der CometVisu zeitbezogene Aktionen auszuführen # Version 1.0 05.01.2014 # Copyright: fechter65 (https://knx-user-forum.de/members/fechter65.html) #################### ###Einstellungen:### #################### my @Aktionen; my $Minute; my $Stunde; my $Status; my $GATest; my $Value; my $debug = 0; ###################### ##ENDE Einstellungen## ###################### #Ab hier nichts mehr aendern. ###################### ##Hauptverarbeitung:## ###################### &readConf(); #Konfigurationsdatei einlesen $plugin_info{$plugname . '_cycle'} = 59; if ($msg{'apci'} eq "A_GroupValue_Read") { #das Plugin wird aufgerufen, um einen ihm verwalteten Wert abzufragen $GATest = $msg{'dst'}; if($debug>=1){plugin_log($plugname," beantworte GA ".$GATest);} foreach my $element (@Aktionen) { if ($element->{GAm} eq $GATest){knx_write($GATest, $plugin_info{$plugname.'_'.$element->{Name}."_Minute"},$element->{DPT});} if ($element->{GAh} eq $GATest){knx_write($GATest, $plugin_info{$plugname.'_'.$element->{Name}."_Stunde"},$element->{DPT});} if ($element->{GAStatus} eq $GATest){knx_write($GATest, $plugin_info{$plugname.'_'.$element->{Name}."_Status"},$element->{DPT});} } } elsif ($msg{'apci'} eq "A_GroupValue_Write" ) { #das Plugin wird aufgerufen, weil ein von ihm verwalteter Wert geändert wird $GATest = $msg{'dst'}; $Value = $msg{'value'}; #geänderten Wert abspeichern, da mit er remanent wird foreach my $element (@Aktionen) { if ($element->{GAm} eq $GATest) { if (!defined $Value) { # Wert muss dekodiert werden $Value = decode_dpt7($msg{'data'}); } if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);} $plugin_info{$plugname.'_'.$element->{Name}."_Minute"} = $Value; } if ($element->{GAh} eq $GATest) { if (!defined $Value) { # Wert muss dekodiert werden $Value = decode_dpt7($msg{'data'}); } if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);} $plugin_info{$plugname.'_'.$element->{Name}."_Stunde"} = $Value; } if ($element->{GAStatus} eq $GATest) { if (!defined $Value) { # Wert muss dekodiert werden $Value = knx_read($GATest,0,$element->{DPT}); } if($debug>=1){plugin_log($plugname," GA ".$GATest." Value ".$Value);} $plugin_info{$plugname.'_'.$element->{Name}."_Status"} = $Value; } } } else {#zyklischer Aufruf my $crtHour = `date \"+%H\"`; my $crtMin = `date \"+%M\"`; if($debug>=1){plugin_log($plugname, " Testzeit: ".$crtHour." : " ."y" . $crtMin . "xxx" );} foreach my $element (@Aktionen) { #zunächst alle GA subskribieren (nicht sehr elegant, dass dies bei jedem Aufruf erfolgt) $plugin_subscribe{$element->{GAStatus}}{$plugname} = 1; $plugin_subscribe{$element->{GAh}}{$plugname} = 1; $plugin_subscribe{$element->{GAm}}{$plugname} = 1; #Prüfen, ob Zeitpunkt für Schaltbefehl gegeben ist $Status = knx_read($element->{GAStatus},0,1); if ($Status eq '') { $Status = $plugin_info{$plugname.'_'.$element->{Name}."_Status"} } if($debug>=1){plugin_log($plugname,$element->{Name}." Status ".$Status);} if (($Status > "0")) { if($debug>=1){plugin_log($plugname,$element->{Name}." Status passiert ");} $Stunde = knx_read($element->{GAh},0,7.007); if (($crtHour == $Stunde)) { $Minute = knx_read($element->{GAm},0,7.006); if (($crtMin == $Minute)) { plugin_log($plugname,$element->{Name}." ausgefuehrt um ".$Stunde .":" . $Minute ." an " . $element->{GASchalten} . " mit Wert " . $element->{SchaltBefehl}); knx_write($element->{GASchalten},$element->{SchaltBefehl},$element->{DPT}); } } } } } #++++++++++++++++++++++++ sub readConf #++++++++++++++++++++++++ { my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf'; if (! -f $confFile) { plugin_log($plugname, " no conf file [$confFile] found!"); } else { if($debug>=1){plugin_log($plugname, " reading conf file [$confFile].");} open(CONF, $confFile); my @lines = <CONF>; close($confFile); my $result = eval("@lines"); if (($result) and ($debug>=1)){plugin_log($plugname, "conf file [$confFile] returned result[$result]")}; if ($@) { if($debug>=1){plugin_log($plugname, " conf file [$confFile] returned:");} my @parts = split(/\n/, $@); if($debug>=2){plugin_log($plugname, " --> $_") foreach (@parts);} } } } #Ende readConf
Code:
#!/usr/bin/perl # # CVZeitschaltuhr - Konfiguration # @Aktionen = #Name: Frei waehlbar, dient der Übersicht und als Protokolleintrag #GASchalten: GA, die im entsprechenden Zeitpunkt ausgeführt wird #SchaltBefehl: Wert, der an die GA Schalten übermittelt wird #DPT: Datenformat des Schaltbefehls #GAStatus: GA, welche den Status enthält; zulässige Stati: 0: nicht aktiv, 1: aktiv (muss von CV befüllt werden) #GAh: GA, welche die Stunde des Schaltzeitpunkts enthält (muss von CV befüllt werden) #GAm GA, welche die Minute des Schaltzeitpunkts enthält (muss von CV befüllt werden) ( {Name=>'LichtBueroDCausschalten', GASchalten=>'1/1/130', SchaltBefehl=>'0', DPT=>'1', GAStatus=>'10/0/63', GAh=>'10/0/61' ,GAm=>'10/0/62'}, );
Beste Grüsse - und herzlichen Dank an die CV-Entwickler
Diego
Kommentar