Attribut Wait bei Doif scheint nicht zu greifen

Begonnen von Dracolein, 22 Juni 2021, 07:25:38

Vorheriges Thema - Nächstes Thema

Dracolein

Moin zusammen,

anbei ein DOIF für meine simple Rolladensteuerung im Bad, abhängig von der Deckenlampe.
Die Rolläden sollen abhängig von Sonnenauf- und untergang gesteuert werden - funktioniert
Die Rolläden sollen morgens nicht automatisch hochfahren, wenn Licht eingeschaltet ist (erster doif-Zweig) - funktioniert(e)

Nun wollte ich eine Art Verzögerung für diesen Fall einbauen, dass die Rolläden um 60 Minuten später hochfahren, falls morgens Licht eingeschaltet ist.
Das ist der zweite Doif-Zweig.

Zusätzlich habe ich das Attribut wait 0:3600:0 gesetzt, aber aus mir unerklärlichen Gründen funktioniert das nicht so wie gedacht.
Statt dessen fahren die Rolläden wieder hoch, wenn Licht eingeschaltet ist.

Was mache ich falsch?


Internals:
   DEF        ([Badrolloautomatikschalter:state] eq "on" and [{sunrise("REAL",0,"06:30","9:00")}]
and (([BadPanelKlo:reachable] == 1 and [BadPanelKlo:pct] == 0
and [BadPanelDusche:reachable] == 1 and [BadPanelDusche:pct] == 0)
or ([BadPanelKlo:reachable] == 0 and [BadPanelDusche:reachable] == 0)
or ([BadPanelKlo:reachable] == 1 and [BadPanelKlo:pct] == 0 and [BadPanelDusche:reachable] == 0)
or ([BadPanelKlo:reachable] == 0 and [BadPanelDusche:reachable] == 1 and [BadPanelDusche:pct] == 0)
))(set shelly5 pct 100, set shelly6 pct 100)
DOELSEIF ([Badrolloautomatikschalter:state] eq "on" and [{sunrise("REAL",0,"06:30","9:00")}]
and (([BadPanelKlo:reachable] == 1 and [BadPanelKlo:pct] > 1) or ([BadPanelDusche:reachable] == 1 and [BadPanelDusche:pct] > 0)))
(set shelly5 pct 100, set shelly6 pct 100)
DOELSEIF ([Badrolloautomatikschalter:state] eq "on" and [{sunset("REAL",0,"15:00","22:30")}]) (set shelly5 pct 0, set shelly6 pct 0)
   FUUID      60bd0e83-f33f-4dec-bf14-939b95810760ad7e
   MODEL      FHEM
   NAME       Badrolloautomatik
   NOTIFYDEV  BadPanelDusche,BadPanelKlo,Badrolloautomatikschalter,global
   NR         136
   NTFY_ORDER 50-Badrolloautomatik
   STATE      initialized
   TYPE       DOIF
   VERSION    24570 2021-06-02 22:25:40
   READINGS:
     2021-06-22 07:13:48   cmd             0
     2021-06-22 07:13:48   mode            enabled
     2021-06-22 07:13:48   state           initialized
     2021-06-22 07:13:48   timer_01_c01    23.06.2021 06:30:00
     2021-06-22 07:13:48   timer_02_c02    23.06.2021 06:30:00
     2021-06-22 07:13:48   timer_03_c03    22.06.2021 21:41:50
   Regex:
     accu:
     collect:
     cond:
       BadPanelDusche:
         0:
           pct        ^BadPanelDusche$:^pct:
           reachable  ^BadPanelDusche$:^reachable:
         1:
           pct        ^BadPanelDusche$:^pct:
           reachable  ^BadPanelDusche$:^reachable:
       BadPanelKlo:
         0:
           pct        ^BadPanelKlo$:^pct:
           reachable  ^BadPanelKlo$:^reachable:
         1:
           pct        ^BadPanelKlo$:^pct:
           reachable  ^BadPanelKlo$:^reachable:
       Badrolloautomatikschalter:
         0:
           state      ^Badrolloautomatikschalter$:^state:
         1:
           state      ^Badrolloautomatikschalter$:^state:
         2:
           state      ^Badrolloautomatikschalter$:^state:
   attr:
     cmdState:
     wait:
       0:
         0
       1:
         3600
       2:
         0
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Badrolloautomatikschalter','state') eq "on" and ::DOIF_time_once($hash,0,$wday)  and ((::ReadingValDoIf($hash,'BadPanelKlo','reachable') == 1 and ::ReadingValDoIf($hash,'BadPanelKlo','pct') == 0  and ::ReadingValDoIf($hash,'BadPanelDusche','reachable') == 1 and ::ReadingValDoIf($hash,'BadPanelDusche','pct') == 0)  or (::ReadingValDoIf($hash,'BadPanelKlo','reachable') == 0 and ::ReadingValDoIf($hash,'BadPanelDusche','reachable') == 0)  or (::ReadingValDoIf($hash,'BadPanelKlo','reachable') == 1 and ::ReadingValDoIf($hash,'BadPanelKlo','pct') == 0 and ::ReadingValDoIf($hash,'BadPanelDusche','reachable') == 0) or (::ReadingValDoIf($hash,'BadPanelKlo','reachable') == 0 and ::ReadingValDoIf($hash,'BadPanelDusche','reachable') == 1 and ::ReadingValDoIf($hash,'BadPanelDusche','pct') == 0) )
     1          ::ReadingValDoIf($hash,'Badrolloautomatikschalter','state') eq "on" and ::DOIF_time_once($hash,1,$wday)  and ((::ReadingValDoIf($hash,'BadPanelKlo','reachable') == 1 and ::ReadingValDoIf($hash,'BadPanelKlo','pct') > 1) or (::ReadingValDoIf($hash,'BadPanelDusche','reachable') == 1 and ::ReadingValDoIf($hash,'BadPanelDusche','pct') > 0))
     2          ::ReadingValDoIf($hash,'Badrolloautomatikschalter','state') eq "on" and ::DOIF_time_once($hash,2,$wday)
   days:
   do:
     0:
       0          set shelly5 pct 100, set shelly6 pct 100
     1:
       0          set shelly5 pct 100, set shelly6 pct 100
     2:
       0          set shelly5 pct 0, set shelly6 pct 0
     3:
   helper:
     DEVFILTER  ^global$|^BadPanelDusche$|^BadPanelKlo$|^Badrolloautomatikschalter$
     NOTIFYDEV  global|BadPanelDusche|BadPanelKlo|Badrolloautomatikschalter
     globalinit 1
     last_timer 3
     sleeptimer -1
     triggerDev
   intervalfunc:
   localtime:
     0          1624422600
     1          1624422600
     2          1624390910
   readings:
     all         Badrolloautomatikschalter:state BadPanelKlo:reachable BadPanelKlo:pct BadPanelDusche:reachable BadPanelDusche:pct
   realtime:
     0          06:30:00
     1          06:30:00
     2          21:41:50
   time:
     0          {sunrise("REAL",0,"06:30","9:00")}
     1          {sunrise("REAL",0,"06:30","9:00")}
     2          {sunset("REAL",0,"15:00","22:30")}
   timeCond:
     0          0
     1          1
     2          2
   timer:
     0          0
     1          0
     2          0
   timers:
     0           0
     1           1
     2           2
   triggertime:
     1624390910:
       localtime  1624390910
       hash:
     1624422600:
       localtime  1624422600
       hash:
   uiState:
   uiTable:
Attributes:
   room       Befehle,Homekit
   wait       0:3600:0

Hier nochmal der wesentliche Teil, zerlegt in 3 Zweige:


([Badrolloautomatikschalter:state] eq "on" and [{sunrise("REAL",0,"06:30","9:00")}]
and (([BadPanelKlo:reachable] == 1 and [BadPanelKlo:pct] == 0
and [BadPanelDusche:reachable] == 1 and [BadPanelDusche:pct] == 0)
or ([BadPanelKlo:reachable] == 0 and [BadPanelDusche:reachable] == 0)
or ([BadPanelKlo:reachable] == 1 and [BadPanelKlo:pct] == 0 and [BadPanelDusche:reachable] == 0)
or ([BadPanelKlo:reachable] == 0 and [BadPanelDusche:reachable] == 1 and [BadPanelDusche:pct] == 0)
))(set shelly5 pct 100, set shelly6 pct 100)

DOELSEIF ([Badrolloautomatikschalter:state] eq "on" and [{sunrise("REAL",0,"06:30","9:00")}]
and (([BadPanelKlo:reachable] == 1 and [BadPanelKlo:pct] > 1) or ([BadPanelDusche:reachable] == 1 and [BadPanelDusche:pct] > 0)))
(set shelly5 pct 100, set shelly6 pct 100)

DOELSEIF ([Badrolloautomatikschalter:state] eq "on" and [{sunset("REAL",0,"15:00","22:30")}]) (set shelly5 pct 0, set shelly6 pct 0)

Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Otto123

Hi,

Du hast nun die Bedingung in zwei Zweigen drin. DOIF arbeitet von vorn nach hinten, ist der erste Zweig wahr - wird agiert, weitere Zweige werden (in dieser "Runde") nicht ermittelt.
Alle Deine Geräte triggern das DOIF, das kann auch kontraproduktiv sein.

Dein list ist nach der Erstellung, wenn Du ein list im "Fehlerfall" machst sieht man meist besser was los ist.

Überlege Dir welches gerät das DOIF anstoßen soll und welche Werte nur abgefragt werden sollen.
->
[BadPanelKlo:pct] triggert
[?BadPanelKlo:pct] fragt nur ab.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Dracolein

#2
Zitat von: Otto123 am 22 Juni 2021, 11:21:11
[BadPanelKlo:pct] triggert
[?BadPanelKlo:pct] fragt nur ab.
Wow, das wusste ich nicht, wieder was gelernt. Cool, das werde ich nutzen und umbauen. Im Prinzip soll das gesamte DOIF nur durch "sunrise" angestoßen werden, sonst tagsüber gar nicht.
Wenn es getriggert wird, darf von den 3 Zweigen nur 1 Zweig wahr sein.

Zitat von: Otto123 am 22 Juni 2021, 11:21:11
wenn Du ein list im "Fehlerfall" machst sieht man meist besser was los ist.
Wie meinst Du das?
Im Moment ist der Sonnenaufgang noch deutlich vor 06:30, heißt ich habe derzeit täglich morgens die Möglichkeit zu Tests.
Sollte ich im Fehlerfall unmittelbar um 06:31 ein list erzeugen, meinst Du?

P.S.:
by the way, wenn ich den zweiten Zweig rauswerfe und auch das Attribut "wait" rauswerfe, funktioniert das DOIF morgens wie es soll: Ist zum Öffnen-Zeitpunkt Licht eingeschaltet, bleiben die Rolläden unten.
Ich wollte lediglich upgraden, dass in diesem Fall die Rolläden um 60 Minuten verspätet öffnen, daher hatte ich den zweiten Zweig reingebaut und erhoffte mir per "wait" die Ausführung um 60min zu verzögern.

Das hier funktioniert:

([Badrolloautomatikschalter:state] eq "on" and [{sunrise("REAL",0,"06:30","9:00")}]
and (([BadPanelKlo:reachable] == 1 and [BadPanelKlo:pct] == 0
and [BadPanelDusche:reachable] == 1 and [BadPanelDusche:pct] == 0)
or ([BadPanelKlo:reachable] == 0 and [BadPanelDusche:reachable] == 0)
or ([BadPanelKlo:reachable] == 1 and [BadPanelKlo:pct] == 0 and [BadPanelDusche:reachable] == 0)
or ([BadPanelKlo:reachable] == 0 and [BadPanelDusche:reachable] == 1 and [BadPanelDusche:pct] == 0)
))(set shelly5 pct 100, set shelly6 pct 100)
DOELSEIF ([Badrolloautomatikschalter:state] eq "on" and [{sunset("REAL",0,"15:00","22:30")}]) (set shelly5 pct 0, set shelly6 pct 0)


Und so habe ich es nun geändert:

// Wenn Badrolloautomatik = EIN & Sonnenaufgang & (Lampen bestromt & abgeschaltet oder Lampen nicht bestromt): Rollos hochfahren

([?Badrolloautomatikschalter:state] eq "on" and [{sunrise("REAL",0,"06:30","9:00")}]
and (([?BadPanelKlo:reachable] == 1 and [?BadPanelKlo:pct] == 0
and [?BadPanelDusche:reachable] == 1 and [?BadPanelDusche:pct] == 0)
or ([?BadPanelKlo:reachable] == 0 and [?BadPanelDusche:reachable] == 0)
or ([?BadPanelKlo:reachable] == 1 and [?BadPanelKlo:pct] == 0 and [?BadPanelDusche:reachable] == 0)
or ([?BadPanelKlo:reachable] == 0 and [?BadPanelDusche:reachable] == 1 and [?BadPanelDusche:pct] == 0)
))(set shelly5 pct 100, set shelly6 pct 100)

//Ansonsten wenn Barolloautomatik = EIN & Sonnenaufgang & irgendeine Lampe leuchtet: Rollos hochfahren nach 3600sek

DOELSEIF ([?Badrolloautomatikschalter:state] eq "on" and [{sunrise("REAL",0,"06:30","9:00")}]
and ([?BadPanelKlo:reachable] == 1 and [?BadPanelKlo:pct] > 1 or [?BadPanelDusche:reachable] == 1 and [?BadPanelDusche:pct] > 0))
(set shelly5 pct 100, set shelly6 pct 100)

// Sonst wenn Badrolloautomatik = EIN & Sonnenuntergang erreicht: Rollos runterfahren

DOELSEIF ([?Badrolloautomatikschalter:state] eq "on" and [{sunset("REAL",0,"15:00","22:30")}]) (set shelly5 pct 0, set shelly6 pct 0)

attr wait    0:3600:0

Demnach ist der Trigger jetzt nur noch die Sunrise-Funktion morgens und abends. Eigentlich kann gleichzeitig nur 1 Beingung = true sein, wenn ich das richtig gemacht habe. Meinen anfänglichen Fehler für das Attribut wait mit Kommata zu arbeiten anstatt mit Doppelpunkten, hatte ich mithilfe der Commandref lösen können.
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Otto123

Ja ein list um 6:31 zeigt Dir an was passiert ist.
Schreibe dazu mal eine Logiktabelle:
(
([BadPanelKlo:reachable] == 1 and [BadPanelKlo:pct] == 0 and [BadPanelDusche:reachable] == 1 and [BadPanelDusche:pct] == 0)
or ([BadPanelKlo:reachable] == 0 and [BadPanelDusche:reachable] == 0)
or ([BadPanelKlo:reachable] == 1 and [BadPanelKlo:pct] == 0 and [BadPanelDusche:reachable] == 0)
or ([BadPanelKlo:reachable] == 0 and [BadPanelDusche:reachable] == 1 and [BadPanelDusche:pct] == 0)
)
Auf den ersten Blick sieht das für mich aus: Wenn beide Lampen nicht "da" sind - wird der Ausdruck wahr - wenn das so ist: wozu dann die komplizierte Abfrage wenn einer der Lampen da ist? So ganz verstehe ich das nicht, aber Du musst das für Dich klären, ob das wirklich jeden Fall abdeckt.

Wenn ich deinen Denkansatz richtig verstehe, brauchst Du doch keinen dritten Zweig. Verzögere doch einfach den ersten?
Noch andere Frage: spielt der pct Wert der Lampen überhaupt eine Rolle? Wenn ich es richtig verstehe, schaltest Du den Strom der Lampen mit normalen Schaltern?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Dracolein

Zitat von: Otto123 am 22 Juni 2021, 13:58:21
Ja ein list um 6:31 zeigt Dir an was passiert ist.
Schreibe dazu mal eine Logiktabelle:
(
([BadPanelKlo:reachable] == 1 and [BadPanelKlo:pct] == 0 and [BadPanelDusche:reachable] == 1 and [BadPanelDusche:pct] == 0)
or ([BadPanelKlo:reachable] == 0 and [BadPanelDusche:reachable] == 0)
or ([BadPanelKlo:reachable] == 1 and [BadPanelKlo:pct] == 0 and [BadPanelDusche:reachable] == 0)
or ([BadPanelKlo:reachable] == 0 and [BadPanelDusche:reachable] == 1 and [BadPanelDusche:pct] == 0)
)
Auf den ersten Blick sieht das für mich aus: Wenn beide Lampen nicht "da" sind - wird der Ausdruck wahr - wenn das so ist: wozu dann die komplizierte Abfrage wenn einer der Lampen da ist? So ganz verstehe ich das nicht, aber Du musst das für Dich klären, ob das wirklich jeden Fall abdeckt.

Wenn ich deinen Denkansatz richtig verstehe, brauchst Du doch keinen dritten Zweig. Verzögere doch einfach den ersten?
Noch andere Frage: spielt der pct Wert der Lampen überhaupt eine Rolle? Wenn ich es richtig verstehe, schaltest Du den Strom der Lampen mit normalen Schaltern?

Das Problem ist die hardwareseitige Bastellösung der Deckebeleuchtung. Die Kids schalten diese derzeit noch über die konventionellen Schalter ein und aus, somit sind die Lampen dann stromlos (reachable = 0). Meine Frau & ich können die Lampen alternativ (sofern die Schalter eingeschaltet sind) per Sprachbefehl ausschalten und die konventionellen Schalter bleiben geschaltet (reachable = 1).
Da ich nun jegliche Zustände einschließen möchte, damit unter allen Umständen die Rolläden geschlossen bleiben,wenn eine oder beide Lampen leuchten, habe ich dies so aufwändig ausgeführtausgeführt.

Der erste Zweig fragt ab, ob beide Lampen wirklich aus sind. Nur wenn sie
- beide nicht erreichbar
- beide erreichbar aber abgeschaltet (pct=0)
- eine der beiden erreichbar, aber abgeschaltet und die andere nicht erreichbar
wird der Zweig wahr und fährt die Rolläden sofort hoch. Das funktioniert bereits.

Der zweite Zweig soll quasi mein Timer werden, der die Rolläden 60 Minuten verzögert höchfährt, falls zum ursprünglich geplanten Schaltzeitpunkt eine (oder beide) Lampen an sind.

Der dritte Zweig dient dem Herunterfahren der Rolläden am Abend und funktioniert.


Zu Deiner Frage:
Die Rolläden sollen nur verzögern, falls Licht an ist. Sonst sollen sie zum Zeitpunkt "sunrise" hochfahren.
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Dracolein

#5
Moin Otto,

hier das List von gerade ebend:


Internals:
   DEF        ([?Badrolloautomatikschalter:state] eq "on" and [{sunrise("REAL",0,"06:30","9:00")}]
and (([?BadPanelKlo:reachable] == 1 and [?BadPanelKlo:pct] == 0
and [?BadPanelDusche:reachable] == 1 and [?BadPanelDusche:pct] == 0)
or ([?BadPanelKlo:reachable] == 0 and [?BadPanelDusche:reachable] == 0)
or ([?BadPanelKlo:reachable] == 1 and [?BadPanelKlo:pct] == 0 and [?BadPanelDusche:reachable] == 0)
or ([?BadPanelKlo:reachable] == 0 and [?BadPanelDusche:reachable] == 1 and [?BadPanelDusche:pct] == 0)
))(set shelly5 pct 100, set shelly6 pct 100)
DOELSEIF ([?Badrolloautomatikschalter:state] eq "on" and [{sunrise("REAL",0,"06:30","9:00")}]
and ([?BadPanelKlo:reachable] == 1 and [?BadPanelKlo:pct] > 1 or [?BadPanelDusche:reachable] == 1 and [?BadPanelDusche:pct] > 0))
(set shelly5 pct 100, set shelly6 pct 100)
DOELSEIF ([?Badrolloautomatikschalter:state] eq "on" and [{sunset("REAL",0,"15:00","22:30")}]) (set shelly5 pct 0, set shelly6 pct 0)
   FUUID      60bd0e83-f33f-4dec-bf14-939b95810760ad7e
   MODEL      FHEM
   NAME       Badrolloautomatik
   NOTIFYDEV  global
   NR         136
   NTFY_ORDER 50-Badrolloautomatik
   STATE      cmd_2
   TYPE       DOIF
   VERSION    24570 2021-06-02 22:25:40
   READINGS:
     2021-06-23 06:30:00   cmd             2
     2021-06-23 06:30:00   cmd_event       timer_2
     2021-06-23 06:30:00   cmd_nr          2
     2021-06-22 11:42:26   mode            enabled
     2021-06-23 06:30:00   state           cmd_2
     2021-06-23 06:30:00   timer_01_c01    24.06.2021 06:30:00
     2021-06-23 06:30:00   timer_02_c02    24.06.2021 06:30:00
     2021-06-22 21:41:50   timer_03_c03    23.06.2021 21:41:58
   Regex:
     accu:
     collect:
   attr:
     cmdState:
     wait:
       0:
         0
       1:
         3600
       2:
         0
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Badrolloautomatikschalter','state') eq "on" and ::DOIF_time_once($hash,0,$wday)  and ((::ReadingValDoIf($hash,'BadPanelKlo','reachable') == 1 and ::ReadingValDoIf($hash,'BadPanelKlo','pct') == 0  and ::ReadingValDoIf($hash,'BadPanelDusche','reachable') == 1 and ::ReadingValDoIf($hash,'BadPanelDusche','pct') == 0)  or (::ReadingValDoIf($hash,'BadPanelKlo','reachable') == 0 and ::ReadingValDoIf($hash,'BadPanelDusche','reachable') == 0)  or (::ReadingValDoIf($hash,'BadPanelKlo','reachable') == 1 and ::ReadingValDoIf($hash,'BadPanelKlo','pct') == 0 and ::ReadingValDoIf($hash,'BadPanelDusche','reachable') == 0) or (::ReadingValDoIf($hash,'BadPanelKlo','reachable') == 0 and ::ReadingValDoIf($hash,'BadPanelDusche','reachable') == 1 and ::ReadingValDoIf($hash,'BadPanelDusche','pct') == 0) )
     1          ::ReadingValDoIf($hash,'Badrolloautomatikschalter','state') eq "on" and ::DOIF_time_once($hash,1,$wday)  and (::ReadingValDoIf($hash,'BadPanelKlo','reachable') == 1 and ::ReadingValDoIf($hash,'BadPanelKlo','pct') > 1 or ::ReadingValDoIf($hash,'BadPanelDusche','reachable') == 1 and ::ReadingValDoIf($hash,'BadPanelDusche','pct') > 0)
     2          ::ReadingValDoIf($hash,'Badrolloautomatikschalter','state') eq "on" and ::DOIF_time_once($hash,2,$wday)
   days:
   do:
     0:
       0          set shelly5 pct 100, set shelly6 pct 100
     1:
       0          set shelly5 pct 100, set shelly6 pct 100
     2:
       0          set shelly5 pct 0, set shelly6 pct 0
     3:
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     event      timer_2
     globalinit 1
     last_timer 3
     sleeptimer -1
     timerdev   
     timerevent timer_2
     triggerDev
     DOIF_eventa:
       cmd_nr: 2
       cmd: 2
       cmd_event: timer_2
       cmd_2
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: timer_2
       state: cmd_2
     timerevents:
       timer_2
     timereventsState:
       timer_2
     triggerEvents:
       timer_2
     triggerEventsState:
       timer_2
   interval:
   intervalfunc:
   localtime:
     0          1624509000
     1          1624509000
     2          1624477318
   realtime:
     0          06:30:00
     1          06:30:00
     2          21:41:58
   time:
     0          {sunrise("REAL",0,"06:30","9:00")}
     1          {sunrise("REAL",0,"06:30","9:00")}
     2          {sunset("REAL",0,"15:00","22:30")}
   timeCond:
     0          0
     1          1
     2          2
   timer:
     0          0
     1          0
     2          0
   timers:
     0           0
     1           1
     2           2
   triggertime:
     1624477318:
       localtime  1624477318
       hash:
     1624509000:
       localtime  1624509000
       hash:
   uiState:
   uiTable:
Attributes:
   room       Befehle,Homekit
   wait       0:3600:0


Es hat leider trotz eingeschalteter Lampe(n) wieder um Punkt 06:30 Uhr die Rolläden hochgefahren.
Ich interpretiere, dass Zweig Nummer 2 zuletzt aktiv war, also eigentlich genau der richtige Zweig, den ich wünsche. Nur WTF warum wird der Befehl nicht um 3600 Sekunden verzögert....
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Damian

Dann hast du wohl die Commandref nicht intensiv genug studiert ;)

ZitatFür Kommandos, die nicht verzögert werden sollen, werden Sekundenangaben ausgelassen oder auf Null gesetzt. Die Verzögerungen werden nur auf Events angewandt und nicht auf Zeitsteuerung. Eine bereits ausgelöste Verzögerung wird zurückgesetzt, wenn während der Wartezeit ein Kommando eines anderen DO-Falls, ausgelöst durch ein neues Ereignis, ausgeführt werden soll.

und dazu passend:

https://fhem.de/commandref_DE.html#DOIF_timerWithWait
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

Ok - an den Fakt hatte ich auch nicht gedacht  :-[
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Dracolein

Kopfkratz, vermutlich wirst Du recht haben, aber ich hatte mich lt. Commandref hier nach gerichtet

https://fhem.de/commandref_DE.html#DOIF_wait
ZitatVerzögerungen für die Ausführung von Kommandos werden pro Befehlsfolge über das Attribut "wait" definiert

Das Attribut "timerWithWait" würde für alle 3 DOIF-Stränge in meinem Fall gelten, oder nicht?
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Damian

Alternativ lassen sich Zeiten verzögern, indem man die Verzögerung direkt einbaut:

[({sunrise("REAL",0,"06:30","9:00")}+3600)]

Am besten aber die Verzögerung direkt über sunrise angeben (erster bzw. zweiter Parameter)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Dracolein

Danke Dir, oh man wieso bin ich nicht selbst drauf gekommen, habe ich doch in jedem DOIF Strang schon eh die sunrise-Funktion drin.

Sprich, ein Ausschnitt

DOELSEIF ([?Badrolloautomatikschalter:state] eq "on" and [{sunrise("REAL",3600,"06:30","9:00")}]
and ([?BadPanelKlo:reachable] == 1 and [?BadPanelKlo:pct] > 1 or [?BadPanelDusche:reachable] == 1 and [?BadPanelDusche:pct] > 0))
(set shelly5 pct 100, set shelly6 pct 100)

So sollte es morgen früh funktionieren, falls dieser DOIF-Strang = true wird.

Da bin ich gespannt  8)
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Damian

Du brauchst auch nicht bis morgen warten, im DOIF siehst du, wann die tatsächliche (verzögerte) Triggerzeit sein wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Dracolein

#12
Hm, wo sehe ich das?

In den aktuellen Readings steht nur:

Zitat
timer_01_c01    24.06.2021 06:30:00       2021-06-23 10:03:57
timer_02_c02    24.06.2021 06:30:00       2021-06-23 10:03:57
timer_03_c03    23.06.2021 21:41:58       2021-06-23 10:03:57
wait_timer        no timer                             2021-06-23 10:04:05

Die Triggerzeit ist ja sogesehen auch richtig, da genau um 06:30 die sunrise-Bedingung wahr würde.
Interessant ist die Uhrzeit, wann der Befehl von Bedingung 2 ausgelöst würde, das müsste im aktuellen Fall 07:30 Uhr sein
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Damian

Das ist die tatsächliche Triggerzeit, du hast ja definiert "nicht vor 6:30" daher 6:30.

So sieht es bei mir aus, wenn ich den tatsächlichen Sonnenaufgang um 5:22 um eine Stunde verschiebe (Einschränkung muss natürlich runter, hier 4:30)

defmod sunrise DOIF ([{sunrise("REAL",3600,"04:30","9:00")}])

setstate sunrise initialized
setstate sunrise 2021-06-23 12:33:40 cmd 0
setstate sunrise 2021-06-23 12:33:40 mode enabled
setstate sunrise 2021-06-23 12:33:40 state initialized
setstate sunrise 2021-06-23 12:33:40 timer_01_c01 24.06.2021 06:22:49

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

Damit geht nur der Vorschlag aus #9
Die Zeit von Sunrise erzeugen und dann von DOIF verzögern lassen.
Wobei ich nicht geprüft habe ob diese Schreibweise wirklich geht: Runde Klammer und sekunden addieren - aber Damian wird es ja wissen :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz