NEWS
Grafana: Probleme mit Errechnen von Werten und deren Anzeige
-
Hallöchen zusammen,
nach Anschaffung des Balkonkraftwerks im letzten Jahr hatte ich mich schon mal intensiver mit Grafana beschäftigt, was dann aber irgendwann auch weide ein wenig eingeschlafen ist. Jetzt gabs vor einiger zeit dann auch mal nen digitalen Stromzähler und nen passenden Lesekopf dazu, was mich dann weider mehr damit basteln lies. Hier treten jetzt ein paar "Problemchen" auf, zu denen ich keine Lösung finde:
Problem 1:
In einer Visualisierung möchte ich anzeigen, wie viel Strom mein BKW produziert hat, wieviel davon ich selbst genutzt und wieviel Geld ich damit gespart habe. Den genutzten PV-Strom errechne aus dem erzeugten PV-Strom und der Einspeisung ins Netz, bzw berechne zusätzlich mit dem aktuellen Strompreis aus einem manuellen Datenpunkt die Ersparnis:from(bucket: "ioBroker") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == "PV_Inverter___Ertrag_total" or r._measurement == "Strompreis_kWh" or r._measurement == "SmartMeter___Einspeisung_gesamt") |> filter(fn: (r) => r._field == "value") |> aggregateWindow(every: 1mo, fn: last, timeSrc: "_start") |> pivot(rowKey: ["_time"], columnKey: ["_measurement"], valueColumn: "_value") |> difference(columns: ["PV_Inverter___Ertrag_total", "SmartMeter___Einspeisung_gesamt" ]) |> map(fn: (r) => ({ r with PV_Nutzung: r.PV_Inverter___Ertrag_total - r.SmartMeter___Einspeisung_gesamt })) |> map(fn: (r) => ({ r with Ersparnis: (r.PV_Inverter___Ertrag_total - r.SmartMeter___Einspeisung_gesamt) * r.Strompreis_kWh }))
Funktioniert soweit ganz gut, allerdings gibt es den Datenpunkt für die Einspeisung erst seit Mitte Mai, in der Folge werden alle Tage/Monate ohne diesen Datenpunkt gar nicht berechnet:
Kann ich das irgenwie umgehen? zB indem ich Grafana irgendwie mitteile, dass er stattdessen mit "0" weiterrechnen soll, wenn er keinen Wert findet?
Problem 2:
In 2 weiteren Visualisierungen geht es um meine tagl. Energie-Bilanz, erstellt aus dem tägl. Bezug aus dem Netz, PV-Ertrag und Einspeisung. Daraus errechne ich den Gesamtverbrauch (also Netzbezug + PV-Ertrag - Einspeisung). Das Ergebnis soll aber nicht in der Visualisierung selbst angezeigt werden, sondern nur im ToolTip und in der Legende. Die beiden Visualisierungen unterscheiden sich nur in 2 Punkten: die eine geht über 30 tage als Barchart, die andere über 365 Tage (aktuell nur Messpunkte ab Mitta Mai) als Time series. Bei dem einen zeigt er den Gesamtverbrauch nur im Tooltip an, beim anderen nur in der Legende. Die entsprechenden Felder sind komplett gleich per Overrides eingestellt.
Hier erschließt sich mir die mögliche Ursache dafür nicht. Habt ihr vielleicht eine Idee?import "timezone" option location = timezone.location(name: "Europe/Berlin") from(bucket: "ioBroker") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == "PV_Inverter___Ertrag_total" or r._measurement == "SmartMeter___Einspeisung_gesamt" or r._measurement == "SmartMeter___Bezug_gesamt") |> filter(fn: (r) => r._field == "value") |> aggregateWindow(every: 1d, fn: last, timeSrc: "_start") |> pivot(rowKey: ["_time"], columnKey: ["_measurement"], valueColumn: "_value") |> difference(columns: ["PV_Inverter___Ertrag_total", "SmartMeter___Einspeisung_gesamt", "SmartMeter___Bezug_gesamt"]) |> map(fn: (r) => ({ r with PV_Nutzung: r.PV_Inverter___Ertrag_total - r.SmartMeter___Einspeisung_gesamt })) |> map(fn: (r) => ({ r with Gesamtverbrauch: r.PV_Inverter___Ertrag_total - r.SmartMeter___Einspeisung_gesamt + r.SmartMeter___Bezug_gesamt}))
Problem 3:
Die Abfrage aus Problem 2 brauchen echt lang bis sie angezeigt werden und der verwendete Raspi 4 geht mit der CPU-Last auch für längere Zeit an die Leistungsgrenze. Liegt das an der Abfrage im Allgemeinen oder hab ich da womöglich irgendwelche Knoten in meiner Query, die das ganze an die Leistungsgrenze treibt?Besten Gruß und vielen Dank im Voraus
Marian -
@t-147 schriebst du bitte noch im Titel dass es Grafana ist...
Grafana Probleme mit Errechnen von Werten und deren Anzeige
ansonsten definiere die Rabge anders
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
klar wird der Pi an seine grenzen gehen.. das sind nicht nur paar DP die der lesen muss sondern auch noch rechnen..
-
@arteck said in Probleme mit Errechnen von Werten und deren Anzeige:
@t-147 schriebst du bitte noch im Titel dass es Grafana ist...
Kein Problem, schon erledigt.
Dass diese Art der Abfrage und Berechnung etwas mehr Leistung braucht, hatte ich ja erwartet. Dass der Pi dann für 1-2min unter Volllast geht, bis alles angezeigt, da hab ich nicht mit gerechnet.
Auf dem gleichen Dashboard ist auch noch eine "Live-Anzeige" der Leistungswerte mir kurzen Abständen der Aktualisierung. Da das Setting ja für das gesamte Dashboard gilt und keine unterschiedlichen Intervalle innerhalb eines Dashboards möglich sind, zwingt vor allem dieses Query das System in die Knie. -
@t-147 sagte in Grafana: Probleme mit Errechnen von Werten und deren Anzeige:
keine unterschiedlichen Intervalle innerhalb eines Dashboards möglich sind
doch du kannst die query setzten dann sind die aber fix..
-
@arteck
Von der Timerange wusste ich das, dass das mit dem Intervall auch geht ist mir tatsächlich neu.
Ich hab bisher nur überall gelesen, dass das Abfrage-Intervall vom Dashboard vorgegeben wird für alle queries.
Aber das wäre ja genau das, was ich bräuchte, um die dauerhafte Belastung des Pi's zu verhindern. -
-
@arteck
Ich glaube wir missverstehen uns.
Ich meine nicht die einstellbare Timerange pro Panel, sondern das automatische Aktualisierungs-Intervall. Das geht wohl nur pro Dashboard einzustellen. -
@t-147 said in Grafana: Probleme mit Errechnen von Werten und deren Anzeige:
Problem 1:
In einer Visualisierung möchte ich anzeigen, wie viel Strom mein BKW produziert hat, wieviel davon ich selbst genutzt und wieviel Geld ich damit gespart habe. Den genutzten PV-Strom errechne aus dem erzeugten PV-Strom und der Einspeisung ins Netz, bzw berechne zusätzlich mit dem aktuellen Strompreis aus einem manuellen Datenpunkt die Ersparnis:from(bucket: "ioBroker") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == "PV_Inverter___Ertrag_total" or r._measurement == "Strompreis_kWh" or r._measurement == "SmartMeter___Einspeisung_gesamt") |> filter(fn: (r) => r._field == "value") |> aggregateWindow(every: 1mo, fn: last, timeSrc: "_start") |> pivot(rowKey: ["_time"], columnKey: ["_measurement"], valueColumn: "_value") |> difference(columns: ["PV_Inverter___Ertrag_total", "SmartMeter___Einspeisung_gesamt" ]) |> map(fn: (r) => ({ r with PV_Nutzung: r.PV_Inverter___Ertrag_total - r.SmartMeter___Einspeisung_gesamt })) |> map(fn: (r) => ({ r with Ersparnis: (r.PV_Inverter___Ertrag_total - r.SmartMeter___Einspeisung_gesamt) * r.Strompreis_kWh }))
Funktioniert soweit ganz gut, allerdings gibt es den Datenpunkt für die Einspeisung erst seit Mitte Mai, in der Folge werden alle Tage/Monate ohne diesen Datenpunkt gar nicht berechnet:
Kann ich das irgenwie umgehen? zB indem ich Grafana irgendwie mitteile, dass er stattdessen mit "0" weiterrechnen soll, wenn er keinen Wert findet?
Dieses Problem ließ sich zwischenzeitlich lösen:
|> fill(column: "SmartMeter___Einspeisung_gesamt", value: 0.0)
Auf Grund der fehlenden Anfangswerte für diese Monate ist das Ergebnis nicht ganz korrrekt, aber die Berechnung wird damit ausgeführt. Damit bin ich für einige andere Anwendungsfälle ebenfalls ein Stück weiter