Aktuell habe ich für das Aussenlicht folgendes DOIF:
([Umwelt_Helligkeit_Aussen:state:d] < 50 and [15:00-([22:15]+int(rand(300)))]
or [([05:55]+int(rand(300)))-11:00] and [Umwelt_Helligkeit_Aussen:state:d] < 20
)
(set Licht_Aussen_Haustuer on)
DOELSE
(set Licht_Aussen_Haustuer off)
Jetzt will ich es aber erweitern, dass das Licht anbleibt wenn noch jemand weg ist:
([Bewohner:residentsAbsent]>0 and [22:00-0:00])
Allerdings hätte ich es gerne so, dass es noch 5Minuten anbleibt, wenn diese Anweisung nicht mehr true ist. Wie kann ich das machen? (Schlieslich will ich dem Aussenlicht nicht beim dunkelwerden zusehen)
Oder muss ich durTimerPresence_cr von jedem Roommate einzeln dafür verwenden,Residents wäre mir da lieber? Also in der Art:
[Andreas:state] eq "absent" and [Andreas:durTimerPresence_cr] <=5 and [22-0:00]?
nimmst Du einfach wait (https://fhem.de/commandref_DE.html#DOIF_wait)
Schöne Weihnachten
Otto
Danke für den Hinweis. Ich habe es jetzt das DOIF erstmal etwas aufgesplittet:
([Umwelt_Helligkeit_Aussen:state:d] < 50 and [15:00-([22:15]+int(rand(300)))] )
(set Licht_Aussen_Haustuer on)
DOELSEIF ([Umwelt_Helligkeit_Aussen:state:d] < 20 and [([05:55]+int(rand(300)))-11:00])
(set Licht_Aussen_Haustuer on)
DOELSEIF ([Umwelt_Helligkeit_Aussen:state:d] < 20 and [Bewohner:residentsAbsent]>0 and [22:15-06:00])
(set Licht_Aussen_Haustuer on)
DOELSE
(set Licht_Aussen_Haustuer off)
Aber wie soll ich da das wait einbauen? Soweit ich das verstehe, verzögert wait das schalten, also müsste ich es irgendwie beim set .... off reinbauen?
Hast Du denn meinen Link -> Doku nicht gelesen? Da steht doch wie es geht mit Beispielen :-\
Gruß Otto
doch natürlich habe ich dort nachgelesen.
Dort sind Beispiele gelistet, wie etwas erst ausgeführt wird, wenn z.b. die Bedingung x Sekunden true ist.
Bei mir wäre das dementsprechend der DOELSE Zweig mit set .... off, der erst nach einer bestimmten Teit ausgeführt werden soll. Aber dort habe ich ja keine Bedingung? => Mir feht der passende Ansatz
ZitatBeispieldefinition bei mehreren DO-Blöcken mit Befehlssequenzen:
DOIF (Bedingung1)
(set ...) ## erster Befehl der ersten Sequenz soll um eine Sekunde verzögert werden
(set ...) ## zweiter Befehl der ersten Sequenz soll um 2 Sekunden nach dem ersten Befehl verzögert werden
DOELSEIF (Bedingung2)
(set ...) ## erster Befehl der zweiten Sequenz soll um 3 Sekunden verzögert werden
(set ...) ## zweiter Befehl der zweiten Sequenz soll um 0,5 Sekunden nach dem ersten Befehl verzögert werden
attr <DOIF-module> wait 1,2:3,0.5
Du hast vier Sequenzen und die letzte soll verzögert werden, also
attr <> wait 0:0:0:300
Oder habe ich mich verzählt?
Zitat von: andi11 am 24 Dezember 2017, 13:07:27
doch natürlich habe ich dort nachgelesen.
Dort sind Beispiele gelistet, wie etwas erst ausgeführt wird, wenn z.b. die Bedingung x Sekunden true ist.
Bei mir wäre das dementsprechend der DOELSE Zweig mit set .... off, der erst nach einer bestimmten Teit ausgeführt werden soll. Aber dort habe ich ja keine Bedingung? => Mir feht der passende Ansatz
hier: Aber dort habe ich ja keine Bedingung?
Die wird nicht benötigt, es wird die Befehlsausführung verzögert.
Der Ansatz ist, für den letzten Zweig eine Wartezeit ins Attribut einzutragen.
ach so, dass es beim ELSE Zweig auch geht, darauf wäre ich nicht gekommen.
Und dass es bei den anderen Umständen jetzt einfach 5Minuten zu spät ausgeht, ist ja egal :)
Manchmal steht man echt auf dem Schlauch. Ich werds mal testen, danke derweil.
Zitat von: andi11 am 24 Dezember 2017, 14:03:13
ach so, dass es beim ELSE Zweig auch geht, darauf wäre ich nicht gekommen.
Und dass es bei den anderen Umständen jetzt einfach 5Minuten zu spät ausgeht, ist ja egal :)
Manchmal steht man echt auf dem Schlauch. Ich werds mal testen, danke derweil.
Wäre es nicht egal, könntest Du ein DOELSEIF-Zweig mit einer Bedingung für den speziellen Fall einfügen.
Zitat von: Ellert am 24 Dezember 2017, 14:12:33
Wäre es nicht egal, könntest Du ein DOELSEIF-Zweig mit einer Bedingung für den speziellen Fall einfügen.
Garnicht so einfach, da nehm ich lieber die 5Minuten Versatz in Kauf...
Zitat von: andi11 am 24 Dezember 2017, 14:03:13
ach so, dass es beim ELSE Zweig auch geht, darauf wäre ich nicht gekommen.
Wäre aber schnell getestet ;).
Zitat von: andi11 am 24 Dezember 2017, 14:19:10
Garnicht so einfach
DOELSEIF (1) ist relativ einfach!
Zitat von: Per am 28 Dezember 2017, 16:46:43
DOELSEIF (1) ist relativ einfach!
? Was meinst du damit?
Der ELSE-Zweig macht alles was übrig bleibt. (1) ist immer wahr, umfasst also auch alles, was an der Stelle noch übrig ist.
also ist es eigentlich genau das gleiche wie bei meiner Schreibweise weiter oben, oder nicht?
So einach ist es mit dem else Zweig verzögern extra aber nicht, denn dann müsste off nach "es wurde zu hell" getrennt von "jemand ist gekommen" behandelt werden.
Wenn du es trennen willst, geht natürlich kein ELSE. In keiner Programmiersprache dieser Welt. Denn du hast ja wieder je eine Bedingung.
Moin,
wie wird denn dein "alle sind weg" Zustand erzeugt? Bei mir ist es so, dass dabei sowieso ein paar Minuten gewartet wird. Ansonsten wäre ja immer mal einer weg obwohl er noch im Haus ist ;D
Damit ergibt sich doch automatisch der Effekt deiner 5 minuten.
Ansonsten kannst Du noch einen separaten DOELSEIF Zweig mit der Abfrage einbauen den Du verzögerst. Aber es wird immer komplizierter ::)
Gruß Otto
genau deswegen meinte ich es nicht so einfach, ohne diesen Schaltverzug IMMER zu haben.