FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: AlterSchwede am 28 Dezember 2014, 18:38:02

Titel: Fhem-Befehl "set" mit Parametern aus Perl möglich?
Beitrag von: AlterSchwede am 28 Dezember 2014, 18:38:02
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
Titel: Antw:Fhem-Befehl "set" mit Parametern aus Perl möglich?
Beitrag von: KernSani am 28 Dezember 2014, 18:46:27
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
Titel: Antw:Fhem-Befehl "set" mit Parametern aus Perl möglich?
Beitrag von: AlterSchwede am 28 Dezember 2014, 18:54:50
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!
Titel: Antw:Fhem-Befehl "set" mit Parametern aus Perl möglich?
Beitrag von: Dietmar63 am 28 Dezember 2014, 19:25:35
Du musst den gesamten set-Befehl als string an die Funktion {fhem("set... ")}  übergeben.
Titel: Antw:Fhem-Befehl "set" mit Parametern aus Perl möglich?
Beitrag von: AlterSchwede am 28 Dezember 2014, 20:11:56
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?
Titel: Antw:Fhem-Befehl "set" mit Parametern aus Perl möglich?
Beitrag von: KernSani am 28 Dezember 2014, 20:20:32
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
Titel: Antw:Fhem-Befehl "set" mit Parametern aus Perl möglich?
Beitrag von: AlterSchwede am 28 Dezember 2014, 20:55:05
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
Titel: Antw:Fhem-Befehl "set" mit Parametern aus Perl möglich?
Beitrag von: Dietmar63 am 28 Dezember 2014, 22:01:33
Du musst dich mit den Grundlagen in Perl auseinander setzen - sonst bleibt das schwierig für dich.