NEWS
Aus influxDB 2 lesen und schreiben JS oder node.js
-
@xxjooo zeig doch mal den Query
-
soweit ich gelesen habe, kann man mit der Flux-Sprache von InfluxDB Daten lesen, filtern und transformieren – aber nicht direkt in andere Datenpunkte schreiben.
Ich kann leider erst am Nachmittag eines meiner Beispiele einstellen.
-
@xxjooo Klar kannst Du das. Mit
> to()
. Macht man doch z.B. mit Tasks genauso. Kann man natürlich auch nur einmalig manuell ausführen, um einen bestehenden Datenbestand einzuschränken und das Ergebnis wieder zu speichern.https://docs.influxdata.com/flux/v0/stdlib/influxdata/influxdb/to/
-
also hier ein JavaScript aus ioBroker:
const rangeStart = '2024-06-19T00:00:00.000Z'; const rangeStop = '2025-06-19T00:00:00.000Z'; function loeschen() { sendTo('influxdb.0', 'deleteAll', [ { id: '0_userdata.0.Wetterstation.Aussenfeuchtigkeit_clean' } ], result => console.log('deleted')); } function holen() { sendTo('influxdb.0', 'getHistory', { id: '0_userdata.0.Wetterstation.Aussenfeuchtigkeit', options: { start: new Date(rangeStart).getTime(), end: new Date(rangeStop).getTime(), aggregate: 'onchange', addId: true } }, function (result) { if (!result || !result.result || !Array.isArray(result.result)) { console.error('Fehlerhafte Rückgabe:', JSON.stringify(result)); return; } for (let i = 0; i < result.result.length; i++) { const entry = result.result[i]; const val = entry.val; if (val >= 30 && val <= 60) { setState('0_userdata.0.Wetterstation.Aussenfeuchtigkeit_clean', { val: val, ts: entry.ts, ack: true, q: entry.q || 0, from: entry.from || 'system.adapter.javascript.0' }, true); } } }); } //loeschen(); // optional holen(); // Daten abrufen
In 0_userdata.0.Wetterstation.Aussenfeuchtigkeit sind für den Zeitraum tausende an Daten. Angekommen ist das:
-
@xxjooo Oha, Du rufst also extrem oft
setState
auf, und hoffst auf die Logik dahinter? Wenn Du es schon so extrem umständlich mit einem Script machen möchtest (statt mit Flux-Funktionen direkt in der Datenbank), dann schau wenigstens diesendTo
FunktionstoreState
für die Datenbank an:https://github.com/ioBroker/ioBroker.influxdb?tab=readme-ov-file#storestate
-
also mit dem Script:
const rangeStart = '2024-06-19T00:00:00.000Z'; const rangeStop = '2025-06-19T00:00:00.000Z'; function loeschen() { sendTo('influxdb.0', 'deleteAll', [ { id: '0_userdata.0.Wetterstation.Aussenfeuchtigkeit_clean' } ], result => console.log('deleted')); } function holen() { sendTo('influxdb.0', 'getHistory', { id: '0_userdata.0.Wetterstation.Aussenfeuchtigkeit', options: { start: new Date(rangeStart).getTime(), end: new Date(rangeStop).getTime(), aggregate: 'onchange', addId: true } }, function (result) { if (!result || !result.result || !Array.isArray(result.result)) { console.error('Fehlerhafte Rückgabe:', JSON.stringify(result)); return; } for (let i = 0; i < result.result.length; i++) { const entry = result.result[i]; const val = entry.val; if (val >= 30 && val <= 60) { sendTo('influxdb.0', 'storeState', { id: '0_userdata.0.Wetterstation.Aussenfeuchtigkeit_clean', state: { val: val, ts: entry.ts, ack: true, q: entry.q || 0, from: entry.from || 'system.adapter.javascript.0' } }); } } }); } //loeschen(); // optional holen(); // Daten abrufen
ergibt sich leider exakt das gleiche Ergebnis, nur zwei Werte...
Dann muss ich mich doch mit der Flux-Sprache beschäftigen. Interessanterweise hatte ich vor der Umstellung auf influxDB 2.x mit influxDB 1.8x schon mal so ein Problem und konnte aber mit einem JavaScript alle Daten in einen anderen DP schreiben...
Gut, dann schau ich mal auf Flux...
-
@xxjooo sagte in Aus influxDB 2 lesen und schreiben JS oder node.js:
Gut, dann schau ich mal auf Flux...
from(bucket: "dein_bucket") |> range(start: -10y) |> filter(fn: (r) => r._measurement == "0_userdata.0.Wetterstation.Aussenfeuchtigkeit" and r._field == "value" ) |> filter(fn: (r) => r._value >= 30.0 and r._value <= 60.0) |> set(key: "_measurement", value: "0_userdata.0.Wetterstation.Aussenfeuchtigkeit_clean") |> to(bucket: "dein_bucket")
EDIT: indem du die letzte Zeile (mit "to") erstmal weglässt, kannst du sehen, ob das Ergebnis das gewünschte ist.
-
vielen Dank, sieht sehr einfach aus. Mal sehen.
-
@marc-berg, @arteck und @haus-automatisierung
Ok, ich bestätige: Der Weg funktioniert auf Anhieb. Sogar so, dass in einen anderen bucket geschrieben werden kann, der den DP noch gar nicht kannte. Vielen Dank dafür!
Dann möchte ich das jetzt gerne noch etwas weiter spinnen:
Ich bin ja grundsätzlich skeptisch, dass das nicht noch mal passiert. Jetzt habe ich ja inzwischen unter den Einstellungen der DPs Grenzen gesetzt, damit nur reale Werte durchkommen. Sollte das aber aus irgendeinem Grund noch mal passieren, dann würde ich gerne einfach diese Flux-Abfrage automatisiert ausführen lassen.
Da muss ich aber mal noch ein wenig drüber nachdenken, denn nach dem Lesen der readme des influx Adapters auf github kommt mir noch eine andere Idee: es müsste doch möglich sein, eine Abfrage mit JavaScript im ioBroker zu programmieren, unter den tausenden Werten die weniger als 10 zu finden, die weg müssen und diese mit dem delete state Befehl des Adapters einfach zu löschen.
Ich könnte dann den ersten Weg einmalig mit Zurückschreiben der Werte komplett durchgehen und dann, wenn letzteres funktionieren würde, das in das Wetter Skript von @SBorg integrieren oder zeitlich davor starten lassen.
Haltet Ihr das grundsätzlich für möglich? Ich setze es mal noch nicht auf gelöst, da ich sicher noch Fragen dazu habe.
Besten Dank Euch!
Jo
-
@xxjooo sagte in Aus influxDB 2 lesen und schreiben JS oder node.js:
Da muss ich aber mal noch ein wenig drüber nachdenken, denn nach dem Lesen der readme des influx Adapters auf github kommt mir noch eine andere Idee: es müsste doch möglich sein, eine Abfrage mit JavaScript im ioBroker zu programmieren, unter den tausenden Werten die weniger als 10 zu finden, die weg müssen und diese mit dem delete state Befehl des Adapters einfach zu löschen.
Ich könnte dann den ersten Weg einmalig mit Zurückschreiben der Werte komplett durchgehen und dann, wenn letzteres funktionieren würde, das in das Wetter Skript von @SBorg integrieren oder zeitlich davor starten lassen.
Haltet Ihr das grundsätzlich für möglich? Ich setze es mal noch nicht auf gelöst, da ich sicher noch Fragen dazu habe.Möglich, aber warum nicht an der Wurzel packen und die Werte vor dem Schreiben plausibilisieren und filtern?
-
ja, sehr gut, das habe ich beim ersten Mal auch gedacht, als mir das Problem unplausibler Werte aufgefallen ist. Das Problem, mit dem ich nicht umgehen konnte, war, dass die Werte von der Wetterstation über das Skript und den Adapter Simple RESTful API Adapter von der Station geholt und direkt in die DPs geschrieben und damit auch geloggt werden. Das bedeutete für mich, dass eine Überprüfung auf Plausibilität für mich nicht möglich war, denn ich konnte nicht herausfinden, wie ich mit dem Simple RESTful API Adapter einen Wert filtern kann, bevor er einem DP zugeordnet und geloggt wird.
Siehst Du da eine Möglichkeit?