DoIF einzelnes Kommando erst nach Zeitablauf

Begonnen von geforce28, 13 Januar 2018, 21:08:40

Vorheriges Thema - Nächstes Thema

KernSani

#15
Bevor du dir da einen abbrichst mit Hilfskonstrukten (wobei ich mir durchaus vorstellen kann, dass ellert oder damian auch eine elegante Lösung finden): Schiess doch dein letztes Kommando mit einem guten, alten AT los...

Edit: und während ich das schreibe kommt ellert mit einem Ansatz :-)
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Damian

#16
Normalerweise wird die Abarbeitung abgebrochen, wenn ein anderer Zustand (cmd_2) zuschlägt. Das ist der Normalfall, denn mit einem neuen Zustand ist das Vorhaben (hier eine verzögerte Ausführung) passé.

Das lässt sich mit einem einfachen sleep umgehen: (set bla 1, set bla 2,sleep 10;set bla 3)

Hier wird auf jeden Fall set bla 3 ausgeführt. Die Frage ist nur: Will man das wirklich, wenn sich die Bedingung bereits verändert hat, hier >= 20.

Edit: Ich würde überlegen, was im DOELESIF-Fall (>= 20) passieren soll, vielleicht erledigt sich dann dein Vorhaben den letzten Befehl auf jeden Fall ausführen zu wollen, wenn er schon längst nicht mehr aktuell ist.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

geforce28

#17
So, also habe jetzt folgendes Konstrukt gebaut und es scheint zu funktionieren...
Hätte aber trotzdem gerne mal eure Meinung, ob das so jetzt optimal umgesetzt ist ?

([WZ.Rollo.Fenster:pct] < 20 and [WZ.Sensor.Fenster] eq "open") (set WZ.Fenster.Motorlaeuft inactive)(set WZ.Rollo.Fenster pct 20)(set WZ.Fenster.Lueftungsmodus.Status on)
DOELSEIF ([WZ.Rollo.Fenster:pct] == 20 and [WZ.Sensor.Fenster] eq "open") (set WZ.Fenster.Motorlaeuft active)


Und als attr: "wait 0,0,0:20".

Was ich damit wie gesagt bezwecken möchte ist folgendes:
Es sollen die ersten 3 "CMD'S"
(set WZ.Fenster.Motorlaeuft inactive)(set WZ.Rollo.Fenster pct 20)(set WZ.Fenster.Lueftungsmodus.Status on)
abgearbeitet werden ohne pause. Währenddessen ändert sich der Status aber, weil
[WZ.Rollo.Fenster:pct] < 20 nicht mehr gültig ist, sondern [WZ.Rollo.Fenster:pct] == 20 gültig wird.

Wenn dies der fall ist soll nach 20 sekunden Zeitablauf folgendes Kommando ausgeführt werden:
(set WZ.Fenster.Motorlaeuft active)

EDIT:
Wird das DOELSEIF jetzt wirklich nur dann ausgeführt, wenn das erste DOIF ausgeführt wurde und anschließend die Bedingungen des DOIF's ungültig wurde?

Per

Vorsicht: du könntest eine Selbsttriggerung benötigen!

Zitat von: geforce28 am 16 Januar 2018, 16:14:46
Und als attr: "wait 0,0,0:20".
Wenn du keine weiteren Attribute vergibst, ist wait 0,0,0 selten notwendig. Hier z.B. nicht.
([WZ.Rollo.Fenster:pct] < 20 and [WZ.Sensor.Fenster] eq "open") (set WZ.Fenster.Motorlaeuft inactive,set WZ.Rollo.Fenster pct 20,set WZ.Fenster.Lueftungsmodus.Status on)
DOELSEIF ([WZ.Rollo.Fenster:pct] == 20 and [WZ.Sensor.Fenster] eq "open") (set WZ.Fenster.Motorlaeuft active)

wait 0:20
macht das Gleiche mit weniger Last.

Ellert

Zitat von: geforce28 am 16 Januar 2018, 16:14:46
So, also habe jetzt folgendes Konstrukt gebaut und es scheint zu funktionieren...
Hätte aber trotzdem gerne mal eure Meinung, ob das so jetzt optimal umgesetzt ist ?

([WZ.Rollo.Fenster:pct] < 20 and [WZ.Sensor.Fenster] eq "open") (set WZ.Fenster.Motorlaeuft inactive)(set WZ.Rollo.Fenster pct 20)(set WZ.Fenster.Lueftungsmodus.Status on)
DOELSEIF ([WZ.Rollo.Fenster:pct] == 20 and [WZ.Sensor.Fenster] eq "open") (set WZ.Fenster.Motorlaeuft active)


Und als attr: "wait 0,0,0:20".

Was ich damit wie gesagt bezwecken möchte ist folgendes:
Es sollen die ersten 3 "CMD'S"
(set WZ.Fenster.Motorlaeuft inactive)(set WZ.Rollo.Fenster pct 20)(set WZ.Fenster.Lueftungsmodus.Status on)
abgearbeitet werden ohne pause. Währenddessen ändert sich der Status aber, weil
[WZ.Rollo.Fenster:pct] < 20 nicht mehr gültig ist, sondern [WZ.Rollo.Fenster:pct] == 20 gültig wird.

Wenn dies der fall ist soll nach 20 sekunden Zeitablauf folgendes Kommando ausgeführt werden:
(set WZ.Fenster.Motorlaeuft active)

EDIT:
Wird das DOELSEIF jetzt wirklich nur dann ausgeführt, wenn das erste DOIF ausgeführt wurde und anschließend die Bedingungen des DOIF's ungültig wurde?

Ich würde eher gegen den Status cmd_1 verriegeln, denn der wird erst erreicht, wenn der letzte Befehl abgesetzt wurde, also
DOELSEIF ([WZ.Rollo.Fenster:pct] == 20 and [WZ.Sensor.Fenster] eq "open" and [$SELF] eq "cmd_1")
und nur notwendige Sequenzen erstellen
(set WZ.Fenster.Motorlaeuft inactive, set WZ.Rollo.Fenster pct 20)(set WZ.Fenster.Lueftungsmodus.Status on)

und die Attribute
wait 0,10:1
selftrigger wait

ohne do always


geforce28

Was heißt "könnte ?
Und wozu ?

Okay, das mit dem wait 0:20 macht sinn. ;)


Was ist denn nun die "bessere" Variante...
Die mit dem DOELSEIF oder den Vorschlag von Demian mit sleep.
(set bla 1, set bla 2,sleep 10;set bla 3)

Hat die Variante mit Sleep irgendwelche vor / Nachteile ?

Ellert

Zitat von: geforce28 am 16 Januar 2018, 17:18:09
Was heißt "könnte ?
Und wozu ?

Okay, das mit dem wait 0:20 macht sinn. ;)


Was ist denn nun die "bessere" Variante...
Die mit dem DOELSEIF oder den Vorschlag von Demian mit sleep.
(set bla 1, set bla 2,sleep 10;set bla 3)

Hat die Variante mit Sleep irgendwelche vor / Nachteile ?
Mir stellt sich eine ganz andere Frage. Ist es wirklich erforderlich, das [WZ.Rollo.Fenster:pct] < 20 das DOIF triggert, wenn nicht, würde das ursprüngliche wait nicht zurück gesetzt werden und es wäre wahrscheinlich kein DOELSEIF erforderlich.

geforce28

JA es ist erforderlich.

Aber nochmal bitte zurück zu meiner Frage...

Zitat von: geforce28 am 16 Januar 2018, 17:18:09
Was heißt "könnte ?
Und wozu ?

Okay, das mit dem wait 0:20 macht sinn. ;)


Was ist denn nun die "bessere" Variante...
Die mit dem DOELSEIF oder den Vorschlag von Demian mit sleep.
(set bla 1, set bla 2,sleep 10;set bla 3)

Hat die Variante mit Sleep irgendwelche vor / Nachteile ?

Damian

Zitat von: geforce28 am 16 Januar 2018, 19:12:58
JA es ist erforderlich.

Aber nochmal bitte zurück zu meiner Frage...

Wie schon geschrieben wird sleep im Gegensatz zu wait nicht unterbrochen.

Unabhängig davon doktern wir an Symptomen, ohne genau zu wissen, was die ganze Schaltung bezwecken soll.

Als nächstes wird die Frage auftauchen: Was ist mit dem Fall > 20?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

geforce28

#24
Also, sorry, ich möchte das ganze dann mal konkretisieren.

Wenn die Rollade unter 20% ist & das Fenster geöffnet wird (Fenstersensor), soll die Rollade auf 20% fahren.
Dann wird der sog. "Lüftungsmodus" -> Dummy aktiviert.

Wenn anschließend manuell die Rollade gefahren wird, soll der Lüftungsmodus deaktiviert werden.
Wenn die Rollade aber nicht manuell gefahren wird und das Fenster wieder geschlossen wird, soll die Rollade auf 0% fahren.

Zur Prüfung, ob die Rollade gefahren wird, habe ich mir ein Notify gebaut, was prüft, ob der Motor fährt (UP oder Down) und dann den Lüftungsmodus deaktiviert.
define WZ.Fenster.Motorlaeuft notify (WZ.Rollo.Fenster:.*down.*|WZ.Rollo.Fenster:.*up.*) set WZ.Fenster.Lueftungsmodus.Status off