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)
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.
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 (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)
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', '');
Es funktioniert.
Habe meinen apikey im DEF angefügt und so klappt es.
Ok, das passt weil das ja das Ziel ist.
Ich würde den KEY noch ins secret schieben, aber das musst Du selber entscheiden.
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
in meiner Installation habe ich den KEY als secret gesetzt und das geht problemlos. Komisch. Naja, Hauptsache es läuft jetzt bei Dir.
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)
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 ?
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}}}
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.