Aus Leistung den Zählerstand berechnen

Viele Wechselrichter oder Messsteckdosen liefern Momentanwerte der Leistung, beispielsweise 350 W. Ich benötige jedoch häufig nur die kumulierten Werte in Form von Zählerständen, d. h. die kumulierte Energie über einen bestimmten Zeitraum in Kilowattstunden.

Dazu braucht man im Prinzip nur die Leistungswerte mit einem Zeitstempel.

Im folgenden Artikel beschreibe ich, wie ich das mit Node-Red gelöst habe. Das Prinzip ist auf viele andere Geräte übertragbar, die keine Zählerstände liefern.

Grundprinzip

Ein Zendure-Hyper-2000-Wechselrichter liefert über die Cloud nur die erzeugte Leistung per MQTT zu einem bestimmten Zeitpunkt, nicht aber einen Zählerstand, anhand dessen ich die erzeugte Energie beispielsweise an einem Tag ablesen könnte.

Dabei lassen sich Energie und Zählerstand recht einfach aus der Leistung berechnen. Die dazu benötigten Werte lassen sich physikalisch wie folgt beschreiben (vereinfacht):

  • Leistung (Watt) = Spannung * Stromstärke (z.B. in Watt)
  • Energie (kWh) = Leistung * Zeit in einem Zeitintervall (z.B. in Kilowattstunden)
  • Zählerstand =  Summe der Energiewerte in Zeitintervallen (z.B. in Kilowattstunden)

Eine Lampe, die eine Stunde lang eingeschaltet ist und 500 Watt benötigt, verbraucht somit eine Energie von 0,5 kWh. Wäre die Lampe dimmbar und würde sie nach einer halben Stunde auf 250 Watt gedimmt werden, würde sie in der ersten halben Stunde 0,25 kWh und in der zweiten halben Stunde 0,125 kWh, also insgesamt 0,375 kWh, verbrauchen.

Ein Wechselrichter produziert in relativ kurzen Zeitabständen unterschiedliche Leistungen, sodass ich die Energie für viele kleine Zeitintervalle berechnen und aufsummieren muss. Mathematisch entspricht dies einer Integralfunktion über ein Rechteck. Da jeder übermittelte Leistungswert einen Zeitstempel besitzt, können die erforderlichen Daten schnell ermittelt werden.

Voraussetzungen

Ich realisiere die Berechnung in Node-Red und speichere die Zählerstände in eine InfluxDB-Datenbank. Grundsätzlich speichere ich nur die resultierenden Zählerstände in der Datenbank ab, indem ich die Energie des letzten Zeitraums hinzufüge.

Im Programm benutze ich einige Flow-Variablen, das heißt, diese speichern Werte zwischen, die beim nächsten Programmdurchlauf verwendet werden, wenn ein neuer Leistungswert geliefert wird. Diese Variablen sind:

Variablenname in Node-Red Beschreibung
f_letzterZeitstempel In der Variablen wird der Zeitstempel der letzten Leistungsmessung gespeichert. Wenn eine neue Leistung gemessen wird, kann ich den Zeitraum für die Energieberechnung aus der Differenz der Zeitstempel ermitteln.
f_letzteEnergeWh In dieser Variablen wird die letzte Leistung zwischengespeichert. Mein Wechselrichter liefert Wattstunden. Würden kWh geliefert, müssten diese mit 1000 multipliziert werden, um Wattstunden zu erhalten.
f_LetzterZaehlerstand In dieser Variable speichere ich den letzten Zählerstand, sodass ich bei der Berechnung nicht jedes Mal die Datenbank abfragen muss. Eine Datenbankabfrage erfolgt nur, wenn die erste Leistung vorliegt, da der Wert sonst 0 ist.

Flowbeschreibung

Die Verarbeitung und Speicherung der Daten erfolgt durch einen Flow, dessen Struktur wie folgt ist:

Von meinem Wechselrichter erhalte ich per MQTT-Abfrage eine Vielzahl von Werten als Input. Aus diesen extrahiere ich im nächsten Function-Node zuerst die aktuelle Leistung.

In der Funktion „Energie berechnen” ermittele ich die Energie im letzten Zeitintervall. Mit dem anschließenden Switch-Node teste ich, ob die Variable „f_Zaehlerstand” vorhanden ist (Bedingung für Ausgang 1: „ist nicht Null”, für Ausgang 2: „ansonsten”). Warum mache ich das?

Für die Zählerstandsermittlung hole ich mir initial immer den Zählerstand aus der Datenbank und rechne dann mit Flow-Variablen in Node-Red weiter. Dadurch spare ich mir bei jedem Durchlauf die Datenbankabfrage des letzten Zählerstandes, die nur Zeit kostet. Allerdings muss ich am Anfang (nach einem Neustart von Node-Red) den Zählerstand einmal in die Variable laden. Dies stelle ich mit dem Switch-Node fest, der einfach prüft, ob die Variable „f_Zaehlerstand” vorhanden ist. Falls nicht, führe ich eine Abfrage der InfluxDB-Datenbank mit dem „influxdb in“-Node „Letzten Zählerstand auslesen“ und dem Function Node „Letzten Zählerstand zwischenspeichern“ aus. In diesem speichere ich den letzten Zählerstand aus der Datenbankabfrage in der Variablen „f_Zaehlerstand”.

Liefert der Switch-Node das Ergebnis „ist nicht Null”, wurde eine korrekte Energieberechnung durchgeführt. Im nächsten Funktionsknoten „Zähler hochsetzen” addiere ich die beiden Variablen „f_letzterZaehlerstand” und „f_energiekWh” und erhalte somit den neuen Zählerstand, den ich im anschließenden „InfluxDB Out”-Knoten in die Datenbank schreibe.

Berechnung

Im Folgenden ist die Vorgehensweise bei der Berechnung in dem Function-Node "Energie berechnen" kurz beschrieben:

  1. Zunächst wird die Leistung ausgelesen und ein Zeitstempel erzeugt.
  2. Anschließend werden die Flow-Variablen ausgelesen und zwischengespeichert.
  3. Nun erhalten die Flow-Variablen die aktuelle Leistung und den aktuellen Zeitstempel.
  4. Danach wird geprüft, ob es sich um die erste Messung handelt. Dies kann mittler der Variablen f_Zaehlerstand erfolgen, die bei der ersten Messung noch nicht ermittelt ist (z. B. nach einem Neustart von Node-Red). Falls ja, wird die Funktion abgebrochen (die
  5. Erläuterung erfolgt weiter hinten).
  6. Anschließend wird die Zeitdifferenz zwischen dem letzten und dem aktuellen Zeitwert berechnet (auch in Stunden).
  7. Schließlich kann die Energie in Wattstunden berechnet werden.
  8. Das Ergebnis wird von der Funktion zurückgeliefert.
Copy to Clipboard

Der gesamte Ablauf kann selbstverständlich noch vereinfacht werden. Ebenso sind Erweiterungen denkbar. So habe ich beispielsweise eine kleine Absicherung eingebaut, falls die Datenbank nicht beschrieben werden kann (z. B. aufgrund eines Connection-Errors). In diesem Fall werden die Energiewerte zwischengespeichert, bis ein erneutes Schreiben möglich ist.