Guten Abend,
nach vielen Suchen und probieren komme ich mit einem einfachen Timer im DIOF nicht ganz klar. Ziel ist es, bei Abwesenheit verschiedene Lichter ein und aus zu schalten. Das Ganze in einem Zeitfenster variabel mit Zufallszahlen. Mein DOIF dazu, sieht so aus:
define di_flurlicht_1 DOIF ([([10:26]+int(rand(500)))] and [?absent] eq "away")(set HM_4AB114 on-for-timer 189)
attr di_flurlicht_1 do always
Im Log stehen folgende Einträge:
2017.09.28 10:29:11 3: CUL_HM set HM_4AB114 on-for-timer 189
2017.09.28 10:32:58 3: CUL_HM set HM_4AB114 on-for-timer 189
Warum wird die Aktion 2-mal ausgeführt. Wenn ich das do always weg lasse, wird der Befehl genau einmal ausgeführt. Dann aber am darauf folgenden Tag nicht mehr.
Der zufällig neuberechnete Timer liegt später als der abgelaufene Timer und der wird natürlich auch ausgewertet,
Wenn Du DOELSEIF ([00:00])
zufügst und do always weg lässt, sollte es klappen.
ZitatWarum wird die Aktion 2-mal ausgeführt
Ganz einfach, weil Random beim zweiten Mal 227 Sekunden länger war, als davor ;)
Lösung: random in wait unterbringen und das Attribut https://fhem.de/commandref_DE.html#DOIF_timerWithWait setzen
Danke für die schnelle Hilfe, habe es jetzt so eingebaut.
Nach einigen Test funktioniert das DOIF nun genau wie es soll. Könnt ihr mir bitte die Funktion vom timerwithwait erklären?
timerWithWait weist DOIF an den ersten Waittimer im Timer zu berücksichtigen.
([10:00]) (Befehl)
Befehl wird um 10.00 Uhr ausgeführt
([10:00]) (Befehl)
wait 300
Befehl wird um 10.00 Uhr ausgeführt
([10:00]) (Befehl)
wait 300
timerWithWait 1
Befehl wird um 10.05 Uhr ausgeführt