NEWS
Grafana Zeitstempel für bar anpassen
-
Hallo Zusammen,
ich bin mir nicht sicher ob das Topic passt. Wenn es ein bessere gibt, bitte verschieben.
Ich bau mir gerade ein Grafana bar charts zusammen, in dem mir die 3 verschiedene Daten angezeigt werden sollen:- Strom aus dem Netz (gelb)
- Aus der Solaranlage verwendeter Strom (grün)
- Von der Solaranlage ins Netz eingespeist (blau)
Alle Farben werden noch überarbeitet
Für die abgelaufenen Monate funktioniert das stacking wunderbar. Für den aktuell laufenden Monitor funktioniert es leider nicht. Ursache ist (nach meiner Vermutung) der Zeitstempel in der InfluxDB. Dieser liegt bei den abgelaufenen Monaten beim auf dem letzten Tag im Monat um 21:00 (Z? UTC?).
Hat jemand ne Idee wie ich die 3 einzelnen Bars stacken kann?
mir würde dazu einfallen den Zeitstempel dieses Messpunktes zu manipulieren (Uhrzeit abschneiden).
Gibt es noch andere Möglichkeiten und weis jemand wie ich das durchführen kann?
Ich freue mich über antworten, werde allerdings erst morgen Abend zum Antworten kommen.
-
@gaunt sagte in Grafana Zeitstempel für bar anpassen:
Gibt es noch andere Möglichkeiten und weis jemand wie ich das durchführen kann?
Zeig mal bitte die Flux-Queries.
-
@marc-berg said in Grafana Zeitstempel für bar anpassen:
Zeig mal bitte die Flux-Queries.
Hier die Querie von der Solarerzeugung:
import "timezone" option location = timezone.location(name: "Europe/Berlin") from(bucket: "IOBroker") |> range(start: -10mo, stop: now()) |> filter(fn: (r) => r["_measurement"] == "0_userdata.0.Energie.Strom.Historie.AktuellerMonat.StromSolarVerwendet") |> filter(fn: (r) => r["_field"] == "value") |> aggregateWindow(every: 1mo, offset: -10s, fn: last, createEmpty: false) |> yield(name: "Solar")
Hier ist die vom Netzbezug:
import "timezone" option location = timezone.location(name: "Europe/Berlin") from(bucket: "IOBroker") |> range(start: -10mo, stop: now()) |> filter(fn: (r) => r["_measurement"] == "0_userdata.0.Energie.Strom.Historie.AktuellerMonat.StromBezug") |> filter(fn: (r) => r["_field"] == "value") |> aggregateWindow(every: 1mo, offset: -10s, fn: last, createEmpty: false) |> yield(name: "bezug")
Und hier von der Einspeisung aus der Solaranlage ins Netz:
import "timezone" option location = timezone.location(name: "Europe/Berlin") from(bucket: "IOBroker") |> range(start: -10mo, stop: now()) |> filter(fn: (r) => r["_measurement"] == "0_userdata.0.Energie.Strom.Historie.AktuellerMonat.StromEingespeist") |> filter(fn: (r) => r["_field"] == "value") |> aggregateWindow(every: 1mo, offset: -10s, fn: last, createEmpty: false) |> map(fn: (r) => ({ r with _value: r._value * -1.0 })) |> yield(name: "Eingespeist")
Alle Datenpunkte werden im IOBroker geschrieben wenn sich der Wert (z.B. Netzbezug) erhöht und vom IOBroker wird alle 10min in die InfluxDB geschrieben.
-
@gaunt sagte in Grafana Zeitstempel für bar anpassen:
|> aggregateWindow(every: 1mo, offset: -10s, fn: last, createEmpty: false)
Ich bin kein Fan von Offsets in den Queries, was soll damit erreicht werden?
Versuche mal die drei Zeilen
|> aggregateWindow(every: 1mo, offset: -10s, fn: last, createEmpty: false)
auszutauschen durch
|> aggregateWindow(every: 1mo, fn: last, createEmpty: false, timeSrc: "_start")
Ohne die Quelldaten ist es natürlich etwas schwierig.
-
Super cool.
das hat funktioniert. Der Wert der im November steht, ist zwar der falsche. Aber der gleiche falsche Wert steht auch in der Datenbank. Daher funktioniert es genau so wie es sollte.Kannst du mir noch sagen was der Code der das Offset ersetzt hat macht?
timeSrc: "_start"
-
@gaunt sagte in Grafana Zeitstempel für bar anpassen:
Kannst du mir noch sagen was der Code der das Offset ersetzt hat macht?
Mit der aggregateWindow Funktion werden ja eine Reihe von Werten (in deinem Fall von einem Monat) zusammengefasst und durch EINEN Wert ersetzt. Mit den "fn" Attribut wird festgelegt, was mit den einzelnen Werten passiert ("sum" für Summe, "mean" für Mittelwert etc.)
Jedenfalls wird mit dem "timeSrc" Parameter festgelegt, welchen Zeitstempel der resultierende Wert bekommt. Im Standard wird das ENDE des Zeitfensters angenommen, das mit "aggregateWindow" gebildet wird. Mit "_start" wird dagegen der Anfang des Zeitfensters genommen, also 0 Uhr des ersten des Monats.
Für den aktuellen Monat ist das Ende des jeweiligen Zeitfensters gleich dem letzten aufgezeichneten Wert. Und wenn nicht alle drei Werte in der selben Mikrosekunde aufgezeichnet wurden, kann nicht gestapelt werden.Schwierig zu erklären (ohne was dabei aufzumalen). Ich hoffe, ich konnte es ein wenig klarstellen.
-
Doch perfekt erklärt. Zu mindestens habe ich es verstanden.
Was ich eben in meiner Freude Übersehen habe, ist das sich der "Versatz" jetzt auf den Anfang der Datenreihe verschoben hat.
Die von Grafana aus der DB ausgelesenen Daten sehen so aus:
Das sind die Daten die für diesen Monat in der Datenbank vorliegen (Normalerweise liegen jedoch mehrere Daten für einen Monat vor).
-
@gaunt sagte in Grafana Zeitstempel für bar anpassen:
"Versatz" jetzt auf den Anfang der Datenreihe verschoben hat.
Je nachdem, welchen Zeitraum man anzeigen lässt kann das natürlich passieren. Das kann man verhindern, indem man immer den Anfang des (bei dir) Monats nimmt. Das geht mit der
truncate
Funktion. Also die "range" Zeilen noch austauschen und "date" importieren.import "date" |> range(start: date.truncate(t:-10mo, unit:1mo))
"stop: now()" kann man weglassen, da sowieso der Defaultwert
-
@marc-berg said in Grafana Zeitstempel für bar anpassen:
geht mit der truncate Funktion
Genau das hat funktioniert.
Vielen Dank nochmal. Das hat mir unglaublich viel geholfen und viele viele Stunden des testen, lesen und Suchens erspart.
Zu mindestens wenn das was ich bereits getan habe missachtet.Vielen Dank nochmal