DOIF Wecker - Wochentage werden nicht richtig ausgewertet

Begonnen von jual, 25 Januar 2017, 22:06:11

Vorheriges Thema - Nächstes Thema

jual

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.

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

jual

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.

Damian

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.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

jual

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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

jual

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".

jual

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.

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF