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
Moin,
bin zwar etwas raus, da i.M. kein Fhem am laufen, aber ich würde die Kueche auf Zustandsabfrage setzen. [?Kueche....]
LG
Andreas
Warum DOIF und define at statt DOIF und attr wait?
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
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.
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
+: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
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.
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
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
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
([07:00-20:00,+:00])
schon probiert?