Hauptmenü

Zeitschalteruhr DOIF Probleme

Begonnen von germanikus666, 08 Februar 2019, 20:33:45

Vorheriges Thema - Nächstes Thema

germanikus666

Hallo zusammen,

ich arbeite gerade an einer Zeitschaltuhr für meine Außenbeleuchtung und bin mit meinem Latein am Ende. Vielleicht könnt ihr mir helfen.

Das Szenario:
Morgens um 04:30 oder zu einer definierten Zeit geht das Licht an, sofern der TIMER als aktiv über einen Dummyschalter gesetzt wurde.
Bei Sonnenaufgang soll das Licht ausgehen, sofern der TIMER als aktiv über einen Dummyschalter gesetzt wurde.

Bei Sonnenuntergang soll das Licht angehen, sofern der TIMER als aktiv über einen Dummyschalter gesetzt wurde.
Abends um 21:00 oder zu einer definierten Zeit geht das Licht aus, sofern der TIMER als aktiv über einen Dummyschalter gesetzt wurde.

Das Ganze habe ich das noch für die Tablet UI umgesetzt.

Mein Problem ist, dass der Parameter mit der Prüfung, ob TIMER gesetzt ist, einfach ignoriert wird.


define timer1 dummy
attr timer1 devStateIcon ON:rc_GREEN:OFF OFF:rc_RED:ON
attr timer1 icon hue_filled_br30
attr timer1 setList ON OFF
attr timer1 room MQTT
attr timer1 webCmd ON:OFF
attr timer1 useSetExtensions 1

define timer2 dummy
attr timer2 devStateIcon ON:rc_GREEN:OFF OFF:rc_RED:ON
attr timer2 icon hue_filled_br30
attr timer2 setList ON OFF
attr timer2 room MQTT
attr timer2 webCmd ON:OFF
attr timer2 useSetExtensions 1

define aussenbeleuchtung5 DOIF ([{sunrise("CIVIL",0,"05:00","08:00")}] and [timer2,"ON"])\
   (set aussen33 OFF)\
DOELSEIF ([{sunset("CIVIL",0,"15:00","20:00")}] and [timer2,"ON"])\
   (set aussen33 ON)

define aussenbeleuchtung6 DOIF ([{sunrise("CIVIL",0,"05:00","08:00")}] and [timer1,"ON"])\
   (set aussen32 OFF)\
DOELSEIF ([{sunset("CIVIL",0,"15:00","20:00")}] and [timer1,"ON"])\
   (set aussen32 ON)

define zeitschaltuhr2 DOIF ([[$SELF:P_mybegin,"07:45"]] and [timer1,"ON"])\
   (set aussen32 ON)\
DOELSEIF ([[$SELF:P_myend,"21:00"]] and [timer1,"ON"])\
   (set aussen32 OFF)
attr zeitschaltuhr2 alias Schaltuhr2
attr zeitschaltuhr2 cmdState on|off
attr zeitschaltuhr2 readingList P_mybegin P_myend
attr zeitschaltuhr2 room MQTT
attr zeitschaltuhr2 setList P_mybegin:time P_myend:time
attr zeitschaltuhr2 webCmd P_mybegin:P_myend

define rg_zeitschaltuhr2 readingsGroup zeitschaltuhr2:+STATE,<P_mybegin>,P_mybegin,<P_myend>,P_myend
attr rg_zeitschaltuhr2 commands {"P_mybegin"=>"P_mybegin:","P_myend"=>"P_myend:",}
attr rg_zeitschaltuhr2 noheading 1
attr rg_zeitschaltuhr2 room MQTT
define zeitschaltuhr3 DOIF ([[$SELF:P_mybegin,"04:30"]] and [timer2,"ON"])\
   (set aussen33 ON)\
DOELSEIF ([[$SELF:P_myend,"21:00"]] and [timer2,"ON"])\
   (set aussen33 OFF)
attr zeitschaltuhr3 alias Schaltuhr3
attr zeitschaltuhr3 cmdState on|off
attr zeitschaltuhr3 readingList P_mybegin P_myend
attr zeitschaltuhr3 room MQTT
attr zeitschaltuhr3 setList P_mybegin:time P_myend:time
attr zeitschaltuhr3 webCmd P_mybegin:P_myend

define rg_zeitschaltuhr3 readingsGroup zeitschaltuhr3:+STATE,<P_mybegin>,P_mybegin,<P_myend>,P_myend
attr rg_zeitschaltuhr3 commands {"P_mybegin"=>"P_mybegin:","P_myend"=>"P_myend:",}
attr rg_zeitschaltuhr3 noheading 1
attr rg_zeitschaltuhr3 room MQTT


Damian

Diese Syntax: [timer2,"ON"] gibt´s nicht.

Du meinst: [timer2] eq "ON"
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

germanikus666

#2
Habe ich geändert. Funktioniert immer noch nicht.

Beispiel:define zeitschaltuhr2 DOIF ([[$SELF:P_mybegin,"07:45"]] and [timer1] eq "ON")\
   (set aussen32 ON)\
DOELSEIF ([[$SELF:P_myend,"21:00"]] and [timer1] eq "ON")\
   (set aussen32 OFF)



germanikus666

#3
Ok, es funktioniert. Ich musste erst den Timer in fhem nochmal auf initialize setzen. Kann ich das irgendwie umgehen, dass der State des Timer gespeichert wird?

Ellert

ZitatKann ich das irgendwie umgehen, dass der State des Timer gespeichert wird?
Ja, wenn Du Perl-DOIF verwendest kannst Du selbst festlegen was wann gespeichert wird.

germanikus666



Damian

#7
Man muss wohl dazu sagen, dass im Perl_Modus mit der Funktion set_Exec nur ein Wait-Timer-Ersatz mit Angabe von Sekunden existiert.

Was noch fehlt ist die Möglichkeit, statt Sekunden echte Zeiten anzugeben, man könnte die komplette Syntax der Timer in eckigen Klammern (inklusive Zeitberechnung) ebenfalls über set_Exec realisieren.

Dann könnte man nicht nur definieren:

set_Exec("off",30,'fhem_set("lamp off")');


sondern auch

set_Exec("off","10:00",'fhem_set("lamp off")');

oder

set_Exec("off","10:00+rand(100)",'fhem_set("lamp off")');

oder

my $time="10:00";
set_Exec("off","$time+00:05",'fhem_set("lamp off")');


set_Exec-Timer lassen sich über ihren Namen (hier: "off") vor ihrem Ablauf löschen, ebenfalls kann man abfragen wie viele Sekunden sie noch zu ihrem Ablauf haben.

Wiederholungen müssen z. Zt. selbst programmiert werden, auch dass könnte man mit einem weiteren Parameter realisieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF