Anwendungsbeispiel JsonMod #4: Tanken

Begonnen von jkriegl, 31 März 2020, 15:44:11

Vorheriges Thema - Nächstes Thema

jkriegl

Habe tankerkoenig über HTTPMOD mit extractALLJSON sehr gut am Laufen.
Aber die Readings-Namen sind sehr kryptisch da sehr lange.
Versuche nun mit JsonMod und jsonPathf die Readings sprechend zu machen. Die Daten
{"ok":true,"license":"CC BY 4.0 -  https:\/\/creativecommons.tankerkoenig.de","data":"MTS-K","prices":{"51d4b71e-a095-1aa0-e100-80009459e03a":{"status":"open","e5":1.249,"e10":1.219,"diesel":1.129},"67693691-5653-44b1-9c0f-1151ddc9ea40":{"status":"open","e5":1.249,"e10":1.219,"diesel":1.129},"8185cb0e-6dcf-42ad-a5e9-c63209564c96":{"status":"open","e5":1.168,"e10":1.148,"diesel":1.078},"2a6ec536-a1e2-44cd-aaa6-2abc46b36866":{"status":"open","e5":1.249,"e10":1.219,"diesel":1.129}}}
Eine Reading wird angelegt, aber die Daten stimmen nicht.
Internals:
   API_LAST_RES 1585661475.75927
   API__LAST_MSG 200
   CFGFN     
   DEF        https://creativecommons.tankerkoenig.de/json/prices.php?ids=67693691-5653-44b1-9c0f-1151ddc9ea40,51d4b71e-a095-1aa0-e100-80009459e03a,8185cb0e-6dcf-42ad-a5e9-c63209564c96,2a6ec536-a1e2-44cd-aaa6-2abc46b36866&apikey=[key]
   FUUID      5e8332e7-f33f-9f96-4878-4078643eaa5744c4
   NAME       JMSprit
   NEXT       2020-03-31 15:45:00
   NOTIFYDEV  global
   NR         284
   NTFY_ORDER 50-JMSprit
   SECRETS    KEY
   SOURCE     https://creativecommons.tankerkoenig.de/json/prices.php?ids=67693691-5653-44b1-9c0f-1151ddc9ea40,51d4b71e-a095-1aa0-e100-80009459e03a,8185cb0e-6dcf-42ad-a5e9-c63209564c96,2a6ec536-a1e2-44cd-aaa6-2abc46b36866&apikey=[key] (200)
   STATE      ???
   SVN        21549 2020-03-30 22:56:44 UTC
   TYPE       JsonMod
   CONFIG:
     IN_REQUEST 0
     SOURCE     https://creativecommons.tankerkoenig.de/json/prices.php?ids=67693691-5653-44b1-9c0f-1151ddc9ea40,51d4b71e-a095-1aa0-e100-80009459e03a,8185cb0e-6dcf-42ad-a5e9-c63209564c96,2a6ec536-a1e2-44cd-aaa6-2abc46b36866&apikey=[key]
     SECRET:
   OLDREADINGS:
   READINGS:
     2020-03-31 15:31:15   ALLG-e10        63997728.000
Attributes:
   interval   */15 * * * *
   readingList single(jsonPathf("\$['67693691-5653-44b1-9c0f-1151ddc9ea40']['e10']", '%.3f'), 'ALLG-e10', 0);
   room       6.0 Tanken


Gerne hätte satus e5 und e 10 in einem reading

Edit: readingList   
single(jsonPath($.67693691-5653-44b1-9c0f-1151ddc9ea40.e10), 'ALLG-e10', 0);
liefert: ALLG-e10 ARRAY(0x3de7f48)
Rpi 3/4, buster, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

herrmannj

#1
Moin,

a) Danke, das wollte ich sowieso auch für mich einrichten.
b) bist Du auf den API Endpoint festgelegt?

Ich glaube auf den Endpoint komme ich nicht drauf, das war wohl der aus dem Betatest (?)

Richtig wäre vmtl (kann das leider nicht selbst testen):
single(jsonPath('$.prices.67693691-5653-44b1-9c0f-1151ddc9ea40.e10'), 'ALLG-e10', 0);
Beide Preise müssten mit concat() gehen:
single(concat('E10: ', 'jsonPath($.prices.67693691-5653-44b1-9c0f-1151ddc9ea40.e10', ' E5 ', jsonPath($.prices.67693691-5653-44b1-9c0f-1151ddc9ea40.e10'), 'ALLG-e10', 0);

Du bist da auch dicht dran. Abgesehen vom Hochkomma in Deinem edit fehlt (list und edit) eigentlich nur 'prices' im path

Ich bin jetzt über den anderen Endpoint gegangen: https://creativecommons.tankerkoenig.de/json/list.php?lat=...

Damit lässt sich eine Liste generieren, ich habe 2km Distanz genommen (screenshot):
multi(jsonPath('$.stations[*]'), concat(property('brand'), ' ', property('street')), property('price'));

Die Liste scheint aber nur entweder E10 oder E5 zu liefern (bei mir Diesel, daher Wurscht). Man könnte jetzt noch isOpen über ein concat dazunehmen. Aber in etwa kenne ich ja die Zeiten.

jkriegl

Vielen Dank, diese Variante hatte ich auch schon probiert.

Meine Variante kannst Du auch testen (Demolink aus der API-Doku) https://creativecommons.tankerkoenig.de/json/prices.php?ids=4429a7d9-fb2d-4c29-8cfe-2ca90323f9f8,446bdcf5-9f75-47fc-9cfa-2c3d6fda1c3b,60c0eefa-d2a8-4f5c-82cc-b5244ecae955,44444444-4444-4444-4444-444444444444&apikey=00000000-0000-0000-0000-000000000002

single(jsonPath('$.prices.67693691-5653-44b1-9c0f-1151ddc9ea40.e10'), 'ALLG-e10', 0);
Bekomme auch Log-Einträge, die nur mit verbose=0 unterdrückt werden können.
Im Reading steht: ARRAY(0x3eb2a00)
Rpi 3/4, buster, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

herrmannj

wie jetzt? geht nich?

Ich habe das mit dem link gerade probiert, das hier geht einwandfrei:
readingList single(jsonPath('$.prices.4429a7d9-fb2d-4c29-8cfe-2ca90323f9f8.e10'), 'e10', '');

list:
Internals:
   API_LAST_RES 1585737443.29825
   API__LAST_MSG 200
   CFGFN     
   DEF        https://creativecommons.tankerkoenig.de/json/prices.php?ids=4429a7d9-fb2d-4c29-8cfe-2ca90323f9f8,446bdcf5-9f75-47fc-9cfa-2c3d6fda1c3b,60c0eefa-d2a8-4f5c-82cc-b5244ecae955,44444444-4444-4444-4444-444444444444&apikey=00000000-0000-0000-0000-000000000002
   FUUID      5e846e81-f33f-a6e8-b293-0ceca854d4e695c4
   NAME       tk
   NEXT       2020-04-01 13:00:00
   NOTIFYDEV  global
   NR         73
   NTFY_ORDER 50-tk
   SOURCE     https://creativecommons.tankerkoenig.de/json/prices.php?ids=4429a7d9-fb2d-4c29-8cfe-2ca90323f9f8,446bdcf5-9f75-47fc-9cfa-2c3d6fda1c3b,60c0eefa-d2a8-4f5c-82cc-b5244ecae955,44444444-4444-4444-4444-444444444444&apikey=00000000-0000-0000-0000-000000000002 (200)
   STATE      ???
   SVN        21544 2020-03-30 14:01:55 UTC
   TYPE       JsonMod
   CONFIG:
     IN_REQUEST 0
     SOURCE     https://creativecommons.tankerkoenig.de/json/prices.php?ids=4429a7d9-fb2d-4c29-8cfe-2ca90323f9f8,446bdcf5-9f75-47fc-9cfa-2c3d6fda1c3b,60c0eefa-d2a8-4f5c-82cc-b5244ecae955,44444444-4444-4444-4444-444444444444&apikey=00000000-0000-0000-0000-000000000002
     SECRET:
   READINGS:
     2020-04-01 12:37:23   e10             1.234
Attributes:
   readingList single(jsonPath('$.prices.4429a7d9-fb2d-4c29-8cfe-2ca90323f9f8.e10'), 'e10', '');


jkriegl

Es funktioniert.
Habe meinen apikey im DEF angefügt und so klappt es.
Rpi 3/4, buster, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

herrmannj

Ok, das passt weil das ja das Ziel ist.

Ich würde den KEY noch ins secret schieben, aber das musst Du selber entscheiden.

jkriegl

Klappt bei Tankerkönig nur, wenn man den apikey im define eingibt.
Im Demobeispiel ist ein Demokey und damit werden immer Beispieldaten auch zur eigenen Tanke ausgegeben.

set <name> secret KEY 123445 hatte ich sowieso und jetzt zusätzlich
attr <nama> httpHeader X-API-Key 123456
Rpi 3/4, buster, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

herrmannj

in meiner Installation habe ich den KEY als secret gesetzt und das geht problemlos. Komisch. Naja, Hauptsache es läuft jetzt bei Dir.

jkriegl

#8
Tankerkönig schickt bei geschlossen keine e5, e10, diesel Daten mit.
Das führt dazu, dass im reading etwas wie ARRAY(xxx..) steht. Ist zwar nur unschön, kann aber bei Auswertungen zu Folgefehlern führen.
{"status":"open","e5":1.239,"e10":1.209,"diesel":1.119},"8185cb0e-6dcf-42ad-a5e9-c63209564c96":{"status":"closed"},"2a6ec536-a1e2-44cd-aaa6-2abc46b36866":{"status":"open","e5":1.239,"e10":1.209,"diesel":1.119}}}
Bei single(jsonPath('<>'), 'reading-name', 0) gibt es einen 3. Parameter. Für was ist eigentlich dieser? (default, falls keine Übereinstimmung?)  (edit: oder 0=reading nicht verändern, 1=Fehlermeldung ausgeben)
Rpi 3/4, buster, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

herrmannj

der dritte Parameter bei single ist ein default (wenn das Element welches man mit dem path adressiert nicht vorhanden ist).

a) das scheint bei Dir nicht zu greifen -> da bin vmtl ich gefordert
b) das würde Dir jetzt vmtl aber auch nichts bringen. Ein Auswertung würde imho ja "in die Irre geführt", egal ob man da jetzt 0 oder 999 reinschreibt.

Idee wie das zukünftig aussehen könnte: wenn man da ein undef reinschreibt wird das reading komplett raus genommen ?

jkriegl

Komme noch einmal auf mein altes Problem zurück Tanke "closed"
- Tankerkönig liefert dann keine Spritpreise für diese Tanke. Im Reading steht dann "<Name> ARRAY(0x56dba40)".
Bei Weiterverarbeitung muss man sich mit dem dafault eines ReadingsNum oder Ähnlichem behelfen.
HTTPMOD verändert in diesem Fall die readings nicht (inkl. timestamp) bei Verwendung von readingxxJSON. Ausserdem ist ein reread, stop, start möglich.
{"ok":true,"license":"CC BY 4.0 -  https:\/\/creativecommons.tankerkoenig.de","data":"MTS-K","prices":{"8185cb0e-6dcf-42ad-a5e9-c63209564c96":{"status":"closed"},"51d4b71e-a095-1aa0-e100-80009459e03a":{"status":"open","e5":1.189,"e10":1.159,"diesel":1.059}}}
Rpi 3/4, buster, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

herrmannj

Ich schau mir das die Tage nochmals an wie man das lösen kann.

Zu start/stop: setzte doch den interval entsprechend: */5 5-21 * * * entspricht alle 5 Minuten von 5:00 - 21:55. Oder wie auch immer "deine" Tanke halt auf hat.