Hallo,
ich schalte Abend zu Sonnenuntergang eine Lampe mit DOIF an und um 23:00h (in der Woche) bzw. um 23:59 (am Wochenende) wieder aus. Zusätzlich schalte ich in der Woche morgens die Lampe um 6:00 bis zum Sonnenaufgang an.
Internals:
DEF ([{sunset("REAL",0,"16:00","21:30")} - 23:00|01234]) (set EG_WoZi_Stehlampen on)
DOELSEIF ([{sunset("REAL",0,"16:00","21:30")} - 23:59|56]) (set EG_WoZi_Stehlampen on)
DOELSEIF ([06:00 - ({sunrise("REAL",0,"06:10","9:00")})|8]) (set EG_WoZi_Stehlampen on)
DOELSE (set EG_WoZi_Stehlampen off)
NAME Automatiklicht_EG_WoZi
NR 1616
NTFY_ORDER 50-Automatiklicht_EG_WoZi
STATE cmd_4
TYPE DOIF
CHANGETIME:
Readings:
2016-01-08 16:35:29 cmd_event timer_1
2016-01-08 16:35:29 cmd_nr 4
2016-01-08 16:35:29 state cmd_4
2016-01-08 16:35:29 timer_1_c1 09.01.2016 16:36:51|01234
2016-01-07 23:38:17 timer_2_c1 08.01.2016 23:00:00|01234
2016-01-08 16:35:29 timer_3_c2 09.01.2016 16:36:51|56
2016-01-07 23:59:02 timer_4_c2 08.01.2016 23:59:00|56
2016-01-08 06:00:00 timer_5_c3 09.01.2016 06:00:00|8
2016-01-08 08:41:19 timer_6_c3 09.01.2016 08:40:47|8
Condition:
0 DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"01234")
1 DOIF_time($hash,$hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"56")
2 DOIF_time($hash,$hash->{realtime}{4},$hash->{realtime}{5},$wday,$hms,"8")
Days:
0 01234
1 01234
2 56
3 56
4 8
5 8
Devices:
Do:
0:
0 set EG_WoZi_Stehlampen on
1:
0 set EG_WoZi_Stehlampen on
2:
0 set EG_WoZi_Stehlampen on
3:
0 set EG_WoZi_Stehlampen off
Helper:
globalinit 1
last_timer 6
sleeptimer -1
Internals:
Itimer:
Readings:
Realtime:
0 16:36:51
1 23:00:00
2 16:36:51
3 23:59:00
4 06:00:00
5 08:40:47
State:
Time:
0 {sunset("REAL",0,"16:00","21:30")}
1 23:00:00
2 {sunset("REAL",0,"16:00","21:30")}
3 23:59:00
4 06:00:00
5 ({sunrise("REAL",0,"06:10","9:00")})
Timecond:
0 0
1 0
2 1
3 1
4 2
5 2
Timer:
0 0
1 0
2 0
3 0
4 0
5 0
Timerfunc:
Timers:
0 0 1
1 2 3
2 4 5
Attributes:
group Licht
room EG_WoZi
Während die morgendliche Schaltung problemlos funktioniert, klappt es abends nicht. Zum Einschaltzeitpunkt wird die Lampe eingeschaltet und in der gleichen Sekunde wieder ausgeschaltet.
2016.01.08 16:35:29 3: EG_WoZi_Stehlampen white slot 4 set on 0
2016.01.08 16:35:29 3: EG_WoZi_Stehlampen set HSV 0, 0, 100 with ramp: 0, flags:
2016.01.08 16:35:29 3: EG_WoZi_Stehlampen white slot 4 set off 0
2016.01.08 16:35:29 3: EG_WoZi_Stehlampen RGBW2 slot 4 dim 0 0
2016.01.08 16:35:29 3: EG_WoZi_Stehlampen set HSV 0, 0, 0 with ramp: 0, flags:
Scheinbar wird das erste command ausgeführt und in der gleichen Sekunde auch cmd_4. Auch wenn ich weiss, dass DOIF nur ein command ausführt, kann ich mir das Verhalten nicht anders erklären.
Vielleicht hat ja jemand von Euch eine Idee!? Danke!
Gruß,
Carsten
Zitat von: MrRight am 08 Januar 2016, 18:14:45
Hallo,
ich schalte Abend zu Sonnenuntergang eine Lampe mit DOIF an und um 23:00h (in der Woche) bzw. um 23:59 (am Wochenende) wieder aus. Zusätzlich schalte ich in der Woche morgens die Lampe um 6:00 bis zum Sonnenaufgang an.
Internals:
DEF ([{sunset("REAL",0,"16:00","21:30")} - 23:00|01234]) (set EG_WoZi_Stehlampen on)
DOELSEIF ([{sunset("REAL",0,"16:00","21:30")} - 23:59|56]) (set EG_WoZi_Stehlampen on)
DOELSEIF ([06:00 - ({sunrise("REAL",0,"06:10","9:00")})|8]) (set EG_WoZi_Stehlampen on)
DOELSE (set EG_WoZi_Stehlampen off)
Scheinbar wird das erste command ausgeführt und in der gleichen Sekunde auch cmd_4. Auch wenn ich weiss, dass DOIF nur ein command ausführt, kann ich mir das Verhalten nicht anders erklären.
Vielleicht hat ja jemand von Euch eine Idee!? Danke!
Gruß,
Carsten
Ja, in der aktuellen Version triggert jeder Timer das Modul unabhängig von den anderen gesetzten Timer, auch dann wenn die Timer die gleiche Zeit haben. Dabei ist die Reihenfolge der Timer mit der gleichen Zeit nicht gewährleistet. Das führt zu diesem Phänomen. Zukünftig werden Timer mit gleicher Zeit nur einmal triggern.
Du kannst das Problem aber so lösen:
([{sunset("REAL",0,"16:00","21:30")} - 23:00|01234]
or [{sunset("REAL",0,"16:00","21:30")} - 23:59|56]
or [06:00 - {sunrise("REAL",0,"06:10","9:00")}|8])
(set EG_WoZi_Stehlampen on)
DOELSE
(set EG_WoZi_Stehlampen off)
Gruß
Damian
wow! Danke für die wahnsinnig schnelle Antwort!
Gruß,
Carsten
Hallo Damian,
da habe ich mich wohl zu früh gefreut. :-[
Heute habe ich mit Deiner vorgeschlagenen Lösung wieder das gleiche Problem:
2016.01.09 16:36:51 3: EG_WoZi_Stehlampen white slot 4 set on 0
2016.01.09 16:36:51 3: EG_WoZi_Stehlampen set HSV 0, 0, 100 with ramp: 0, flags:
2016.01.09 16:36:51 3: EG_WoZi_Stehlampen white slot 4 set off 0
2016.01.09 16:36:51 3: EG_WoZi_Stehlampen RGBW2 slot 4 dim 0 0
Hast Du noch eine andere Idee?
Gruß,
Carsten
Zitat von: MrRight am 09 Januar 2016, 18:14:29
Hallo Damian,
da habe ich mich wohl zu früh gefreut. :-[
Heute habe ich mit Deiner vorgeschlagenen Lösung wieder das gleiche Problem:
2016.01.09 16:36:51 3: EG_WoZi_Stehlampen white slot 4 set on 0
2016.01.09 16:36:51 3: EG_WoZi_Stehlampen set HSV 0, 0, 100 with ramp: 0, flags:
2016.01.09 16:36:51 3: EG_WoZi_Stehlampen white slot 4 set off 0
2016.01.09 16:36:51 3: EG_WoZi_Stehlampen RGBW2 slot 4 dim 0 0
Hast Du noch eine andere Idee?
Gruß,
Carsten
Poste mal list von deinem Modul.
sehr gerne:
Internals:
CFGFN
DEF ([{sunset("REAL",0,"16:00","21:30")} - 23:00|01234]
or [{sunset("REAL",0,"16:00","21:30")} - 23:59|56]
or [06:00 - {sunrise("REAL",0,"06:10","9:00")}|8])
(set EG_WoZi_Stehlampen on)
DOELSE
(set EG_WoZi_Stehlampen off)
NAME EG_Wohnen_Stehlampenautomatik_DOIF
NR 11559
NTFY_ORDER 50-EG_Wohnen_Stehlampenautomatik_DOIF
STATE cmd_1
TYPE DOIF
CHANGETIME:
Readings:
2016-01-09 23:00:00 cmd_event timer_2
2016-01-09 23:00:00 cmd_nr 1
2016-01-09 23:00:00 state cmd_1
2016-01-09 16:36:51 timer_1_c1 10.01.2016 16:38:15|01234
2016-01-09 23:00:00 timer_2_c1 10.01.2016 23:00:00|01234
2016-01-09 16:36:51 timer_3_c1 10.01.2016 16:38:15|56
2016-01-08 23:59:02 timer_4_c1 09.01.2016 23:59:00|56
2016-01-09 06:00:00 timer_5_c1 10.01.2016 06:00:00|8
2016-01-09 08:40:47 timer_6_c1 10.01.2016 08:40:13|8
Condition:
0 DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"01234") or DOIF_time($hash,$hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"56") or DOIF_time($hash,$hash->{realtime}{4},$hash->{realtime}{5},$wday,$hms,"8")
Days:
0 01234
1 01234
2 56
3 56
4 8
5 8
Devices:
Do:
0:
0 set EG_WoZi_Stehlampen on
1:
0 set EG_WoZi_Stehlampen off
Helper:
globalinit 1
last_timer 6
sleeptimer -1
Internals:
Itimer:
Readings:
Realtime:
0 16:38:15
1 23:00:00
2 16:38:15
3 23:59:00
4 06:00:00
5 08:40:13
State:
Time:
0 {sunset("REAL",0,"16:00","21:30")}
1 23:00:00
2 {sunset("REAL",0,"16:00","21:30")}
3 23:59:00
4 06:00:00
5 {sunrise("REAL",0,"06:10","9:00")}
Timecond:
0 0
1 0
2 0
3 0
4 0
5 0
Timer:
0 0
1 0
2 0
3 0
4 0
5 0
Timerfunc:
Timers:
0 0 1 2 3 4 5
Attributes:
cmdpause 300
group Licht
room EG_WoZi
DOIF Version
98_DOIF.pm 10337 2016-01-02 22:38:32Z damian-s
Gruß,
Carsten
Zitat von: MrRight am 09 Januar 2016, 23:57:20
sehr gerne:
Internals:
CFGFN
DEF ([{sunset("REAL",0,"16:00","21:30")} - 23:00|01234]
or [{sunset("REAL",0,"16:00","21:30")} - 23:59|56]
or [06:00 - {sunrise("REAL",0,"06:10","9:00")}|8])
(set EG_WoZi_Stehlampen on)
DOELSE
(set EG_WoZi_Stehlampen off)
NAME EG_Wohnen_Stehlampenautomatik_DOIF
NR 11559
NTFY_ORDER 50-EG_Wohnen_Stehlampenautomatik_DOIF
STATE cmd_1
TYPE DOIF
CHANGETIME:
Readings:
2016-01-09 23:00:00 cmd_event timer_2
2016-01-09 23:00:00 cmd_nr 1
2016-01-09 23:00:00 state cmd_1
2016-01-09 16:36:51 timer_1_c1 10.01.2016 16:38:15|01234
2016-01-09 23:00:00 timer_2_c1 10.01.2016 23:00:00|01234
2016-01-09 16:36:51 timer_3_c1 10.01.2016 16:38:15|56
2016-01-08 23:59:02 timer_4_c1 09.01.2016 23:59:00|56
2016-01-09 06:00:00 timer_5_c1 10.01.2016 06:00:00|8
2016-01-09 08:40:47 timer_6_c1 10.01.2016 08:40:13|8
Condition:
0 DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"01234") or DOIF_time($hash,$hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"56") or DOIF_time($hash,$hash->{realtime}{4},$hash->{realtime}{5},$wday,$hms,"8")
Days:
0 01234
1 01234
2 56
3 56
4 8
5 8
Devices:
Do:
0:
0 set EG_WoZi_Stehlampen on
1:
0 set EG_WoZi_Stehlampen off
Helper:
globalinit 1
last_timer 6
sleeptimer -1
Internals:
Itimer:
Readings:
Realtime:
0 16:38:15
1 23:00:00
2 16:38:15
3 23:59:00
4 06:00:00
5 08:40:13
State:
Time:
0 {sunset("REAL",0,"16:00","21:30")}
1 23:00:00
2 {sunset("REAL",0,"16:00","21:30")}
3 23:59:00
4 06:00:00
5 {sunrise("REAL",0,"06:10","9:00")}
Timecond:
0 0
1 0
2 0
3 0
4 0
5 0
Timer:
0 0
1 0
2 0
3 0
4 0
5 0
Timerfunc:
Timers:
0 0 1 2 3 4 5
Attributes:
cmdpause 300
group Licht
room EG_WoZi
DOIF Version
98_DOIF.pm 10337 2016-01-02 22:38:32Z damian-s
Gruß,
Carsten
Anhand der Definition kann ich keinen Fehler erkennen. Leider ist der Zustand des Moduls kurz nach dem Sonnenuntergang um 16:36:51 nicht sichtbar, da bereits der Timer um 23:00 gelaufen ist. Schaue bitte heute kurz nach 16:38:15 nach, ob sich das Modul im Zustand cmd_2 befindet. Wir wollen nicht hoffen, dass da noch ein anderes Modul definiert ist, welches um diese Zeit schaltet.
Gruß
Damian
Ich hänge mich hier mal mit dran, hatte gestern das selbe Phänomen und suche nach einer Lösung.... Könnte cmdpause als Workaround helfen?
Zitat von: JoeALLb am 10 Januar 2016, 08:45:43
Ich hänge mich hier mal mit dran, hatte gestern das selbe Phänomen und suche nach einer Lösung.... Könnte cmdpause als Workaround helfen?
Ich habe es gerade bei mir nachgebaut mit:
([({sunset("REAL",0,"16:00","21:30")}-[06:42]) - 23:00|01234] or [({sunset("REAL",0,"16:00","21:30")}-[06:42]) - 23:59|56] ) (set bla on) DOELSE (set bla off)
mit [06:42] habe ich die Sonnenuntergangszeit zum Testen auf jetzt verschoben. Bei mir wird sauber nur der cmd_1-Fall ausgeführt.
Gruß
Damian
@Damian Hatte gerade im Test einen Ausdruckfehler im Doif, darum hat mein aktueller Test nicht funktioniert.
perl error in condition: ReadingValDoIf...
Dazu eine Anregung: Wäre es nicht hilfreich, wenn der state des doifs von "initialized" auf "error" geht, wenn solch ein Auswertefehler kommt?
sG
Joe
Zitat von: JoeALLb am 10 Januar 2016, 10:31:10
@Damian Hatte gerade im Test einen Ausdruckfehler im Doif, darum hat mein aktueller Test nicht funktioniert.
perl error in condition: ReadingValDoIf...
Dazu eine Anregung: Wäre es nicht hilfreich, wenn der state des doifs von "initialized" auf "error" geht, wenn solch ein Auswertefehler kommt?
sG
Joe
Na ja, ich hoffe du machst die Änderungen direkt über die Weboberfläche (DEF-Editor), dann wird doch die Meldung unmittelbar ausgegeben.
Zitat von: Damian am 10 Januar 2016, 10:40:13
Na ja, ich hoffe du machst die Änderungen direkt über die Weboberfläche (DEF-Editor), dann wird doch die Meldung unmittelbar ausgegeben.
Natürlich!
Ich werte im DOELSEIF eine Perlfunktion aus, die einzeln funktioniert. ich hatte noch keine Zeit, es mir genauer anzusehen, mir ist nur aufgefallen, dass
in der Detailansicht des DOIFS der Perl-Fehler angezeigt wird. Ich (für mich) hätte früher entdeckt, dass dieses DOIF gar nicht mehr funktioniert,
wenn dieser Fehler im State gestanden hätte... daher mein Feature-Wunsch hier ;-)
Zitat von: JoeALLb am 10 Januar 2016, 13:51:34
Natürlich!
Ich werte im DOELSEIF eine Perlfunktion aus, die einzeln funktioniert. ich hatte noch keine Zeit, es mir genauer anzusehen, mir ist nur aufgefallen, dass
in der Detailansicht des DOIFS der Perl-Fehler angezeigt wird. Ich (für mich) hätte früher entdeckt, dass dieses DOIF gar nicht mehr funktioniert,
wenn dieser Fehler im State gestanden hätte... daher mein Feature-Wunsch hier ;-)
Ein solches Feature hätte aber auch einen Nebeneffekt. Es gäbe einen weiteren Zustand mit dem die heutigen DOIF-User nicht rechnen. Und wenn sie den Zustand des Moduls woanders abfragen, dann müssten sie neuerdings mit einem weiteren Zustand rechnen und ihre Definitionen anpassen.
Gruß
Damian
Der Zustand kommt ja nur, wenn ein Fehler vorliegt. Und zwar genau dann, wenn doif nicht mehr funktioniert, da ex eben einen Fehler gefunden hat und stoppt, also eh nicht mehr funktioniert.
Wie auch immer, dass waren nur meine 2 cent zu dem Thema, ich bin wieder am testen ;-)
Hallo Damian,
jetzt hat es zwei Tage geklappt. Ich beobachte es weiter.
Nochmals vielen Dank für Deine Hilfe ... und auch für das geniale Modul!
Gruß,
Carsten
Zitat von: JoeALLb am 11 Januar 2016, 21:51:31
Der Zustand kommt ja nur, wenn ein Fehler vorliegt. Und zwar genau dann, wenn doif nicht mehr funktioniert, da ex eben einen Fehler gefunden hat und stoppt, also eh nicht mehr funktioniert.
Wie auch immer, dass waren nur meine 2 cent zu dem Thema, ich bin wieder am testen ;-)
error wird aber auch schon mal gesetzt, obwohl das Kommando funktioniert hat, nämlich dann, wenn eine Funktion einen Wert ungleich "" liefert.
Du kannst aber mit Attribut state dir den error selbst in den Status holen. Am besten in Kombination mit dem neuen Attribut notexist in dieser Version http://forum.fhem.de/index.php/topic,46327.msg381054.html#msg381054.
Hallo Damian,
nachdem es zwei Tage funktioniert hat, waren heute die Lampen wieder aus....
Das DOIF schaltet mit cmd_2 die Lampen aus, obwohl m. E. die erste Bedingung erfüllt ist. Ich kann mir das Verhalten nicht erklären.
Hier ein aktuelles list auf das DOIF:
Internals:
CFGFN
DEF ([{sunset("REAL",0,"16:00","21:30")} - 23:00|01234]
or [{sunset("REAL",0,"16:00","21:30")} - 23:59|56]
or [06:00 - {sunrise("REAL",0,"06:10","9:00")}|8])
(set EG_WoZi_Stehlampen on)
DOELSE
(set EG_WoZi_Stehlampen off)
NAME EG_Wohnen_Stehlampenautomatik_DOIF
NR 11559
NTFY_ORDER 50-EG_Wohnen_Stehlampenautomatik_DOIF
STATE cmd_2
TYPE DOIF
CHANGETIME:
Readings:
2016-01-12 16:41:10 cmd_event timer_3
2016-01-12 16:41:10 cmd_nr 2
2016-01-12 16:41:10 state cmd_2
2016-01-12 16:41:10 timer_1_c1 13.01.2016 16:42:40|01234
2016-01-11 23:00:00 timer_2_c1 12.01.2016 23:00:00|01234
2016-01-12 16:41:10 timer_3_c1 13.01.2016 16:42:40|56
2016-01-11 23:59:00 timer_4_c1 12.01.2016 23:59:00|56
2016-01-12 06:00:03 timer_5_c1 13.01.2016 06:00:00|8
2016-01-12 08:38:54 timer_6_c1 13.01.2016 08:38:10|8
Condition:
0 DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"01234") or DOIF_time($hash,$hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"56") or DOIF_time($hash,$hash->{realtime}{4},$hash->{realtime}{5},$wday,$hms,"8")
Days:
0 01234
1 01234
2 56
3 56
4 8
5 8
Devices:
Do:
0:
0 set EG_WoZi_Stehlampen on
1:
0 set EG_WoZi_Stehlampen off
Helper:
globalinit 1
last_timer 6
sleeptimer -1
Internals:
Itimer:
Readings:
Realtime:
0 16:42:40
1 23:00:00
2 16:42:40
3 23:59:00
4 06:00:00
5 08:38:10
State:
Time:
0 {sunset("REAL",0,"16:00","21:30")}
1 23:00:00
2 {sunset("REAL",0,"16:00","21:30")}
3 23:59:00
4 06:00:00
5 {sunrise("REAL",0,"06:10","9:00")}
Timecond:
0 0
1 0
2 0
3 0
4 0
5 0
Timer:
0 0
1 0
2 0
3 0
4 0
5 0
Timerfunc:
Timers:
0 0 1 2 3 4 5
Attributes:
group Licht
room EG_WoZi
und der passende Logeintrag:
2016.01.12 16:41:10 3: EG_WoZi_Stehlampen white slot 4 set on 0
2016.01.12 16:41:10 3: EG_WoZi_Stehlampen set HSV 0, 0, 100 with ramp: 0, flags:
2016.01.12 16:41:10 3: EG_WoZi_Stehlampen white slot 4 set off 0
2016.01.12 16:41:10 3: EG_WoZi_Stehlampen RGBW2 slot 4 dim 0 0
2016.01.12 16:41:10 3: EG_WoZi_Stehlampen set HSV 0, 0, 0 with ramp: 0, flags:
Es wird offensichtlich 2 mal in der gleichen Sekunde geschaltet. Ein anderes DOIF oder notify gibt es nicht.
Gruß,
Carsten
Zitat von: MrRight am 12 Januar 2016, 19:26:58
Hallo Damian,
nachdem es zwei Tage funktioniert hat, waren heute die Lampen wieder aus....
Das DOIF schaltet mit cmd_2 die Lampen aus, obwohl m. E. die erste Bedingung erfüllt ist. Ich kann mir das Verhalten nicht erklären.
Es wird offensichtlich 2 mal in der gleichen Sekunde geschaltet. Ein anderes DOIF oder notify gibt es nicht.
Gruß,
Carsten
Ich denke, ich weiß was das Problem ist:
Bei dir hat zuerst um 16:41:10 Timer timer_1_c1 zugeschlagen das führte zur Ausführung von cmd1, der Timer wird daraufhin auf 16:42:40 gesetzt. Danach in der gleichen Sekunde hat timer_1_c3 zugeschlagen jetzt ist das erste Intervall noch nicht wahr, weil es ja jetzt bei 16:42:40 anfängt und das zweite Intervall ist ja aufgrund von 56 ja sowieso heute nicht wahr, daher kommt cmd_2.
Zukünftig werde ich die Programmlogik des Moduls ändern, sodass soetwas nicht mehr passieren kann. Solange musst du dir so behelfen:
DOIF ([{sunset("REAL",0,"16:00","21:30")}|01234]
or [{sunset("REAL",0,"16:00","21:30")}|56]
or [06:00|8])
(set EG_WoZi_Stehlampen on)
DOELSEIF ([23:00|01234] or [23:59|56] or [{sunrise("REAL",0,"06:10","9:00")}|8])
(set EG_WoZi_Stehlampen off)
Gruß
Damian
Hallo Damian,
danke fürs anschauen! Kein Stress mit der Anpassung, ich kann mit dem Workaround leben.
Gruß, Carsten