FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Stefan6183 am 06 Juni 2023, 10:24:24

Titel: DOIF Bedingung 2 Stunden VOR Twilight reading
Beitrag von: Stefan6183 am 06 Juni 2023, 10:24:24
Hallo,

ich versuche schon seit Wochen, ein relativ einfaches DOIF hinzubekommen, verzweifle aber an der korrekten Syntax:
Meine Markisen sollen 2 Stunden vor dem Twilight Reading ss_indoor schließen.

Mein DOIF sieht momentan so aus:
define di_abendsMarkisen DOIF ([([myTwilightWeather:ss_indoor]-[02:00])])
(set MQTT2_MARKISEKURZ close,set MQTT2_MARKISELANG close)

Das set wird aber nie ausgelöst.
Das set funktioniert, wenn ich eine andere Bedingung verwende. Also scheint die Bedingung falsch zu sein.

Ich wäre für jegliche Tipps dankbar!

Gruß
Stefan
Titel: Aw: DOIF Bedingung 2 Stunden VOR Twilight reading
Beitrag von: Aurel_B am 06 Juni 2023, 10:31:56
Puuuh, ich glaube nicht, dass diese Zeitdefinition funktionieren wird. Wenn ich das richtig sehe, so wird DOIF deine Definition als Zeitspanne interpretieren -> "Zwischen [myTwilightWeather:ss_indoor] und 02:00 wird das DOIF ausgeführt".

Was vielleicht der einfachste Weg ist: beim SUNRISE_EL Module (https://wiki.fhem.de/wiki/SUNRISE_EL (https://wiki.fhem.de/wiki/SUNRISE_EL)) kannst du einen Offset definieren, also z.B. "-2*60*60" für "2h früher". Ich verwende das innerhalb eines at um eine Hühnerstalltür 15min vor Sonnenaufgang öffnen zu lassen "sunrise_abs("HORIZON=-1.0", -15 * 60)"
Titel: Aw: DOIF Bedingung 2 Stunden VOR Twilight reading
Beitrag von: yersinia am 06 Juni 2023, 10:43:59
eigtl müsste deine variante funktionieren
define di_abendsMarkisen DOIF ([([myTwilightWeather:ss_indoor]-[02:00])])
(set MQTT2_MARKISEKURZ close, set MQTT2_MARKISELANG close)
https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung (https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung)
ansonsten versuch mal
define di_abendsMarkisen DOIF ([({twilight("myTwilightWeather","ss_indoor")}-[02:00])])
(set MQTT2_MARKISEKURZ close, set MQTT2_MARKISELANG close)

Und schau, was dir DOIF im reading timer_01_c01 anzeigt. Da sollte für heute eine Uhrzeit stehen, die -2h von myTwilightWeather:ss_indoor ist. Wenn da eine Zeit steht, stimmt was mit dem Ausführungsteil nicht.
Titel: Aw: DOIF Bedingung 2 Stunden VOR Twilight reading
Beitrag von: rabehd am 06 Juni 2023, 13:14:54
https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung (https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung)
Titel: Aw: DOIF Bedingung 2 Stunden VOR Twilight reading
Beitrag von: Stefan6183 am 06 Juni 2023, 19:54:25
Vielen Dank für eure Antworten!

@ansgru: Das SUNRISE_EL Module würde ich notfalls verwenden. Wegen der zusätzlichen Funktionen (insbesondere Einbindung von Wetter) würde ich aber Twilight bevorzugen.

@rabehd: Danke für den Link. Das hatte ich mir schon durchgelesen, dort aber keine Lösung für meinen Anwendungsfall gefunden.

@yersinia:
Zitat von: yersinia am 06 Juni 2023, 10:43:59eigtl müsste deine variante funktionieren
define di_abendsMarkisen DOIF ([([myTwilightWeather:ss_indoor]-[02:00])])
(set MQTT2_MARKISEKURZ close, set MQTT2_MARKISELANG close)
https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung (https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung)
Tatsächlich hat mein ursprüngliches DOIF nach einem set initialize und set checkall die Markisen heute um 19:11:52 geschlossen.
Das list kurz vorher sah so aus:
Internals:
   CFGFN     
   DEF        ([([myTwilightWeather:ss_indoor]-[02:00])])
(set MQTT2_MARKISEKURZ close,set MQTT2_MARKISELANG close)
   FUUID      64764c9b-f33f-a6b5-af03-00df107fb203fead
   MODEL      FHEM
   NAME       di_abendsMarkisen
   NOTIFYDEV  myTwilightWeather,global
   NR         1127
   NTFY_ORDER 50-di_abendsMarkisen
   STATE      cmd_2
   TYPE       DOIF
   VERSION    27367 2023-03-27 21:37:33
   eventCount 104
   READINGS:
     2023-06-06 19:10:40   cmd             2
     2023-06-06 19:10:40   cmd_event       di_abendsMarkisen
     2023-06-06 19:10:40   cmd_nr          2
     2023-06-06 19:10:36   mode            enabled
     2023-06-06 19:10:40   state           cmd_2
     2023-06-06 19:10:29   timer_01_c01    06.06.2023 19:11:52
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     itimer:
       myTwilightWeather:
         itimer:
           ss_indoor  ^myTwilightWeather$:^ss_indoor:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
   days:
   devices:
   do:
     0:
       0          set MQTT2_MARKISEKURZ close,set MQTT2_MARKISELANG close
     1:
   helper:
     NOTIFYDEV  myTwilightWeather,global
     globalinit 1
     last_timer 1
     sleeptimer -1
     timerdev   
     timerevent
     timerevents
     timereventsState
     triggerDev
     DOIF_eventa:
       cmd_nr: 2
       cmd: 2
       cmd_event: di_abendsMarkisen
       cmd_2
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: di_abendsMarkisen
       state: cmd_2
   hmccu:
   intervalfunc:
   localtime:
     0          1686071512
   realtime:
     0          19:11:52
   time:
     0          ([myTwilightWeather:ss_indoor]-[02:00])
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1686071512:
       localtime  1686071512
       hash:
   uiState:
   uiTable:
Attributes:
   disable    0

timer_01_c01 war also korrekt berechnet (2 Stunden vor myTwilightWeather:ss_indoor, das aktuell 21:11:52 ist).
Nach einem set initialize und set checkall hatte das DOIF auch zuvor schon einmal funktioniert, aber am nächsten Tag dann nicht mehr.


Zitatansonsten versuch mal
define di_abendsMarkisen DOIF ([({twilight("myTwilightWeather","ss_indoor")}-[02:00])])
(set MQTT2_MARKISEKURZ close, set MQTT2_MARKISELANG close)

Und schau, was dir DOIF im reading timer_01_c01 anzeigt. Da sollte für heute eine Uhrzeit stehen, die -2h von myTwilightWeather:ss_indoor ist. Wenn da eine Zeit steht, stimmt was mit dem Ausführungsteil nicht.

Das habe ich jetzt auch getestet und es scheint genauso wie mein altes DOIF zu funktionieren (Markisen schließen).
Mal sehen, ob sie das morgen auch noch tun. :D
Titel: Aw: DOIF Bedingung 2 Stunden VOR Twilight reading
Beitrag von: Damian am 06 Juni 2023, 20:01:26
Morgen wird es wieder nicht funktionieren. Du hast das do always-Attribut vergessen.
Titel: Aw: DOIF Bedingung 2 Stunden VOR Twilight reading
Beitrag von: Stefan6183 am 07 Juni 2023, 09:20:26
Vielen Dank, das wird vermutlich mein Problem beheben. Ganz habe ich aber noch nicht verstanden, weshalb ich das do always Attribut brauche, da ja die Bedingung [myTwilightWeather:ss_indoor]-[02:00] eine Sekunde nachdem sie true wurde wieder false werden müsste und sich außerdem ss_indoor jeden Tag ändert.
Titel: Aw: DOIF Bedingung 2 Stunden VOR Twilight reading
Beitrag von: Per am 07 Juni 2023, 09:51:12
Sie ändert sich zwar, triggert dann aber nicht. Es gibt also keinen Fall B (virtuell oder reell).
Titel: Aw: DOIF Bedingung 2 Stunden VOR Twilight reading
Beitrag von: rabehd am 07 Juni 2023, 10:26:39
Genau, wenn es nur einen Zweig gibt, dann kann er nirgendwo hinspringen und braucht do always.
Titel: Aw: DOIF Bedingung 2 Stunden VOR Twilight reading
Beitrag von: Stefan6183 am 07 Juni 2023, 10:49:34
Ok, verstanden. Vielen Dank für die Erklärungen!
Titel: Aw: DOIF Bedingung 2 Stunden VOR Twilight reading
Beitrag von: Per am 07 Juni 2023, 20:23:41
Zitat von: rabehd am 07 Juni 2023, 10:26:39Genau, wenn es nur einen Zweig gibt, dann kann er nirgendwo hinspringen und braucht do always.
Deshalb mein Einwand mit "virtuell", wenn man auf "on" triggert und es gibt ein "off", hätte man den zweiten Zustand. Den gibt es hier aber nicht, hier gibt es nur "Zeitpunkt". "kein Zeitpunkt" geht nicht zu triggern. Dann müsste man einen Zeitraum (1 Sekunde reicht) nehmen, da gibt es on und off.
Titel: Aw: DOIF Bedingung 2 Stunden VOR Twilight reading
Beitrag von: Stefan6183 am 12 Juni 2023, 15:03:55
Kurzes Update: Dank do always funktioniert das DOIF jetzt schon seit einigen Tagen problemlos.
Danke für eure Hilfe!