Mehrere DOIFS in einem? Sollte doch gehen, oder?

Begonnen von misux, 27 April 2018, 07:12:54

Vorheriges Thema - Nächstes Thema

Otto123

Hi blade-of-fire,
Damit hast Du meine Theorie bestätigt und die richtige Lösung selbst gefunden.  :D

Doku lesen hilft wie so oft:
ZitatBei der Abarbeitung der Bedingungen, werden nur die Bedingungen überprüft, die zum ausgelösten Event das dazughörige Device bzw. die dazugehörige Triggerzeit beinhalten. Mit dem Attribut checkall lässt sich das Verhalten so verändern, dass bei einem Event-Trigger auch Bedingungen geprüft werden, die das triggernde Device nicht beinhalten. Folgende Parameter können angegeben werden:

checkall event Es werden alle Bedingungen geprüft, wenn ein Event-Trigger auslöst.
checkall timer Es werden alle Bedingungen geprüft, wenn ein Timer-Trigger auslöst.
checkall all   Es werden grundsätzlich alle Bedingungen geprüft.

Zu beachten ist, dass bei einer wahren Bedingung die dazugehörigen Befehle ausgeführt werden und die Abarbeitung immer beendet wird - es wird also grundsätzlich immer nur ein Befehlszweig ausgeführt und niemals mehrere.

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

Damian

Zitat von: blade-of-fire am 27 April 2018, 10:30:58
Für die Logik des Ablaufs sollte doch egal sein, aus welchem Grund die Bedingung Wahr oder Unwahr ist.

So ist das normalerweise bei einer strukturierter Programmierung.

Bei DOIF ist es etwas anders, hier stehen die Trigger im Vordergrund, daher wird nicht jeder Zweig ausgewertet, dieses Verfahren hat sich beim DOIF bewährt, Zitat aus der Commandref:

ZitatZu beachten ist, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event das dazughörige Device bzw. die dazugehörige Triggerzeit beinhalten. Kommt ein Device in mehreren Bedingungen vor, so wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist.

Du kannst das Verhalten über das checkall-Attribut verändern. Aber auch dort wird maximal immer nur ein Zweig pro Trigger ausgeführt. Wenn komplette Unabhängigkeit von Ausführungszweigen innerhalb eines DOIF-Moduls gefordert ist, was der strukturierten Programmierung eher entspricht, dann kann ich nur auf DOIF-Perl verweisen: https://fhem.de/commandref_DE.html#DOIF_Perl_Modus

Dort kann man sich nach belieben austoben, Voraussetzung: geringe Perlkenntnisse.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

blade-of-fire

Ja, da hast du Recht, Lesen hilft oftmals weiter  :-[

In dem Fall bin ich fälschlicherweise davon ausgegangen, dass die Bedingungen immer komplett durchlaufen werden. Ich hatte das in irgendeinem Forumsbetrag gelesen und nicht angezweifelt.

Durch setzen des Attributs checkall funktioniert es jetzt wie gewollt, ggf werde ich aber dennoch auf die DOIF-Perl Variante umsteigen.

Danke :)
VM mit Ubuntu und FHEM-Instanz (Hauptinstanz)
FHEM2FHEM
Raspberry Pi 3 B+ mit Eigenbau-Platine + Relais-Platine + Cul-Stick + FHEMDuino