Hi!
Ich würde gerne ein DOIF bauen, das in einem bestimmten Zeitintervall (z.B. Ende November bis Anfang Januar) ein Reading "Weihnachtszeit" true liefert, sonst false.
Das Ganze soll gleich nach der Erstellung des Geräts funktionieren, also nicht erst nach einiger Zeit durch einen Zeit-Trigger.
Nach mehreren Abenden Doku-Lesen bin ich zu diesem Ergebnis gekommen:
Internals:
CFGFN
DEF (([00:00] or ["^global$:^MODIFIED $SELF$"]) and ($md ge "11-25" or $md le "01-08"))
(setreading $SELF Weihnachtszeit true)
DOELSE
(setreading $SELF Weihnachtszeit false)
NAME di_Weihnachtszeit
NR 11516
NTFY_ORDER 50-di_Weihnachtszeit
STATE true
TYPE DOIF
Readings:
2017-12-06 22:56:12 Device global
2017-12-06 22:56:12 Weihnachtszeit true
2017-12-06 22:56:12 cmd 1
2017-12-06 22:56:12 cmd_event global
2017-12-06 22:56:12 cmd_nr 1
2017-12-06 22:56:12 matched_event_c1_1 MODIFIED di_Weihnachtszeit
2017-12-06 22:56:12 state true
2017-12-07 00:00:00 timer_01_c01 08.12.2017 00:00:00
Condition:
0 (DOIF_time_once($hash,0,$wday) or EventDoIf('^global$',$hash,'^MODIFIED di_Weihnachtszeit$',0)) and ($md ge "11-25" or $md le "01-08")
Days:
Devices:
Do:
0:
0 setreading di_Weihnachtszeit Weihnachtszeit true
1:
0 setreading di_Weihnachtszeit Weihnachtszeit false
Helper:
event timer_1
globalinit 1
last_timer 1
sleeptimer -1
timerdev
timerevent timer_1
triggerDev
timerevents:
timer_1
timereventsState:
MODIFIED di_Weihnachtszeit
triggerEvents:
timer_1
triggerEventsState:
MODIFIED di_Weihnachtszeit
Internals:
Interval:
Itimer:
Localtime:
0 1512687600
Readings:
Realtime:
0 00:00:00
Regexp:
0:
0 ^global$:^MODIFIED di_Weihnachtszeit$
All:
0 ^global$:^MODIFIED di_Weihnachtszeit$
State:
Time:
0 00:00:00
Timecond:
0 0
Timer:
0 0
Timers:
0 0
Trigger:
Triggertime:
1512687600:
localtime 1512687600
Hash:
Attributes:
cmdState true|false
group Allgemein
room Weihnachten
Das funktioniert.
Aber die Frage an die Spezialisten: Ist das zu kompliziert?
Geht es einfacher?
Da ich derartiges noch öfter brauchen werde, interessiert mich, wie man das "richtig" macht ;)
LG,
Stephan.
Kann man so machen.
Reicht dir nicht der Status des Devices?
define Weihnachtszeit DOIF (([00:00] or ["^global$:^MODIFIED $SELF$"]) and ($md ge "11-25" or $md le "01-08") DOELSE
attr Weihnachtszeit do always
attr Weihnachtszeit cmdState on|off
Danke!
Ja, der Status reicht.
Das vereinfacht das Ganze schon mal.
Heisst "kann man so machen", dass es noch schlauere Varianten gibt? ;)
Zitat von: loescher am 08 Dezember 2017, 20:45:29
Danke!
Ja, der Status reicht.
Das vereinfacht das Ganze schon mal.
Heisst "kann man so machen", dass es noch schlauere Varianten gibt? ;)
Ich will nicht ausschließen, dass jemand irgendetwas Eleganteres mit DOIF definiert, aber für größere Zeiträume ist $md beim DOIF die kürzeste Variante. Und wenn man immer den aktuellen Zustand haben will, dann muss man wohl zusätzlich triggern, hier also um 00:00 Uhr bzw. nach dem Start des Systems.
Danke!
Und danke für das coole DOIF und die Zeit, die du da investierst!