Hallo zusammen,
es ist mal wieder soweit, ich seh den Wald vor lauter Bäumen nicht mehr oder meine nicht vorhandenen Programmierkenntnisse lassen mich mal wieder im Stich.
Ich versuche testweise, ein Reading an ein ESP8266-Display mit ESPEasy-Firmware auszugeben, entweder per GetHttpFile oder über das ESPEasy-Modul.
Die Zeile
Tst_Jet:Diesel:.* { GetHttpFile("192.168.17.106:80", "/control?cmd=lcd,1,1," . ("$Diesel")) }
sollte mit den Dieselpreis der benachbarten Tanke ausgeben. Ich bekomme aber nur eine Fehlermeldung im Log, die die undefinierte globale Variable anmeckert.
Setze ich nur "Diesel" ein, schreibt er mir das Wort "Diesel" aufs Display.
Auch beim Versuch, das mit dem ESPEasy-Modul zu lösen, passiert vergleichbares.
Wie kann ich die Variable mit dem Preis im Code verfügbar machen? Hat da jemand mal ein Beispiel für mich?
Danke schon mal
Shardan
Das Zauberwort heißt ReadingsVal (http://fhem.de/commandref_DE.html#perl) oder ReadingsNum
Funktioniert leider auch nicht, gibt ähnliche Fehlermeldungen zurück.
Mit der ESBEasy-Bridge geh es vermutlich gar nicht, die interpretiertt den Befehlsstring scheinbar nicht, sondern gibt ihn einfach als Text an das Display aus.
Wenn ich im notify eingebe:
Tst_12Mann:SuperE5:.* { GetHttpFile("192.168.17.106:80", "/control?cmd=lcd,1,1,ReadingsVal("Tst_12Mann","SuperE5",0) }
(Nicht wundern, die Tanke ist an einem Fußballstadion und heißt "12. Mann"....)
bekomme ich eine Menge Fehlermeldungen:
2016.12.04 14:41:58 1: PERL WARNING: Bareword found where operator expected at (eval 2801) line 1, near ""/control?cmd=lcd,1,1,ReadingsVal("Tst_12Mann"
2016.12.04 14:41:58 3: eval: my $EVTPART1='1.359';my $NAME='Tst_12Mann';my $TYPE='HTTPMOD';my $EVTPART0='SuperE5:';my $EVENT='SuperE5: 1.359';my $SELF='n_Sprit12m';{ GetHttpFile("192.168.17.106:80", "/control?cmd=lcd,1,1,ReadingsVal("Tst_12Mann","SuperE5",0) }
2016.12.04 14:41:58 1: PERL WARNING: String found where operator expected at (eval 2801) line 1, near "Tst_12Mann",""
2016.12.04 14:41:58 3: eval: my $EVTPART1='1.359';my $NAME='Tst_12Mann';my $TYPE='HTTPMOD';my $EVTPART0='SuperE5:';my $EVENT='SuperE5: 1.359';my $SELF='n_Sprit12m';{ GetHttpFile("192.168.17.106:80", "/control?cmd=lcd,1,1,ReadingsVal("Tst_12Mann","SuperE5",0) }
2016.12.04 14:41:58 1: PERL WARNING: Bareword found where operator expected at (eval 2801) line 1, near "","SuperE5"
2016.12.04 14:41:58 3: eval: my $EVTPART1='1.359';my $NAME='Tst_12Mann';my $TYPE='HTTPMOD';my $EVTPART0='SuperE5:';my $EVENT='SuperE5: 1.359';my $SELF='n_Sprit12m';{ GetHttpFile("192.168.17.106:80", "/control?cmd=lcd,1,1,ReadingsVal("Tst_12Mann","SuperE5",0) }
2016.12.04 14:41:58 1: PERL WARNING: String found where operator expected at (eval 2801) line 1, at end of line
2016.12.04 14:41:58 3: eval: my $EVTPART1='1.359';my $NAME='Tst_12Mann';my $TYPE='HTTPMOD';my $EVTPART0='SuperE5:';my $EVENT='SuperE5: 1.359';my $SELF='n_Sprit12m';{ GetHttpFile("192.168.17.106:80", "/control?cmd=lcd,1,1,ReadingsVal("Tst_12Mann","SuperE5",0) }
2016.12.04 14:41:58 3: n_Sprit12m return value: Can't find string terminator '"' anywhere before EOF at (eval 2801) line 1.
Der Event wird also offenbar richtig produziert, die Werte sind da, aber der Befehlsstring wird nicht zusammengebaut.
Einige andere Beispiele aus der CommandRef hab ich probiert, hat aber alles ähnliche Fehlermeldungen erbracht.
Shardan
Hallo,
konntest du in dieser Sache etwas erreichen? Habe das selbe Problem:
2017.02.04 19:36:02 1: PERL WARNING: Bareword found where operator expected at (eval 549555) line 1, near "5.4 H"
2017.02.04 19:36:02 3: eval: { GetHttpFile("192.168.1.1:80", "/control?cmd=oled,1,1,xxxxReadingsVal ("T: 5.4 H: 80")" ) }
Ich Lese erfolgreich Temperaturdaten aus. Bekomme aber dann den Fehler im Log; auf dem Display wird nichts angezeigt!
Danke!
Zitat von: spel am 04 Februar 2017, 19:44:33
2017.02.04 19:36:02 1: PERL WARNING: Bareword found where operator expected at (eval 549555) line 1, near "5.4 H"
2017.02.04 19:36:02 3: eval: { GetHttpFile("192.168.1.1:80", "/control?cmd=oled,1,1,xxxxReadingsVal ("T: 5.4 H: 80")" ) }
Das da kann ja nicht stimmen:
xxxxReadingsVal ("T: 5.4 H: 80")"
die xxxx sind da sicherlich nicht richtig und ReadingsVal erwartet 3 Parameter (https://fhem.de/commandref_DE.html#perl), nämlich den Device-Namen, den Reading-Namen und einen Default-Wert,
Also so in etwa:
ReadingsVal('MyWeatherDevice','temperature','not found')
Weiterhin funktionieren Anführungszeichen innerhalb von mit Anführungszeichen geöffneten Zeichenketten nicht.
@Shardan: Die geschachtelten Anführungszeichen sind übrigens auch bei dir die Fehlerursache.
@spel: Weiter bei dir ... Du verwendest
"/control?cmd=oled,1,1,xxxxReadingsVal ("T: 5.4 H: 80")" ) }
Damit wird foldendes als vollständige Zeichenkette erkannt:
"/control?cmd=oled,1,1,xxxxReadingsVal ("
Der Rest verursacht dann ein Problem, weil es außerhalb einer gültigen Zeichenkette ist und nicht als Perl-bekannter Begriff erkannt werden kann (ist ja logisch, oder?).
T: 5.4 H: ist nichts was Perl von Haus aus kennt, das ist auch genau das was die Fehlermeldung aussagt und anführt.
Wenn nicht unbedingt notwendig Einfaches Hochkomma (') als Zeichenketten-Einfassung (mir fällt der korrekte Begriff dafür gerade nicht ein :o) statt doppelter Anführungszeichen verwenden, das verhindert schon so manches Problem.
Einfach mal den Unterschied zwischen " und ' nachlesen, wie z.B. hier: https://wiki.selfhtml.org/wiki/Perl/Zeichenketten
Wobei das Problem oben auch bei konsequenter Anwendung von einfachen Hochkommas passiert wäre. Schreiben können hätte man es aber so:
'/control?cmd=oled,1,1,xxxxReadingsVal ("T: 5.4 H: 80")'
oder so:
"/control?cmd=oled,1,1,xxxxReadingsVal ('T: 5.4 H: 80')"
oder man maskiert die Anführungszeichen innerhalb der Zeichenkette mit Backslash (\):
"/control?cmd=oled,1,1,xxxxReadingsVal (\T: 5.4 H: 80\")"
Bleibt dabei dann nur noch das Problem mit der fehlerhaften Verwendung von ReadingsVal, wie o.a. anzupassen.
Ok! War jetzt doch ziemlich viel Info. :D
@Benni
Der Exkurs war Klasse .... ;)
VG
Frank