DOIF "solange bis true und noch ein paar Minuten länger" bei ResidentsModul

Begonnen von andi11, 24 Dezember 2017, 09:57:59

Vorheriges Thema - Nächstes Thema

andi11

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


Otto123

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

andi11

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?

Otto123

Hast Du denn meinen Link -> Doku nicht gelesen? Da steht doch wie es geht mit Beispielen  :-\

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

andi11

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

Otto123

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

Ellert

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.

andi11

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.

Ellert

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.

andi11

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

Per

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!


Per

Der ELSE-Zweig macht alles was übrig bleibt. (1) ist immer wahr, umfasst also auch alles, was an der Stelle noch übrig ist.

andi11

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.

Per

Wenn du es trennen willst, geht natürlich kein ELSE. In keiner Programmiersprache dieser Welt. Denn du hast ja wieder je eine Bedingung.