NEWS
InfluxDB mit Node-RED auslesen und schreiben - so geht's!
-
Ich wollte die Daten, die der ioBroker in der influxDB anlegt, in Node-RED auslesen und dachte mir in meiner Einfalt, dass das "mal so eben" geht. Leider gibt es da ein paar Fallstricke - und anscheinend fand ich nicht die richtigen Suchbegriffe, um hier oder bei Google die Lösung zu finden.
Ich bin einigermaßen vertraut mit SQL, aber bei influx ist die Philosphie komplett anders und ich stehe immer wieder mal auf dem Schlauch. Vielleicht kann ich hier mit einem kleinen Beitrag anderen eine lange Suche ersparen
Das Video hätte mir geholfen, aber ich fand es erst später: "Prescient Devices Inc." erklärt es bei YouTube in aller Kürze.
Worauf dort nicht eingegangen wird und was mir viel Kopfzerbrechen bereitet hat, ist die Angabe der Influx-Version. Ich habe hier eine V 1.8.3, also dachte ich mir, dass ich bei der Konfiguration der influx-Nodes eben [1.8-flux] auswählen muss. Leider wird danach eine einfache Query mit SELECT unmöglich, man muss dann "flux sprechen", eine mir völlig unverständliche Variante zur Abfrage.
Kurzum: unbedingt [1.x] auswählen:Damit kann man dann wirklich einfache Abfragen machen wie z.B.
SELECT * FROM test
Wenn man auf die völlig abwegige Idee kommt, den letzten, also aktuellsten Eintrag auszulesen, macht man das so:
SELECT * FROM test ORDER BY DESC LIMIT 1
(Leider gibt es kein LAST oder ähnliches)
Ich habe hier ein paar Beispiele zum Rumspielen angelegt, so sieht das aus:
Im ersten Inject-Node setze ich als Value mit JSONata einen Zufallswert 0-10, das "measurement" lege ich auch hier fest und nicht im influxdb-out-Node.
Der Name der Database ist bei mir iobroker, das wird in bei der Konfiguration der DB eingetragen (s.o.).Das Auslesen der Daten ist in der mittleren Zeile "dumm", es werden einfach alle ("*") Einträge ausgelesen, das Ergebnis ist ein Array von Objects.
In der unteren Zeile ist das intelligent, es wird nur der letzte Eintrag geholt und dann im payload (dem Ergebnis der Query), das erste Objekt und darin das Field "value" abgefragt ("msg.payload[0].value"), damit bekomme ich den Wert, den ich oben reingesteckt habe.
"value" ist der Standardname, der für dumm eingestellte payloads von influx gewählt wird. Wer andere fields möchte, findet Beispiele im o.g. Video.
Viel Erfolg!
P.S.: Vor dem Installieren des angehängten Flows, muss noch in der Palette "node-red-contrib-influxdb" installiert werden, oder passiert das automatisch??
-
@woodbert sagte in InfluxDB mit Node-RED auslesen und schreiben - so geht's!:
(Leider gibt es kein LAST oder ähnliches)
Das ist so nicht korrekt. Du kannst LAST() verwenden.
Auszug aus einem fuction-node von mir:
let qdevice = msg.payload.device; let qserie = msg.payload.serie; let query = `SELECT LAST("value") AS "${qserie}" ` + `FROM "${qdevice}" `; msg.query = query return msg;
Gruß
Reiner -
@rewenode
Schick, ich danke dir! Habe ich übersehen.Um denselben "Output" zu bekommen muss ich dann aber das hier schreiben:
SELECT LAST(value) AS value FROM test
Ansonsten steht in den Objekten des Arrays "last" als key.
-
@woodbert sagte in InfluxDB mit Node-RED auslesen und schreiben - so geht's!:
Um denselben "Output" zu bekommen muss ich dann aber das hier schreiben:
Wird wohl auf den Typ deiner Spalte value ankommen. Bei mir gehts mit "value". Wobei man "value" ja nicht wirklich als Spaltenbezeichner nehmen sollte - mein Fehler.
Gibt übrigens auch FIRST()Und dann sollte man es aus Performacegründen mit GROUP BY kombinieren.
Siehe hier https://stackoverflow.com/questions/29193898/influxdb-getting-only-last-value-in-queryGruß
Reiner -
@woodbert Achtung, value (in meinem Beispiel) ist ein Spalte
Gruß
Reiner -
@rewenode sagte in InfluxDB mit Node-RED auslesen und schreiben - so geht's!:
Und dann sollte man es aus Performacegründen mit GROUP BY kombinieren.
Siehe hier https://stackoverflow.com/questions/29193898/influxdb-getting-only-last-value-in-queryHmm, ich sage doch, dass ich influx "nicht verstehe"
Immerhin steht bei stackoverflow, dass die schlechte Performance für InfluxDB v0.8 gilt, vielleicht ist das ja bei v1.8 behoben -
@woodbert said in InfluxDB mit Node-RED auslesen und schreiben - so geht's!:
In der unteren Zeile ist das intelligent, es wird nur der letzte Eintrag geholt und dann im payload (dem Ergebnis der Query), das erste Objekt und darin das Field "value" abgefragt ("msg.payload[0].value"), damit bekomme ich den Wert, den ich oben reingesteckt habe.
Guten Morgen
Wo hast du diesen Term "msg.payload[0].value" eingegeben? denn ich möchte wirklich aus dem Array nur die Value als payload haben.... Die Lösung von Dir funktioniert ansonsten (hab den Flow importiert)
Danke für eure Antworten! -
@mauri-0
Was du oben siehst ist die Ausgabe eines debug-nodes.
Du kannst das natürlich auch in einen change-node schreiben und in msg.payload füllen. -
-
@mickym
Danke für die schöne Aufbereitung meines Vorschlags. Am iPhone von unterwegs war mir das doch zu schwierig -