Hauptmenü

DOIF mit "or" und "and"

Begonnen von ThomasMagnum, 31 März 2017, 14:22:59

Vorheriges Thema - Nächstes Thema

ThomasMagnum

Hallo,

ich möchte ein DOIF zur Steuerung meines Rollos implementieren. In diesem DOIF soll geprüft werden ob Bedingung1 entweder 1, 2 oder 3 ist und Bedingung2 und Bedingung 3 muss erfüllt sein. Nach lesen des Artikels "DOIF/Operatorenrangfolge" in der Wiki müsste meinem Verständnis nach die DEF folgenderm. aussehen.

([Bedingung1:state] eq "1" || [Bedingung1:state] eq "2" || [Bedingung1:state] eq "3" and [Bedingung2] eq "n" [Bedingung3] > 20 ) (set Rollo on)

Habe ich das richtig verstanden oder bin ich auf dem Holzweg?
Eingebaut und getestet habe ich das noch nicht, da ich kein Testsystem habe und nicht irgendwas im produktiven FHEM implementieren möchte.

Gruß, Thomas

Jorge3711

Zwischen Bedingung2 und Bedingung3 fehlt ein "and". Ansonsten würde ich sage passt das.

Damian

Zitat von: ThomasMagnum am 31 März 2017, 14:22:59
Hallo,

ich möchte ein DOIF zur Steuerung meines Rollos implementieren. In diesem DOIF soll geprüft werden ob Bedingung1 entweder 1, 2 oder 3 ist und Bedingung2 und Bedingung 3 muss erfüllt sein. Nach lesen des Artikels "DOIF/Operatorenrangfolge" in der Wiki müsste meinem Verständnis nach die DEF folgenderm. aussehen.

([Bedingung1:state] eq "1" || [Bedingung1:state] eq "2" || [Bedingung1:state] eq "3" and [Bedingung2] eq "n" [Bedingung3] > 20 ) (set Rollo on)

Habe ich das richtig verstanden oder bin ich auf dem Holzweg?
Eingebaut und getestet habe ich das noch nicht, da ich kein Testsystem habe und nicht irgendwas im produktiven FHEM implementieren möchte.

Gruß, Thomas

Wahrscheinlich meinst du das aber so:
(([Bedingung1:state] eq "1" or [Bedingung1:state] eq "2" or [Bedingung1:state] eq "3") and [Bedingung2] eq "n" and [Bedingung3] > 2)...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

ThomasMagnum

Hallo Jorge3711, hallo Damian,

vielen Dank für eure Hilfen / Kommentare.
Nur noch mal für mich zum Verständnis, die Klammersetzung um den Block der Bedingung1 sorgt dafür das diese separat zu den Bedingungen2 und 3 behandelt werden - richtig?
Also entweder Bedingung1-1 oder Bedingung1-2 oder Bedingung1-3 und dann noch Bedingung2 und Bedingung3.

Aber was bedeuten dann die ||? Ich dachte nach dem Lesen des Artikels das dies genau in solch einem Fall zu nutzen ist. Wobei mir die Variante mit der "inneren" Klammer nach dem Vorbild des Klammerechnens natürlich lieber ist.  ;)

Gruß, Thomas

Damian

Zitat von: ThomasMagnum am 01 April 2017, 00:54:51
Hallo Jorge3711, hallo Damian,

vielen Dank für eure Hilfen / Kommentare.
Nur noch mal für mich zum Verständnis, die Klammersetzung um den Block der Bedingung1 sorgt dafür das diese separat zu den Bedingungen2 und 3 behandelt werden - richtig?
Also entweder Bedingung1-1 oder Bedingung1-2 oder Bedingung1-3 und dann noch Bedingung2 und Bedingung3.

Aber was bedeuten dann die ||? Ich dachte nach dem Lesen des Artikels das dies genau in solch einem Fall zu nutzen ist. Wobei mir die Variante mit der "inneren" Klammer nach dem Vorbild des Klammerechnens natürlich lieber ist.  ;)

Gruß, Thomas

1. || entspricht or, genauso wie && and entspricht
2. and hat eine höhere Rangstufe als or  (so wie Punkt- vor Strichrechnung), daher musst du entsprechend mit Klammern arbeiten
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Zitat von: Damian am 01 April 2017, 08:54:48
1. || entspricht or, genauso wie && and entspricht
2. and hat eine höhere Rangstufe als or  (so wie Punkt- vor Strichrechnung), daher musst du entsprechend mit Klammern arbeiten

Doch || hat eine höhere Rangstufe als and, daher können die Klammern entfallen

A || B and C entspricht (A or B) and C

Damian

Zitat von: Ellert am 01 April 2017, 11:46:06
Doch || hat eine höhere Rangstufe als and, daher können die Klammern entfallen

A || B and C entspricht (A or B) and C

Das ist richtig, genauso wie && höhere Rangstufe als and hat. Ich finde, dass gerade für Anfänger or bzw. and besser verständlich ist. Eine Mischung aus || or and && halte ich für ungünstig, denn dann kommt man mit den Rangstufen noch mehr durcheinander und die Regel: Punkt- (and) vor Strichrechnung (or) ausgehebelt wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Zitat von: Damian am 01 April 2017, 12:44:28
Das ist richtig, genauso wie && höhere Rangstufe als and hat. Ich finde, dass gerade für Anfänger or bzw. and besser verständlich ist. Eine Mischung aus || or and && halte ich für ungünstig, denn dann kommt man mit den Rangstufen noch mehr durcheinander und die Regel: Punkt- (and) vor Strichrechnung (or) ausgehebelt wird.

Es war nicht als Empfehlung gedacht, sondern als Ergänzung. Der Artikel https://wiki.fhem.de/wiki/DOIF/Operatorenrangfolge auf den sich ThomasMagnum vermutlich bezog, sollte deutlich machen, dass man die Operatorentypen nur mit Vorsicht mischen sollte.

Damian

Zitat von: Ellert am 01 April 2017, 18:27:33
Es war nicht als Empfehlung gedacht, sondern als Ergänzung. Der Artikel https://wiki.fhem.de/wiki/DOIF/Operatorenrangfolge auf den sich ThomasMagnum vermutlich bezog, sollte deutlich machen, dass man die Operatorentypen nur mit Vorsicht mischen sollte.

Du müsstest den Wiki-Artikel anpassen. Die Erklärung zu || ist nicht korrekt. || ist in Perl ebenso ein logisches Oder wie or (mit einer anderen Priorität), bitweise Oder ist dagegen | (wie in C) siehe https://wiki.selfhtml.org/wiki/Perl/Operatoren
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Oh, das ist mir entgangen, danke für den Hinweis, ich hab's korrigiert.