Neu: 77_SMAEM - Modul für SMA Energie Meter. Alternative zum Sunny Home Manager.

Begonnen von Volker Kettenbach, 30 März 2016, 12:42:05

Vorheriges Thema - Nächstes Thema

Volker Kettenbach

Zitat von: ch.eick am 13 August 2020, 17:30:30
Das würde mich auch interessieren, da ich Docker bereits im Einsatz habe.
Gruß
    Christian

Hier eine Anleitung, wie man FHEM im Docker-Container derart betreiben kann, dass auch Multicast möglich ist.

https://forum.fhem.de/index.php/topic,114284.0.html

elo

Ich habe eine Frage zum 77_SMAEM.pm und 76_SMAInverter.pm, ich habe beide im Betrieb und nutze FHEM die Daten per MQTT in einen Influxdb zu schieben.
Beide Module laufen im Inveral von 60 Sekunden. 77_SMAEM.pm benötigt aber immer eine Sekunde länger und startet beim nächsten Lauf auch eine Sekunde später.
Das wiederum führt nach einigen Stunden dazu, dass die entscheidenden Werte mit denen ich den "Eigenverbrauch" ermittele nicht mehr exakt zusammen passen, da diese mehrere Sekunden voneinander entfernt liegen.
Nur über das Interval (- 1-2 Sekunden) bekomme ich beide auch nicht synchron. Was mache ich falsch oder wie könnte ich das beheben?

77_SMAEM Ergebnisse nach 60 Sekunden:
13:39:03
13:40:04
13:41:05

Ich habe einen SMA STP10 und einen EM 2.0.

fhem.cfg

###
define PV89_SMAEM SMAEM
setuuid PV89_SMAEM 5f778473-f33f-969e-bcdf-efad6105dc436b54
attr PV89_SMAEM alias SMA Energy Meter
attr PV89_SMAEM feedinPrice 0.089
attr PV89_SMAEM group Photovoltaik Anlage
attr PV89_SMAEM icon measure_power
attr PV89_SMAEM interval 60
attr PV89_SMAEM mqttPublish *:topic={"fhem/pv/$device"} *:qos=1 *:retain=0 *:expression={"{\"$name\":".$value."}"}
attr PV89_SMAEM powerCost 0.30
attr PV89_SMAEM room PV
attr PV89_SMAEM stateFormat {sprintf("%.0f",ReadingsVal($name,"state",0))." W"}

###
define PV89_SMAI SMAInverter password 192.168.169.119
setuuid PV89_SMAI 5f778a86-f33f-969e-53dd-6ad8bdfb6f0c9d3d
attr PV89_SMAI alias SMA Inverter
attr PV89_SMAI group Photovoltaik Anlage
attr PV89_SMAI icon measure_photovoltaic_inst
attr PV89_SMAI interval 60
attr PV89_SMAI mqttPublish *:topic={"fhem/pv/$device"} *:qos=1 *:retain=0 *:expression={"{\"$name\":".$value."}"}
attr PV89_SMAI room PV
attr PV89_SMAI stateFormat {sprintf("%.0f",ReadingsVal($name,"state",0))." W"}
attr PV89_SMAI target-serial 3006xxxxxx
attr PV89_SMAI target-susyid 408

Mein WR liefert auch nur diese Readings, dabei sollte ihm mehr bekannt sein:
SPOT_ETODAY,SPOT_ETOTAL,SPOT_PAC1,SPOT_PAC2,SPOT_PAC3,SPOT_PACTOT,SPOT_PDC1,SPOT_PDC2,avg_power_lastminutes_05,avg_power_lastminutes_10,avg_power_lastminutes_15,modulstate,normal,opertime_start,opertime_stop,state.

--
Raspi + FHEM 5.8 + HM-MOD-PCB + HM-LAN + HM-LC_Bl1PBU-FM + HM-LC-BL1-FM + HM-PB-2-WM + HM-LC-SW1-FM + HM-TC-IT-WM-W-EU + HM-CC-RT-DN

DS_Starter

Die Synchronität zu erhalten ist relativ einfach.

Aber
Zitat
76_SMAInverter.pm lautsch auf Multicast und 77_SMAEM.pm muss die Daten aktiv abholen
stimmt nicht, ist genau andersherum.

Also man stellt den SMAInverter auf manuelle Arbeitsweise -> Attr mode = manual.
SMAEM generiert alle 60 Sekunden seine Readings. Ein einfaches notify auf zum Beispiel das Reading "Saldo_Wirkleistung" stößt die Datenladung des SMAInverter an, z.B.:


defmod N.STP_5000.getdata notify SMA_Energymeter:Saldo_Wirkleistung:.* get STP_5000 data
attr N.STP_5000.getdata disable 0
attr N.STP_5000.getdata room Energie


Damit laufen die Werte dann nicht auseinander.
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

ch.eick

Zitat von: Volker Kettenbach am 17 September 2020, 11:33:05
Hier eine Anleitung, wie man FHEM im Docker-Container derart betreiben kann, dass auch Multicast möglich ist.
:-) schau mal wer da ganz ober steht :-)
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

elo

Zitat von: DS_Starter am 27 Oktober 2020, 14:04:35
Die Synchronität zu erhalten ist relativ einfach.

Damit laufen die Werte dann nicht auseinander.

define Notify.PV89_SMAI.getdata notify PV89_SMAEM:SMAEM1901xxxxxx_Saldo_Wirkleistung:.* get PV89_SMAI data
setuuid Notify.PV89_SMAI.getdata 5f982251-f33f-969e-45c1-a0be841dd4f27931
attr Notify.PV89_SMAI.getdata room PV

Toll, funktioniert, Danke!
--
Raspi + FHEM 5.8 + HM-MOD-PCB + HM-LAN + HM-LC_Bl1PBU-FM + HM-LC-BL1-FM + HM-PB-2-WM + HM-LC-SW1-FM + HM-TC-IT-WM-W-EU + HM-CC-RT-DN

elo

Ich habe zum SMAEM noch ein Userreading hinzugefügt.

Summe_Direktverbrauch { sprintf("%.0f",abs(ReadingsVal("PV89_SMAI", "SPOT_PACTOT",0)-ReadingsVal("PV89_SMAEM", "SMAEM1901xxxxxx_Einspeisung_Wirkleistung",0))); },
Summe_Gesamtverbrauch { sprintf("%.0f",ReadingsVal("PV89_SMAEM", "Summe_Direktverbrauch",0)+ReadingsVal("PV89_SMAEM", "SMAEM1901xxxxxx_Bezug_Wirkleistung",0)); }

Leider scheint dieses die Daten "mittendrin" zu aktualisieren, also nach SMAEM und vor SMAInverter und damit passen die Zahlen nicht gut zueinander. Das Reading in den SMAInverter hängen bringt auch nix, da scheint es auch zu früh die Berechnung durchzuführen.

Wie mache ich das besser?
--
Raspi + FHEM 5.8 + HM-MOD-PCB + HM-LAN + HM-LC_Bl1PBU-FM + HM-LC-BL1-FM + HM-PB-2-WM + HM-LC-SW1-FM + HM-TC-IT-WM-W-EU + HM-CC-RT-DN

DS_Starter

Wie triggerst du die Erstellung des Userreadings ?
Geht aus deiner Angabe nicht hervor.

Aber das Userreading wäre auf jeden Fall besser im SMAInverter angesiedelt, weil er das letzte Device in der Kette ist.
Im SMAEM gibt es das Attribut noCoprocess. Das solltest du in diesem Fall auf "1" stellen, weil die Datengenerierung in SMAEM sonst asynchron abläuft.

Alternativ könntest du dir einen Dummy erstellen und sowohl SMAEM und auch SAMInverter Readingwerte dort setzen.
Erst wenn die benötigten Werte im Dummy vorhanden sind (Event), lässt du ebenfalls im Dummy dein Userreading berechnen.
So mache ich das in den Auswertungen für PV-Bilanzen weil so die Synchronität sichergestellt ist.
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

elo


Das wird scheinbar automatisch getriggert, bei jedem Intervall.

Kannst du deine Variante mit dem DummyDevice genauer beschrieben bitte?
--
Raspi + FHEM 5.8 + HM-MOD-PCB + HM-LAN + HM-LC_Bl1PBU-FM + HM-LC-BL1-FM + HM-PB-2-WM + HM-LC-SW1-FM + HM-TC-IT-WM-W-EU + HM-CC-RT-DN

DS_Starter

ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

elo

Ich wollte das Topic auch erwähnen und sagen, nein damit komme ich nicht zurecht.  :-\
--
Raspi + FHEM 5.8 + HM-MOD-PCB + HM-LAN + HM-LC_Bl1PBU-FM + HM-LC-BL1-FM + HM-PB-2-WM + HM-LC-SW1-FM + HM-TC-IT-WM-W-EU + HM-CC-RT-DN

ch.eick

Ich habe das als Vorlage für den Kostal Plenticore verwendet, jedoch liefert der von hause aus bereits viele Werte selber.
Wenn man dem Wiki folgt, dann lässt es sich also recht gut umsetzen.

Danke nochmals für die Vorlage :-)
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

DS_Starter

Danke Christian  :)

Ich versuche es kurz zusammenzufassen. Berichtige mich bitte falls ich was falsch teile, ist schon so lange her.  ???

Also du erstellst ein Dummy z.B.:


defmod Dum.Energy dummy
attr Dum.Energy DbLogExclude GridConsumption,GridFeedIn,SelfConsumptionQuote
attr Dum.Energy alias Energiebilanz
attr Dum.Energy event-on-change-reading PV,GridConsumption,GridFeedIn,SelfConsumptionQuote
attr Dum.Energy event-on-update-reading TotalConsumption,AutarkyQuoteDay,SelfConsumptionQuoteDay,AutarkyQuoteMonth,SelfConsumptionQuoteMonth,AutarkyQuoteYear,SelfConsumptionQuoteYear
attr Dum.Energy group Energiebilanz
attr Dum.Energy icon measure_power_meter
attr Dum.Energy room Energie


Und notify Devices für SMAEM und SMAInverter um mit setreading die benötigten Werte in diesen Dummy zu übertragen, z.B:


defmod N.GridFeedIn.Dum.Energy notify SMA_Energymeter:Einspeisung_Wirkleistung:.* { fhem "setreading Dum.Energy GridFeedIn "."$EVTPART1"}
attr N.GridFeedIn.Dum.Energy room Energie


bzw.


defmod N.PV.TotalConsumption.Dum.Energy notify STP_5000:modulstate.* {\
# Energieverbrauch\
fhem "setreading Dum.Energy PV ".sprintf("%.1f",(ReadingsVal("STP_5000","total_pac",0)*1000));;\
my $tc = sprintf("%.1f",ReadingsVal("Dum.Energy","PV",0)+ReadingsVal("Dum.Energy","GridConsumption",0)-ReadingsVal("Dum.Energy","GridFeedIn",0));; \
if($tc >= 0) { \
     fhem ("setreading Dum.Energy TotalConsumption ".sprintf("%.1f",$tc));;\
}\
\
# Autarkiegrad\
my $valA = (ReadingsVal("STP_5000", "total_pac",0)*1000)-ReadingsVal("SMA_Energymeter", "Einspeisung_Wirkleistung",0);;\
my $calcVal = $valA / ($valA + ReadingsVal("SMA_Energymeter", "Bezug_Wirkleistung",0))*100;;\
fhem ("setreading Dum.Energy AutarkyQuote ".($calcVal?sprintf("%.0f",$calcVal):"0"));;\
  \
# Eigenverbrauchsquote\
my $totalpac = ReadingsVal("STP_5000", "total_pac",0)*1000;;\
if($totalpac > 0) {\
     my $valSelf = $totalpac - ReadingsVal("SMA_Energymeter", "Einspeisung_Wirkleistung",0);;\
     my $calSelf = $valSelf / $totalpac * 100;;\
     fhem ("setreading Dum.Energy SelfConsumptionQuote ".sprintf("%.0f",$calSelf));;\
} else {\
     fhem ("setreading Dum.Energy SelfConsumptionQuote -");;\
}\
}
attr N.PV.TotalConsumption.Dum.Energy room Energie


Das zweite Notify überträgt nicht nur die Werte vom SMAInverter in den Dummy, sondern führst dann auch gleich die Berechnung der Autarkie und Eigenverbrauch aus.

Das ist jetzt ein Prinzip. Du musst natürlich alles übertragen was du zur Berechnung brauchst und schauen dass der Wert des SMAInverters der letzte ist der alles anstößt wegen der Synchronität.

Hoffe das hilft jetzt weiter.  :)
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Kamik

Hallo zusammen,

Heiko hat mich vorhin auf dieses Modul aufmerksam gemacht und ich hatte nach der Definition prompt einige Effekte, die ich beim Querlesen in diesem Thread nicht gefunden habe. Vielleicht ist es im Vorfeld schon gut zu sagen, dass mein SHM 2.0 eine sehr aktuelle Firmware inne hat (2.4.14.R)

Mir ist bei den ersten Intervallen aufgefallen, dass meine Readings hin und wieder alle auf 0 springen. Im Log ist etwas mit der Division durch 0 zu sehen:


2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 531.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 622.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 623.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 624.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 625.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 631.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 632.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 633.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 634.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 640.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/77_SMAEM.pm line 646.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 656.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 657.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 658.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 659.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 667.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 668.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 669.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 670.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 676.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 677.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 678.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 679.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 685.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 686.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 687.
2020.11.09 21:30:24 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/77_SMAEM.pm line 693.


Außerdem gibt es folgende Meldungen im Log:


2020.11.09 21:31:25 3: SMAEM SunnyHomeManager - Buffer length 32 is not usual. May be your meter has been updated with a new firmware.
2020.11.09 21:31:25 3: SMAEM SunnyHomeManager - WARNING - old process 21641 has been killed to start a new BlockingCall
2020.11.09 21:31:25 1: SMAEM SunnyHomeManager -> BlockingCall SMAEM_DoParse Timeout: process terminated

2020.11.09 21:44:26 3: SMAEM SunnyHomeManager - Buffer length 32 is not usual. May be your meter has been updated with a new firmware.
2020.11.09 21:45:24 3: SMAEM SunnyHomeManager - Buffer length 32 is not usual. May be your meter has been updated with a new firmware.


Ich habe das Modul erstmal disabled.
Sind diese Probleme bekannt?

Gruß
Patrick

DS_Starter

Hallo Patrick,

oh je, da hat sich der Aufbau des Datagramms mit dieser Firmware geändert/erweitert.  :(
Da muß das Modul erstmal wieder erweitert werden wenn ich (oder Volker) Zeit und Muße finden.

Bis Firmware 2.03.4.R ist zur Zeit implementiert.

Grüße,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Kamik

Danke für die schnelle Antwort.

Keine Hektik :)

Teilweise kommen Werte, aber wie schon gesagt, diese werden dann alle mit 0 überschrieben.

Ich werde das Modul erstmal wieder deaktiviert lassen und hier mitlesen, falls sich da noch etwas tut.

Aber die Updates von SMA bzgl. der Homemanager wurde jetzt ausgerollt. Ich kann mir denken, dass in nächster Zeit einige mit einem SHM 2.0 dazukommen werden.

Ich habe ja zur Not noch deine alternativen :)

Gruß