Shelly und die Wattminuten von zwei Geräten verrechnen (Balkon & Stromkasten)

Begonnen von Rheingold, 19 August 2022, 09:32:44

Vorheriges Thema - Nächstes Thema

Rheingold

Hallo zusammen,

ich brauch ein bisschen Denkhilfe bei den Shellies und der Verarbeitung der Wattminute.

Mein Setup ist wie folgt:
- Shellies per MQTT eingebunden und mit Statistik-Modul kombiniert
- am Balkonkraftwerk hängt ein Shelly der unter anderem Wm und Leistung liefert (Balkon_Wm, Balkon_Power). Klappt soweit super. Auch mit der Statistik
- Im Sicherungskasten der Wohnung hängt ein Shelly 3 EM der den kompletten Bezug berechnet ("3EM_Bezug_Wm"), die Einspeisung kalkuliert ("3EM_Einspeisung_Wm") und die komplette Leistungsaufnahme/Abgabe ermittelt (3EM_Power). Auch das klappt soweit erstmal.
- Über das Statistik-Modul lasse ich mir jeweils die Tages-/Monats-/Jahreswerte ausgeben

Beispiel: es werden gerade 100 W am Balkonkraftwerk produziert werden und 200 W bezogen. Heißt ich verbrauche 300 W im Augenblick. Ich möchte nun ausgeben und speichern wie viel Gesamtleistung ich verbrauche - easy (3EM_Power + Balkon_Power) ... aber auch viel viele Wm ich tatsächlich verbraucht habe. Und gerade bei letzterem bekomme ich Kopfschmerzen weil Wm eben Leistung pro Zeit sind und doch nicht so einfach miteinander verrechnet werden können 🤔🙈🤯 oder doch?

Wie muss ich vorgehen um die Wm ordentlich zu loggen um daraus einen schönen Chart machen zu können? Muss ich die Deltas der Wm beider Shellies miteinander summieren und das Ergebnis z.B. als neues Reading abspeichern?

Ich freue mich auf eure Hilfe oder Denkanstöße :)

Fhem auf Raspi 3; Jeelink mit 6x TX29DTH; CUL433 mit 9x RCS 1000 N und Somfy-Steuerung; CUL868; MAX-Cube + Thermostate; Philips Hue & Ikea Tradfri; Google Home Assistant; FTUI für Tablet und SmartPhone via Reverse-Proxy

Damian

Zitat von: Rheingold am 19 August 2022, 09:32:44
Hallo zusammen,

ich brauch ein bisschen Denkhilfe bei den Shellies und der Verarbeitung der Wattminute.

Mein Setup ist wie folgt:
- Shellies per MQTT eingebunden und mit Statistik-Modul kombiniert
- am Balkonkraftwerk hängt ein Shelly der unter anderem Wm und Leistung liefert (Balkon_Wm, Balkon_Power). Klappt soweit super. Auch mit der Statistik
- Im Sicherungskasten der Wohnung hängt ein Shelly 3 EM der den kompletten Bezug berechnet ("3EM_Bezug_Wm"), die Einspeisung kalkuliert ("3EM_Einspeisung_Wm") und die komplette Leistungsaufnahme/Abgabe ermittelt (3EM_Power). Auch das klappt soweit erstmal.
- Über das Statistik-Modul lasse ich mir jeweils die Tages-/Monats-/Jahreswerte ausgeben

Beispiel: es werden gerade 100 W am Balkonkraftwerk produziert werden und 200 W bezogen. Heißt ich verbrauche 300 W im Augenblick. Ich möchte nun ausgeben und speichern wie viel Gesamtleistung ich verbrauche - easy (3EM_Power + Balkon_Power) ... aber auch viel viele Wm ich tatsächlich verbraucht habe. Und gerade bei letzterem bekomme ich Kopfschmerzen weil Wm eben Leistung pro Zeit sind und doch nicht so einfach miteinander verrechnet werden können 🤔🙈🤯 oder doch?

Wie muss ich vorgehen um die Wm ordentlich zu loggen um daraus einen schönen Chart machen zu können? Muss ich die Deltas der Wm beider Shellies miteinander summieren und das Ergebnis z.B. als neues Reading abspeichern?

Ich freue mich auf eure Hilfe oder Denkanstöße :)

Aus Leistung Energie zu bestimmen ist meistens schwierig, da du ja nicht zu jedem Zeitpunkt die Leistung des Gerätes kennst - die kann sich innerhalb einer Sekunde mehrfach ändern. Daher bestimmen normalerweise die Geräte selbst die Energie, weil sie intern öfters die Leistung auswerten können, als wir in FHEM.

Energie ist das Integral aus Leistung und Zeit.

Es ist daher besser direkt die Energie der Geräte auszulesen - normalerweise in KWh - und diese zu plotten.


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Rheingold

Ist es ein denkbarer Ansatz wie folgt zu rechnen?
Balkon_Wm + 3EM_Bezug_Wm - 3EM_Einspeisung_Wm

So können die aktuellen Werte der Geräte direkt miteinander verrechnen werden um den Momentanverbrauch zu bestimmen. Beispiele:

50 Wm vom Balkon + 300 Wm Bezug - 0 Wm Einspeisung = 350 Wm Momentanverbrauch

Wird etwas eingespeist, dann ja nur weil mehr vom Balkon kommt als gebraucht wird. Folglich ist der Bezug 0:
400 Wm vom Balkon + 0 Wm Bezug - 200 Wm Einspeisung = 200 Wm Momentanverbrauch.

Meinungen hierzu?
Fhem auf Raspi 3; Jeelink mit 6x TX29DTH; CUL433 mit 9x RCS 1000 N und Somfy-Steuerung; CUL868; MAX-Cube + Thermostate; Philips Hue & Ikea Tradfri; Google Home Assistant; FTUI für Tablet und SmartPhone via Reverse-Proxy

Damian

Zitat von: Rheingold am 19 August 2022, 11:12:13
Ist es ein denkbarer Ansatz wie folgt zu rechnen?
Balkon_Wm + 3EM_Bezug_Wm - 3EM_Einspeisung_Wm

So können die aktuellen Werte der Geräte direkt miteinander verrechnen werden um den Momentanverbrauch zu bestimmen. Beispiele:

50 Wm vom Balkon + 300 Wm Bezug - 0 Wm Einspeisung = 350 Wm Momentanverbrauch

Wird etwas eingespeist, dann ja nur weil mehr vom Balkon kommt als gebraucht wird. Folglich ist der Bezug 0:
400 Wm vom Balkon + 0 Wm Bezug - 200 Wm Einspeisung = 200 Wm Momentanverbrauch.

Meinungen hierzu?

Also Momentanverbrauch kann nicht in Wm sein, das wäre ja Energie und die wird über Zeit bestimmt. Momentanverbrauch kann ja nur Leistung in KW oder Watt sein, weil sie im "Moment" stattfindet.

Was du machen kannst ist, über einen bestimmten Zeitraum z. B. letzte Sekunde, Minute, Stunde, Tag, Woche, Monat, Jahr Energie in KWh oder Wm bestimmen (1 kWh entspricht 16,67 Wm) und diese darstellen, addieren oder sonst was machen. Dabei müssen alle sich auf den gleichen Zeitraum beziehen. So mache ich es, indem ich die Gesamtenergie/-menge (total-Readings) der jeweiligen Zähler auswerte und darstelle : https://wiki.fhem.de/wiki/DOIF/Automatisierung#Tages-.2C_Monats-_und_Jahresstatistik_f.C3.BCr_Strom-.2C_Gas-.2C_Wasserz.C3.A4hler_und_andere_Z.C3.A4hler

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

DetlefR

ZitatIst es ein denkbarer Ansatz wie folgt zu rechnen?
Balkon_Wm + 3EM_Bezug_Wm - 3EM_Einspeisung_Wm

Das lässt sich bei den Shellies machen. Beide liefern die Werte für energy und returned_energy konstant im Minutentakt. Dadurch kann man die energy Werte vom "Balkon" mit dem "Zähler" verrechnen und in Durschnittsleistung umrechnen.
balkon.returned_energy+zähler.energy-zähler.returned_energy
balkon.energy sollte es eigentlich nicht geben. ;)

Rheingold

Zitat von: DetlefR am 19 August 2022, 15:08:37
balkon.energy sollte es eigentlich nicht geben. ;)
Jein.
Die Shellys messen ja lediglich die Leistung - egal in welche Richtung. Heißt, speist das Balkonkraftwerk 500 W ein, zeigt er 500 W an. Schließe ich eine Kaffeemaschine an die Steckdose an (und ziehe das Balkonkraftwerk aus der Steckdose dafür), zeigt der Shelly 1.500 W an 🤷‍♂️

Für den "Real-Verbrauch" klappt nun alles soweit :) Was mich noch vor Kopfzerbrechen stellt sind die Wattminuten - also die Energie:

Der ShellyEM3 liefert für L1, L2 und L3 jeweils die bezogene Energie wie auch die eingespeiste. Also genau wie es in der API-Doku steht:
Zitatshellies/shellyem3-<deviceid>/emeter/<i>/energy energy counter in Watt-minute
shellies/shellyem3-<deviceid>/emeter/<i>/returned_energy energy returned to the grid in Watt-minute

Heißt wenn L1 & 2 Strom beziehen und L3 einspeist, wie muss ich in FHEM diese Werte zusammen rechnen? Vor allem: der "Einspeisezähler" von L3 läuft weiter, obwohl ich auf L1 & 2 noch verbrauche. Der Shelly EM3 hat keinen Zähler der direkt die "Summe" aller Werte bildet. Wie erstelle ich hier eine richtige Summe der wirklich eingespeisten Energie ins Netz, da ich nur die übermittelten Werte von L3 verwenden darf wenn L1 & 2 weniger Leistungsaufnahme haben als über L3 geliefert wird? Also wenn ich über L3 z.b 20 Wm "einspeise" die aber direkt auf L1 verbrauche, darf ich diesen Zählerstand nicht als Einspeisung berechnen 🤔

Also irgendwie so nach dem Prinzip: Wenn Gesamt_Power < 0 dann speicher L3_returned_engery und erstelle ein Delta zum zuvor gespeicherten L3_returned_energy

Ich hoffe das Problem ist verständlich und ihr habt einen Tipp zum Lösungsansatz für mich?
Fhem auf Raspi 3; Jeelink mit 6x TX29DTH; CUL433 mit 9x RCS 1000 N und Somfy-Steuerung; CUL868; MAX-Cube + Thermostate; Philips Hue & Ikea Tradfri; Google Home Assistant; FTUI für Tablet und SmartPhone via Reverse-Proxy

Damian

Du bildest die Differenz auf jeder Leitung zwischen dem aktuellen und dem zuletzt gesendeten Wert, dann weiß Du wie viel Energie zwischen den beiden Sendezeitpunkten jeweils verbraucht worden ist, diese Differenzen kannst du dann addieren, weil sie über den gleichen Zeitraum errechnet wurden.

Wenn shelly im Minutentakt sendet, dann kannst du ganz einfach aus der errechneten Energie die durchschnittliche Leistungsaufnahme in Watt der letzten Minute bestimmen WattMinute/1 Minute= Watt - der Zahlenwert ist also gleich.


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

DetlefR

Damit wir vom gleichem reden, möglicherweise liege ich falsch.
Was am Balkonkraftwerk hängt, ist das ein EM oder eine Steckdose. Ich bin wohl fälschlicherweise immer von einem EM ausgegangen.
Wenn es die Steckdose ist, sehe ich da keine Möglichkeit. Da gibt es nichts, was sich sinnvoll mit den energy Werten des 3EM verbinden lässt.

Gruß Detlef

Rheingold

Danke für die Tipps soweit :)

Richtig, im Sicherungskasten ist ein Shelly EM3 und am Balkonkraftwerk ein Shelly 2.5 verbaut. Der EM3 liefert alle 60 Sekunden ein neues Energy-Reading. Der 2.5er liefert die Werte sporadisch alle paar Sekunden.

Aktueller Lösungsansatz ist per DOIF minütlich ein Delta von der eingespeisten sowie der verbrauchten Energie zu errechnen und daraus zu ermitteln in welche Richtung der Strom wirklich floss. Ein paar Denksportaufgaben stehen mir noch bevor, aber ich bin halbwegs zuversichtlich. Zumindest mehr noch als vor ein paar Tagen :)

Ergebnisse werden für die Nachwelt und als Diskussionsgrundlage hier geteilt :)
Fhem auf Raspi 3; Jeelink mit 6x TX29DTH; CUL433 mit 9x RCS 1000 N und Somfy-Steuerung; CUL868; MAX-Cube + Thermostate; Philips Hue & Ikea Tradfri; Google Home Assistant; FTUI für Tablet und SmartPhone via Reverse-Proxy

Damian

Zitat von: Rheingold am 22 August 2022, 07:07:58
Danke für die Tipps soweit :)

Richtig, im Sicherungskasten ist ein Shelly EM3 und am Balkonkraftwerk ein Shelly 2.5 verbaut. Der EM3 liefert alle 60 Sekunden ein neues Energy-Reading. Der 2.5er liefert die Werte sporadisch alle paar Sekunden.

Aktueller Lösungsansatz ist per DOIF minütlich ein Delta von der eingespeisten sowie der verbrauchten Energie zu errechnen und daraus zu ermitteln in welche Richtung der Strom wirklich floss. Ein paar Denksportaufgaben stehen mir noch bevor, aber ich bin halbwegs zuversichtlich. Zumindest mehr noch als vor ein paar Tagen :)

Ergebnisse werden für die Nachwelt und als Diskussionsgrundlage hier geteilt :)

Das Berechnen der durchschnittlichen Leistung über UserReadins habe ich hier beschrieben: https://forum.fhem.de/index.php/topic,97959.msg1225965.html#msg1225965
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

torte

Hallo zusammen,

Ich versuche mich auch gerade daran mit dem Shelly 3EM und einem Shelly 1PM meinen Autarkiegrat zu berechnen.
Der 3em schreibt ja pro Phase was er bezieht und was er einspeist.

emeter_0_total
emeter_0_total_returned
emeter_1_total
emeter_1_total_returned
emeter_2_total
emeter_2_total_returned

Ich speise aber nur auf einer Phase ein, nun kann es sein das ich auf dieser Phase dann nix beziehe aber was einspeise, auf den anderen beiden Phasen beziehe ich aber Strom.

So richtig hab ichs jetzt noch nicht verstanden wie ich nun rausbekomme was ich am Tag überhaupt komplett eingespeist was bezogen und was ich direkt verbraucht habe.
Gibts jemand der mir vielleicht mal den richtigen Schubser geben kann.
Dankeschön
Grüße
Torte

Rheingold

Zitat von: torte am 24 August 2022, 09:37:53
So richtig hab ichs jetzt noch nicht verstanden wie ich nun rausbekomme was ich am Tag überhaupt komplett eingespeist was bezogen und was ich direkt verbraucht habe.
Gibts jemand der mir vielleicht mal den richtigen Schubser geben kann.
Dankeschön
Grüße
Torte
Habe genau das gleiche Problem gehabt und konnte es lösen. nicht schön, aber funktioniert.

Zum groben Vorgehen:
- jede Minute wird ein delta von den bezogenen Wattminuten vom Shelly 3EM ermittelt
- jede Minute wird ein delta von den erzeugten Wattminuten vom Balkonkraftwerk (BKW) ermittelt
- daraus errechne ich was eingespeist und was verbraucht wird
- Zudem errechne ich wie Leistung (Watt) ich produziere bzw. beziehe.
- Von den Energie erstelle ich dann mit dem Statistikmodul entsprechende Tages, Monats, Jahrs Zusammenfassungen

Das ganze läuft seit 2 Tagen, also kann ich noch nicht viel dazu sagen ;-)

Code kommt später. Muss den erst mal aufräumen bevor ich den hier poste ;)
Fhem auf Raspi 3; Jeelink mit 6x TX29DTH; CUL433 mit 9x RCS 1000 N und Somfy-Steuerung; CUL868; MAX-Cube + Thermostate; Philips Hue & Ikea Tradfri; Google Home Assistant; FTUI für Tablet und SmartPhone via Reverse-Proxy

Rheingold

Hi,

also hier die Auszüge aus der fhem.cfg für den Strom richtig abzulesen und Auswertungen anzustellen:

Shelly 3 EM mit vielen UserReadings

define Shelly_Sicherungskasten MQTT_DEVICE
attr Shelly_Sicherungskasten IODev Mosquitto
attr Shelly_Sicherungskasten event-on-change-reading Power_Total:5,Shelly_Sicherungskasten_Eingespeist_kWh:0.01
attr Shelly_Sicherungskasten group Stromverbrauch
attr Shelly_Sicherungskasten room 40_Strom
attr Shelly_Sicherungskasten stateFormat {ReadingsVal("$name", "Power_Total", "") ." W & ⬇".sprintf("%.2f",ReadingsVal("$name","statShelly_Sicherungskasten_Bezogen_kWhDay",0)). " kWh & ⬆".sprintf("%.2f",ReadingsVal("di_L3_Einspeisung","statEingespeist_Summe_kWhDay",0))}\
attr Shelly_Sicherungskasten subscribeReading_Eingespeist_L1 shellies/shellyem3-sicherungskasten/emeter/0/total_returned
attr Shelly_Sicherungskasten subscribeReading_Eingespeist_L2 shellies/shellyem3-sicherungskasten/emeter/1/total_returned
attr Shelly_Sicherungskasten subscribeReading_Eingespeist_L3 shellies/shellyem3-sicherungskasten/emeter/2/total_returned
attr Shelly_Sicherungskasten subscribeReading_Energy_L1 shellies/shellyem3-sicherungskasten/emeter/0/total
attr Shelly_Sicherungskasten subscribeReading_Energy_L2 shellies/shellyem3-sicherungskasten/emeter/1/total
attr Shelly_Sicherungskasten subscribeReading_Energy_L3 shellies/shellyem3-sicherungskasten/emeter/2/total
attr Shelly_Sicherungskasten subscribeReading_Energy_Wm_L1 shellies/shellyem3-sicherungskasten/emeter/0/energy
attr Shelly_Sicherungskasten subscribeReading_Energy_Wm_L2 shellies/shellyem3-sicherungskasten/emeter/1/energy
attr Shelly_Sicherungskasten subscribeReading_Energy_Wm_L3 shellies/shellyem3-sicherungskasten/emeter/2/energy
attr Shelly_Sicherungskasten subscribeReading_Power_L1 shellies/shellyem3-sicherungskasten/emeter/0/power
attr Shelly_Sicherungskasten subscribeReading_Power_L2 shellies/shellyem3-sicherungskasten/emeter/1/power
attr Shelly_Sicherungskasten subscribeReading_Power_L3 shellies/shellyem3-sicherungskasten/emeter/2/power
attr Shelly_Sicherungskasten subscribeReading_state shellies/shellyem3-sicherungskasten/relay/0
attr Shelly_Sicherungskasten userReadings Shelly_Sicherungskasten_Bezogen_kWh {(ReadingsVal("$name","Energy_L1","") + ReadingsVal("$name","Energy_L2","") + ReadingsVal("$name","Energy_L3","")) / 1000},\
Shelly_Sicherungskasten_Eingespeist_kWh {(ReadingsVal("$name","Shelly_Sicherungskasten_Eingespeist_Wm","")) / 60 / 1000 },\
Shelly_Sicherungskasten_Eingespeist_Wm {(ReadingsVal("di_L3_Einspeisung","Eingespeist_Summe_Wm",""))},\
BezogenGerundet_kWhDay {"T: ". sprintf("%.2f",ReadingsVal("Shelly_Sicherungskasten","statShelly_Sicherungskasten_Bezogen_kWhDay",0)) },\
BezogenGerundet_kWhMonth {"M: ". sprintf("%.2f",ReadingsVal("Shelly_Sicherungskasten","statShelly_Sicherungskasten_Bezogen_kWhMonth",0)) },\
BezogenGerundet_kWhYear {"J: ". sprintf("%.2f",ReadingsVal("Shelly_Sicherungskasten","statShelly_Sicherungskasten_Bezogen_kWhYear",0)) },\
Power_Total {sprintf("%.2f",(ReadingsVal("$name","Power_L1","") + ReadingsVal("$name","Power_L2","") + ReadingsVal("$name","Power_L3",""))) },\
Energy_Total {(ReadingsVal("$name","Energy_L1","") + ReadingsVal("$name","Energy_L2","") + ReadingsVal("$name","Energy_L3","")) /1000 },\
Energy_Wm_Total {(ReadingsVal("$name","Energy_Wm_L1","") + ReadingsVal("$name","Energy_Wm_L2","") + ReadingsVal("$name","Energy_Wm_L3","")) },\
Eingespeist_Gerundet_kWhDay {"T: ". sprintf("%.2f",ReadingsVal("Shelly_Sicherungskasten","statShelly_Sicherungskasten_Eingespeist_kWhDay",0)) },\
Eingespeist_Gerundet_kWhMonth {"M: ". sprintf("%.2f",ReadingsVal("Shelly_Sicherungskasten","statShelly_Sicherungskasten_Eingespeist_kWhMonth",0)) },\
Eingespeist_Gerundet_kWhYear {"J: ". sprintf("%.2f",ReadingsVal("Shelly_Sicherungskasten","statShelly_Sicherungskasten_Eingespeist_kWhYear",0)) }


File Log für den Shelly am Sicherungskaste:
define FileLog_Shelly_Sicherungskasten FileLog ./log/Shelly_Sicherungskasten-%Y.log Shelly_Sicherungskasten
attr FileLog_Shelly_Sicherungskasten logtype text
attr FileLog_Shelly_Sicherungskasten room 40_Strom


Und die Statistiken für den Shelly
define Shelly_Sicherungskasten_Statistik statistics Shelly_Sicherungskasten
attr Shelly_Sicherungskasten_Statistik deltaReadings Shelly_Sicherungskasten_Bezogen_kWh
attr Shelly_Sicherungskasten_Statistik minAvgMaxReadings Power_Total
attr Shelly_Sicherungskasten_Statistik room 40_Strom
attr Shelly_Sicherungskasten_Statistik singularReadings Shelly_Sicherungskasten:Shelly_Sicherungskasten_Bezogen_kWh:Delta:(Hour|Day|Month|Year)


Sowie getrennte Statistik für die Einspeisewerte:
define Shelly_Sicherungskasten_Eingespeist_Statistik statistics Shelly_Sicherungskasten
attr Shelly_Sicherungskasten_Eingespeist_Statistik deltaReadings Shelly_Sicherungskasten_Eingespeist_kWh
attr Shelly_Sicherungskasten_Eingespeist_Statistik room 40_Strom
attr Shelly_Sicherungskasten_Eingespeist_Statistik singularReadings Shelly_Sicherungskasten:Shelly_Sicherungskasten_Eingespeist_kWh:Delta:(Hour|Day|Month|Year)


Das Balkonkraftwerk ist ebenfalls mittels Shelly eingebunden.
Im Grund fast so wie oben. Ich errechne auch das eingesparte Geld auf basis meines Strompreises von 43,1 cent/kWh 🙈
define Shelly_Balkon MQTT_DEVICE
attr Shelly_Balkon IODev Mosquitto
attr Shelly_Balkon event-on-change-reading Power:5,WattMinuten,Shelly_Balkon_kWh:0.1
attr Shelly_Balkon group Stromverbrauch
attr Shelly_Balkon room 1.7 Balkon,40_Strom
attr Shelly_Balkon stateFormat {ReadingsVal("$name", "Power", "") ." W & ".sprintf("%.2f",ReadingsVal("$name","statShelly_Balkon_kWhDay",0)). " kWh"}
attr Shelly_Balkon subscribeReading_.* shellies/shellyswitch25-balkon/relay/0
attr Shelly_Balkon subscribeReading_Power shellies/shellyswitch25-balkon/relay/0/power
attr Shelly_Balkon subscribeReading_Temperatur shellies/shellyswitch25-balkon/temperature
attr Shelly_Balkon subscribeReading_WattMinuten shellies/shellyswitch25-balkon/relay/0/energy
attr Shelly_Balkon subscribeReading_state shellies/shellyswitch25-balkon/relay/0
attr Shelly_Balkon userReadings Shelly_Balkon_kWh:WattMinuten.* monotonic {ReadingsVal($NAME,"WattMinuten",0)/60/1000},\
VerbrauchGerundet_kWhDay {"T: ". sprintf("%.2f",ReadingsVal("Shelly_Balkon","statShelly_Balkon_kWhDay",0)) },\
VerbrauchGerundet_kWhMonth {"M: ". sprintf("%.2f",ReadingsVal("Shelly_Balkon","statShelly_Balkon_kWhMonth",0)) },\
VerbrauchGerundet_kWhYear {"J: ". sprintf("%.2f",ReadingsVal("Shelly_Balkon","statShelly_Balkon_kWhYear",0)) },\
ErsparnisJahr {"💰: ". sprintf("%.2f",(ReadingsVal($NAME,"statShelly_Balkon_kWhYear",0) - ReadingsVal("di_L3_Einspeisung","statEingespeist_Summe_kWhYear",0))*0.431)},\
Gerundet_Eingespart_kWhDay {sprintf("%.2f",(ReadingsVal("Shelly_Balkon","statShelly_Balkon_kWhDay",0) - ReadingsVal("di_L3_Einspeisung","statEingespeist_Summe_kWhDay",0))) },\
Gerundet_Eingespart_kWhMonth {sprintf("%.2f",(ReadingsVal("Shelly_Balkon","statShelly_Balkon_kWhMonth",0) - ReadingsVal("di_L3_Einspeisung","statEingespeist_Summe_kWhMonth",0))) },\
Gerundet_Eingespart_kWhYear {sprintf("%.2f",(ReadingsVal("Shelly_Balkon","statShelly_Balkon_kWhYear",0) - ReadingsVal("di_L3_Einspeisung","statEingespeist_Summe_kWhYear",0))) },


Das passende File Log für das BKW
define FileLog_Shelly_Balkon FileLog ./log/Shelly_Balkon-%Y.log Shelly_Balkon
attr FileLog_Shelly_Balkon logtype text
attr FileLog_Shelly_Balkon room 1.7 Balkon


... und die Statistiken ebenfalls
define Shelly_Balkon_Statistik statistics Shelly_Balkon
attr Shelly_Balkon_Statistik deltaReadings Shelly_Balkon_kWh
attr Shelly_Balkon_Statistik minAvgMaxReadings Power,Temperatur
attr Shelly_Balkon_Statistik room 1.7 Balkon,40_Strom
attr Shelly_Balkon_Statistik singularReadings Shelly_Balkon:Shelly_Balkon_kWh:Delta:(Hour|Day|Month|Year)


Dann einen Dummy der alle Werte zusammenführt
define Stromverbrauch_Gesamt dummy
attr Stromverbrauch_Gesamt event-min-interval .*:60
attr Stromverbrauch_Gesamt event-on-change-reading Gesamt_Power:5,Gesamt_kWh:0.01
attr Stromverbrauch_Gesamt group Stromverbrauch
attr Stromverbrauch_Gesamt room 40_Strom
attr Stromverbrauch_Gesamt stateFormat {ReadingsVal("$name", "Gesamt_Power", "") ." W & ".sprintf("%.2f",ReadingsVal("$name","statGesamt_kWhDay",0)). " kWh"}
attr Stromverbrauch_Gesamt userReadings Balkon_kWh:Balkon_Wm.* monotonic {ReadingsVal($NAME,"Balkon_Wm",0)/60/1000},\
Sicherungskasten_Wm {ReadingsVal("di_L3_Einspeisung","Verbrauch_Wm_new","")},\
Sicherungskasten_kWh:Sicherungskasten_Wm.* monotonic {ReadingsVal($NAME,"Sicherungskasten_Wm",0)/60/1000},\
Sicherungskasten_Power {ReadingsVal("Shelly_Sicherungskasten","Power_Total","")},\
Balkon_Power {ReadingsVal("Shelly_Balkon","Power","")},\
Gesamt_Power {ReadingsVal("$name","Sicherungskasten_Power","") + ReadingsVal("$name","Balkon_Power","") },\
Gesamt_Wm {ReadingsVal("$name","Sicherungskasten_Wm","") + ReadingsVal("$name","Balkon_Wm","") - ReadingsVal("di_L3_Einspeisung","Eingespeist_Summe_Wm","")},\
Gesamt_kWh {ReadingsVal("$name","Gesamt_Wm","") / 60 / 1000 },\
Eingespeist_kWh {ReadingsVal("di_L3_Einspeisung","Eingespeist_Summe_kWh","")},\
Gesamt_Gerundet_kWhDay {"T: ". sprintf("%.2f",ReadingsVal("$name","statGesamt_kWhDay",0)) },\
Gesamt_Gerundet_kWhMonth {"M: ". sprintf("%.2f",ReadingsVal("$name","statGesamt_kWhMonth",0)) },\
Gesamt_Gerundet_kWhYear {"J: ". sprintf("%.2f",ReadingsVal("$name","statGesamt_kWhYear",0)) },


Per DoIf lese und schreibe ich die Verbrauchswerte in den Dummy mit den Gesamtzahlen
define di_Stromverbrauch_Gesamt DOIF ([Shelly_Sicherungskasten:Energy_Wm_Total] >= 0) {\
fhem "setreading Stromverbrauch_Gesamt Sicherungskasten_Wm ".ReadingsVal("Shelly_Sicherungskasten", "Energy_Wm_Total", "").";;";;\
fhem "setreading Stromverbrauch_Gesamt Balkon_Wm ".ReadingsVal("Shelly_Balkon", "WattMinuten", "").";;";;\
}\
DOELSEIF ([Shelly_Balkon:WattMinuten] >= 0) {\
fhem "setreading Stromverbrauch_Gesamt Sicherungskasten_Wm ".ReadingsVal("Shelly_Sicherungskasten", "Energy_Wm_Total", "").";;";;\
fhem "setreading Stromverbrauch_Gesamt Balkon_Wm ".ReadingsVal("Shelly_Balkon", "WattMinuten", "").";;";;\
}\
DOELSEIF ([Shelly_Sicherungskasten:Power_Total] >= 0) {\
fhem "setreading Stromverbrauch_Gesamt Gesamt_Power ".(ReadingsVal("Shelly_Sicherungskasten", "Power_Total", "")+ ReadingsVal("Shelly_Balkon", "Power", "")).";;";;\
}\
DOELSEIF ([Shelly_Sicherungskasten:Power_Total] < 0) {\
fhem "setreading Stromverbrauch_Gesamt Eingespeist_kWh ".ReadingsVal("Shelly_Sicherungskasten", "Eingespeist_L3", "");;\
}
attr di_Stromverbrauch_Gesamt do always
attr di_Stromverbrauch_Gesamt room 40_Strom


Hier lasse ich mir noch mit dem Gesamtverbrauch Statistiken erstellen:
define Stromverbrauch_Gesamt_Statistik statistics Stromverbrauch_Gesamt
attr Stromverbrauch_Gesamt_Statistik deltaReadings Gesamt_kWh
attr Stromverbrauch_Gesamt_Statistik room 40_Strom
attr Stromverbrauch_Gesamt_Statistik singularReadings Stromverbrauch_Gesamt:Gesamt_kWh:Delta:(Hour|Day|Month|Year)

Und natürlich auch ein Flie Log:
define FileLog_Stromverbrauch_Gesamt FileLog ./log/Stromverbrauch_Gesamt.log Stromverbrauch_Gesamt
attr FileLog_Stromverbrauch_Gesamt logtype text
attr FileLog_Stromverbrauch_Gesamt room 40_Strom


Dann berechne ich die Einspeisung auf der L3
define di_L3_Einspeisung DOIF ([+:01] and [di_L3_Einspeisung:Eingespeist_Wm_delta] > [di_L3_Einspeisung:Verbrauch_Wm_delta]) {\
fhem "setreading di_L3_Einspeisung Eingespeist_Wm_old ".(ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_new", "")).";;";;\
fhem "setreading di_L3_Einspeisung Eingespeist_Wm_new ".(ReadingsVal("Shelly_Sicherungskasten", "Eingespeist_L3", "") * 60).";;";;\
fhem "setreading di_L3_Einspeisung Eingespeist_Wm_delta ".(ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_new", "") - ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_old", "")).";;";;\
fhem "setreading di_L3_Einspeisung Verbrauch_Wm_old ".(ReadingsVal("di_L3_Einspeisung", "Verbrauch_Wm_new", "")).";;";;\
fhem "setreading di_L3_Einspeisung Verbrauch_Wm_new ".(ReadingsVal("Shelly_Sicherungskasten", "Shelly_Sicherungskasten_Bezogen_kWh", "") * 60 * 1000).";;";;\
fhem "setreading di_L3_Einspeisung Verbrauch_Wm_delta ".(ReadingsVal("di_L3_Einspeisung", "Verbrauch_Wm_new", "") - ReadingsVal("di_L3_Einspeisung", "Verbrauch_Wm_old", "")).";;";;\
fhem "setreading di_L3_Einspeisung Eingespeist_Summe_Wm ".(ReadingsVal("di_L3_Einspeisung", "Eingespeist_Summe_Wm", "") + ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_delta", "")).";;";;;;\
fhem "setreading di_L3_Einspeisung Eingespeist_Summe_kWh ".(ReadingsVal("di_L3_Einspeisung", "Eingespeist_Summe_kWh", "") + (ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_delta", "") / 60 / 1000)).";;";;;;\
fhem "setreading di_L3_Einspeisung Eingespeist_Power ".(ReadingsVal("Shelly_Sicherungskasten", "Power_Total", "")).";;";;\
fhem "setreading di_L3_Einspeisung test größer;;";;\
}\
\
DOELSEIF ([+:01] and [di_L3_Einspeisung:Eingespeist_Wm_delta] <= [di_L3_Einspeisung:Verbrauch_Wm_delta]) {\
fhem "setreading di_L3_Einspeisung Eingespeist_Wm_old ".(ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_new", "")).";;";;\
fhem "setreading di_L3_Einspeisung Eingespeist_Wm_new ".(ReadingsVal("Shelly_Sicherungskasten", "Eingespeist_L3", "") * 60).";;";;\
fhem "setreading di_L3_Einspeisung Eingespeist_Wm_delta ".(ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_new", "") - ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_old", "")).";;";;\
fhem "setreading di_L3_Einspeisung Verbrauch_Wm_old ".(ReadingsVal("di_L3_Einspeisung", "Verbrauch_Wm_new", "")).";;";;\
fhem "setreading di_L3_Einspeisung Verbrauch_Wm_new ".(ReadingsVal("Shelly_Sicherungskasten", "Shelly_Sicherungskasten_Bezogen_kWh", "") * 60 * 1000).";;";;\
fhem "setreading di_L3_Einspeisung Verbrauch_Wm_delta ".(ReadingsVal("di_L3_Einspeisung", "Verbrauch_Wm_new", "") - ReadingsVal("di_L3_Einspeisung", "Verbrauch_Wm_old", "")).";;";;\
fhem "setreading di_L3_Einspeisung Eingespeist_Power 0;;";;\
fhem "setreading di_L3_Einspeisung test kleiner;;";;\
}\
DOELSEIF ([Shelly_Sicherungskasten:Power_Total] < 0){\
fhem "setreading di_L3_Einspeisung Eingespeist_Power ".(ReadingsVal("Shelly_Sicherungskasten", "Power_Total", "")).";;";;\
}
attr di_L3_Einspeisung do always
attr di_L3_Einspeisung event-min-interval .*:60
attr di_L3_Einspeisung event-on-change-reading Eingespeist_Power
attr di_L3_Einspeisung room 40_Strom
attr di_L3_Einspeisung userReadings Verbrauch_kWh:Verbrauch_Wm_delta.* monotonic {ReadingsVal($NAME,"Verbrauch_Wm_delta",0)/60/1000},\
Eingespeist_Gerundet_kWhDay {"T: ". sprintf("%.2f",ReadingsVal("$name","statEingespeist_Summe_kWhDay",0)) },\
Eingespeist_Gerundet_kWhMonth {"M: ". sprintf("%.2f",ReadingsVal("$name","statEingespeist_Summe_kWhMonth",0)) },\
Eingespeist_Gerundet_kWhYear {"J: ". sprintf("%.2f",ReadingsVal("$name","statEingespeist_Summe_kWhYear",0)) },\


Und dann noch minütlich die Werte die Energiewerte lesen. Ist die Einspeisung höher, wird der Wert der Einspeisung gespeichert.
define di_L3_Einspeisung DOIF ([+:01] and [di_L3_Einspeisung:Eingespeist_Wm_delta] > [di_L3_Einspeisung:Verbrauch_Wm_delta]) {\
fhem "setreading di_L3_Einspeisung Eingespeist_Wm_old ".(ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_new", "")).";;";;\
fhem "setreading di_L3_Einspeisung Eingespeist_Wm_new ".(ReadingsVal("Shelly_Sicherungskasten", "Eingespeist_L3", "") * 60).";;";;\
fhem "setreading di_L3_Einspeisung Eingespeist_Wm_delta ".(ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_new", "") - ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_old", "")).";;";;\
fhem "setreading di_L3_Einspeisung Verbrauch_Wm_old ".(ReadingsVal("di_L3_Einspeisung", "Verbrauch_Wm_new", "")).";;";;\
fhem "setreading di_L3_Einspeisung Verbrauch_Wm_new ".(ReadingsVal("Shelly_Sicherungskasten", "Shelly_Sicherungskasten_Bezogen_kWh", "") * 60 * 1000).";;";;\
fhem "setreading di_L3_Einspeisung Verbrauch_Wm_delta ".(ReadingsVal("di_L3_Einspeisung", "Verbrauch_Wm_new", "") - ReadingsVal("di_L3_Einspeisung", "Verbrauch_Wm_old", "")).";;";;\
fhem "setreading di_L3_Einspeisung Eingespeist_Summe_Wm ".(ReadingsVal("di_L3_Einspeisung", "Eingespeist_Summe_Wm", "") + ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_delta", "")).";;";;;;\
fhem "setreading di_L3_Einspeisung Eingespeist_Summe_kWh ".(ReadingsVal("di_L3_Einspeisung", "Eingespeist_Summe_kWh", "") + (ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_delta", "") / 60 / 1000)).";;";;;;\
fhem "setreading di_L3_Einspeisung Eingespeist_Power ".(ReadingsVal("Shelly_Sicherungskasten", "Power_Total", "")).";;";;\
fhem "setreading di_L3_Einspeisung test größer;;";;\
}\
\
DOELSEIF ([+:01] and [di_L3_Einspeisung:Eingespeist_Wm_delta] <= [di_L3_Einspeisung:Verbrauch_Wm_delta]) {\
fhem "setreading di_L3_Einspeisung Eingespeist_Wm_old ".(ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_new", "")).";;";;\
fhem "setreading di_L3_Einspeisung Eingespeist_Wm_new ".(ReadingsVal("Shelly_Sicherungskasten", "Eingespeist_L3", "") * 60).";;";;\
fhem "setreading di_L3_Einspeisung Eingespeist_Wm_delta ".(ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_new", "") - ReadingsVal("di_L3_Einspeisung", "Eingespeist_Wm_old", "")).";;";;\
fhem "setreading di_L3_Einspeisung Verbrauch_Wm_old ".(ReadingsVal("di_L3_Einspeisung", "Verbrauch_Wm_new", "")).";;";;\
fhem "setreading di_L3_Einspeisung Verbrauch_Wm_new ".(ReadingsVal("Shelly_Sicherungskasten", "Shelly_Sicherungskasten_Bezogen_kWh", "") * 60 * 1000).";;";;\
fhem "setreading di_L3_Einspeisung Verbrauch_Wm_delta ".(ReadingsVal("di_L3_Einspeisung", "Verbrauch_Wm_new", "") - ReadingsVal("di_L3_Einspeisung", "Verbrauch_Wm_old", "")).";;";;\
fhem "setreading di_L3_Einspeisung Eingespeist_Power 0;;";;\
fhem "setreading di_L3_Einspeisung test kleiner;;";;\
}\
DOELSEIF ([Shelly_Sicherungskasten:Power_Total] < 0){\
fhem "setreading di_L3_Einspeisung Eingespeist_Power ".(ReadingsVal("Shelly_Sicherungskasten", "Power_Total", "")).";;";;\
}
attr di_L3_Einspeisung do always
attr di_L3_Einspeisung event-min-interval .*:60
attr di_L3_Einspeisung event-on-change-reading Eingespeist_Power
attr di_L3_Einspeisung room 40_Strom
attr di_L3_Einspeisung userReadings Verbrauch_kWh:Verbrauch_Wm_delta.* monotonic {ReadingsVal($NAME,"Verbrauch_Wm_delta",0)/60/1000},\
Eingespeist_Gerundet_kWhDay {"T: ". sprintf("%.2f",ReadingsVal("$name","statEingespeist_Summe_kWhDay",0)) },\
Eingespeist_Gerundet_kWhMonth {"M: ". sprintf("%.2f",ReadingsVal("$name","statEingespeist_Summe_kWhMonth",0)) },\
Eingespeist_Gerundet_kWhYear {"J: ". sprintf("%.2f",ReadingsVal("$name","statEingespeist_Summe_kWhYear",0)) },\


Dann noch natürlich eine Statistik zur Einspeisung:
define Stromverbrauch_Eingespeist_Statistik statistics di_L3_Einspeisung
attr Stromverbrauch_Eingespeist_Statistik deltaReadings Eingespeist_Summe_kWh
attr Stromverbrauch_Eingespeist_Statistik room 40_Strom
attr Stromverbrauch_Eingespeist_Statistik singularReadings di_L3_Einspeisung:Eingespeist_Summe_kWh:Delta:(Hour|Day|Month|Year)


Dann zu guter Letzt noch jede Minute die Leistung schreiben.
Im Grunde ein hässlicher Workaround, weil ich mit LogProxy die Charts für FTUI nicht schön bekommen habe (Plott-Abriss usw.)
define di_Strom_Log DOIF ([+:01]) {\
fhem "setreading di_Strom_Log Gesamt_Power ".(ReadingsVal("Stromverbrauch_Gesamt", "Gesamt_Power", "")).";;";;\
}
attr di_Strom_Log do always
attr di_Strom_Log event-min-interval .*:60
attr di_Strom_Log room 40_Strom
define FileLog_Strom_Leistung FileLog ./log/di_Strom_Log.log di_Strom_Log
attr FileLog_Strom_Leistung logtype text
attr FileLog_Strom_Leistung room 40_Strom


So, das sollte es gewesen sein. Mir ist bewusst, dass der Code nicht sonderlich schön ist, aber aktuell funktioniert er gut. Verbesserungsvorschläge sind natürlich herzlich willkommen! :)
Fhem auf Raspi 3; Jeelink mit 6x TX29DTH; CUL433 mit 9x RCS 1000 N und Somfy-Steuerung; CUL868; MAX-Cube + Thermostate; Philips Hue & Ikea Tradfri; Google Home Assistant; FTUI für Tablet und SmartPhone via Reverse-Proxy

torte

Hi,

vielen Dank für den Code,  das muss ich mir jetzt erstmal reinziehen :-)

Grüße
Torte

torte

Hi zusammen,

so hatte nun Zeit mir das ganz mal anzugucken. Hab mir einiges abgeguckt und nun eine Lösung nur auf Userreadings gebaut.


emeter_total_power { ReadingsVal($NAME,"emeter_0_power", 0 ) + ReadingsVal($NAME,"emeter_1_power", 0 ) + ReadingsVal($NAME,"emeter_2_power", 0 )},
emeter_total_power_gesamt:emeter_total_power.* { ReadingsVal($NAME,'emeter_total_power',0) + ReadingsVal('SHELLY.Solar','relay_0_power',0)},
emeter_total_kwh { ReadingsVal($NAME,'emeter_0_kWh',0) + ReadingsVal($NAME,'emeter_1_kWh',0) + ReadingsVal($NAME,'emeter_2_kWh',0)},
emeter_total_energy_summe:emeter_2_energy.* { ReadingsVal($NAME,'emeter_0_energy',0) + ReadingsVal($NAME,'emeter_1_energy',0) + ReadingsVal($NAME,'emeter_2_energy',0) + OldReadingsVal($NAME,'emeter_total_energy_summe',0)},
emeter_total_returned_energy_summe:emeter_2_returned_energy.* { (ReadingsVal($NAME,'emeter_0_returned_energy',0) + ReadingsVal($NAME,'emeter_1_returned_energy',0) + ReadingsVal($NAME,'emeter_2_returned_energy',0)) },
emeter_total_returned_feedin_summe:emeter_total_returned_energy_summe.* {if ( ReadingsVal($NAME, 'emeter_total_power',0) <= 0 ) { ( ReadingsVal($NAME,'emeter_total_returned_energy_summe',0) - (ReadingsVal($NAME,'emeter_0_energy',0) + ReadingsVal($NAME,'emeter_1_energy',0) + ReadingsVal($NAME,'emeter_2_energy',0)) ) + ReadingsVal($NAME,'emeter_total_returned_feedin_summe',0)} else { ReadingsVal($NAME,'emeter_total_returned_feedin_summe',0)} },
OWN_consumption_day:statEmeter_total_returned_feedin_summeDay.* { ReadingsVal('SHELLY.Solar','statEnergy_wmDay',0) - ReadingsVal($NAME,'statEmeter_total_returned_feedin_summeDay',0)},
OWN_consumption_dayLast:statEmeter_total_returned_feedin_summeDayLast.* { ReadingsVal('SHELLY.Solar','statEnergy_wmDayLast',0) - ReadingsVal($NAME,'statEmeter_total_returned_feedin_summeDayLast',0)},
TOTAL_consumption_day:statEmeter_total_energy_summeDay.* { ReadingsVal( $NAME,'OWN_consumption_day',0) + ReadingsVal($NAME,'statEmeter_total_energy_summeDay',0)},
TOTAL_consumption_dayLast:statEmeter_total_energy_summeDay.* { ReadingsVal( $NAME,'OWN_consumption_dayLast',0) + ReadingsVal($NAME,'statEmeter_total_energy_summeDayLast',0)},
Autarkiegrad:TOTAL_consumption_day.* { sprintf("%.2f", (ReadingsVal( $NAME,'OWN_consumption_day',0) / ReadingsVal($NAME,'TOTAL_consumption_day',0)) * 100)},
Self_consumption_dayLast:statTOTAL_consumption_dayDayLast.* { sprintf("%.2f", (ReadingsVal( $NAME,'statTOTAL_consumption_dayDayLast',0) / ReadingsVal($NAME,'statEnergy_wmDayLast',0)) * 100)}


Mein Shelly mit dem Balkonkraftwerk heißt SHELLY.Solar

Für einige Readings lasse ich mit dem Statistik  Modul eine delta Statistik schreiben. Die Werte habe ich hauptsachlich immer mit WattMinute geschrieben, werden dann in FTUI bei mir umgerechnet in kwh wenn nötig.