Zählerstand aus einzelnen Leistungswerten (sekündlich) berechnen Smartmeter MQTT

Begonnen von Stefan1968, 23 Februar 2023, 13:50:23

Vorheriges Thema - Nächstes Thema

Stefan1968

Hallo an alle,
ich bin schon eine ganze Weile mit FHEM befasst, aber jetzt komme ich einfach nicht weiter. Ist meine erste Anfrage im Forum. Wenn ich was falsch mache bitte nicht schlagen :-).
Folgendes Problem / Idee:
Ich habe an meinem "intelligenten" (digitalen Stromzähler) ein Smartmeter das über ein MQTT Device in FHEM eingebunden ist.
Ich bekomme den Zählerstand in Wh und die aktuelle Leistung als Gesamtwert und für die einzelnen Phasen.
In diversen Userreadings bekomme ich die Daten auch umgerechnet z.B. in KWh.
Leider habe ich keinen Einspeisezähler, der meine Einspeiseleistung der BalkonPVAnlage zählt.

Über ein Userreading habe ich jetzt eine Trennung der Leistungsdaten in Netzbezug und Einspeisung realisiert.

Netzbezug {ReadingsNum($name,'SM_16_7_0',0)<0 ? 0 : ReadingsNum($name,'SM_16_7_0',0)},
Einspeisung { ReadingsNum($name,'SM_16_7_0',0)>0 ? 0 : ReadingsNum($name,'SM_16_7_0',0)*-1 },


Die Daten kommen sekündlich.
Meine Idee war jetzt die Leistungsanteile, die ja quasi sekündlich in Ws vorliegen in KWh umzurechnen, also in etwa
EinspeisungKWh {ReadingsNum($name,'Einspeisung',0)/1000/3600} und dann einfach aufzusummieren.
Die Umrechnung klappt, aber bei der Aufsummierung nach dem Schema EinspeisungKWhGes {ReadingsNum($name,'EinspeisungKWhGes',0) +ReadingsNum($name,'EinspeisungKWh',0)} ergeben sich Werte die unplausibel (viel zu groß) sind. Bei ca. 300Watt dauernder Leistung müsste ja nach einer Stunde etwa 0,3KWh herauskommen. Die erreiche ich schon nach wenigen Minuten.....
Hat jemand eine Idee? Geht das überhaupt so, wie ich mir das vorstelle? Es muss nicht mega genau sein. Ich möchte nur in etwa berechnen wieviel Leistung meiner BalkonPVAnalge im Netz verschwindet.....
Schon mal Dank im Voraus.
Ach ja, ich habe mir schon den Wolf gesucht. Entweder benutze ich die falschen Begriffe oder ich liege total auf dem Holzweg.

cnkru

RPi4, Razberry, ZWAVE (Thermostate, Dimmer, Schalter, Multisensor), Milight-LED, Wifi (IPCAM, Fritz!DECT, Sonoff), alexa, Hombridge, Velux-Rollos, Viessman-API, iobroker, SENEC

bartman121

Naja, ein userreading ohne Trigger triggert halt auf jedes Event, works as Designed.

Deine summierfunktion wird viel zu oft aufgerufen. Einfach nochmal in der Commandref nachlesen.

Also wenn der Zähler Netzbezug und Lieferung ausgeben kann, dann muss das auch ein Zählerstand für A+ und A- sein. Nimm darauf das statistics-Modul!

Grüße

Andreas


Stefan1968

ZitatVersuche es mal mit der Integralfunktion im userReading
Das mit der Integral Funktion habe ich schon ausprobiert. Bringt leider keine Änderung.

ZitatAlso wenn der Zähler Netzbezug und Lieferung ausgeben kann, dann muss das auch ein Zählerstand für A+ und A- sein. Nimm darauf das statistics-Modul!
Mein Zähler kann leider nur einen Zählerstand ausgeben. Bei Einspeisung wird nur die Momentanleistung als negativer Wert angezeigt.
Daraus errechne/trenne ich dann die Momentanleistung Einspeisung/Bezug.  Diese wird dann in KWh umgerechnet, wobei ich immer vom Sekundentakt ausgegangen bin.
Irgendwie hat das ganze mit den MQTT Daten zu tun.
Eigentlich sendet der Zähler per MQTT sekündlich ein Protokoll im Json Format, das ich mit dem Modul expand json in seine Bestandteile zerlege.
Das klappt auch super.
Augenscheinlich werden die Werte für die einzelnen Phasen, aktuelle Gesamt Leistung und für den Zählerstand sekündlich aktualisiert.
Wenn ich nun aber mit dem event-aggregator das Reading EinspeisungKWhGes auf Anzahl der Einzelwerte im Aktualisireungszeitraum prüfe, komme ich auf 12.
Das ist auch in etwa der Faktor um den der Gesamtwert des Readings EinspeisungKWhGes vom erwarteten Wert abweicht. Ich hätte hier jetzt genau einen Wert pro Sekunde erwartet.
event-aggregator NetzbezugKWhGesTest::none:n: (Hier Netzbezug da im Moment die Sonne nicht scheint ;-) Rechenweg/Umsetzung ist aber gleich.
Das ist auch in etwa der Faktor um den der Gesamtwert des Readings EinspeisungKWhGes vom erwarteten Wert abweicht.
Da muss ich wohl noch mal in die Tiefe gehen.

bartman121


Damian

Jeder mir bekannte Zähler, der Leistung liefert, liefert auf die angesammelte Energie in kWh. Die Differenz zwei dieser Werte liefert dir die gewünschte Energie in kWh des Zeitraums, das ist mit Sicherheit genauer als aus den einzelnen Leistungswerten die Energie zu ermitteln.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stefan1968

ZitatDen Teil mit dem Trigger hast du gelesen und verstanden?
Gelesen ja! Verstanden? Bin mir nicht mehr sicher.

ZitatJeder mir bekannte Zähler, der Leistung liefert, liefert auf die angesammelte Energie in kWh. Die Differenz zwei dieser Werte liefert dir die gewünschte Energie in kWh des Zeitraums, das ist mit Sicherheit genauer als aus den einzelnen Leistungswerten die Energie zu ermitteln.
Mein Stromzähler ist kein Einspeisen oder zwei Wege Zähler. Der zählt hoch bzw. bleibt bei Einspeisung stehen....
Ich werde mir den ganzen Kram die Tage  noch mal ansehen. Wegen der trigger bin ich etwas ratlos, da ja die einzelnen Reading sekündlich aktualisiert werden und nur einen Wert repräsentieren aber da muss ich wohl noch mal nachlegen, was mein Verständnis angeht......

bartman121

Achso, jetzt lese ich den Unfug erst.

Du speist einphasig ein und willst anhand der Gesamtleistung feststellen, dass du einspeist und auch noch die Energiemenge berechnen die du eingespeist hast.

Ich vermute hier fehlt ein bisschen Grundwissen. Nur weil deine Gesamtleistung größer null ist, muss das nicht heißen, dass du nicht einspeist. Genauso heißt Gesamtleistung< 0 nicht, dass du keinen Strombezug haben musst.

Wenn dein Zähler kein 4Quadranten-Zählet ist, dann wirst du mit deiner Herangehensweise irgendwelchen Unfug erfahren/ermitteln.

Ohne geeignetes Messmittel wirst du hier keine ordentlichen Ergebnisse bekommen. Mal davon abgesehen, dass der gewünschte wert ohnehin keine Relevanz hat.


Stefan1968

So, ich habe am WE noch ein bisschen rumprobiert und es scheint jetzt zu funktionieren.
Der Trigger war die Lösung. SM_16_7_0 ist der Wert aller drei Phasen in W der genau einmal pro Sekunde übermittelt wird. Wenn man das in den UserReadings nicht angibt, wird jedes Event das vom Device erzeugt wird getriggert und sorgt dann beim Addieren der Werte für "Verwirrung".
Danke #bartman121
Netzbezug:SM_16_7_0.* {ReadingsVal($name,'SM_16_7_0',0)<0 ? 0 : ReadingsVal($name,'SM_16_7_0',0)},
NetzbezugInt:SM_16_7_0.* {ReadingsVal($name,'SM_16_7_0',0)<0 ? 0 : ReadingsVal($name,'SM_16_7_0',0)},
NetzbezugKWh:SM_16_7_0.* {ReadingsVal($name,'Netzbezug',0)/1000/3600},
NetzbezugKWhGes:SM_16_7_0.* {ReadingsVal($name,'NetzbezugKWhGes',0) +ReadingsVal($name,'NetzbezugKWh',0) },
NetzbezugKWhGesGer:SM_16_7_0.* {(sprintf"%.2f",ReadingsVal($name,'NetzbezugKWhGes',0))},
Einspeisung:SM_16_7_0.* { ReadingsVal($name,'SM_16_7_0',0)>0 ? 0 : ReadingsVal($name,'SM_16_7_0',0)*-1 },
EinspeisungKWh:SM_16_7_0.* {ReadingsVal($name,'Einspeisung',0)/1000/3600},
EinspeisungKWhGes:SM_16_7_0.* {ReadingsVal($name,'EinspeisungKWhGes',0) +ReadingsVal($name,'EinspeisungKWh',0) },
EinspeisungKWhGesGer:SM_16_7_0.* {(sprintf"%.2f",ReadingsVal($name,'EinspeisungKWhGes',0))},

Hier noch mal eine kleine Zusammenfassung für diejenigen die es interessiert.
Was will ich:
Ich habe einen Stromzähler der mir einen Zählerstand (Verbrauch) ausgibt und bei Einspeisung (Einphasig, sogenannte Balkonanlage) stehen bleibt.
Er gibt mir also nicht aus wie viele KWh eingespeist werden.
Was er mir aber anzeigt ist die Wirkleistung aller drei Phasen einzeln und in Summe, auch wenn die Werte Negativ werden (bedeutet Einspeisung).
Wie mache ich das:
Da der Zähler genau einmal pro Sekunde die Wirkleistung ausgibt, kann ich also den Wert als Ws (Arbeit) annehmen.
Wenn ich diesen Wert in Ws nun durch 3600s/h und 1000 w/kw dividiere erhalte ich Kwh die pro Sekunde verbraucht/eingespeist werden.
Diese Werte addiere ich auf und erhalte einen errechneten Zähler für die Energie / Arbeit in KWh, jeweils für Einspeisung und Netzbezug.
Netzbezug liefert mir der Zähler freihaus. Wenn ich nun also den Zählerwert mit meiner Berechnung vergleiche, müssten die Werte eigentlich korrelieren.
Kleine Ungenauigkeit oder besser Schwierigkeit ist, dass der Zählerstand nur (ich meine) alle 3 Minuten übermittelt wird.
Ich muss also genau den richtigen Moment erwischen um zu vergleichen.
Was mir noch aufgefallen ist:
Ich hatte ursprünglich mit ReadingsNum gearbeitet. Die auf KWh umgerechneten Werte springen sporadisch in exponentielle Darstellung um, was bei den aufaddierten Werten zu Berechnungsfehlern geführt hat. Ich habe alles auf ReadingsVal geändert und damit funktioniert es jetzt.
Wenn jemand Lust und Zeit hat zu erklären was genau der Unterschied ist oder wo ich das nachlesen kann, würde ich mich freuen. Habe es bisher noch nicht gefunden.

Stefan1968

Zitatchso, jetzt lese ich den Unfug erst.

Du speist einphasig ein und willst anhand der Gesamtleistung feststellen, dass du einspeist und auch noch die Energiemenge berechnen die du eingespeist hast.

Ich vermute hier fehlt ein bisschen Grundwissen. Nur weil deine Gesamtleistung größer null ist, muss das nicht heißen, dass du nicht einspeist. Genauso heißt Gesamtleistung< 0 nicht, dass du keinen Strombezug haben musst.

Wenn dein Zähler kein 4Quadranten-Zählet ist, dann wirst du mit deiner Herangehensweise irgendwelchen Unfug erfahren/ermitteln.

Ohne geeignetes Messmittel wirst du hier keine ordentlichen Ergebnisse bekommen. Mal davon abgesehen, dass der gewünschte wert ohnehin keine Relevanz hat.

Es handelt sich um ein Smartmeter oder auch 4Quadrantenzähler genannt, der nur leider die Einspeisung nicht zeigt, da nicht freigeschaltet......sollte also passen ;-)