BKW: Einspeisung berechnen ?

Begonnen von sprudelverduenner, 27 Dezember 2022, 08:50:56

Vorheriges Thema - Nächstes Thema

sprudelverduenner

Hallo liebe FHEM-Gemeinde,

ich betreibe ein sogenanntes Balkonkraftwerk mit einem Hoymiles Microwechselrichter.
Den Microwechselrichter habe mit der AhoyDTU auch bereits in FHEM eingebunden.

Die Werte von meinem Einrichtungszähler habe ich ebenso in FHEM eingebunden - bei einer Einspeisung zeigt dieser negative Werte, läuft aber natürlich nicht rückwärts.

Ich kenne dadurch meinen täglichen Strombezug und meine tägliche Stromerzeugung.
Wenn ich jetzt die Möglichkeit hätte meine tägliche Einspeisung zu berechnen, dann wüsste ich wieviel Wh / kWh ich tatsächlich durch das Balkonkraftwerk gespart habe.

Gibt es eine Möglichkeit die tägliche Einspeisung zu berechnen?

Vielen Dank für Eure Antworten,
Sprudelverduenner




FHEM @ RaspberryPi 3, HMLAN, HMUART + HMRS485, Homematic, ESPEasy @ Sonoff / Shelly / ESP8266, ZigBee @ CC2531
Echo Dot, Dreambox, Yamaha MusicCast, Logitech Hub, LW-12, LD382
FRITZ!Box 7590 AX, Mesh @ FRITZ!Repeater 2400, FRITZ!Fon, iPhone 13, iPad Air 5, AppleWatch 8

ch.eick

#1
Moin,
Du kannst die negativen Werte, die in einem fester Rhythmus ,von z.B. einer Minute kommen, Summieren und bekommst dann Watt/Minute .
Das dann /60 /1000 sind dann kWh .
Es gibt im FHEM auch einen ElectricityCalculator,  der sollte das erledigen.


VG Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

sprudelverduenner

Danke für Deine Antwort.

Ich habe mir das Modul ElectricityCalculator angeschaut und mal eingerichtet.

Ich sehe allerdings für mich ein Problem wo ich noch keine Lösung sehe.

Mein Stromzähler sieht so aus: Internals:
   CFGFN      /opt/fhem/FHEM/sub_cfg/sub_externe-geraete.cfg
   DEF        192.168.1.102:23
   DeviceName 192.168.1.102:23
   FD         12
   FUUID      5c448db4-f33f-fbf8-9b5c-6f01145592c0614b
   MeterType  SML
   NAME       eHZ
   NEXT       2022-12-27 21:23:00
   NR         188
   PARTIAL   
   STATE      436.5 W
   TYPE       OBIS
   eventCount 169
   OLDREADINGS:
   READINGS:
     2022-12-27 21:22:00   ManufID         ISK
     2022-12-27 21:22:00   PublicKey       5A64-8B5F-3175-1341-046A-E738-5E54-0E67-76B3-2317-4CF1-B326-6BD6-3F42-65EC-F46B-FD0C-47F2-6331-CC35-4F9D-178F-86C1-BBAE-01
     2022-12-27 21:22:00   Serial          06-49-53-4B-01-07-22-FC-EF-F2
     2021-04-25 11:24:38   Version         
     2022-12-27 21:22:00   consumption     33384
     2022-12-27 21:22:00   power           436.5
     2022-12-27 21:22:00   power_neg       0
     2022-12-27 21:22:00   power_pos       436.5
     2022-12-27 18:35:29   state           opened
     2022-12-27 21:22:00   total_consumption 33384620.1
     2022-12-27 21:22:00   total_consumption_Ch1 33384412.1
     2022-12-27 21:22:00   total_consumption_Ch2 208
   helper:
     BUFFER     
     DIRECTIONSUM >
     EoM        1
     LastPacketTime 1672172520.85578
     NETDEV     1
     SPEED      5
     TRIGGERTIME 1672172580
     Channels:
     DEVICES:
       
       60
       
     RULECACHE:
       1-0:0.0.9*255 Serial
       1-0:1.8.0*255 Counter
       1-0:1.8.1*255 Counter
       1-0:1.8.2*255 Counter
       1-0:16.7.0*255 Channels
       129-129:199.130.3*255 ManufID
       129-129:199.130.5*255 PublicKey
     directions:
Attributes:
   alignTime  00:01
   event-aggregator power:60:linear:mean,total_consumption:60:none:v,total_consumption_Ch1:60:none:v
   event-on-update-reading .*
   interval   60
   pollingMode on
   room       0.3_Keller,4.1_Strom
   stateFormat {ReadingsVal($name,"state","") eq "disconnected" ? "disconnected" : ReadingsVal($name,"power","")." W"}


Das Reading power ist das originale Reading.
Über ein doif übertrage ich bei einem positiven Wert von power den Wert in ein setreading power_pos und setze power_neg auf 0.
Bei einem negativen Wert von power (Einspeisung) setze ich den Wert in ein setreading power_neg und setze power_pos auf 0.

Problem ist nun, dass der ElectricityCalculator nur auf das originale Reading power reagiert.
Ändere ich die Definition auf das Reading power_pos dann passiert in dem ElectricityCalculator nichts mehr.

Evtl. bin ich mit meinen Readings ja auf dem Holzweg oder ich sehe vor lauter Bäumen den Wald nicht...

FHEM @ RaspberryPi 3, HMLAN, HMUART + HMRS485, Homematic, ESPEasy @ Sonoff / Shelly / ESP8266, ZigBee @ CC2531
Echo Dot, Dreambox, Yamaha MusicCast, Logitech Hub, LW-12, LD382
FRITZ!Box 7590 AX, Mesh @ FRITZ!Repeater 2400, FRITZ!Fon, iPhone 13, iPad Air 5, AppleWatch 8

ch.eick

#3
Zitat von: sprudelverduenner am 27 Dezember 2022, 21:30:06
Danke für Deine Antwort.

Ich habe mir das Modul ElectricityCalculator angeschaut und mal eingerichtet.

Ich sehe allerdings für mich ein Problem wo ich noch keine Lösung sehe.

Mein Stromzähler sieht so aus:

< snip >

   stateFormat {ReadingsVal($name,"state","") eq "disconnected" ? "disconnected" : ReadingsVal($name,"power","")." W"}


Das Reading power ist das originale Reading.
Über ein doif übertrage ich bei einem positiven Wert von power den Wert in ein setreading power_pos und setze power_neg auf 0.
Bei einem negativen Wert von power (Einspeisung) setze ich den Wert in ein setreading power_neg und setze power_pos auf 0.

Problem ist nun, dass der ElectricityCalculator nur auf das originale Reading power reagiert.
Ändere ich die Definition auf das Reading power_pos dann passiert in dem ElectricityCalculator nichts mehr.
Moin,
ähnlich wie beim stateFormat kannst Du erstmal ein userreading anlegen. Hier mal ein ungetestetes Beispiel

power_pos:power {(ReadingsVal("$NAME","power" ,0) >= 0)? ReadingsVal("$NAME","power" ,0) : 0},
power_neg:power {(ReadingsVal("$NAME","power" ,0) <= 0)? abs(ReadingsVal("$NAME","power" ,0)) : 0}

Danach schau dann mal, ob Du dafür auch Events bekommst, auf die man reagieren kann.

Beim ElectricityCalculator brauchst Du danach die passende REGEX, die auf diese Events reagieren.

VG  Christian

P.S. Ich verwende den ElectricityCalculator selber nicht.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

sprudelverduenner

Vielen Dank.

Ich habe nun die 2 gewünschten UserReadings erstellt.

Allerdings scheint mir für mein Vorhaben der ElectricityCalculator nicht das richtige Modul zu sein.
Ich habe jetzt fast den gesamten Beitrag sowie das Wiki durchgelesen - ich finde aber nirgendwo den Hinweis wie ich damit die aktuelle Erzeugung auf kWh zusammen rechnen kann ...

Gibt es sonst noch Ideen?
FHEM @ RaspberryPi 3, HMLAN, HMUART + HMRS485, Homematic, ESPEasy @ Sonoff / Shelly / ESP8266, ZigBee @ CC2531
Echo Dot, Dreambox, Yamaha MusicCast, Logitech Hub, LW-12, LD382
FRITZ!Box 7590 AX, Mesh @ FRITZ!Repeater 2400, FRITZ!Fon, iPhone 13, iPad Air 5, AppleWatch 8

ch.eick

Zitat von: sprudelverduenner am 04 Januar 2023, 15:12:45
Allerdings scheint mir für mein Vorhaben der ElectricityCalculator nicht das richtige Modul zu sein.
Ich habe jetzt fast den gesamten Beitrag sowie das Wiki durchgelesen - ich finde aber nirgendwo den Hinweis wie ich damit die aktuelle Erzeugung auf kWh zusammen rechnen kann ...
Okay, ich habe es jetzt auch mal gelesen und der ElectricityCalculator scheint nur Impulse zu zählen, was hier natürlich nicht passt.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Hallo nochmal,
es lies mir einfach keine Ruhe, da ich ja auch mit meiner PV-Anlage rum mache :-)

Mit meinem userReading wird nun ein Zähler nachgebildet:
- Beim ersten Event wird der gesetzte Wert gemerkt
- Bei der nächsten Änderung wird der bisherige gemerkte Wert mit der verstrichenen Zeit in Sekunden multipliziert,
   was dann Ws ergibt.
- Die Ws werden mit monotonik in total_Ws_pos aufsummiert
- Daraus werden dann in total_kWh_pos die kWh berechnet
- Zum Schluss wird der jetzige power_pos Wert noch als Vorheriger Wert gemerkt
- Beim nächsten Event geht es dann wieder von vorne los

Es wird davon ausgegangen, das die Messeinrichtung bei jeder Änderung einen neuen Wert sendet.

Hier mal ein Dummy im RAW Format

defmod Stromzaehler dummy
attr Stromzaehler DbLogExclude .*
attr Stromzaehler userReadings power_timeWs_pos:power_pos.* { time_str2num(ReadingsTimestamp($name,"power_pos","null")) },\
power_timekWh_pos:power_timeWs_pos.* { (ReadingsTimestamp($name,"total_kWh_pos","null") eq "null")? time_str2num(ReadingsTimestamp($name,"power_timeWs_pos","null")) : time_str2num(ReadingsTimestamp($name,"total_kWh_pos","null")) },\
power_timeDelta_pos:power_timekWh_pos.* { ReadingsVal($name,"power_timeWs_pos",0)-ReadingsVal($name,"power_timekWh_pos",0)  },\
\
total_Ws_pos:power_timeDelta_pos.* monotonic { (ReadingsVal($name,"power_timeDelta_pos",0) eq 0)? 0 : ReadingsVal($name,"power_befor_pos",0) * ReadingsVal($name,"power_timeDelta_pos",1) },\
total_kWh_pos:total_Ws_pos.* { round(ReadingsVal($name,"total_Ws_pos",0)/1000/60/60,3) },\
power_befor_pos:total_Ws_pos.* { ReadingsVal($name,"power_pos",0) }


Test
Die eingabe Zeit zwischen den setreadings bestimmt wieviel kWh letztlich zusammen kommen.
Das letzte setreading mit 0 simuliert dann das Ende.

setreading Stromzaehler power_pos 0
setreading Stromzaehler power_pos 1000
setreading Stromzaehler power_pos 2000
setreading Stromzaehler power_pos 1000
setreading Stromzaehler power_pos 0
setreading Stromzaehler power_pos 1000
setreading Stromzaehler power_pos 0

Ich bitte um einen Test, bevor man das dann einfach für die negativen Werte entsprechend kopiert.

VG   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

sprudelverduenner

Danke für Deine Mühen,

ich habe in der Zwischenzeit evtl. schon eine Lösung für mich gefunden.

Ich habe insgesamt 3 USEREADINGS angelegt:power_pos {(ReadingsVal("$NAME","power",0) >= 0)? ReadingsVal("$NAME","power",0):0},
power_neg {(ReadingsVal("$NAME","power",0) <= 0)? abs(ReadingsVal("$NAME","power",0)):0},
total_einspeisung integral {ReadingsVal($name,"power_pos",0)/3600}


Die ersten 2 USEREADINGS stammen leicht abgewandelt von Dir - diese ersetzen mein altes DOIF um die 2 neuen Readings zu erzeugen.

In einem Beitrag von 2016 habe ich das 3. USERREADING gefunden. Ich habe dieses erst einmal probehalber auf power_pos getriggert.#
Mein eHZ sendet genau alle 60 Sekunden neue Werte.
Nach 2,5 Stunden habe ich meinen Verbrauch des eHZ mit dem hochgerechneten Verbrauch verglichen: die Differenzen waren fast gleich.

Ich werde mal morgen die Werte über den ganzen Tag beobachten. Sollten auch hier die tatsächlichen und die berechneten Werte annähernd gleich sein so wird dann im USEREADING lediglich power_pos durch power_neg ersetzt und ich habe dann mein READING mit dem Wert der Einspeisung.

Beste Grüße,
Sprudelverduenner

FHEM @ RaspberryPi 3, HMLAN, HMUART + HMRS485, Homematic, ESPEasy @ Sonoff / Shelly / ESP8266, ZigBee @ CC2531
Echo Dot, Dreambox, Yamaha MusicCast, Logitech Hub, LW-12, LD382
FRITZ!Box 7590 AX, Mesh @ FRITZ!Repeater 2400, FRITZ!Fon, iPhone 13, iPad Air 5, AppleWatch 8