[gelöst] Warum scheint mein DOIF rekursv zu arbeiten?

Begonnen von olwaldi, 08 November 2023, 13:01:05

Vorheriges Thema - Nächstes Thema

olwaldi

Ich möchte Internet-Radio hören, allerdings stündlich unterbrochen von fm-Nachrichten (Alles mit dem SIRD-device Kueche), ein ideales Problem für DOIF:
define SwitchToNews DOIF (\
  (\
    [06:00-10:00,:00] or \
    [12:00-13:00,:00] or \
    [15:00-22:00,:00]\
  ) and \
   [Kueche:power] eq "on" and \
   [Kueche:input] eq "internetradio"\
 ) (\
   set Kueche input fm, \
   define someMinsLater \
     at +00:04:00 set Kueche input internetradio\
 )\

attr SwitchToNews state cmd_1
#   CFGFN     
#   DEF        (
#  (
#    [06:00-10:00,:00] or
#    [12:00-13:00,:00] or
#    [15:00-22:00,:00]
#  ) and
#   [Kueche:power] eq "on" and
#   [Kueche:input] eq "internetradio"
# ) (
#   set Kueche input fm,
#   define someMinsLater
#     at +00:04:00 set Kueche input internetradio
# )
#
#   FUUID      654b4c67-f33f-fc3a-ee4b-33e054c9e4513944
#   MODEL      FHEM
#   NAME       SwitchToNews
#   NOTIFYDEV  Kueche,global
#   NR         500
#   NTFY_ORDER 50-SwitchToNews
#   STATE      initialized
#   TYPE       DOIF
#   VERSION    27740 2023-07-10 09:31:11
#   eventCount 63
#   READINGS:
#     2023-11-08 12:34:26   cmd             0
#     2023-11-08 12:34:26   mode            enabled
#     2023-11-08 12:34:26   state           initialized
#     2023-11-08 12:34:26   timer_01_c01    09.11.2023 06:00:00
#     2023-11-08 12:34:26   timer_02_c01    09.11.2023 10:00:00
#     2023-11-08 12:34:26   timer_04_c01    09.11.2023 12:00:00
#     2023-11-08 12:34:26   timer_05_c01    08.11.2023 13:00:00
#     2023-11-08 12:34:26   timer_07_c01    08.11.2023 15:00:00
#     2023-11-08 12:34:26   timer_08_c01    08.11.2023 22:00:00
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#     cond:
#       Kueche:
#         0:
#           input      ^Kueche$:^input:
#           power      ^Kueche$:^power:
#   attr:
#     cmdState:
#     wait:
#     waitdel:
#   condition:
#     0             (     ::DOIF_time($hash,0,1,$wday,$hms) or      ::DOIF_time($hash,3,4,$wday,$hms) or      ::DOIF_time($hash,6,7,$wday,$hms)   ) and     ::ReadingValDoIf($hash,'Kueche','power') eq "on" and     ::ReadingValDoIf($hash,'Kueche','input') eq "internetradio" 
#   days:
#   do:
#     0:
#       0              set Kueche input fm,     define someMinsLater       at +00:04:00 set Kueche input internetradio 
#     1:
#   helper:
#     NOTIFYDEV  Kueche,global
#     globalinit 1
#     last_timer 9
#     sleeptimer -1
#   interval:
#     0          -1
#     1          0
#     3          -1
#     4          3
#     6          -1
#     7          6
#   intervalfunc:
#     2          ::DOIF_time($hash,0,1,$wday,$hms)
#     5          ::DOIF_time($hash,3,4,$wday,$hms)
#     8          ::DOIF_time($hash,6,7,$wday,$hms)
#   intervaltimer:
#     0          2
#     1          2
#     3          5
#     4          5
#     6          8
#     7          8
#   localtime:
#     0          1699506000
#     1          1699520400
#     3          1699527600
#     4          1699444800
#     6          1699452000
#     7          1699477200
#   readings:
#     all         Kueche:power Kueche:input
#   realtime:
#     0          06:00:00
#     1          10:00:00
#     3          12:00:00
#     4          13:00:00
#     6          15:00:00
#     7          22:00:00
#   time:
#     0          06:00:00
#     1          10:00:00
#     2          :00
#     3          12:00:00
#     4          13:00:00
#     5          :00
#     6          15:00:00
#     7          22:00:00
#     8          :00
#   timeCond:
#     0          0
#     1          0
#     2          0
#     3          0
#     4          0
#     5          0
#     6          0
#     7          0
#     8          0
#   timer:
#     0          0
#     1          0
#     2          0
#     3          0
#     4          0
#     5          0
#     6          0
#     7          0
#     8          0
#   timers:
#     0           0  1  2  3  4  5  6  7  8
#   triggertime:
#     1699444800:
#       localtime  1699444800
#       hash:
#     1699452000:
#       localtime  1699452000
#       hash:
#     1699477200:
#       localtime  1699477200
#       hash:
#     1699506000:
#       localtime  1699506000
#       hash:
#     1699520400:
#       localtime  1699520400
#       hash:
#     1699527600:
#       localtime  1699527600
#       hash:
#   uiState:
#   uiTable:
#
setstate SwitchToNews initialized
setstate SwitchToNews 2023-11-08 12:34:26 cmd 0
setstate SwitchToNews 2023-11-08 12:34:26 mode enabled
setstate SwitchToNews 2023-11-08 12:34:26 state initialized
setstate SwitchToNews 2023-11-08 12:34:26 timer_01_c01 09.11.2023 06:00:00
setstate SwitchToNews 2023-11-08 12:34:26 timer_02_c01 09.11.2023 10:00:00
setstate SwitchToNews 2023-11-08 12:34:26 timer_04_c01 09.11.2023 12:00:00
setstate SwitchToNews 2023-11-08 12:34:26 timer_05_c01 08.11.2023 13:00:00
setstate SwitchToNews 2023-11-08 12:34:26 timer_07_c01 08.11.2023 15:00:00
setstate SwitchToNews 2023-11-08 12:34:26 timer_08_c01 08.11.2023 22:00:00

Leider funktioniert's nur zur Hälfte. Zur (erwarteten) Triggerzeit wird tatsächich auf fm umgeschaltet und wie gewünscht ein at erzeugt. Sobald die 4min vom at abgelaufen sind, wird umgeschaltet, aber wieder auf fm. Und es gibt einen neuen at-Timer auf 4min später. D.h. scheinbar triggert das DOIF erneut, obwohl die Zeitbedingung nicht erfüllt ist. Die anderen zwei Bedingungen sind natürlich wieder erfüllt.

Wo ist mein Denkfehler?


Ratlos, Michael

rischbiter123

Moin,
bin zwar etwas raus, da i.M. kein Fhem am laufen, aber ich würde die Kueche auf Zustandsabfrage setzen. [?Kueche....]
LG
Andreas
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

Per

Warum DOIF und define at statt DOIF und attr wait?

olwaldi

Zitat von: rischbiter123 am 08 November 2023, 13:24:02Moin,
bin zwar etwas raus, da i.M. kein Fhem am laufen, aber ich würde die Kueche auf Zustandsabfrage setzen. [?Kueche....]
LG
Andreas
Was zwei Fragezeichen doch ausmachen, das ist die Lösung:
[?Kueche:power] eq "on" and
[?Kueche:input] eq "internetradio"

Danke, Michael

olwaldi

Zitat von: Per am 08 November 2023, 15:23:01Warum DOIF und define at statt DOIF und attr wait?
Mit wait geht's vermutlich auch, ich wollte aber zwei Kommandos im zeitlichen Abstand laufen lassen. Das wait würde m.W. nur den Start verzögern können.

KernSani

Mit "wait" kannst du beliebig viele Dinge hintereinander laufen. Intern macht das auch nichts großartig anderes als ein "at". Das Grundproblem wird das aber nicht lösen. Ich fürchte, die ":00" Notation in der Zeitspezifikation macht nicht ganz das was du erwartest (nämlich garnichts). Dein DOIF triggert immer nur zu Beginn des Zeitintervalls und beim "set Kueche input internetradio" ist das Zeitintervall (06:00 - 10:00) wahr, daher wird nochmal getriggert. Die korrekte Notation wäre m.E. [06:00-10:00,+60] (Im Zeitraum 06:00-10:00 jede Stunde)
Grüße,
Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

olwaldi

+:60 war mein erster Versuch, aber die Minuten dürfen wohl nur bis 59 gehen. Ich bekam immer eine Fehlermeldung vom DOIF bzgl. Zeitangabe. :00 scheint zu klappen, immerhin hat's gerade um 16:00 komplett funktioniert.

Ich werde das mal weiter beobachten.


Danke schonmal für die rege Diskussion, Michael

olwaldi

#7
Ich habe nochmal diverse Threds zu meinem Problem gelesen. Ich glaube daher, daß ich in jedem Fall das Attribut do auf always setzen muß. Außerdem habe ich den Interrvalltimer auf ,+[1]:00 gesetzt:
define SwitchToNews DOIF (\
  (\
    [06:00-10:00,+[1]:00] or \
    [12:00-13:00,+[1]:00] or \
    [15:00-22:00,+[1]:00]\
  ) and \
  [?Kueche:power] eq "on" and \
  [?Kueche:input] eq "internetradio"\
) (\
   set Kueche input fm, \
   define someMinsLater \
     at +00:04:30 set Kueche input internetradio\
)\

attr SwitchToNews cmdState checking
attr SwitchToNews do always
attr SwitchToNews state checking
#   CFGFN     
#   DEF        (
#  (
#    [06:00-10:00,+[1]:00] or
#    [12:00-13:00,+[1]:00] or
#    [15:00-22:00,+[1]:00]
#  ) and
#  [?Kueche:power] eq "on" and
#  [?Kueche:input] eq "internetradio"
#) (
#   set Kueche input fm,
#   define someMinsLater
#     at +00:04:30 set Kueche input internetradio
#)
#
#   FUUID      654b4c67-f33f-fc3a-ee4b-33e054c9e4513944
#   MODEL      FHEM
#   NAME       SwitchToNews
#   NOTIFYDEV  global
#   NR         500
#   NTFY_ORDER 50-SwitchToNews
#   STATE      initialized
#   TYPE       DOIF
#   VERSION    27740 2023-07-10 09:31:11
#   eventCount 73
#   READINGS:
#     2023-11-09 09:43:04   cmd             0
#     2023-11-09 09:43:04   mode            enabled
#     2023-11-09 09:43:04   state           initialized
#     2023-11-09 09:43:04   timer_01_c01    10.11.2023 06:00:00
#     2023-11-09 09:43:04   timer_02_c01    09.11.2023 10:00:00
#     2023-11-09 09:43:04   timer_04_c01    09.11.2023 12:00:00
#     2023-11-09 09:43:04   timer_05_c01    09.11.2023 13:00:00
#     2023-11-09 09:43:04   timer_07_c01    09.11.2023 15:00:00
#     2023-11-09 09:43:04   timer_08_c01    09.11.2023 22:00:00
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#   attr:
#     cmdState:
#       0:
#         checking
#     wait:
#     waitdel:
#   condition:
#     0             (     ::DOIF_time($hash,0,1,$wday,$hms) or      ::DOIF_time($hash,3,4,$wday,$hms) or      ::DOIF_time($hash,6,7,$wday,$hms)   ) and    ::ReadingValDoIf($hash,'Kueche','power') eq "on" and    ::ReadingValDoIf($hash,'Kueche','input') eq "internetradio"
#   days:
#   do:
#     0:
#       0              set Kueche input fm,     define someMinsLater       at +00:04:30 set Kueche input internetradio
#     1:
#   helper:
#     NOTIFYDEV  global
#     globalinit 1
#     last_timer 9
#     sleeptimer -1
#   interval:
#     0          -1
#     1          0
#     3          -1
#     4          3
#     6          -1
#     7          6
#   intervalfunc:
#     2          ::DOIF_time($hash,0,1,$wday,$hms)
#     5          ::DOIF_time($hash,3,4,$wday,$hms)
#     8          ::DOIF_time($hash,6,7,$wday,$hms)
#   intervaltimer:
#     0          2
#     1          2
#     3          5
#     4          5
#     6          8
#     7          8
#   localtime:
#     0          1699592400
#     1          1699520400
#     3          1699527600
#     4          1699531200
#     6          1699538400
#     7          1699563600
#   realtime:
#     0          06:00:00
#     1          10:00:00
#     3          12:00:00
#     4          13:00:00
#     6          15:00:00
#     7          22:00:00
#   time:
#     0          06:00:00
#     1          10:00:00
#     2          +[1]:00
#     3          12:00:00
#     4          13:00:00
#     5          +[1]:00
#     6          15:00:00
#     7          22:00:00
#     8          +[1]:00
#   timeCond:
#     0          0
#     1          0
#     2          0
#     3          0
#     4          0
#     5          0
#     6          0
#     7          0
#     8          0
#   timer:
#     0          0
#     1          0
#     2          0
#     3          0
#     4          0
#     5          0
#     6          0
#     7          0
#     8          0
#   timers:
#     0           0  1  2  3  4  5  6  7  8
#   triggertime:
#     1699520400:
#       localtime  1699520400
#       hash:
#     1699527600:
#       localtime  1699527600
#       hash:
#     1699531200:
#       localtime  1699531200
#       hash:
#     1699538400:
#       localtime  1699538400
#       hash:
#     1699563600:
#       localtime  1699563600
#       hash:
#     1699592400:
#       localtime  1699592400
#       hash:
#   uiState:
#   uiTable:
#
setstate SwitchToNews initialized
setstate SwitchToNews 2023-11-09 09:43:04 cmd 0
setstate SwitchToNews 2023-11-09 09:43:04 mode enabled
setstate SwitchToNews 2023-11-09 09:43:04 state initialized
setstate SwitchToNews 2023-11-09 09:43:04 timer_01_c01 10.11.2023 06:00:00
setstate SwitchToNews 2023-11-09 09:43:04 timer_02_c01 09.11.2023 10:00:00
setstate SwitchToNews 2023-11-09 09:43:04 timer_04_c01 09.11.2023 12:00:00
setstate SwitchToNews 2023-11-09 09:43:04 timer_05_c01 09.11.2023 13:00:00
setstate SwitchToNews 2023-11-09 09:43:04 timer_07_c01 09.11.2023 15:00:00
setstate SwitchToNews 2023-11-09 09:43:04 timer_08_c01 09.11.2023 22:00:00

Teste dann, ob es so korrekt funktioniert. Ich vermisse allerdings oben in der Liste der Timer welche für z.B. 8:00 oder 9:00.

Alternativ hätte ich noch die Idee, die stündlichen Zeiten mit ? zur Statusabfrage zu degradieren und mit "and" einen stündlichen Trigger [+[1]:00] zu verknüpfen.


Bleibt spannend, Michael

Nachtrag: Wie befürchtet, das DOIF hat nicht um 10:00Uhr getriggert.


olwaldi

Hab' jetzt mal diese Zeitdefinition verrsucht:
  [+[1]:00] and
  (
    [?06:00-10:00] or
    [?12:00-13:00] or
    [?15:00-22:00]
  )
Dann hätte ich stündliche Timer erwartet, sehe aber weiterhin nur Timer für die Zeitintervalle (trotz ?).
Wenn  ich die Doku richtig verstanden habe, brauche ich das + für regelmäßige Timer. Mir ist nur unklar, ob die 1 in eckigen Klammern OK ist. Laut Thread (von 2015) ab 2 vorgesehen.

Grüßle, Michael

olwaldi

Funktioniert besser. Wie gewünscht hat das DOIF um 11:00 nicht getriggert, zum Ausgleich aber um 12:00 zweimal, einmal aufgrund des stündlichen Intervalls, aber auch vermutlich einmal aufgrund der Zeitgrenze eines Intervalls, trotz "?".

Grüßle, Michael

olwaldi

Hab' mich zu einer radikalen Änderung "durchgerungen": anstatt ausnahmen in einem Zeitintervall erzwingen zu wollen, gebe ich einfach alle Wunschzeiten an:
  (
    [07:00] or [08:00] or [09:00] or [10:00] or
    [12:00] or [13:00] or [15:00] or [16:00] or
    [17:00] or [18:00] or [19:00] or [20:00]
  ) and ...
Da bin ich zuversichtlich, daß dann immer getriggert werden wird.

Grüßle, Michael

Damian

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