Fhem-Befehl "set" mit Parametern aus Perl möglich?

Begonnen von AlterSchwede, 28 Dezember 2014, 18:38:02

Vorheriges Thema - Nächstes Thema

AlterSchwede

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

KernSani

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
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

AlterSchwede

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!

Dietmar63

Du musst den gesamten set-Befehl als string an die Funktion {fhem("set... ")}  übergeben.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

AlterSchwede

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?

KernSani

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
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

AlterSchwede

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

Dietmar63

Du musst dich mit den Grundlagen in Perl auseinander setzen - sonst bleibt das schwierig für dich.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm