FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: andi11 am 24 Dezember 2017, 09:57:59

Titel: DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag von: andi11 am 24 Dezember 2017, 09:57:59
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]?

Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag von: Otto123 am 24 Dezember 2017, 10:42:49
nimmst Du einfach wait (https://fhem.de/commandref_DE.html#DOIF_wait)

Schöne Weihnachten
Otto
Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag von: andi11 am 24 Dezember 2017, 11:28:55
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?
Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag von: Otto123 am 24 Dezember 2017, 13:02:53
Hast Du denn meinen Link -> Doku nicht gelesen? Da steht doch wie es geht mit Beispielen  :-\

Gruß Otto
Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag 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
Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag von: Otto123 am 24 Dezember 2017, 13:11:33
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?
Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag von: Ellert am 24 Dezember 2017, 13:12:23
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.
Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag 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.
Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag von: Ellert am 24 Dezember 2017, 14:12:33
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.
Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag von: andi11 am 24 Dezember 2017, 14:19:10
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...
Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag von: Per am 28 Dezember 2017, 16:46:43
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!
Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag von: andi11 am 28 Dezember 2017, 19:45:47
Zitat von: Per am 28 Dezember 2017, 16:46:43
DOELSEIF (1) ist relativ einfach!
? Was meinst du damit?
Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag von: Per am 29 Dezember 2017, 00:33:15
Der ELSE-Zweig macht alles was übrig bleibt. (1) ist immer wahr, umfasst also auch alles, was an der Stelle noch übrig ist.
Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag von: andi11 am 29 Dezember 2017, 11:00:07
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.
Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag von: Per am 29 Dezember 2017, 11:17:10
Wenn du es trennen willst, geht natürlich kein ELSE. In keiner Programmiersprache dieser Welt. Denn du hast ja wieder je eine Bedingung.
Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag von: Otto123 am 29 Dezember 2017, 11:23:47
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
Titel: Antw:DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul
Beitrag von: andi11 am 29 Dezember 2017, 14:09:07
genau deswegen meinte ich es nicht so einfach, ohne diesen Schaltverzug IMMER zu haben.