NEWS
Rechnen mit JSON+ Abspeichern als Datenpunkt
-
Hi zusammen,
ich nutze folgendes Script, um mir die niedrigsten Spritpreise der letzten Tage auszugeben.
Das Ergebnis kommt im JSON Format, womit ich leider nicht weiterkomme.
Ich würde gerne die "_value" Daten auslesen und davon den niedrigsten Wert in einem Datenpunkt abspeichern.
Wie kann ich auf die JSON-Werte zugreifen?
Leider hat alles was ich bisher versucht habe nicht funktioniert.
Es wäre toll, wenn mir jemand helfen könnte,VG
LisaScript:
sendTo('influxdb.0', 'query', 'from(bucket: "iobroker")'+ ' |> range(start: -7d)'+ ' |> drop(columns: ["_start","_stop"]) '+ ' |> filter(fn: (r) => r["_measurement"] == "alias.0.Allgemein.Tanken.Jet e5")'+ ' |> filter(fn: (r) => r["_field"] == "value")'+ ' |> aggregateWindow(every: 1d, fn: min, createEmpty: false)' , function (result) { if (result.error) { console.error(result.error); } else { // show result var data = JSON.stringify(result) console.log(data); } });
JSON - Ergbnis (aus Console):
{ "result": [ [ { "result": "_result", "table": 0, "_time": "2021-12-15T00:00:00Z", "_value": 1.619, "_field": "value", "_measurement": "alias.0.Allgemein.Tanken.Jet e5", "_start": "2021-12-14T12:12:28.834984968Z", "_stop": "2021-12-21T12:12:28.834984968Z", "ts": 1639526400000 }, { "result": "_result", "table": 0, "_time": "2021-12-16T00:00:00Z", "_value": 1.599, "_field": "value", "_measurement": "alias.0.Allgemein.Tanken.Jet e5", "_start": "2021-12-14T12:12:28.834984968Z", "_stop": "2021-12-21T12:12:28.834984968Z", "ts": 1639612800000 }, { "result": "_result", "table": 0, "_time": "2021-12-17T00:00:00Z", "_value": 1.599, "_field": "value", "_measurement": "alias.0.Allgemein.Tanken.Jet e5", "_start": "2021-12-14T12:12:28.834984968Z", "_stop": "2021-12-21T12:12:28.834984968Z", "ts": 1639699200000 }, { "result": "_result", "table": 0, "_time": "2021-12-18T00:00:00Z", "_value": 1.599, "_field": "value", "_measurement": "alias.0.Allgemein.Tanken.Jet e5", "_start": "2021-12-14T12:12:28.834984968Z", "_stop": "2021-12-21T12:12:28.834984968Z", "ts": 1639785600000 }, { "result": "_result", "table": 0, "_time": "2021-12-19T00:00:00Z", "_value": 1.609, "_field": "value", "_measurement": "alias.0.Allgemein.Tanken.Jet e5", "_start": "2021-12-14T12:12:28.834984968Z", "_stop": "2021-12-21T12:12:28.834984968Z", "ts": 1639872000000 }, { "result": "_result", "table": 0, "_time": "2021-12-20T00:00:00Z", "_value": 1.619, "_field": "value", "_measurement": "alias.0.Allgemein.Tanken.Jet e5", "_start": "2021-12-14T12:12:28.834984968Z", "_stop": "2021-12-21T12:12:28.834984968Z", "ts": 1639958400000 }, { "result": "_result", "table": 0, "_time": "2021-12-21T00:00:00Z", "_value": 1.579, "_field": "value", "_measurement": "alias.0.Allgemein.Tanken.Jet e5", "_start": "2021-12-14T12:12:28.834984968Z", "_stop": "2021-12-21T12:12:28.834984968Z", "ts": 1640044800000 }, { "result": "_result", "table": 0, "_time": "2021-12-21T12:12:28.834984968Z", "_value": 1.609, "_field": "value", "_measurement": "alias.0.Allgemein.Tanken.Jet e5", "_start": "2021-12-14T12:12:28.834984968Z", "_stop": "2021-12-21T12:12:28.834984968Z", "ts": 1640088748834 } ] ], "ts": 1640088749005, "error": null }
-
@adsfa Nicht getestet:
let arr = result.result[0]; let min = 3; for(let i = 0; i < arr.length; i++) { if(arr[i]._value < min) min = arr[i]._value; } setState(idMinimum, min, true):
-
@adsfa als Alternative zu @paul53 Lösung, gibt zusätzlich das letzte Datum des billigsten Preises aus und ermittelt den Preis durch Sortierung:
let arr = JSON.parse(getState('0_userdata.0.Forum.Tanken.json').val).result[0]; arr.sort((a, b) => a._value - b._value || a._time - b._time); setState('0_userdata.0.Forum.Tanken.preis', arr[0]._value); setState('0_userdata.0.Forum.Tanken.datum', new Date(arr[0]._time).getTime());
-
@paul53 sagte in Rechnen mit JSON+ Abspeichern als Datenpunkt:
@adsfa Nicht getestet:
let arr = result.result[0]; let min = 3; for(let i = 0; i < arr.length; i++) { if(arr[i]._value < min) min = arr[i]._value; } setState(idMinimum, min, true):
Vielen Dank euch beiden!
@paul53 Leider weiß ich nicht genau, wo ich den Code einfügen muss. "idMinimum" wird zudem nicht gefunden.
@fastfoot Den Ansatz verstehe ich leider auch nicht. Den Datenpunkt habe ich bei mir nicht. Muss ich zuerst das JSON in diesem Datenpunkt speichern? -
@adsfa sagte: Leider weiß ich nicht genau, wo ich den Code einfügen muss.
In den else-Zweig ab Zeile 13.
@adsfa sagte in Rechnen mit JSON+ Abspeichern als Datenpunkt:
"idMinimum" wird zudem nicht gefunden.
Diese Variable / Konstante muss erst deklariert werden. Man kann auch die Datenpunkt-ID direkt eingeben, z.B.
setState('0_userdata.0.Forum.Tanken.preis', min, true):
Der Datenpunkt "0_userdata.0.Forum.Tanken.preis" muss vorher erstellt werden.
-
@adsfa sagte in Rechnen mit JSON+ Abspeichern als Datenpunkt:
Den Ansatz verstehe ich leider auch nicht. Den Datenpunkt habe ich bei mir nicht. Muss ich zuerst das JSON in diesem Datenpunkt speichern?
du wolltest ja in einen Datenpunkt schreiben, da ich den nicht kenne habe ich einen eigenen genommen, genau wie in der ersten Zeile. Das musst du natürlich durch deine DP ersetzen.
-
-
@adsfa sagte: Zum Verständnis: Was bedeutet min = 3?
Das Start-Minimum. Der Preis wird hoffentlich nie über 3 €/l steigen.
-
@adsfa sagte in Rechnen mit JSON+ Abspeichern als Datenpunkt:
Vielen Dank euch beiden!!
@paul53
Jetzt klappt es perfektZum Verständnis: Was bedeutet min = 3?
@fastfoot
Den Ansatz auch noch das Datum zu haben finde ich super.
Muss ich dafür das JSON Ergebnis in z.B. dem Datenpunkt: 0_userdata.0.Forum.Tanken.json abspeichern?nein, wenn es schon in einer variable ist (zB result) dann
let arr = result.result[0]
in der ersten Zeile