Eigentlich habe ich gedacht, dass ich das DOIF-Modul einigermaßen verstanden habe. So habe ich mir nun einen Wecker erstellt, den man für jeden Wochentag einstellen kann. Nun löst der Wecker mehrmals aus, auch wenn der Wochentag nicht passt.
Beispiel: Montag : 7:20Uhr, Dienstag : 8:00Uhr, Mittwoch 9:00
Angenommen es ist Dienstag, dann wird der Wecker um 8:00 Uhr ausgelöst und dann aber auch nochmal um 9:00Uhr - der Zeit für Mittwoch
Es werden also immer alle Zeiten ausgelöst, die nach der Weckzeit des aktuellen Tages (entsprechend der Reihenfolge im or-Statement) auftauchen.
Das DOIF habe ich wie folgt definiert:
##1 - Schaltzeiten werden geschaltet, wenn Wecker_Aktiv == on
([?$SELF:W_Aktiv, "off"] eq "on"
and ([[$SELF:W_Montag]|1]
or [[$SELF:W_Dienstag]|2]
or [[$SELF:W_Mittwoch]|3]
or [[$SELF:W_Donnerstag]|4]
or [[$SELF:W_Freitag]|5]
or [[$SELF:W_Samstag]|6]
or [[$SELF:W_Sonntag]|0]))
(set gr_Bewohner awoken)
Ich hoffe, dass ich mein Problem halbwegs verständlich schildern konnte.
Zitat von: jual am 25 Januar 2017, 22:06:11
Eigentlich habe ich gedacht, dass ich das DOIF-Modul einigermaßen verstanden habe. So habe ich mir nun einen Wecker erstellt, den man für jeden Wochentag einstellen kann. Nun löst der Wecker mehrmals aus, auch wenn der Wochentag nicht passt.
Beispiel: Montag : 7:20Uhr, Dienstag : 8:00Uhr, Mittwoch 9:00
Angenommen es ist Dienstag, dann wird der Wecker um 8:00 Uhr ausgelöst und dann aber auch nochmal um 9:00Uhr - der Zeit für Mittwoch
Es werden also immer alle Zeiten ausgelöst, die nach der Weckzeit des aktuellen Tages (entsprechend der Reihenfolge im or-Statement) auftauchen.
Das DOIF habe ich wie folgt definiert:
##1 - Schaltzeiten werden geschaltet, wenn Wecker_Aktiv == on
([?$SELF:W_Aktiv, "off"] eq "on"
and ([[$SELF:W_Montag]|1]
or [[$SELF:W_Dienstag]|2]
or [[$SELF:W_Mittwoch]|3]
or [[$SELF:W_Donnerstag]|4]
or [[$SELF:W_Freitag]|5]
or [[$SELF:W_Samstag]|6]
or [[$SELF:W_Sonntag]|0]))
(set gr_Bewohner awoken)
Ich hoffe, dass ich mein Problem halbwegs verständlich schildern konnte.
Mit der aktuellen DOIF-Version sollte er nur an den angegebenen Wochentagen triggern.
Danke für die schnelle Antwort. Allerdings habe ich heute nochmal ein update gemacht. Ist eigentlich immer mein erstes ToDo, wenn irgendwas nicht richtig läuft ;-).
Was mich wundert ist, dass er zunächst den Tag richtig prüft und wenn das entsprechende Ereignis für den Tag eingetreten ist, prüft er anscheinend nur noch die Uhrzeiten der nächsten Tage - entsprechend der Reihenfolge in der or-Bedingung.
Zitat von: jual am 25 Januar 2017, 23:18:48
Danke für die schnelle Antwort. Allerdings habe ich heute nochmal ein update gemacht. Ist eigentlich immer mein erstes ToDo, wenn irgendwas nicht richtig läuft ;-).
Was mich wundert ist, dass er zunächst den Tag richtig prüft und wenn das entsprechende Ereignis für den Tag eingetreten ist, prüft er anscheinend nur noch die Uhrzeiten der nächsten Tage - entsprechend der Reihenfolge in der or-Bedingung.
Ich habe gestern bei mit einen Test mit allen Wochentagen gemacht und es funktioniert alles wie erwartet. Es wird immer nur am passenden Wochentag getriggert.
Die Auswertung der Bedingung läuft in Perl ab. Daher gelten die Regeln von Perl innerhalb einer Bedingung.
Ok, dann ist ja evtl. in meiner Definition irgend ein Fehler?! Vielleicht ergänzend noch die Info, dass ich "do always" gesetzt habe und "selftrigger all". Weiterhin gibt es einen weiteren DOELSEIF-Zweig der das "Reset-Reading" abfragt und dann die einzelnen Zeiten für die Wochentage mit "set d_Wecker W_<Wochentag> <default>" auf einen default-Wert setzt. Würde ein "list" des helfen? Ist aber verdammt lang:
Internals:
DEF ##1 - Schaltzeiten werden geschaltet, wenn Wecker_Aktiv == on
([?$SELF:W_Aktiv, "off"] eq "on"
and ([[$SELF:W_Montag]|1]
or [[$SELF:W_Dienstag]|2]
or [[$SELF:W_Mittwoch]|3]
or [[$SELF:W_Donnerstag]|4]
or [[$SELF:W_Freitag]|5]
or [[$SELF:W_Samstag]|6]
or [[$SELF:W_Sonntag]|0]))
(set gr_Bewohner awoken)
##2 - Resetfunktion setzt Uhrzeiten auf Defaultwerte
DOELSEIF (["$SELF:W_Reset: on"])
( set $SELF W_Montag 07:20;
set $SELF W_Dienstag 06:40;
set $SELF W_Mittwoch 07:20;
set $SELF W_Donnerstag 07:20;
set $SELF W_Freitag 06:40;
set $SELF W_Samstag 09:00;
set $SELF W_Sonntag 09:00)
NAME di_Wecker
NR 287
NTFY_ORDER 50-di_Wecker
STATE cmd_2
TYPE DOIF
Readings:
2017-01-26 08:27:49 Device di_Wecker
2017-01-01 13:00:19 W_Aktiv on
2017-01-26 08:27:49 W_Dienstag 06:40
2017-01-26 08:27:49 W_Donnerstag 07:20
2017-01-26 08:27:49 W_Freitag 06:40
2017-01-26 08:27:49 W_Mittwoch 07:20
2017-01-25 20:11:48 W_Mittwoch|3 0
2017-01-26 08:27:49 W_Montag 07:20
2017-01-25 21:53:34 W_Montag|1 0
2017-01-26 08:27:49 W_Reset on
2017-01-26 08:27:49 W_Samstag 09:00
2017-01-26 08:27:49 W_Sonntag 09:00
2017-01-26 08:27:49 cmd 2
2017-01-26 08:27:49 cmd_event di_Wecker
2017-01-26 08:27:49 cmd_nr 2
2017-01-26 08:27:49 e_di_Wecker_W_Aktiv on
2017-01-26 08:27:49 matched_event_c2_1 W_Reset: on
2017-01-26 08:27:49 state cmd_2
2017-01-26 08:27:49 timer_01_c01 27.01.2017 07:20:00|1
2017-01-26 08:27:49 timer_02_c01 27.01.2017 06:40:00|2
2017-01-26 08:27:49 timer_03_c01 27.01.2017 07:20:00|3
2017-01-26 08:27:49 timer_04_c01 27.01.2017 07:26:00|4
2017-01-26 08:27:49 timer_05_c01 27.01.2017 07:24:00|5
2017-01-26 08:27:49 timer_06_c01 26.01.2017 09:00:00|6
2017-01-26 08:27:49 timer_07_c01 26.01.2017 09:00:00|0
Condition:
0 ReadingValDoIf($hash,'di_Wecker','W_Aktiv',' "off"') eq "on" and (DOIF_time_once($hash,0,$wday,"1") or DOIF_time_once($hash,1,$wday,"2") or DOIF_time_once($hash,2,$wday,"3") or DOIF_time_once($hash,3,$wday,"4") or DOIF_time_once($hash,4,$wday,"5") or DOIF_time_once($hash,5,$wday,"6") or DOIF_time_once($hash,6,$wday,"0"))
1 EventDoIf('di_Wecker',$hash,'W_Reset: on',0)
Days:
0 1
1 2
2 3
3 4
4 5
5 6
6 0
Devices:
Do:
0:
0 set gr_Bewohner awoken
1:
0 set di_Wecker W_Montag 07:20; set di_Wecker W_Dienstag 06:40; set di_Wecker W_Mittwoch 07:20; set di_Wecker W_Donnerstag 07:20; set di_Wecker W_Freitag 06:40; set di_Wecker W_Samstag 09:00; set di_Wecker W_Sonntag 09:00
2:
Helper:
event W_Reset: on
globalinit 1
last_timer 7
sleeptimer -1
timerdev di_Wecker
timerevent W_Reset: on
triggerDev di_Wecker
timerevents:
W_Reset: on
timer_01_c01: 27.01.2017 07:20:00|1
timer_02_c01: 27.01.2017 06:40:00|2
timer_03_c01: 27.01.2017 07:20:00|3
timer_04_c01: 27.01.2017 07:26:00|4
timer_05_c01: 27.01.2017 07:24:00|5
timer_06_c01: 26.01.2017 09:00:00|6
timer_07_c01: 26.01.2017 09:00:00|0
Device: di_Wecker
e_di_Wecker_W_Aktiv: on
matched_event_c2_1: W_Reset: on
W_Montag: 07:20
W_Dienstag: 06:40
W_Mittwoch: 07:20
W_Donnerstag: 07:20
W_Freitag: 06:40
W_Samstag: 09:00
W_Sonntag: 09:00
cmd_nr: 2
cmd: 2
cmd_event: di_Wecker
cmd_2
timereventsState:
W_Reset: on
timer_01_c01: 27.01.2017 07:20:00|1
timer_02_c01: 27.01.2017 06:40:00|2
timer_03_c01: 27.01.2017 07:20:00|3
timer_04_c01: 27.01.2017 07:26:00|4
timer_05_c01: 27.01.2017 07:24:00|5
timer_06_c01: 26.01.2017 09:00:00|6
timer_07_c01: 26.01.2017 09:00:00|0
Device: di_Wecker
e_di_Wecker_W_Aktiv: on
matched_event_c2_1: W_Reset: on
W_Montag: 07:20
W_Dienstag: 06:40
W_Mittwoch: 07:20
W_Donnerstag: 07:20
W_Freitag: 06:40
W_Samstag: 09:00
W_Sonntag: 09:00
cmd_nr: 2
cmd: 2
cmd_event: di_Wecker
cmd_2
triggerEvents:
W_Reset: on
timer_01_c01: 27.01.2017 07:20:00|1
timer_02_c01: 27.01.2017 06:40:00|2
timer_03_c01: 27.01.2017 07:20:00|3
timer_04_c01: 27.01.2017 07:26:00|4
timer_05_c01: 27.01.2017 07:24:00|5
timer_06_c01: 26.01.2017 09:00:00|6
timer_07_c01: 26.01.2017 09:00:00|0
Device: di_Wecker
e_di_Wecker_W_Aktiv: on
matched_event_c2_1: W_Reset: on
W_Montag: 07:20
W_Dienstag: 06:40
W_Mittwoch: 07:20
W_Donnerstag: 07:20
W_Freitag: 06:40
W_Samstag: 09:00
W_Sonntag: 09:00
cmd_nr: 2
cmd: 2
cmd_event: di_Wecker
cmd_2
triggerEventsState:
W_Reset: on
timer_01_c01: 27.01.2017 07:20:00|1
timer_02_c01: 27.01.2017 06:40:00|2
timer_03_c01: 27.01.2017 07:20:00|3
timer_04_c01: 27.01.2017 07:26:00|4
timer_05_c01: 27.01.2017 07:24:00|5
timer_06_c01: 26.01.2017 09:00:00|6
timer_07_c01: 26.01.2017 09:00:00|0
Device: di_Wecker
e_di_Wecker_W_Aktiv: on
matched_event_c2_1: W_Reset: on
W_Montag: 07:20
W_Dienstag: 06:40
W_Mittwoch: 07:20
W_Donnerstag: 07:20
W_Freitag: 06:40
W_Samstag: 09:00
W_Sonntag: 09:00
cmd_nr: 2
cmd: 2
cmd_event: di_Wecker
cmd_2
Internals:
Interval:
Itimer:
all di_Wecker
Localtime:
0 1485498000
1 1485495600
2 1485498000
3 1485498360
4 1485498240
5 1485417600
6 1485417600
Readings:
0 di_Wecker:W_Aktiv
all di_Wecker:W_Aktiv
Realtime:
0 07:20:00
1 06:40:00
2 07:20:00
3 07:26:00
4 07:24:00
5 09:00:00
6 09:00:00
Regexp:
0:
1:
0 di_Wecker:W_Reset: on
All:
0 di_Wecker:W_Reset: on
State:
Time:
0 [di_Wecker:W_Montag]
1 [di_Wecker:W_Dienstag]
2 [di_Wecker:W_Mittwoch]
3 [di_Wecker:W_Donnerstag]
4 [di_Wecker:W_Freitag]
5 [di_Wecker:W_Samstag]
6 [di_Wecker:W_Sonntag]
Timecond:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
Timer:
0 0
1 0
2 1
3 1
4 0
5 0
6 0
Timers:
0 0 1 2 3 4 5 6
Trigger:
Triggertime:
1485417600:
localtime 1485417600
Hash:
1485495600:
localtime 1485495600
Hash:
1485498000:
localtime 1485498000
Hash:
1485498240:
localtime 1485498240
Hash:
1485498360:
localtime 1485498360
Hash:
Attributes:
do always
readingList W_Aktiv W_Reset W_Montag W_Dienstag W_Mittwoch W_Donnerstag W_Freitag W_Samstag W_Sonntag
selftrigger all
setList W_Aktiv:on,off W_Reset:on W_Montag:time W_Dienstag:time W_Mittwoch:time W_Donnerstag:time W_Freitag:time W_Samstag:time W_Sonntag:time
Na ja, wenn du nur die halbe Wahrheit hier postest, dann ist klar, dass ich es nicht nachvollziehen kann. selftrigger all könnte schon das Problem sein. Einfach löschen und testen.
Tja, jetzt weiß ich auch nicht mehr weiter. Selftrigger habe ich jetzt mal entfernt und trotzdem wurde das Problem damit nicht gelöst. Da hilft wohl jetzt erstmal nur, dass ich noch eine zusätzliche Bedingung einfüge, damit wirklich nur die Zeit für den aktuellen Tag getriggert wird.
Selftrigger hatte ich übrigens eingebaut, da ich dachte, dass nur so eine DOIF-Bedingung getriggert wird, die sich auf ein Reading des DOIF bezieht. Hier der "Reset-Schalter".
Ich habe jetzt nochmal ein wenig getestet und festgestellt. dass es wohl an der Definition der von mir verwendeten Readings [[$Self:W_Montag]|4] liegen muss. Wenn ich feste Zeiten Eintrage ([19:00]|4) , dann funktioniert es tatsächlich, wie es sein soll. Also muss das Problem bei der Readings-Nutzung liegen. Vielleicht hilft dieser Hinweis bei der Fehlersuch.
Zitat von: jual am 27 Januar 2017, 19:03:29
Ich habe jetzt nochmal ein wenig getestet und festgestellt. dass es wohl an der Definition der von mir verwendeten Readings [[$Self:W_Montag]|4] liegen muss. Wenn ich feste Zeiten Eintrage ([19:00]|4) , dann funktioniert es tatsächlich, wie es sein soll. Also muss das Problem bei der Readings-Nutzung liegen. Vielleicht hilft dieser Hinweis bei der Fehlersuch.
Fehler bereits gefunden: https://forum.fhem.de/index.php/topic,64736.msg570867.html#msg570867