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)
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
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.
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?
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.
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....
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
Ok - an den Fakt hatte ich auch nicht gedacht :-[
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?
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)
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)
Du brauchst auch nicht bis morgen warten, im DOIF siehst du, wann die tatsächliche (verzögerte) Triggerzeit sein wird.
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
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
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 :)
Zitat von: Damian am 23 Juni 2021, 12:40:26
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
Ich bin geistig am Limit grade ;D 8)
Okay, aber ich komme dahinter, hoffe ich.
[{sunrise("REAL",3600,"06:30","9:00")}]
bedeutet bei echtem Sonnenaufgang um z.B. 05:12 Uhr sozusagen: Verzögere um 60 Minuten, aber frühestens um 06:30 Uhr.
Heißt: die Verzögerungszeit läge bei 06:12 Uhr, was wiederum nicht zum definierten Zeitfenster von 6:30 - 9:00 Uhr passt und deshalb starten die Rolläden um 6:30 Uhr.
Ich glaube zumindest den Fehler, welchen ich mache, habe ich begriffen.
Der Workaround wäre von Dir, Damian
[({sunrise("REAL",0,"06:30","9:00")}+3600)]
was dann zu interpretieren ist: Sonnenaufgang z.B. 5:12 Uhr, Trigger jedoch erst um/ab 06:30, aber dann
zusätzlich um 60 Minuten verzögert.
Hab ich es verstanden? ???
Zitat von: Dracolein am 23 Juni 2021, 13:46:28
Ich bin geistig am Limit grade ;D 8)
Okay, aber ich komme dahinter, hoffe ich.
[{sunrise("REAL",3600,"06:30","9:00")}]
bedeutet bei echtem Sonnenaufgang um z.B. 05:12 Uhr sozusagen: Verzögere um 60 Minuten, aber frühestens um 06:30 Uhr.
Heißt: die Verzögerungszeit läge bei 06:12 Uhr, was wiederum nicht zum definierten Zeitfenster von 6:30 - 9:00 Uhr passt und deshalb starten die Rolläden um 6:30 Uhr.
Ich glaube zumindest den Fehler, welchen ich mache, habe ich begriffen.
Der Workaround wäre von Dir, Damian
[({sunrise("REAL",0,"06:30","9:00")}+3600)]
was dann zu interpretieren ist: Sonnenaufgang z.B. 5:12 Uhr, Trigger jedoch erst um/ab 06:30, aber dann zusätzlich um 60 Minuten verzögert.
Hab ich es verstanden? ???
So ist es.
Melde mich morgen früh mit Feedback, ob meine Frau unter der Dusche mich schreiend hergerufen hat, damit ich das Licht ausschalte oder die Rolläden stoppe 8) ;D
edit:
jetzt stimmen auch die Timer-Readings für morgen früh endlich. Da steht bereits 07:30 Uhr
Vielen Dank für Eure Hilfe.
Hallo zusammen, ich muss das Thema nochmals aufwärmen, obwohl an der Konfiguration seit Juni nichts geändert wurde.
Ich beobachte seit einigen Tagen, dass die Rolladen am Abend NICHT MEHR zur gewünschten Zeit herunterfahren und kann mir die Ursache nicht erklären.
Der letzte Doif-Strang ist gemeint:
DOELSEIF ([?Badrolloautomatikschalter:state] eq "on" and [{sunset("REAL",0,"15:00","22:30")}]) (set shelly5 pct 0, set shelly6 pct 0)
In den Readings des Doif-Devices stand auch vorher die vorgeplante Urzeit
timer_03_c03 03.09.2021 20:07:34
Aber zu genau dieser Uhrzeit passierte heute rein gar nichts - auch nicht im Event Monitor.
Ich habe dann etwas herumprobiert und mithilfe des "Zeitverzögerungs-Parameters der Funktion sunset den Eventzeitpunkt immer ein paar Minuten weiter nach hinten geschoben, um den Sachverhalt zu prüfen. Der einzige Faktor, den ich änderte, war die huedevice-Deckenlampen einzuschalten, sprich den Schalter umzulegen, damit sie im zigbee-Netzwerk aktiv sind. Dadurch änderte sich der Zustand von "not reachable" auf "off", logisch. Aber ich kann mir rein logisch keinen Reim draus machen, weshalb dieser Faktor auf den dritten DOIF-Strang eine Auswirkung haben könnte, denn in meinem o.g. Befehl, also das abendliche Herunterfahren dieser zwei Rolläden sollen die Zustände der Deckenlampen gar keine Rolle spielen ?!...
Auerdem bilde ich mir ein, dass es die letzten Wochen auch nie ein Thema war.
Sehr merkwürdig.
Immer list vom betroffenen DOIF von dem betroffenen Zustand liefern. Warum etwas geht oder nicht geht, kann man mit den wenigen Informationen nicht feststellen.