Historische Wh-Werte mit neuen kWh-Werten in grafana synchronisieren

Wie ich in folgendem Beispiel beschrieben habe, habe ich meine WLAN-Meross-Steckdosen durch Zigbee-Nous-Steckdosen ersetzt. Dabei wurde auch folgendes geändert:

  • der Energy-Wert wird nicht mehr in Wh sondern in kWh geliefert
  • der Energy-Wert wird nicht mehr jede Nach um 0Uhr auf 0 gesetzt, sondern steigt stetig an.

Während das im EnergyDashboard von HA keine Probleme verursacht, weil HA diese Einheiten korrekt bewerten kann, ist das für grafana als reines Darstellungstool eine Katastrophe, die ich wie folgt gelöst habe.
Momentan sieht meine Grafik wie folgt aus. An den Farben ist sehr schön zu erkennen den Wechsel der Steckdosen, wobei der letzte grüne Balken eine Lücke aufweist, da die Werte aus beiden Sensoren nicht korrekt addiert werden. Man kann in grafana natürlich auch einstellen, dass alles in grün angezeigt wird, dannsieht man den Wechsel nicht mehr.

neben dem bisherigen Query

import "timezone"
option location = timezone.location(name: "Europe/Berlin")
from(bucket: "homeassistant")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "Wh")
  |> filter(fn: (r) => r["_field"] == "value")
  |> filter(fn: (r) => r["domain"] == "sensor")
  |> filter(fn: (r) => r["entity_id"] == "gefriertruhe_energy")
  |> aggregateWindow(every: 1d, fn: last, timeSrc: "_start", createEmpty: false)
  |> yield(name: "last")

habe ich ein 2. Query eingefügt

import "timezone"
option location = timezone.location(name: "Europe/Berlin")
from(bucket: "homeassistant")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "kWh")
  |> filter(fn: (r) => r["_field"] == "value")
  |> filter(fn: (r) => r["domain"] == "sensor")
  |> filter(fn: (r) => r["entity_id"] == "gefriertruhe_energy")
  |> aggregateWindow(every: 1d, fn: last, timeSrc: "_start", createEmpty: false)
  |> difference()

Während das 1. Query die Wh-Werte auswertet und dabei berücksichtigt, dass diese immer um 0Uhr zurückgesetzt werden, berücksichtigt das 2. Query den Umstand eines permanent steigenden Sensorwertes.

Wenn man beide obigen Querys nun so verwendet, dann bleibt trotzdem ein Problem bestehen. Entweder werden die Altwerte viel zu hoch angezeigt oder die neuen viel zu gering. Also muss eine Wertereihe mit der anderen synchronisiert oder normiert werden. Dies könnte man auf 2 Arten lösen. Man nimmt für die neuen Werte eine 2. Y-Achse (war mein erster Gedanke und Versuch). Problem dabei, die Skalierung ist dann unterschiedlich und nahe beieinander liegende Werte von Alt und Neu werden falsch dargestellt.
Ich habe das so gelöst, dass ich im 1. Query folgende Zeile hinzugefügt habe

  |> map(fn: (r) => ({r with _value: float(v: r._value) / 1000.0}))

so dass das Query nun wie folgt aussieht

import "timezone"
option location = timezone.location(name: "Europe/Berlin")
from(bucket: "homeassistant")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "Wh")
  |> filter(fn: (r) => r["_field"] == "value")
  |> filter(fn: (r) => r["domain"] == "sensor")
  |> filter(fn: (r) => r["entity_id"] == "gefriertruhe_energy")
  |> map(fn: (r) => ({r with _value: float(v: r._value) / 1000.0}))
  |> aggregateWindow(every: 1d, fn: last, timeSrc: "_start", createEmpty: false)
  |> yield(name: "last")

und die Altwerte Wh in kWh umgerechnet werden. Als Standard Options habe ich die Unit auf kWh eingestellt und es wird alles korrekt angezeigt wie in der Grafik ganz zu Anfang.

Viel Spaß
Claudius

P.S. vielen Dank den vielen fleissigen HA-Nutzern hier, die mir immer wieder mit guten Tips weiterhelfen und geholfen haben. Vieles wäre ohne sie nicht so schnell und so einfach möglich gewesen.