Hallo,
ich möchte Daten von einem FakeWandthermostat an (zunächst) einen Thermostat senden.
Zunächst habe ich das Ganze mit festen Parametern probiert und das funktionierte auch:
notify netatmo_D70:ee:50:04:cd:38:temperature.* set Thermostat1 fakeWT MAX_1059f4 21.0 20.0
Dann habe ich die aktuelle Temperatur aus der Netatmo-Wetterstation entnommen, die bereits als Triggerereignis für das notify diente. Auch das erfolgreich:
notify netatmo_D70:ee:50:04:cd:38:temperature.* set Thermostat1 fakeWT MAX_1059f4 21.0 $EVTPART1
Zuletzt versuchte ich, den Wert einer Dummy-Variable als "desired Temperature" (also dem ersten Parameter) zu übergeben. Dieser Dummy "SolltemperaturWz" ist mein Sollwertgeber:
notify netatmo_D70:ee:50:04:cd:38:temperature.* set Thermostat1 fakeWT MAX_1059f4 {ReadingsVal("SolltemperaturWz", "state", "");;} $EVTPART1
Leider funktioniert dieser Teil nicht. Das Logfile meldet "invalid number of arguments". Jetzt weiß ich nicht, ob es prinzipiell nicht funktioniert, PERL-Code in dieser Form einzubinden oder ob ich nur einen Syntaxfehler habe.
Oder gibt es einen Weg ganz ohne PERL, beide Parameter zu übergeben?
Viele Grüße
Der Alte Schwede
Hi Alter Schwede,
Syntaxfehler (im Perl Code) bekommst du am einfachsten heraus, indem du den Perl-Ausdruck (in geschweiften Klammern) in das FHEM Befehlsfeld eingibst.
Grundsätzlich versteht notify (meines Wissens) nur FHEM Operatoren ODER Perl, sprich wenn du Perl verwenden willst/musst, dann musst du die komplette Anweisung in Perl zusammen basteln und mit {fhem("set blablabla")} ausfrufen.
Grüße,
Oli
Danke Oli! Der Tipp mit der Überprüfung von Syntaxfehlern war sehr hilfreich. Mein Perl-Ausdruck liefert "23.0" zurück, ohne Anführungsstriche natürlich. Die Syntax stimmt also erstmal. :)
Okay, wenn Teilausdrücke im Perl nicht möglich sind, dann war ich auf dem Holzweg. Schade, jetzt wirds etwas länger dauern. ;)
Danke für die Hilfe!
Du musst den gesamten set-Befehl als string an die Funktion {fhem("set... ")} übergeben.
Das habe ich getan, das Ganze sieht jetzt so aus:
notify netatmo_D70:ee:50:04:cd:38:temperature.* { fhem "set Thermostat1 fakeWT MAX_1059f4 ReadingsVal("SolltemperaturWz", "state", "") %EVTPART1" }
Leider meldet jetzt das Logfile
2014.12.28 19:52:59 3: eval: { fhem "set Thermostat1 fakeWT MAX_1059f4 ReadingsVal("SolltemperaturWz", "state", "") 20.7" }
2014.12.28 19:52:59 1: PERL WARNING: (Missing operator before ") 20.7"?)
2014.12.28 19:52:59 3: CopySendWZTemp return value: syntax error at (eval 37054) line 1, near ""set Thermostat1 fakeWT MAX_1059f4 ReadingsVal("SolltemperaturWz"
Es wird also offensichtlich der ReadingsVal-Teil nicht ausgeführt. Was mich sehr verwirrt, weil ich den ReadingsVal-Teil bereits getestet hatte (siehe oben). Ich trage diesen Code in der DEF von notify ein (also ohne das "notify" was ihr hier seht. Das dient nur der Verständlichkeit.
Muss ich da evtl. noch irgend etwas escapen?
Hi,
du hast jetzt nichts anderes gemacht als zuvor... Nämlich dir einen String gebastelt, der FHEM Befehle und Perl vermischt.
Du musst die einzelnen Bestandteile concatenaten (In Perl ein einfacher "."), also in etwa sowas:
"set Thermostat1 ".ReadingsVa()
Grüße,
Oli
Ich hatte schon so das Gefühl, Oli.
Letztlich ist, soweit ich das bisher alles hier begreife, alles zwischen {fhem " und "} ein String, der wiederum an fhem übergeben wird. Nur das concatenate hatte ich bisher noch nirgends entdeckt. Bzw. ging der "." wohl zwischen allen */\({ unter. ;)
Letztendlich hat es also funktioniert und mein Wissenszuwachs war groß heute.
Hier noch die Lösung:
notify netatmo_D70:ee:50:04:cd:38:temperature.* { fhem "set Thermostat1 fakeWT MAX_1059f4 ".ReadingsVal("SolltemperaturWz", "state", 19.0)." %EVTPART1"
Vielen Dank!
Alter Schwede
Du musst dich mit den Grundlagen in Perl auseinander setzen - sonst bleibt das schwierig für dich.