Hallo,
ich habe ein Problem mit einem DOIF, welches bis vor kurzem noch funktionierte. Nach einem der Updates der letzten Tage geht es allerdings nicht mehr.
Szenario: (Hue-)Lampen sollen um 21:45 ausgeschaltet werden, aber nur, wenn auch der HTPC nicht mehr läuft, sonst erst beim Ausschalten des PC.
Folgender Code (stark vereinfacht):
... DOIF ([[twilight:ss_weather]-21:45])
(set wz_HueBridge scene kEa86R8RU7JfdXM)
DOELSEIF ([wz_KODI:state] eq "disconnected")
(set HUEGroup8 off)
Mein Verständnis war, dass um 21:45 der DOELSEIF-Zweig aufgerufen wird. Ist der HTPC aus, wird das Licht ausgeschaltet. Ist der HTPC noch an, passiert um 21:45 erstmal nichts. Beim Statuswechsel von KODI wird DOELSEIF dann wieder probiert und ausgeführt. So dachte ich zumindest bisher und das funktionierte bis vor kurzem wie gesagt.
Offensichtlich denke ich aber falsch und habe die Funktionsweise von DOIF noch nicht verstanden. Die Frage ist nun, wo liegt der Fehler bzw. wie kann ich das anders lösen?
Gruß und danke!
EDIT: In Post #5 habe ich versucht, mein Problem nochmal einfacher zu beschreiben.
Zitat von: chrille76 am 02 Dezember 2016, 17:49:49
ich habe ein Problem mit einem DOIF, welches bis vor kurzem noch funktionierte. Nach einem der Updates der letzten Tage geht es allerdings nicht mehr.
aber ein update verhaut doch deinen DOIF-Code nicht...
([twilight:ss_weather]-[21:45])
Zitat von: kumue am 02 Dezember 2016, 20:51:22
aber ein update verhaut doch deinen DOIF-Code nicht...
Ich behaupte nicht, dass es zwingend am Update liegt. Aber warum sollte ein Update eines Moduls nicht grundsätzlich zu Problemen führen können?
Zitat von: kumue am 02 Dezember 2016, 20:51:22
([twilight:ss_weather]-[21:45])
Denke nicht, dass das funktioniert. Aber das Auslösen des Timers ist auch gar nicht das Problem. Licht geht bei ss_weather an und um 21:45 wird auch ausgelöst. Aber eben nicht in den DOELSEIF-Zweig gelaufen. Das ist mein Problem.
ZitatMein Verständnis war, dass um 21:45 der DOELSEIF-Zweig aufgerufen wird.
Das war nie der Fall, [[twilight:ss_weather]-21:45] wird zu ss_ wahr und zu 21 Uhr 45 unwahr. Die zweite Bedingung wird nur geprüft, wenn Kodi ein Event sendet.
Eine Zeitspanne anzugeben scheint nicht sinnvoll, versuch mal ss_ in den ersten und 21 Uhr 45 in den zweiten Zweig zu legen.
Zitat von: Ellert am 02 Dezember 2016, 21:34:29
Das war nie der Fall, [[twilight:ss_weather]-21:45] wird zu ss_ wahr und zu 21 Uhr 45 unwahr. Die zweite Bedingung wird nur geprüft, wenn Kodi ein Event sendet.
Eine Zeitspanne anzugeben scheint nicht sinnvoll, versuch mal ss_ in den ersten und 21 Uhr 45 in den zweiten Zweig zu legen.
Also für mich stellt es sich laut WebIF so dar: es werden 2 Timer angelegt. Einer zum Zeitpunkt ss_weather, einer zu 21:45. Licht geht an zu ss_weather, soweit so gut. Um 21:45 wir der nächste Timer ausgelöst. Da, wie du schreibst, die erste Bedingung nicht mehr wahr ist, müsste er doch in die zweite laufen...!? Und selbst, wenn die zweite Bedingung nur bei KODI-Statuswechsel geprüft wird, müsste der Zweig doch durchlaufen werden, wenn ich KODI (auch nach 21:45) ausschalte. Tut er aber nicht!
Ich versuche es nochmal anders (und vielleicht einfacher) zu beschreiben.
Variante 1
DOIF ([20:00-22:00])
(set Licht on)
DOELSE
(set Licht off)
erzeugt 2 Timer
timer_01_c01 02.12.2016 20:00:00
timer_02_c01 02.12.2016 22:00:00
Diese Variante funktioniert einwandfrei, Licht geht um 20 Uhr an und um 22 Uhr aus.
Variante 2
DOIF ([20:00-22:00])
(set Licht on)
DOELSEIF (<Bedingung>)
(set Licht off)
erzeugt die gleichen 2 Timer
timer_01_c01 02.12.2016 20:00:00
timer_02_c01 02.12.2016 22:00:00
Und hier kommt das Problem. Licht geht um 20 Uhr an, aber nicht um 22 Uhr aus, auch dann nicht, wenn die Bedingung erfüllt ist!
ZitatUnd hier kommt das Problem. Licht geht um 20 Uhr an, aber nicht um 22 Uhr aus, auch dann nicht, wenn die Bedingung erfüllt ist!
Es fehle der Auslöser zur Prüfung der 2. Bedingung, wenn der nicht um 22 Uhr kommt, bleibt der Status auf cmd_1. Daher musst Du einen Auslöser in die 2. Bedingung schreiben <Bedingung> or [22:00:01] oder <Bedingung> and [22:00:01] je nachdem wass Du willst.
Zitat von: Ellert am 02 Dezember 2016, 23:45:00
Es fehle der Auslöser zur Prüfung der 2. Bedingung, wenn der nicht um 22 Uhr kommt, bleibt der Status auf cmd_1.
Ist die Änderung des Statuswechsels von KODI kein Auslöser? Die <Bedingung> ist ein Reading (s. o. wz_KODI:state). Oben schriebst du, bei Auslösung eines Events müsste die zweite Bedingung geprüft werden. Und der Timer wird ja auch definitiv um 22 Uhr ausgelöst. Es wird nur nicht DOELSEIF durchlaufen. Wenn ich z. B. folgendes mache:
DOIF ([20:00-22:00])
(set something)
DOELSEIF (<Bedingung>)
(set something)
DOELSE
(set something)
dann wird um 22:00 immer DOELSE ausgeführt, auch, wenn die Bedingung im DOELSEIF erfüllt ist. Das verstehe ich nicht.
Zitat von: Ellert am 02 Dezember 2016, 23:45:00
Daher musst Du einen Auslöser in die 2. Bedingung schreiben <Bedingung> or [22:00:01] oder <Bedingung> and [22:00:01] je nachdem wass Du willst.
Ok meinst du folgendermaßen?
DOIF ([20:00])
(set Licht on)
DOELSEIF ([22:00] and [wz_KODI:state] eq "disconnected")
(set Licht off)
Das macht halt aber nicht vollständig das, was ich möchte. Es lässt zwar das Licht an, wenn KODI noch läuft, schaltet aber eben auch nicht später ab, wenn KODI nach 22 Uhr ausgeschaltet wird, da ja dann eben nicht mehr 22 Uhr ist. Da bin ich dann wieder bei meinem Eröffnungspost. Wie bekomme ich es hin, dass das Licht zu einer bestimmten Zeit ausgeht, aber nur dann, wenn der Rechner nicht mehr läuft, sonst erst mit Ausschalten des Rechners?
Und ich wiederhole mich gern, mindestens das Anbleiben des Lichts und das spätere Ausschalten zusammen mit KODI haben bis vor kurzem mit dem Code aus #1 definitiv funktioniert. Ob es auch bei Erreichen des Zeitpunkts lief, wenn der Rechner nicht an war kann ich gerade nicht mit Sicherheit sagen, da die Vorraussetzung selten erfüllt ist. Meist läuft der Rechner länger.
DOELSE ist ein anderes Statement als DOELSEIF, warum sollten sich beide gleich verhalten?
DOELSE = Mach etwas, wenn alle andern Bedingungen mit Auslöser unwahr geworden sind.
DOELSEIF = Mach etwas, wenn diese Bedingung einen Auslöser enthält und als erstes wahr wird.
Ob und wann eine Bedingung einen Auslöser erhält kannst Du Dir mit dem Eventmonitor ansehen. Wenn Du einen Fehler vermutest, dann könntest Du dieses Verfahren (http://www.fhemwiki.de/wiki/DOIF/Tools_und_Fehlersuche) anwenden.
Es könnte auch sein, dass KODI sich anders verhält oder Du die Events eingeschränkt (event-on-change-reading) hast.
Auf jeden Fall solltest Du die Bedingung so formulieren, dass alle Auslöser enthalten sind.
DOELSEIF ([22:00] and [?wz_KODI:state] eq "disconnected" or [wz_KODI:state] eq "disconnected")
Ok, danke erstmal, werde ich probieren. Eine Frage noch, was bewirkt eigentlich das Fragezeichen in dem Statement?
Danke @Ellert, du hast mir die entscheidenden Hinweise gegeben!
Folgendes funktioniert jetzt für mich:
DOIF ([[twilight:ss_weather]-21:45])
(...)
DOELSEIF ([21:45] and [?wz_KODI:state] eq "disconnected" or [wz_KODI:state] eq "disconnected")
(...)
Was war vermutlich mein Denkfehler? Wenn KODI nach 21:45 heruntergefahren wurde funktionierte mein Code, da dieses Event der Trigger war. Anscheinend habe ich aber nie 21:45 erreicht, wenn der Rechner AUS war. Deswegen habe ich nie mitbekommen, dass dann nichts passiert.
Also, Problem gelöst! Danke!
ZitatEine Frage noch, was bewirkt eigentlich das Fragezeichen in dem Statement?
Diese Frage beantwortet die Doku (http://fhem.de/commandref_DE.html#DOIF_Zeitintervalle_Readings_und_Stati_ohne_Trigger) ;)
Ja, mittlerweile selbst rausgefunden. Hab ich bisher überlesen.