Hallo,
es tut mir echt leid wenn ich schon wieder eine Frage stellen muss. Leider zu meinem leiben Thema "IF-Bedingungen".
Ich habe eine IF-Bedingung zusammengestellt, die einen Wert von einem Fotowiderstand abfragt. Wenn der Schwellwert unterschritten wird, soll "Lichtaus" ein gehen. Und anders herum, wenn der Wert überschritten wird, soll Lichtaus auf off gesetzt werden.
define Lichtaus_Notify notify Firmata_ANALOG:reading:.* {\
if (ReadingsVal("Firmata_ANALOG", "reading", "") <= "550") {\
fhem("set Lichtaus on");;\
}\
}\
else {\
if (ReadingsVal("Firmata_ANALOG", "reading", "") > "550") {\
fhem("set Lichtaus off");;\
}\
}\
}
und das funktioniert ganz gut. Aber nun habe ich das Problem, dass Lichtaus immerzu auf off gesetzt wird, auch wenn es bereits auf off ist.
Daher habe ich folgendes geschrieben.
define Lichtaus_Notify notify Firmata_ANALOG:reading:.* {\
if (ReadingsVal("Firmata_ANALOG", "reading", "") <= "550")&&((Lichtaus:state) eq "off") {\
fhem("set Lichtaus on");;\
}\
}\
else {\
if (ReadingsVal("Firmata_ANALOG", "reading", "") > "550")&&ReadingsVal("Lichtaus", "state", "on") {\
fhem("set Lichtaus off");;\
}\
}\
}
Mir ist klar, dass es zwei unterschiedliche Versionen sind. Das ist Absicht. Denn ich will zwei meiner Wege hier zeigen. Aber beides funktioniert nicht.
Kann mal jemand drüber gucken und mir auf die Sprünge helfen? Das wäre echt super. Dann kann ich mein Projekt endlich abschließen.
Dankeschön
KBLc
1. Es geht um Perl if und nicht IF (bitte den Unterschied beachten)
2. Im 2. Beispiel gibt es im 2. Fall keine Bedingung (ReadingsVal("Lichtaus", "state", "on") eq "off"), die Klammerung passt nicht, die Schreibweise im ersten Fall kannst du in Perl nicht verwenden.
3. Warum nicht einfach Value()?
4. Devspec verwenden (set Lichtaus:FILTER=STATE!=off off)
Bitte die Doku sorgfältiger lesen.
Vielen Dank für die schnelle Antwort.
Zitat von: marvin78 am 26 Oktober 2017, 08:49:29
Bitte die Doku sorgfältiger lesen.
Das ist leichter gesagt als getan für jemanden, der mit dem Thema noch am Anfang steht und jedes dritte Wort nicht versteht. Aber ich gebe mir sehr viel Mühe.
Zitat von: marvin78 am 26 Oktober 2017, 08:49:29
1. Es geht um Perl if und nicht IF (bitte den Unterschied beachten)
Danke, habe ich gleich in der Überschrift geändert
Zitat von: marvin78 am 26 Oktober 2017, 08:49:29
2. Im 2. Beispiel gibt es im 2. Fall keine Bedingung (ReadingsVal("Lichtaus", "state", "on") eq "off"), die Klammerung passt nicht, die Schreibweise im ersten Fall kannst du in Perl nicht verwenden.
Danke, das habe ich gerade mal ausprobiert, aber ohne erfolg.
define Lichtaus_Notify notify Firmata_ANALOG:reading:.* {\
if (ReadingsVal("Firmata_ANALOG", "reading", "") <= "550")&&(ReadingsVal("Lichtaus", "state", "off") eq "on") {\
fhem("set Lichtaus on");;\
}\
}\
Zitat von: marvin78 am 26 Oktober 2017, 08:49:29
3. Warum nicht einfach Value()?
Das habe ich in Commandref überlesen. Wäre es zuviel verlangt ein Beispiel oder einen Link zu erbitten, so dass ich mich einarbeiten kann?
Zitat von: marvin78 am 26 Oktober 2017, 08:49:29
4. Devspec verwenden (set Lichtaus:FILTER=STATE!=off off)
Ich habe von so viel keine Ahnung. Das tut mir echt leid. Aber ich habe weider was neues dazugelernt.
Vielen Dank für die Hilfe.
KBLc
Hi,
mit IF (FHEM IF anstatt Perl if) werden solche simplen Vergleiche meist viel kürzer:
IF ([Firmata_ANALOG:reading] <= "550" && [Lichtaus] eq "off") set Lichtaus on
oder in kleiner Abwandlung wie von marvin78 vorgeschlagen
IF ([Firmata_ANALOG:reading] <= "550") set Lichtaus:FILTER=STATE=off on
Siehe commandref IF, set magic und devspec.
Gruß Otto
Tja. Ich hätte wohl in dem Fall einfach mal nach IF in der commandref gesucht.
Zitat von: kblc am 26 Oktober 2017, 09:21:02
Das habe ich in Commandref überlesen. Wäre es zuviel verlangt ein Beispiel oder einen Link zu erbitten, so dass ich mich einarbeiten kann?
Ich habe die Doku erwähnt, nach Value durchsucht und du findest Beispiele. Value( als Suchbegriff hier im Forum findet vieles. Ein bisschen musst du schon selbst machen. Oft werden nur Stichworte genannt. Die Suche hilft dann weiter.
define Lichtaus_Notify notify Firmata_ANALOG:reading:.* {
if (ReadingsVal("Firmata_ANALOG", "reading", "") <= "550") {
fhem("set Lichtaus:FILTER=STATE!=on on");
} elsif (ReadingsVal("Firmata_ANALOG", "reading", "") > "550") {
fhem("set Lichtaus:FILTER=STATE!=off off")
}
}
Man kann es noch mehr einkürzen aber ich denke mal so ist es für Dich noch ersichtlich.
Hi kblc,
Die Bedingung in Deinem Code ist doch genau verkehrt - oder?
if (ReadingsVal("Firmata_ANALOG", "reading", "") <= "550")&&(ReadingsVal("Lichtaus", "state", "off") eq "on") {\
fhem("set Lichtaus on");;\
Da muss doch eq "off" :)
Und da Du das notify ja von Firmata_ANALOG:reading:.* triggern lässt, steht Dein Wert schon im $EVENT.
Du kannst also statt ReadingsVal .. bzw. [<>] auch einfach $EVENT nehmen. ;D
Jetzt hast Du ziemlich viele Tipps und Varianten, welches Dir jetzt am meisten zusagt ist Deine Entscheidung. Hoffentlich haben wir Dich nicht verwirrt.
Gruß Otto
Zitat von: marvin78 am 26 Oktober 2017, 08:49:29
1. Es geht um Perl if und nicht IF (bitte den Unterschied beachten)
Ach ich soll IF anwenden, ich dachte ich soll IF in if im ForenThema ändern. Das habe ich nämlich brav gemacht.
Ich lese auch Commandrev. Das ist ja auch gut geschrieben, aber wie bereits geschrieben, wenn man die Hälfte nicht versteht, und gerade nich am Anfang steht, dann hilft das Commandrev nicht, es erschlägt ein. Denn man ist durch mit lesen und kann nicht mehr sagen was am Anfang steht, denn man hat die Zusammenhänge nicht verstanden. Aber das ist denke ich ganz normal.
Daher vielen Dank für die Geduld.
Zitat von: Otto123 am 26 Oktober 2017, 09:26:16
Hi,
mit IF (FHEM IF anstatt Perl if) werden solche simplen Vergleiche meist viel kürzer:
IF ([Firmata_ANALOG:reading] <= "550" && [Lichtaus] eq "off") set Lichtaus on
oder in kleiner Abwandlung wie von marvin78 vorgeschlagen
IF ([Firmata_ANALOG:reading] <= "550") set Lichtaus:FILTER=STATE=off on
Siehe commandref IF, set magic und devspec.
Gruß Otto
Danke. Nachdem ich nun verstanden habe IF zu verwenden anstelle von if bin ich schon mal glücklich.
Das würde dann in etwa so aussehen? Oder bin ich schon wieder auf dem Holzweg
define Lichtaus_Notify notify Firmata_ANALOG {\
IF ([Firmata_ANALOG:reading] <= "550" && [Lichtaus] eq "off") set Lichtaus on }
das passt zu dem das in Commandrev steht:
define test notify lamp
IF ([lamp] eq "on") (
IF ([outdoor:humidity] < 70)
(set lamp off)
ELSE
(set lamp on)
) ELSE
(set switch on)
Aber else brauch ich dann nicht, oder?
KBLc
Danke Ihr lieben,
ich werde mich einmal damit auseinandersetzen und die einzelnen Varianten probieren. Das sehe ich auch als Übung an. Denn nur so wird man fiter in dem was man tut.
Wenn ich zu einer Lösung gekommen bin, oder nicht weiter weis, werde ich mich hier wieder melden.
Aber vielen Dank schon mal das waren sehr hilfreiche Tipps.
Nein verwirrt war ich vorher schon :)
KBLc
Jetzt habe ich dich doch verwirrt. Mein Code war nur ein Auszug von dem was Du willst. Ich wollte nicht Deinen ganzen Code aufdröseln.
ELSE und ein zweites IF brauchst Du auch.
Ich habe auch nicht gesagt Du sollst IF statt if verwenden. Es ist eine Alternative. Aber mit if springst Du auf Perl Ebene, da kannst Du viel mehr machen. Aber um einen Wert zu testen reicht meiner Meinung nach IF und Du bleibst auf FHEM Ebene.
Versuch Dich einfach :)
Viel Erfolg
Was mich noch wundert, Du Machst eine Probe auf:
"ist Wert <= X" sonst prüfe ob "Wert >X"
Kurz gesagt, warum prüfst Du im else-Zweig den Wert nochmals?
Vielleicht als Hilfestellung:
Bleib erst mal bei einer Variante, wobei ich perl-if vorschlagen würde. Das ist nämlich m.E. ganz gut im Einsteiger-pdf (https://forum.fhem.de/index.php/topic,19621.0.html) ab S. 37 beschrieben. Das in Ruhe durchzuarbeiten schadet nicht, weglassen würde ich uU. Floorpan und das dirkte Editieren der .cfg/includes. An hilfreichen Themen fehlt eigentlich nur die Darstellung des Event-Monitors (https://wiki.fhem.de/wiki/Event_monitor) mit der Option, Devices damit anzulegen.
Das Springen zwischen den vielen Optionen (perl-if/IF/...) verwirrt nur, besser einfach halten (sonst würde ich für die Überwachung eines potentiell schwankenden Werts noch THRESHOLD ins Spiel bringen...) ;)
Just my2ct
Beta-User
Verwirrtheit ist ein Zustand, der manchmal auf neue Wege und in Neue Dimensionen eines Wissensstandes führt. Daher sehe ich in einer für mich als Verwirrten, verwirrende Hilfestellung als kein Problem an. Denn ich bin als unwissender Verwirrter mit meinem Wissensniveau vermutlich dann noch nicht auf dem des Wissenden. Das trägt, meiner Meinung, jedoch dazu bei, dass der unwissende vom wissenden mit in die nächste Dimension gezogen wird. Dafür will ich danke sagen. Denn ich sehe diese Hilfestellungen und das was ich von Euch dadurch gelernt bekomme, nicht als Selbstverständlich an. :)
Hier auch meine Vorübergehende Lösung, damit es mal funktioniert, aber ich arbeite die anderen Sachen noch durch und auch noch ein:
define Lichtaus_Notify notify Firmata_ANALOG:reading.* {\
if (ReadingsVal("Firmata_ANALOG", "reading", "") <= "550") {\
fhem("set Lichtaus:FILTER=STATE!=on on");;\
}\
elsif (ReadingsVal("Firmata_ANALOG", "reading", "") > "550") {\
fhem("set Lichtaus:FILTER=STATE!=off off")\
}\
}
liebe Grüße
KBLc