FHEM Forum

FHEM => Automatisierung => Thema gestartet von: MDietrich am 23 Februar 2024, 08:40:16

Titel: [JsonMod] Use of uninitialized value $arg
Beitrag von: MDietrich am 23 Februar 2024, 08:40:16
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
Titel: Aw: [JsonMod] Use of uninitialized value $arg
Beitrag von: Otto123 am 23 Februar 2024, 09:19:46
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
Titel: Aw: [JsonMod] Use of uninitialized value $arg
Beitrag von: MDietrich am 23 Februar 2024, 10:14:46
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
Titel: Aw: [JsonMod] Use of uninitialized value $arg
Beitrag von: betateilchen am 23 Februar 2024, 10:35:03
Kannst Du mal bitte das vollständige json posten, damit man wirklich vernünftig testen kann?
Titel: Aw: [JsonMod] Use of uninitialized value $arg
Beitrag von: MDietrich am 23 Februar 2024, 10:38:10
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
Titel: Aw: [JsonMod] Use of uninitialized value $arg
Beitrag von: betateilchen am 23 Februar 2024, 11:17:30
attr e10 readingList multi(jsonPath('$.stations[*]'),concat(sprintf('%02d',count()),'_SuperE10_',property('brand')),\
(defined(property('e10')))?concat(property('e10'),' €'):'n/a');;
Titel: Aw: [JsonMod] Use of uninitialized value $arg
Beitrag von: MDietrich am 23 Februar 2024, 11:26:46
Super, funktioniert.

Besten Dank für die Unterstützung,
Matthias
Titel: Aw: [JsonMod] Use of uninitialized value $arg
Beitrag von: betateilchen am 23 Februar 2024, 12:06:07
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().
Titel: Aw: [JsonMod] Use of uninitialized value $arg
Beitrag von: betateilchen am 23 Februar 2024, 16:58:24
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');
Titel: Aw: [JsonMod] Use of uninitialized value $arg
Beitrag von: herrmannj am 24 Februar 2024, 16:06:38
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.