DOIF Ereignissteuerung und DOELSE mit wait

Begonnen von Flachzange, 15 Februar 2021, 22:35:37

Vorheriges Thema - Nächstes Thema

Flachzange

Ich nutze bei DOIF sehr gerne Trigger über Events, um gleich eine ganze Gruppe von Devices auszuwerten, ohne diese spezifizieren zu müssen. Zum Beispiel der Klassiker, ob eines der vielen Fenster auf ist, um dann gleich auszugeben, welches es ist. Jetzt habe ich gleichzeitig aber auch häufig den Fall, dass ich es mit wait und/oder repeatcmd verbinde, um nicht direkt eine Aktion auszulösen. Beim Fenster z. B. erst nach 15 Minuten und dann noch ein weiteres Mal nach 30 Minuten. Damit in diesem Fall beim Schließen des Fensters der wait timer abgebrochen wird, muss der Bedingungsteil unwahr werden. Dies ist bei Eventtriggern jedoch nie der Fall. Bei den Fenstern konnte ich mir eine Lösung über eine zwischengeschaltete structure bauen, nun habe ich aber eine Problemstellung, bei der das nicht funktioniert.

Ich habe (Engery-Harvesting-)Heizkörper-Stellantriebe, welche manchmal in der Nullstellung nicht ganz schließen und damit den Raum aufheizen. Das kann ich erkennen, wenn der Energy Harvester läuft (Reading engeryInput = enabled), obwohl der setpoint auf 0 steht. In diesem Falle möchte ich nach einer Stunde benachrichtigt werden und ein Init auf den jeweiligen Stellantrieb fahren, was das behebt. Nachfolgend das DOIF, welches die energyInput-Events aller Stellantriebe mit Bezeichnung "Stellantrieb_XY" einfängt:

di DOIF (["Stellantrieb_:energyInput:.enabled"] and [$DEVICE:setpoint] == 0)({...do something...})
attr di wait 3600


Jetzt möchte ich ähnlich dem Fensterbeispiel oben, dass der wait timer natürlich nicht durchläuft, wenn sich innerhalb der ersten Stunde der Zustand des Stellantriebs ändert, so dass die Bedingung nicht mehr wahr ist.

Bei klassischer Ereignissteuerung füge ich ein DOELSE an, so dass bei nicht wahrem Ereignis in cmd_2 gewechselt wird.

Wie löse ich es geschickt, dass ich im Prinzip ein generisches DOIF habe, welches den waittimer löscht, sobald für den Trigger, welcher den Waittimer ausgelöst hat, die Bedingung nicht mehr erfüllt ist?

Hinweis in die richtige Richtung reicht mir schon.

Sollte ich noch etwas falsch aufgefasst haben, gerne korrigieren :-)

Danke euch!

Gruß
Chris

xenos1984

Ich würde es im DOIF Perl-Modus versuchen. Sobald ein aktivierendes Event kommt, einen Ausführungstimer starten, dessen Name den des sendenden Gerätes enthält. Wenn ein deaktivierendes Event kommt, den Timer löschen, falls er gesetzt ist.

http://fhem.de/commandref_DE.html#DOIF_Ausf%C3%BChrungstimer

Damian

#2
Im DOIF-FHEM Modus lässt sich das mit einem DOIF nicht realisieren, wenn man davon ausgeht, dass man mehrere Heizkörper-Stellantriebe verwalten muss. Pro Stellantrieb muss es dann ja einen Timer geben. Im DOIF-FHEM Modus gibt es aber nur einen Wait-Timer.

Daher muss man auf DOIF-Perl ausweichen. Dort kann man, wie schon von @xenos1984 erwähnt, mit set_Exec für jedes Device (Stellantrieb) einen eigenen Timer verwalten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Flachzange

Vielen Dank euch beiden für diesen Hinweis. Das war genau das Puzzlestück!