DOIF: Reaktion auf zwei verschiedene Events?

Begonnen von Pfriemler, 22 März 2015, 11:01:28

Vorheriges Thema - Nächstes Thema

Pfriemler

Moinsen,

ich wollte schon länger fragen, wieso mein DOIF mit dem Ereignis-/Bedingungsteil

([Eingang6Taster_Btn_04]  =~ "Short" or [EGHaustuer:state] =~ "open")


sowohl beim Öffnen als auch beim Schließen der Haustür auslöst. Aber es ist richtig: Bei der Änderung des Status der Haustür wird das DOIF aufgerufen (do always) - und wenn Eingang6Taster als letztes kurz betastet wurde (wann auch immer), trifft die erste Bedingung zu, auch wenn die Haustür gerade geschlossen wurde. (Umgekehrt bleibt die Auslösung aus, wenn der Taster zuletzt lange gedrückt wurde).

Ich möchte aber die Anweisungen nur ausführen lassen, wenn das auslösende Ereignis der Taster ist (unabhängig vom Status der Haustür) ODER die Haustür öffnet (ohne dass der Taster dabei eine Rolle spielt). Bei einem notify trenne ich die Auslösebedingungen z.B. mit einem |, aber

([Eingang6Taster_Btn_04]  =~ "Short"|[EGHaustuer:state] =~ "open")

ändert an der Ausführung gar nichts.

Natürlich könnte ich jetzt diese einfache Sache auf ein Notify umbauen oder die zweite Auslösebedingung in ein DOELSEIF verlagern, mit kopiertem Ausführungsteil (finde ich aber nicht schön) - vielleicht bietet DOIF noch eine bessere Lösung?

"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Damian

Zitat von: Pfriemler am 22 März 2015, 11:01:28
Moinsen,

ich wollte schon länger fragen, wieso mein DOIF mit dem Ereignis-/Bedingungsteil

([Eingang6Taster_Btn_04]  =~ "Short" or [EGHaustuer:state] =~ "open")


sowohl beim Öffnen als auch beim Schließen der Haustür auslöst. Aber es ist richtig: Bei der Änderung des Status der Haustür wird das DOIF aufgerufen (do always) - und wenn Eingang6Taster als letztes kurz betastet wurde (wann auch immer), trifft die erste Bedingung zu, auch wenn die Haustür gerade geschlossen wurde. (Umgekehrt bleibt die Auslösung aus, wenn der Taster zuletzt lange gedrückt wurde).

Ich möchte aber die Anweisungen nur ausführen lassen, wenn das auslösende Ereignis der Taster ist (unabhängig vom Status der Haustür) ODER die Haustür öffnet (ohne dass der Taster dabei eine Rolle spielt). Bei einem notify trenne ich die Auslösebedingungen z.B. mit einem |, aber

([Eingang6Taster_Btn_04]  =~ "Short"|[EGHaustuer:state] =~ "open")

ändert an der Ausführung gar nichts.

Natürlich könnte ich jetzt diese einfache Sache auf ein Notify umbauen oder die zweite Auslösebedingung in ein DOELSEIF verlagern, mit kopiertem Ausführungsteil (finde ich aber nicht schön) - vielleicht bietet DOIF noch eine bessere Lösung?

Das könntest du mit Eventabfragen lösen. Diese sind nur zum Zeitpunkt des Triggers wahr, hier:

([Eingang6Taster_Btn_04:?Short]  or  [EGHaustuer:?open])


Es wird zukünftig möglich sein, mehrere unabhängige Bedingungen mit | zu trennen.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Pfriemler

Zitat von: Damian am 22 März 2015, 12:30:30
Das könntest du mit Eventabfragen lösen. Diese sind nur zum Zeitpunkt des Triggers wahr, hier:

([Eingang6Taster_Btn_04:?Short]  or  [EGHaustuer:?open])


HÄ? (augenreib) Ich hätte das jetzt glatt für einen Syntaxfehler gehalten, weil ich das Fragezeichen immer für eine reine Abfrage gehalten habe (also Prüfung der Bedingungung ohne Triggerauslösung) - quasi eher so:
([?Eingang6Taster_Btn_04]  =~ "Short" or [?EGHaustuer:state] =~ "open")
nur dass ich in diesem Falle vermutlich gar keine Reaktion erhalte, weil kein Trigger mehr erzeugt wird ...?

EGHaustuer:open etwa bringt auch sofort eine Fehlermeldung (es gibt kein solches Reading). Der Unterschied zu EGHaustuer:?open besteht demnach nicht in einer (triggerfreien) Abfrage des betreffenden readings, sondern vielmehr der Reaktion auf ein ein solches Event (also irgendwie näher am notify) ...
Das ist verwirrend, aber wie auch immer: es funktioniert perfekt! Danke für die Augenöffnung!
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Pfriemler

und
Zitat von: Damian am 22 März 2015, 12:30:30
Es wird zukünftig möglich sein, mehrere unabhängige Bedingungen mit | zu trennen.
In meinem obigen Beispiel funktioniert | derzeit offenbar wie or.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Damian

Zitat von: Pfriemler am 22 März 2015, 13:45:02
Der Unterschied zu EGHaustuer:?open besteht demnach nicht in einer (triggerfreien) Abfrage des betreffenden readings, sondern vielmehr der Reaktion auf ein ein solches Event (also irgendwie näher am notify) ...
Das ist verwirrend, aber wie auch immer: es funktioniert perfekt! Danke für die Augenöffnung!

Es kommt darauf an, wo du das Fragezeichen setzt. Vor dem Device-Namen gilt es als Abfrage, hinter dem Devicenamen mit Doppelpunkt reagiert es auf Events, so wie ein Notify. Zu beidem gibt es eine Erklärung und entsprechende Beispiele in der Commandref zu DOIF.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Pfriemler

Zitat von: Damian am 22 März 2015, 20:04:09
Zu beidem gibt es eine Erklärung und entsprechende Beispiele in der Commandref zu DOIF.
Das hatte ich nie bestritten  ;D ... nur erschließt es sich nicht sofort logisch. Und ich hatte es mehrfach_st überlesen.
Über das DOIF könnte man allein ein ganzes Kapitel im Einsteigerdoc oder im Wiki anlegen, so vielfältig wie die Möglichkeiten sind.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Damian

Zitat von: Pfriemler am 22 März 2015, 20:44:02
Das hatte ich nie bestritten  ;D ... nur erschließt es sich nicht sofort logisch. Und ich hatte es mehrfach_st überlesen.
Über das DOIF könnte man allein ein ganzes Kapitel im Einsteigerdoc oder im Wiki anlegen, so vielfältig wie die Möglichkeiten sind.

Im alten langen DOIF-Thread kannst du irgendwo die Vorgeschichte zu ? nachlesen ;) Nur kurz an dieser Stelle, es ist nicht ganz zufällig entstanden.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF