Hauptmenü

DOIF Operator "zwischen"?

Begonnen von edition, 01 Januar 2018, 11:55:06

Vorheriges Thema - Nächstes Thema

edition

Hallo zusammen und allen ein frohes neues Jahr.

Ich bastle gerade an einem DOIF, welches in Abhängigkeit des "brightness" Wertes meines Bewegungsmelders bestimmte Texte an einen dummy sendet, dessen Status ich dann auf einem Display darstellen will. Sinngemäß soll bei Werten unter 100 ein Text generiert werden, bei Werten zwischen 100 und 150 ein anderer Text usw.. Da ich keinen Operator für "zwischen" kenne, habe ich das Ganze erst einmal so versucht:

([Bewegungsmelder_Terasse:brightness]<100) (set HellRSS Es ist dunkel) DOELSEIF ([Bewegungsmelder_Terasse:brightness]>120 and [Bewegungsmelder_Terasse:brightness]<150) (set HellRSS Es dämmert) DOELSEIF ([Bewegungsmelder_Terasse:brightness]>150 and [Bewegungsmelder_Terasse:brightness]>230) (set HellRSS Es ist bedeckt) DOELSEIF ([Bewegungsmelder_Terasse:brightness]>230) (set HellRSS Es ist sonnig)

Leider funktioniert das nur bis zur 2. Bedingung. Wenn es heller als "150" wird, ändert sich nichts mehr. Der Status bleibt bei "Es dämmert" stehen, obwohl "brightness" schon über 200 liegt. Da das Ganze auch schon sehr lang ist, würde ich am liebsten mit so etwas wie:

DOELSEIF ([Bewegungsmelder_Terasse:brightness]zwischen120 & 150 (set HellRSS Es dämmert)

arbeiten. Ob es so etwas gibt, weiß ich nicht und ob es damit funktioniert leider auch nicht. Oder habe ich gar einen Denkfehler?

Gruß
edition

igami

Prinzipiell ist es schon richtig so mit zwei Vergleichen zu arbeiten, aber es wird einfacher einen Fehler zu finden, wenn du den Code mit ein paar Zeilenumbrüchen und Einrückungen strukturierst
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Damian

Zitat von: edition am 01 Januar 2018, 11:55:06
Hallo zusammen und allen ein frohes neues Jahr.

Ich bastle gerade an einem DOIF, welches in Abhängigkeit des "brightness" Wertes meines Bewegungsmelders bestimmte Texte an einen dummy sendet, dessen Status ich dann auf einem Display darstellen will. Sinngemäß soll bei Werten unter 100 ein Text generiert werden, bei Werten zwischen 100 und 150 ein anderer Text usw.. Da ich keinen Operator für "zwischen" kenne, habe ich das Ganze erst einmal so versucht:

([Bewegungsmelder_Terasse:brightness]<100) (set HellRSS Es ist dunkel) DOELSEIF ([Bewegungsmelder_Terasse:brightness]>120 and [Bewegungsmelder_Terasse:brightness]<150) (set HellRSS Es dämmert) DOELSEIF ([Bewegungsmelder_Terasse:brightness]>150 and [Bewegungsmelder_Terasse:brightness]>230) (set HellRSS Es ist bedeckt) DOELSEIF ([Bewegungsmelder_Terasse:brightness]>230) (set HellRSS Es ist sonnig)

Leider funktioniert das nur bis zur 2. Bedingung. Wenn es heller als "150" wird, ändert sich nichts mehr. Der Status bleibt bei "Es dämmert" stehen, obwohl "brightness" schon über 200 liegt. Da das Ganze auch schon sehr lang ist, würde ich am liebsten mit so etwas wie:

DOELSEIF ([Bewegungsmelder_Terasse:brightness]zwischen120 & 150 (set HellRSS Es dämmert)

arbeiten. Ob es so etwas gibt, weiß ich nicht und ob es damit funktioniert leider auch nicht. Oder habe ich gar einen Denkfehler?

Gruß
edition

"Zwischen" hast du bereits schon definiert: ([Bewegungsmelder_Terasse:brightness]>120 and [Bewegungsmelder_Terasse:brightness]<150)

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

edition

Ja, damit habe ich mir beholfen, weil ich den Operator nicht kenne. Ich wollte das Ganze kürzer gestalten. Wenn es keinen Operator für zwischen gibt, muss ich es eben so machen.
Aber warum wird nur die erste und zweite Bedingung umgesetzt, nicht aber die dritte? Wenn der "brightness" Wert höher als 150 ist, ist doch die zweite Bedingung gar nicht mehr erfüllt, sondern die dritte. Das DOIF bleibt aber bei cmd_2 stehen. Warum? Habe ich da einen Denkfehler?

edition

Damian

Zitat von: edition am 01 Januar 2018, 12:30:08
Ja, damit habe ich mir beholfen, weil ich den Operator nicht kenne. Ich wollte das Ganze kürzer gestalten. Wenn es keinen Operator für zwischen gibt, muss ich es eben so machen.
Aber warum wird nur die erste und zweite Bedingung umgesetzt, nicht aber die dritte? Wenn der "brightness" Wert höher als 150 ist, ist doch die zweite Bedingung gar nicht mehr erfüllt, sondern die dritte. Das DOIF bleibt aber bei cmd_2 stehen. Warum? Habe ich da einen Denkfehler?

edition

So ziemlich in allen höheren Programmiersprachen wird "zwischen" so oder so ähnlich definiert.

([Bewegungsmelder_Terasse:brightness]>150 and [Bewegungsmelder_Terasse:brightness]>230)

Dass diese Bedingung nicht sinnvoll ist, wirst du feststellen, wenn du gedanklich Werte 100, 200, 300 durchspielst:



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

edition

Oh sch... Da ist ja ein Fehler drin. Mit 2x größer als kann es auch nicht funktionieren. :-[

Ich ziehe meine Frage zurück!
Fehler behoben und funktioniert.

edition