DOIF Bedingung 2 Stunden VOR Twilight reading

Begonnen von Stefan6183, 06 Juni 2023, 10:24:24

Vorheriges Thema - Nächstes Thema

Stefan6183

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

Aurel_B

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) 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)"

yersinia

#2
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
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.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

rabehd

Auch funktionierende Lösungen kann man hinterfragen.

Stefan6183

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
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

Damian

Morgen wird es wieder nicht funktionieren. Du hast das do always-Attribut vergessen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stefan6183

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.

Per

Sie ändert sich zwar, triggert dann aber nicht. Es gibt also keinen Fall B (virtuell oder reell).

rabehd

Genau, wenn es nur einen Zweig gibt, dann kann er nirgendwo hinspringen und braucht do always.
Auch funktionierende Lösungen kann man hinterfragen.

Stefan6183

Ok, verstanden. Vielen Dank für die Erklärungen!

Per

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.

Stefan6183

Kurzes Update: Dank do always funktioniert das DOIF jetzt schon seit einigen Tagen problemlos.
Danke für eure Hilfe!