Zeitintervall Status Reading für z.B. Weihnachtszeit

Begonnen von loescher, 07 Dezember 2017, 22:21:49

Vorheriges Thema - Nächstes Thema

loescher

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.

Damian

#1
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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

loescher

Danke!
Ja, der Status reicht.
Das vereinfacht das Ganze schon mal.

Heisst "kann man so machen", dass es noch schlauere Varianten gibt?  ;)

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

loescher

Danke!
Und danke für das coole DOIF und die Zeit, die du da investierst!