DoIF einzelnes Kommando erst nach Zeitablauf

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

Vorheriges Thema - Nächstes Thema

geforce28

Hallo Leute,

keine Ahnung, ob das überhaupt irgendwie funktioniert, aber ich habe folgende Anforderung...:

in folgendem definiertem DOIF sind ja 4 Kommandos die ausgeführt wären, die da wären:

set WZ.Tuer.Motorlaeuft inactive
set WZ.Rollo.Tuer pct 20
set WZ.Tuer.Lueftungsmodus.Status on
set WZ.Tuer.Motorlaeuft active


hier der komplette DOIF:
define WZ.Tuer.LueftungsmodusAn DOIF ([WZ.Rollo.Tuer:pct] < 20 and [WZ.Senor.Tuer] eq "open") (set WZ.Tuer.Motorlaeuft inactive, set WZ.Rollo.Tuer pct 20, set WZ.Tuer.Lueftungsmodus.Status on)


Nun möchte ich, dass das letzte Kommando "set WZ.Tuer.Motorlaeuft active" erst nach 10 Sekunden nachdem das Kommando "set WZ.Tuer.Lueftungsmodus.Status on" ausgeführt wurde, ausgeführt wird.

Ist das möglich ?
Sorry, ich weiß etwas kompliziert, aber dafür ist das Forum ja hoffentlich da :) !

Vielen Dank schonmal im Voraus !

fischit

#1
attr WZ.Tuer.LueftungsmodusAn wait 0,0,10

Damit sollte das letzte Set nach 10 Sekunden ausgeführt werden, die drei vorher sofort.

Ich meine dafür musst du deinen Ausführungsteil abändern:
(set WZ.Tuer.Motorlaeuft inactive)(set WZ.Rollo.Tuer pct 20)(set WZ.Tuer.Lueftungsmodus.Status on)

geforce28

Danke!

Nach ein wenig rumprobieren klappt es jetzt.
Allerdings hat es zuerst nicht geklappt.

Erst nachdem ich noch zusätzlich das "attr do always" gesetzt habe.
Kannst du erklären, warum dies gesetzt werden muss und wozu es dar ist ?

Aus dem Wiki Artikel geht das für mich nicht verständlich hervor... :(

Vielen Dank im Voraus.

Ellert

#3
Was genau ist an dem Wiki-Artikel für Dich unverständlich? Deine Antwort könnte den Artikel verbessern.

Ist die Erklärung in der Befehlsreferenz für Dich verständlicher?

geforce28

Weiß nicht, wie ich es beschreiben soll, was ich nicht verstehe...
Ich verstehe eigentlich den Grundsatz von dem nicht, was "do always" tut ...
Ich habe andere DOIF's ohne "do always" die auch mehr als 1x funktionieren, also immer wenn die IF Bedingung erfüllt wird.

In der Commandref ist das "do always" für mich genau so unverständlich...
Vielleicht hat ja nochmal einer die Güte mir das kurz etwas näher / verständlicher zu erläutern ! :)

Ellert

Wenn Du nicht sagen kannst, was Du nicht verstehst ist es schwer Dir zu helfen. Ich halte die Aussage in der Befehlsreferenz für verständlich.
ZitatDas DOIF-Modul arbeitet mit Zuständen. Jeder Ausführungszweig DOIF/DOELSEIF..DOELSEIF/DOELSE stellt einen eigenen Zustand dar (cmd_1, cmd_2, usw.). Das Modul merkt sich den zuletzt ausgeführten Ausführungszweig und wiederholt diesen standardmäßig nicht. Ein Ausführungszweig wird erst dann wieder ausgeführt, wenn zwischenzeitlich ein anderer Ausführungszweig ausgeführt wurde, also ein Zustandswechsel stattgefunden hat.

geforce28

Also vielleicht bin ich einfach zu doof, aber es ist für mich nicht verständlich... !

Vielleicht können wir das ja nochmal anhand meines Falles von oben als Beispiel aufzeigen...

Also, Beispiel:
Ich habe eine DOIF Bedingung, die erfüllt werden muss.
Wenn diese erfüllt ist, werden 4 Kommandos ausgeführt.

Das 4. Kommando soll erst nach 10 Sekunden ausgeführt werden.
Also habe ich wie oben geschrieben das Attribut "wait 0,0,0,10" gesetzt.


Kannst du erklären, wie sich das ganze verhält, wenn ich kein do always aktiviere und wenn ich es aktiviere.
(Mit aktiviertem Do always) läuft es ja, aber ich verstehe nicht warum !

Vielen Dank für deine Geduld :)

KernSani

Ich versuche es mal in einfache Worten. Wenn dein DOIF CMD_1 ausgeführt hat, wird es CMD_1 nicht nocheinmal ausführen solange es im Status CMD_1 bleibt, auch wenn die Bedingungen erneut eintreten.
Mit do always wird CMD_1 auch ausgeführt, wenn der Status CMD_1 ist.
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Ellert

Und hier noch einmal mit anderen Worten.
Zitatwenn ich kein do always aktiviere
Das hast Du doch schon selbst beobachtet.

Es wird der Befehlsteil einmal ausgeührt und erst, wenn vorher der Zustand cmd_2 eingetreten ist, dann wird nach Prüfen der Bedingung und erfüllter Bedingung, der Befehlsteil erneut ausgeführt.

Zitatwenn ich es aktiviere

Es wird immer geschaltet, egal ob Zustand cmd_2 zwischendurch eintritt.

Die Worte "do always" stammen aus der englischen Sprache und können mit "tue es immer" übersetzt werden.

geforce28

Okay, ich danke euch... ! :)

Aber wieso wird das 4. Set-Kommando nicht ausgeführt, wenn ich "do always" deaktiviert habe ?
Es müssten dann doch trotzdem alle 4 Kommandos 1x ausgeführt werden.
Das ist ja genau, was ich möchte !

Ellert

wait-Timer werden abgebrochen, wenn ein Zustandswechsel stattfindet während sie laufen.

geforce28

Ah okay, gibt es eine Art "ignore" Modus, dass sie eben nicht abgebrochen werden, den man einstellen kann ?

Ellert

Du könntest in einem DOELSEIF-Zweig eine Bedingung formulieren, die einen vorzeitigen Statuswechsel verhindert.

geforce28

Okay, wie würde sowas dann aussehen ? ;)

Also der Status der sich verändert ist bei mir dieser:
[WZ.Rollo.Fenster:pct] < 20

Sobald das Rollo auf 20% ist, was relativ schnell geht, ist die DOIF Bedingung nicht mehr gültig.

Vielen vielen Dank nochmals für eure Hilfe :)

Ellert

Zitat von: geforce28 am 14 Januar 2018, 19:33:55
Okay, wie würde sowas dann aussehen ? ;)

Also der Status der sich verändert ist bei mir dieser:
[WZ.Rollo.Fenster:pct] < 20

Sobald das Rollo auf 20% ist, was relativ schnell geht, ist die DOIF Bedingung nicht mehr gültig.

Vielen vielen Dank nochmals für eure Hilfe :)

Leg mal was vor, das etwa so aussieht ;)

DOELSEIF (<eine Bedingung die nur dann wahr wird, wenn der letzte Befehl des 1. Zweiges abgearbeitet ist.>)