Hauptmenü

Perl: Zugriff auf Werte

Begonnen von Shardan, 04 Dezember 2016, 01:50:25

Vorheriges Thema - Nächstes Thema

Shardan

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
FHEM auf Celeron-PC
CUNX mit Pigator, 433 + 868 MHZ.
MAX!-HK-Ventile, ESP8266-Sensoren und -Aktoren
Schaltsteckdosen IT / NetIO230B / Netio4

Benni

Das Zauberwort heißt ReadingsVal oder ReadingsNum

Shardan

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
FHEM auf Celeron-PC
CUNX mit Pigator, 433 + 868 MHZ.
MAX!-HK-Ventile, ESP8266-Sensoren und -Aktoren
Schaltsteckdosen IT / NetIO230B / Netio4

spel

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!

Benni

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, 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

franky08

@Benni
Der Exkurs war Klasse ....  ;)

VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1