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. |
Zum Thema Zeitstempel und Zeit habe ich noch folgende Hinweise:
Ich benutze keine Zeitstempel, die mir zusammen mit der Leistung geliefert werden (z. B. von MQTT). Stattdessen nutze ich die Systemzeit zum Zeitpunkt der Datenverarbeitung durch das Programm. Alternativ kann man auch die Zeitstempel des Geräts verwenden, welches die Leistung liefert.
Da die meisten Systeme eine Zeitauflösung im Millisekundenbereich liefern, ergibt die Differenz der verwendeten Zeitstempel ebenfalls Millisekunden. Um diese in Stunden umzurechnen, muss man sie durch 1000 (für Sekunden) und durch 3600 (für Stunden) dividieren.
Bei der Übermittlung von Leistungswerten über eine Cloud (wie bei der Zendure-Lösung) ist eine Zeitverzögerung durch die Laufzeit der Informationen sehr wahrscheinlich. Da diese Laufzeiten schwanken können, ist die Genauigkeit der Energieberechnung bei einer Cloudlösung nicht so hoch wie bei einer Direktabfrage über das lokale Netzwerk. Ich habe jedoch festgestellt, dass die Abweichungen für mich nicht groß genug sind, um die Berechnung zu verändern.
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:
- Zunächst wird die Leistung ausgelesen und ein Zeitstempel erzeugt.
- Anschließend werden die Flow-Variablen ausgelesen und zwischengespeichert.
- Nun erhalten die Flow-Variablen die aktuelle Leistung und den aktuellen Zeitstempel.
- 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
- Erläuterung erfolgt weiter hinten).
- Anschließend wird die Zeitdifferenz zwischen dem letzten und dem aktuellen Zeitwert berechnet (auch in Stunden).
- Schließlich kann die Energie in Wattstunden berechnet werden.
- Das Ergebnis wird von der Funktion zurückgeliefert.
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.
Hinterlasse einen Kommentar