Hallo,
versuche mich gerade in DOIF einzuarbeiten und habe da mal eine Frage zu der ich bisher keine Lösung gefunden habe.
Weder in der CommandRef noch im Wiki oder einem anderen Dokument wird wirklich auf die logische Verknüpfung von Bedingungen eingegangen.
Es steht zwar geschrieben das man diese mit "and" und "or" verknüpfen kann, doch finde ich keine Angaben dazu ob es möglich ist "and" und "or" zu kombinieren.
Also wenn Bedingung1 und Bedingung2 oder Bedingung3 zutreffen oder Bedingung1 und Bedingung2 oder Bedingung1 und Bedingung3.
Gibt es noch weitere Dokumente außer den von mir genannten in denen dazu etwas geschrieben steht?
Man kann and und or beliebig kombinieren, dabei sollte man die Rangfolge beachten und entsprechend klammern. Die logische Auswertung geschieht durch den Perl-Interpreter, also gelten alle Regeln von Perl. Neben and und or gibt es noch 45 weitere Operatoren, siehe: http://www.schmidma.de/selfhtml/perl/sprache/operatoren.htm
Hallo,
wenn ich das richtig sehe geht das also nur im Perl-Modus, oder? Hatte mich erst einmal zum Einstieg auf den Fhem-Modus konzentriert.
Leider sehe ich auch in dem verlinkten Beitrag nirgendwo Beispiele für Mehrere mit Klammern versehene Bedingungen, nur die logische Rangfolge wird aufgelistet.
Wie müsste es denn richtig sein wenn beispielweise Bedingung1 oder Bedingung2 jeweils mit Bedingung3 zutrreffend sein sollten?
if((Bedingung1== xxx and Bedingung3== xxx) or (Bedingung2== xxx and Bedingung3== xxx))
oder muss es so lauten:
if(((Bedingung1== xxx) and (Bedingung3== xxx)) or ((Bedingung2== xxx) and (Bedingung3== xxx)))
Gilt die Klammersetzung vielleicht doch auch im Fhem-Modus?
(([<Device1>:<Reading>] > 0 and [<Device3>:<Reading>] eq "present") or ([<Device2>:<Reading>] > 0 and [<Device3>:<Reading>] > 0))
bzw.
((([<Device1>:<Reading>] > 0) and ([<Device3>:<Reading>] eq "present")) or (([<Device2>:<Reading>] > 0) and ([<Device3>:<Reading>] > 0)))
Die genannten Regeln gelten für FHEM- und Perl-Modus
Zitat von: Superposchi am 31 Oktober 2020, 17:24:36
Wie müsste es denn richtig sein wenn beispielweise Bedingung1 oder Bedingung2 jeweils mit Bedingung3 zutrreffend sein sollten?
if((Bedingung1== xxx and Bedingung3== xxx) or (Bedingung2== xxx and Bedingung3== xxx))
kann man machen , ich würdes es aber anders angehen :
Bedingung3== xxx willst du immer, also kommt die ganz nach vorne, denn ist sie
nicht wahr ist der Rest der Zeile völlig egal und muß vom Interpreter auch nicht weiter geprüft werden.
Daraus ergäbe sich für mich :
if ( (Bedingung3 == xxx) && ( (Bedingung1 == xxx) || (Bedingung2 == xxx) ) )
Ich neige allgemein dazu mehr Klammern zu setzen als wirklich nötig, aber so arbeitet der Parser in meinem Hirn leichter beim lesen :)