[JsonMod] Use of uninitialized value $arg

Begonnen von MDietrich, 23 Februar 2024, 08:40:16

Vorheriges Thema - Nächstes Thema

MDietrich

Moin,
zur Abfrage der aktuellen Spritpreise nutze ich die Tankerkönig API.
Das Device ist definiert:
Tankstellen JsonMod https://creativecommons.tankerkoenig.de/json/list.php?lat=53.995454&lng=11.434776&rad=15&sort=dist&type=all&apikey=#########natürlich mit einem richtigen API-Code.

Aus dem Json generiere ich mit einer readingsList die interessanten Werte:
multi(jsonPath('$.stations[*]'),
concat(sprintf('%02d',count()),'_Diesel_',property('brand')),concat(property('diesel'),' €'));
multi(jsonPath('$.stations[*]'),
concat(sprintf('%02d',count()),'_SuperE10_',property('brand')),concat(property('e10'),' €'));

die Readings sehen alle vernünftig aus:
READINGS:
     2024-02-23 08:30:02   00_Diesel_SHELL 1.819 €
     2024-02-23 08:30:02   00_SuperE10_SHELL 1.779 €
     2024-02-23 08:30:02   01_Diesel_EPT   1.789 €
     2024-02-23 08:30:02   01_SuperE10_EPT 1.719 €
     2024-02-23 08:30:02   02_Diesel_AVIA  1.819 €
     2024-02-23 08:30:02   02_SuperE10_AVIA  €
     2024-02-23 08:30:02   03_Diesel_TotalEnergies 1.819 €
     2024-02-23 08:30:02   03_SuperE10_TotalEnergies 1.789 €
     2024-02-23 08:30:02   04_Diesel_AVIA  1.819 €
     2024-02-23 08:30:02   04_SuperE10_AVIA 1.819 €
     2024-02-23 08:30:02   05_Diesel_HEM   1.799 €
     2024-02-23 08:30:02   05_SuperE10_HEM 1.729 €
     2024-02-23 08:30:02   06_Diesel_ARAL  1.809 €
     2024-02-23 08:30:02   06_SuperE10_ARAL 1.759 €
     2024-02-23 08:30:02   07_Diesel_Hoyer 1.819 €
     2024-02-23 08:30:02   07_SuperE10_Hoyer  €
     2024-02-23 08:30:02   08_Diesel_TotalEnergies 1.819 €
     2024-02-23 08:30:02   08_SuperE10_TotalEnergies 1.829 €
     2024-02-23 08:30:02   09_Diesel_Shell 1.819 €
     2024-02-23 08:30:02   09_SuperE10_Shell 1.819 €
     2024-02-23 08:30:02   10_Diesel_NORDOEL 1.799 €
     2024-02-23 08:30:02   10_SuperE10_NORDOEL 1.729 €
     2024-02-23 08:30:02   11_Diesel_team  1.799 €
     2024-02-23 08:30:02   11_SuperE10_team 1.729 €
     2024-02-23 08:30:02   12_Diesel_HEM   1.799 €
     2024-02-23 08:30:02   12_SuperE10_HEM 1.729 €

Im LOG sind ist lange Reihe von Warnungen:
[Tankstellen] warning: Use of uninitialized value $arg in concatenation (.) or string at ./FHEM/98_JsonMod.pm line 307.
 in 'multi(jsonPath('$.stations[*]'),
concat(sprintf('%02d',count()),'_SuperE10_',property('brand')),concat(property('e10'),' €'))'
Es geht aber immer um die SuperE10 Werte, nie um die für Diesel.
Auf einem zweiten Raspi, mit identischer Definition des Devices, werden keine Warnungen erzeugt.

Mache ich da etwas falsch? Nur Verbose auf '2' ist ja keine Lösung.
Danke im Voraus,
Matthias
FB 6591 Cable / Raspberry 3b+ (Bookworm) / 4xECHO DOT 4/ Homematic Thermostate, Fenster- und Fenster-Sensoren / Philips HUE / CUL-HM /  Zigbee Schalter und Lampen / Shelly 1

Otto123

Hallo Matthias,

Zitat von: MDietrich am 23 Februar 2024, 08:40:16die Readings sehen alle vernünftig aus:

aber genau hier fehlt der Wert
Zitat2024-02-23 08:30:02   02_SuperE10_AVIA  €
...
2024-02-23 08:30:02   07_SuperE10_Hoyer  €
und das besagt die Warnmeldung.

Warum das an einem anderen Gerät nicht auftritt? Keine Idee.

Gruß otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

MDietrich

Hallo Otto,
danke für die Rückmeldung.
Die vollständige Warnmeldung lautet;
[Tankstellen] warning: Use of uninitialized value $arg in concatenation (.) or string at ./FHEM/98_JsonMod.pm line 307.
 in 'multi(jsonPath('$.stations[*]'),
concat(sprintf('%02d',count()),'_SuperE10_',property('brand')),concat(property('e10'),' €'))'
Für die AVIA Tankstelle sieht die Rückmeldung so aus:{"id":"09c0262a-4231-4020-9e30-0f07aa941635","name":"AVIA Automatentankstelle","brand":"AVIA","street":"Haffburg","place":"Wismar","lat":53.90346,"lng":11.46822,"dist":10.5,"diesel":1.829,"e5":null,"e10":null,"isOpen":true,"houseNumber":"8a","postCode":23970}Für E10 ist also kein Wert gesetzt. Kann ich das in der Abfrage abfangen, und wenn ja, wie?

Nachdem ich Verbose mal auf 4 gestellt habe, erscheint noch eine Meldung:
[Tankstellen] api encoding is utf-8, designated encoder is utf-8-strictKann ich das beeinflussen?

Gruß,
Matthias
FB 6591 Cable / Raspberry 3b+ (Bookworm) / 4xECHO DOT 4/ Homematic Thermostate, Fenster- und Fenster-Sensoren / Philips HUE / CUL-HM /  Zigbee Schalter und Lampen / Shelly 1

betateilchen

Kannst Du mal bitte das vollständige json posten, damit man wirklich vernünftig testen kann?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

MDietrich

Hier das vollständige Json:
{"ok":true,"license":"CC BY 4.0 -  https:\/\/creativecommons.tankerkoenig.de","data":"MTS-K","status":"ok","stations":[{"id":"5b84422c-dacd-4a23-85fe-0bb98dd445b4","name":"Arno Ewald","brand":"SHELL","street":"Metkenberg","place":"Redentin","lat":53.9234599,"lng":11.4879278,"dist":8.7,"diesel":1.829,"e5":1.889,"e10":1.829,"isOpen":true,"houseNumber":"2","postCode":23970},{"id":"3b809bc2-a9ac-4b75-8cab-f924a4531e63","name":"ept-Tankstelle Kiel","brand":"EPT","street":"Zierower Landstra\u00dfe","place":"Wismar","lat":53.903087,"lng":11.40457,"dist":10.5,"diesel":1.809,"e5":1.869,"e10":1.809,"isOpen":true,"houseNumber":"3","postCode":23968},{"id":"09c0262a-4231-4020-9e30-0f07aa941635","name":"AVIA Automatentankstelle","brand":"AVIA","street":"Haffburg","place":"Wismar","lat":53.90346,"lng":11.46822,"dist":10.5,"diesel":1.829,"e5":null,"e10":null,"isOpen":true,"houseNumber":"8a","postCode":23970},{"id":"57cb973d-0a57-410d-b774-cac515e5484c","name":"TotalEnergies Wismar","brand":"TotalEnergies","street":"Zierower Landstr.","place":"Wismar","lat":53.902733,"lng":11.404688,"dist":10.5,"diesel":1.839,"e5":1.889,"e10":1.829,"isOpen":true,"houseNumber":"1","postCode":23968},{"id":"0a696fe0-f3c0-4341-adb0-aa4c911447ce","name":"AVIA Tankstelle","brand":"AVIA","street":"Poeler Str.","place":"Wismar","lat":53.90328,"lng":11.47424,"dist":10.6,"diesel":1.829,"e5":1.899,"e10":1.839,"isOpen":true,"houseNumber":"73","postCode":23970},{"id":"e1a15081-24e5-9107-e040-0b0a3dfe563c","name":"G\u00e4gelow, Chausseestr. 1","brand":"HEM","street":"Chausseestr. a","place":"G\u00e4gelow","lat":53.902647,"lng":11.37718,"dist":11,"diesel":1.809,"e5":1.799,"e10":1.739,"isOpen":true,"houseNumber":"1","postCode":23968},{"id":"85dfe4be-cbd0-4a93-9b0c-63304c7b1b8f","name":"Aral Tankstelle","brand":"ARAL","street":"L\u00fcbsche Stra\u00dfe","place":"Wismar","lat":53.894485,"lng":11.440239,"dist":11.2,"diesel":1.819,"e5":1.889,"e10":1.829,"isOpen":true,"houseNumber":"161","postCode":23966},{"id":"c7b4f91e-728a-5b35-a37c-9f3846bd6776","name":"Wismar","brand":"Hoyer","street":"Hauptstr.","place":"Wismar","lat":53.90561294556,"lng":11.52983379364,"dist":11.8,"diesel":1.819,"e5":null,"e10":null,"isOpen":true,"houseNumber":"1a","postCode":23974},{"id":"9bafb96b-6c03-4f6b-97df-3b7843219c3e","name":"TotalEnergies Wismar","brand":"TotalEnergies","street":"Dr.-Leber-Str.","place":"Wismar","lat":53.889796,"lng":11.471355,"dist":12,"diesel":1.839,"e5":1.889,"e10":1.829,"isOpen":true,"houseNumber":"8","postCode":23966},{"id":"0ef3b459-b437-40d9-be79-3d021c5e5583","name":"Shell Wismar Schweriner Str. 20","brand":"Shell","street":"Schweriner Str.","place":"Wismar","lat":53.88506,"lng":11.46288,"dist":12.4,"diesel":1.829,"e5":1.889,"e10":1.829,"isOpen":true,"houseNumber":"20","postCode":23970},{"id":"87f89284-bf36-402a-b9f4-0e1ac6f63118","name":"Ren\u00e9 Mrosek","brand":"NORDOEL","street":"Querstr.","place":"Wismar","lat":53.8805608,"lng":11.4535119,"dist":12.8,"diesel":1.809,"e5":1.869,"e10":1.809,"isOpen":true,"houseNumber":"3","postCode":23966},{"id":"705a6e11-602f-4779-a7db-d64d2a284f3d","name":"Wismar (23970), Querstr. 1","brand":"team","street":"Querstr.","place":"Wismar","lat":53.8789,"lng":11.4546,"dist":13,"diesel":1.809,"e5":1.869,"e10":1.809,"isOpen":true,"houseNumber":"1","postCode":23970},{"id":"e1a15081-250b-9107-e040-0b0a3dfe563c","name":"Kritzow, Karpendiek 1","brand":"HEM","street":"Karpendiek","place":"Kritzow","lat":53.889972,"lng":11.530833,"dist":13.3,"diesel":1.809,"e5":1.869,"e10":1.809,"isOpen":true,"houseNumber":"1","postCode":23970}]}
Gruß,
Matthias
FB 6591 Cable / Raspberry 3b+ (Bookworm) / 4xECHO DOT 4/ Homematic Thermostate, Fenster- und Fenster-Sensoren / Philips HUE / CUL-HM /  Zigbee Schalter und Lampen / Shelly 1

betateilchen

attr e10 readingList multi(jsonPath('$.stations[*]'),concat(sprintf('%02d',count()),'_SuperE10_',property('brand')),\
(defined(property('e10')))?concat(property('e10'),' €'):'n/a');;
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

MDietrich

Super, funktioniert.

Besten Dank für die Unterstützung,
Matthias
FB 6591 Cable / Raspberry 3b+ (Bookworm) / 4xECHO DOT 4/ Homematic Thermostate, Fenster- und Fenster-Sensoren / Philips HUE / CUL-HM /  Zigbee Schalter und Lampen / Shelly 1

betateilchen

Das multi kann man wahrscheinlich noch vereinfachen, aber da komme ich erst heute Nachmittag zum Ausprobieren. Die Idee ist: wenn man eh mit sprintf() arbeitet, braucht man vermutlich kein concat().
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: betateilchen am 23 Februar 2024, 12:06:07Die Idee ist: wenn man eh mit sprintf() arbeitet, braucht man vermutlich kein concat().

q.e.d.

multi(jsonPath('$.stations[*]'),sprintf('%02d_SuperE10_%s',count(),property('brand')),(defined(property('e10')))?concat(property('e10'),' €'):'n/a');
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

herrmannj

In dem JSON stehen schlicht keine Werte für E10 (zb), genauer, da steht "e5": null, "e10": null,"

Darauf weißt JSONMod im Prinzip hin (auch wenn Ursache/Wirkung nicht sofort klar sind). Betateilchen hat das elegant und korrekt gelöst und aus meiner Sicht sind keine fixes am Modul erforderlich.