NEWS
InfluxDB mehrere Task zu einem erfassen
-
Hallo,
Eine Frage noch zur besseren Ordnung der Taskbefehle.
Zur Zeit habe ich für die Erfassung der Temperatur und der Luftfeuchte jeden Raum separat mit einer Task Run für 0:00 gespeichert. Wäre es auch möglich die Räume in einem einzigen Task zu speichern ?
Ich habe mal das Script für 2 Räume also 2 Task so wie es im Moment bei mir ist. Wie müsste ich diese umarbeiten damit
daraus nur noch ein Script entsteht?option task = {name: "arbeitszimmerwerte", cron: "0 0 * * *"} from(bucket: "iobroker") |> range(start: -24h) |> filter( fn: (r) => r["_measurement"] == "zigbee.0.00124b002fabe53f.humidity" or r["_measurement"] == "zigbee.0.00124b002fabe53f.temperature", ) |> filter(fn: (r) => r["_field"] == "value") |> aggregateWindow(every: 60m, fn: mean, createEmpty: false) |> pivot(rowKey: ["_time"], columnKey: ["_measurement"], valueColumn: "_value") |> map( fn: (r) => ({ _time: r._time, _field: "value", _measurement: "raumwerte", temperatur: r["zigbee.0.00124b002fabe53f.temperature"], humidity: r["zigbee.0.00124b002fabe53f.humidity"], zimmer: "arbeitszimmer", }), ) |> to( bucket: "raumwerte", tagColumns: ["zimmer"], fieldFn: (r) => ({temperatur: r.temperatur, humidity: r.humidity}), )
option task = {name: "kuechenwerte", cron: "0 0 * * *"} from(bucket: "iobroker") |> range(start: -24h) |> filter( fn: (r) => r["_measurement"] == "zigbee.0.00124b002fabe538.humidity" or r["_measurement"] == "zigbee.0.00124b002fabe538.temperature", ) |> filter(fn: (r) => r["_field"] == "value") |> aggregateWindow(every: 60m, fn: mean, createEmpty: false) |> pivot(rowKey: ["_time"], columnKey: ["_measurement"], valueColumn: "_value") |> map( fn: (r) => ({ _time: r._time, _field: "value", _measurement: "raumwerte", temperatur: r["zigbee.0.00124b002fabe538.temperature"], humidity: r["zigbee.0.00124b002fabe538.humidity"], zimmer: "kueche", }), ) |> to( bucket: "raumwerte", tagColumns: ["zimmer"], fieldFn: (r) => ({temperatur: r.temperatur, humidity: r.humidity}), )
Gruß
Mico -
Ziemlich tricky, da man in der Map-Funktion nicht überall mit Variablen arbeiten darf, ich nicht stumpf die Queries duplizieren wollte und es in Flux nicht sowas wie Schleifen gibt (glaube ich).
Das hier müsste es tun (Achtung, die Spalte heißt jetzt temperature) :
getData = (sensorId, zimmer) => from(bucket: "iobroker") |> range(start: -24h) |> filter( fn: (r) => r["_measurement"] == "zigbee.0." + sensorId + ".temperature" or r["_measurement"] == "zigbee.0." + sensorId + ".humidity" ) |> filter(fn: (r) => r["_field"] == "value") |> aggregateWindow(every: 60m, fn: mean, createEmpty: false) |> pivot( rowKey: ["_time"], columnKey: ["_measurement"], valueColumn: "_value" ) |> rename(fn: (column) => if column =~ /temperature/ then "temperature" else if column =~ /humidity/ then "humidity" else column ) |> map( fn: (r) => ({ _time: r._time, _field: "value", _measurement: "raumwerte", temperature: r["temperature"], humidity: r["humidity"], zimmer: zimmer, }) ) // hier ergänzen kuecheData = getData(sensorId: "00124b002fabe538", zimmer: "kueche") arbeitszimmerData = getData(sensorId: "00124b002fabe53f", zimmer: "arbeitszimmer") // und hier ergänzen union(tables: [kuecheData, arbeitszimmerData]) |> to( bucket: "raumwerte", tagColumns: ["zimmer"], fieldFn: (r) => ({temperature: r.temperature, humidity: r.humidity}) )
EDIT: Formatierung
-
Vielen Dank,
Ich versuche dieses heute Abend bzw. morgen früh umzusetzen.
Gruß
Mico -
das hat alles geklappt.
2 verständnisfragen:
bei dem punkt: rename
if column =~ /temperature/ then "temperature" else if column =~ /humidity/ then "humidity"
wird das wirklich umbenannt und würde das wenn ich dann, das so schreibe
if column =~ /temperature/ then "donald" else if column =~ /humidity/ then "mickey"
in dem neuen bucket statt temperatur donald heißen.
und was würde passieren wenn ich statt:
|> map( fn: (r) => ({ _time: r._time, _field: "value", _measurement: "raumwerte", temperature: r["temperature"], humidity: r["humidity"], zimmer: zimmer,
einfach das zimmer vor die temperatur und der luftfeuchtigkeit schreibe.
|> map( fn: (r) => ({ _time: r._time, _field: "value", _measurement: "raumwerte", zimmer: zimmer, temperature: r["temperature"], humidity: r["humidity"],
Gruß
Mico -
@mico sagte in InfluxDB mehrere Task zu einem erfassen:
bei dem punkt: rename
wird das wirklich umbenannt und würde das wenn ich dann, das so schreibeif column =~ /temperature/ then "donald" else if column =~ /humidity/ then "mickey"
in dem neuen bucket statt temperatur donald heißen.
An dieser Stelle erfolgt die Umbenennung lediglich, um einen einheitlichen Spalten-Namen für die map() Funktion zu haben. Wenn du die Spalten im Ziel-Measurement anders benennen möchtest, dann in to():
|> to( bucket: "raumwerte", tagColumns: ["zimmer"], fieldFn: (r) => ({donald: r.temperature, mickey: r.humidity}) )
und was würde passieren wenn ich statt:
|> map( fn: (r) => ({ _time: r._time, _field: "value", _measurement: "raumwerte", temperature: r["temperature"], humidity: r["humidity"], zimmer: zimmer,
einfach das zimmer vor die temperatur und der luftfeuchtigkeit schreibe.
Die Reihenfolge ist völlig schnuppe, kannst du machen. Was willst du erreichen?
-
ich möchte nur irgendwann verstehen, wie ich das alles aufbauen muss damit ich ein gewünschtes ergebnis erzielen kann.
damit ich mein wissensstand mal erhöhen kann.bei dem zweiten Hauptgruppe = raumwert der teilt zich in die gruppen = temperatur und luftfeuchtigkeit = und die erhalten die gruppe zimmer nit den räumen
wenn ich zimmer jetzt nach oben setzte habe ich
Hauptgruppe = raumwert der hat die untergruppe zimmer mit den räumen und diese die temperatur bzw luftfeuchte richtig gedacht?Gruß
mico -
@mico sagte in InfluxDB mehrere Task zu einem erfassen:
richtig gedacht?
"Hauptgruppe" und "Untergruppe" sind ja von dir eingeführte Begriffe, da kann man wohl nicht von richtig oder falsch reden.
Ich halte mich da eher an die technischen Gegebenheiten. So ein Measurement besteht aus einer recht einfachen Tabelle, die Spalten mit Unterstrich sind die Muss-Spalten, die von InfluxDB mindestens benötigt werden. "_field" enthält den Namen des Messwertes, "_value" den Messwert selbst (ohne Einheit).
Dazu kommen beliebig viele
Tags
, die sind zur Kategorisierung von Messungen und zur Unterstützung bei der Suche und Filterung gedacht. "zimmer" ist hier ein Tag, was du einfach immer mitgibst, um später zu wissen, aus welchem Raum der Messwert stammt. Vorteil der Tags: sie sind indexiert, d.h. Filter darüber sind sehr schnell. Deshalb aber auf keinen Fall Messwerte in Tags speichern, sonst sprengt es dir die Datenbank.Die Zusammenführung der einzelnen Messwerte zu einer gemeinsamen Messung erfolgt über die exakt gleiche Zeit. (zum Beispiel die erste und zweite Zeile)
_measurement _field _value _time zimmer raumwerte humidity 55 2024-11-01T12:12:12.012Z Arbeitszimmer raumwerte temperature 23 2024-11-01T12:12:12.012Z Arbeitszimmer raumwerte humidity 60 2024-11-01T13:12:12.012Z Kueche raumwerte temperature 19.5 2024-11-01T13:12:12.012Z Kueche raumwerte humidity 54 2024-11-02T12:12:12.012Z Arbeitszimmer raumwerte temperature 23 2024-11-02T12:12:12.012Z Arbeitszimmer raumwerte humidity 61 2024-11-02T13:12:12.012Z Kueche raumwerte temperature 19.4 2024-11-02T13:12:12.012Z Kueche Jetzt, wo ich darüber erzähle: @haus-automatisierung hat über die Grundlagen auch ein Video gemacht, das ist vielleicht hilfreicher.