Der Shelly EM ist ein einphasiger Leistungmesser mit zwei Strommesskanälen, dessen Daten über WLAN abrufbar sind, sowohl per Browser, Cloud, REST-API oder MQTT. Der Shelly EM liefert die Phasenspannung und für beide Stromkanäle Augenblickswerte von Wirk- und Blindleistung, deren Mittelwerte über die letzten 60 Sekunden und getrennt für beide Energierichtungen nicht-flüchtige Energiezähler. Die Spannungsmessung erfolgt über die Phase, die auch den Shelly EM mit Strom versorgt, die Strommessung über zwei unabhängig platzierbare Stromwandler-Clips, die um die zu messenden Abgänge geklemmt werden. Es werden Wandler für 50 A und 120 A angeboten. Für den vorgesehenen Zweck wurden 50-A-Wandler verwendet. Für eine korrekte Leistungmessung müssen die zwei gemessenen Lasten über dieselbe Phase versorgt werden wie der Shelly EM selbst.
Das Skript arbeitet ähnlich wie die Lösung für das SMA-Energy-Meter hier: viewtopic.php?f=31&t=48333&start=30#p591514
Der Ausdrücke XXXXXX und -u USER:PASSWORD müssen durch die Seriennummer bzw. Username und Password (sofern diese im Shelly EM gesetzt wurden) ersetzt werden. Das Skript ruft den gesamtem Status vom Shelly EM bei jedem Aufruf ab. Um die CCU-Belastung nicht unnötig zu erhöhen, fährt es mit der weiteren Verarbeitung nur fort, wenn beim Rohdaten-Abruf kein Fehler augetreten ist und wenn sich der Zeitstempel des Status geändert hat. Dann werden die aktuellen Daten aus dem Status-String extrahiert. Mit den Systemvariablen, die (noch) Zeitstempel und Zählerstände vom letzten Abruf enthalten, werden Leistungsmittelwerte (PV nur Erzeugung, Heizung nur Verbrauch) über den vergangenen Zeitraum gebildet. Zuletzt werden alle Daten sowie die Energiezählerstände und Augenblickswerte für die Wirkleistungen wieder in Systemvariable übertragen.
Erläuterungen zu den einzelnen Schritten finden sich in den Kommentaren des Skriptes.
Code: Alles auswählen
!- 2020-01-09 Abruf des ShellyEM-XXXXXX zur Ermittlung der PV- und Heizungsdaten
!- Benutzte Systemvariablen:
!- _vSMA_PV_Power_TS : Zeit, Zeitstempel des vorigen Datenabrufs
!- SMA PV-Leistung : Zahl, aktuelle PV-Erzeugungsleistung
!- SMA PV-Leistung (mittl) : Zahl, mittlere PV-Erzeugungsleistung seit vorigem Abruf
!- _vSMA_PV_Energy : Zahl, PV-Energiezähler nach vorigem Abruf
!- Solvis Leistung : Zahl, aktueller Verbrauch im Heizungsraum
!- Solvis Leistung (mittl) : Zahl, mittlerer Verbrauch im Heizungsraum seit vorigem Abruf
!- _vSolvis_Energy : Zahl, Energiezähler Heizungsraum nach vorigem Abruf
string lGetOut; !- Ergebnise des HTTP-Abrufs
string lGetErr; !- Fehler
!- Die foldenden Skript-Variablen werden erst angelegt, wenn sie auch tatsächlich benötigt werden
!- Variablen für PV-Anlage
!- real PVEnergy; !- Variable für Energie-Zähler im Shelly EM für den PV-Kanal
!- real PVPower; !- Aktuelle Leistung im PV-Kanal
!- time Shelly_TS; !- Zeitstempel der Shelly EM-Messung
!- object o_vSMA_PV_Power_TS !- Objektvariable für Systemvariable "_vSMA_PV_Power_TS" mit Zeitstempel vom vorigen Shelly-EM-Abruf
!- time _vSMA_PV_Power_TS; !- Zeitstempel vom vorigen Shelly-EM-Abruf aus Systemvariable
!- object o_vSMA_PV_Energy; !- Objektvariable für Systemvariable "_vSMA_PV_Energy" mit Energiezähler vom vorigen Shelly-EM-Abruf
!- real _vSMA_PV_Energy; !- Energiezähler vom vorigen Shelly-EM-Abruf aus Systemvariable
!- real PVPower_avg; !- Mittl. Erzeugungsleistung seit letztem Abruf
!- Variablen für Heizungsraum (Solvis+Beleuchtung)
!- real SolvisEnergy; !- Aktueller Energieverbrauch
!- real SolvisPower; !- Aktuelle Leistung
!- object o_vSolvis_Energy; !- Objektvariable für Systemvariable "_vSolvis_Energy" mit Energiezähler vom vorigen Shelly-EM-Abruf
!- real _vSolvis_Energy; !- Energiezähler vom vorigen Shelly-EM-Abruf aus Systemvariable
!- real SolvisPower_avg; !- Mittl. Leistung Heizungsraum seit letztem Abruf
!- Abfrage der HTTP-Servers und Ausfiltern der aktuellen Leistung und des Zeitstempels
integer ErrorCode = system.Exec("/usr/local/addons/cuxd/extra/curl -u USER:PASSWORD -G http://ShellyEM-XXXXXX/status",&lGetOut,&lGetErr);
if (ErrorCode) { quit; } !- Abbruch bei Fehlercode <> 0
lGetOut = lGetOut.Replace("\"", "");
!- Vearbeitung der Zeitstempel
time Shelly_TS = (((((lGetOut.Substr(lGetOut.Find("unixtime"),50)).StrValueByIndex(",",0)).StrValueByIndex(":",1)).ToInteger())-3600).ToTime();
object o_vSMA_PV_Power_TS = dom.GetObject("_vSMA_PV_Power_TS");
time _vSMA_PV_Power_TS = o_vSMA_PV_Power_TS.Value().ToTime(); !- Zeitstempel auswerten
if (_vSMA_PV_Power_TS == Shelly_TS) { quit;} !- Nur bei aktualisierten Daten fortfahren
!- Auslesen der aktuellen Leistungsdaten
real PVPower = 0.0 - (((lGetOut.Substr(lGetOut.Find("emeters:")+10,-1)).StrValueByIndex(",",0)).StrValueByIndex(":",1)).ToFloat(); !- Aktuelle PV-Leistung
real SolvisPower = (((lGetOut.Substr(lGetOut.Find("emeters:")+10,-1)).StrValueByIndex(",",6)).StrValueByIndex(":",1)).ToFloat(); !- Aktuelle Solvis-Leistung
!- Auslesen der Gesamtenergiezähler
real PVEnergy = ((34380.0899-4.7324)*1.0) + (((lGetOut.Substr(lGetOut.Find("emeters:")+10,-1)).StrValueByIndex(",",5)).StrValueByIndex(":",1)).ToFloat()/1000.0; !- PV-Energie, Korrektur für Vorgeschichte
real SolvisEnergy = (((lGetOut.Substr(lGetOut.Find("emeters:")+10,-1)).StrValueByIndex(",",10)).StrValueByIndex(":",1)).ToFloat()/1000.0; !- Solvis-Energie
object o_vSMA_PV_Energy = dom.GetObject("_vSMA_PV_Energy");
real _vSMA_PV_Energy = o_vSMA_PV_Energy.Value();
real PVPower_avg = 3600000.0*(PVEnergy - _vSMA_PV_Energy)/(Shelly_TS-_vSMA_PV_Power_TS).ToInteger();
object o_vSolvis_Energy = dom.GetObject("_vSolvis_Energy");
real _vSolvis_Energy = o_vSolvis_Energy.Value();
real SolvisPower_avg = 3600000.0*(SolvisEnergy - _vSolvis_Energy)/(Shelly_TS-_vSMA_PV_Power_TS).ToInteger();
!- Zurückschreiben der Daten in die Systemvariablen
o_vSMA_PV_Power_TS.State(Shelly_TS);
o_vSMA_PV_Energy.State(PVEnergy);
dom.GetObject("SMA PV-Leistung").State(PVPower);
dom.GetObject("SMA PV-Leistung (mittl)").State(PVPower_avg);
o_vSolvis_Energy.State(SolvisEnergy);
dom.GetObject("Solvis Leistung (mittl)").State(SolvisPower_avg);
dom.GetObject("Solvis Leistung").State(SolvisPower);
Leider bietet SMA in der genannten Kombination (Sunnyboy 5000 TL21, SMA Homemanager 1.0, SMA Energymeter 1.0) keine mit den SMA-Nutzungbedingungen konforme Möglichkeit, ohne Zusatzhardware diese Daten zu bekommen. Zwar werden die Augenblickswerte per Bluetooth vom Wechselrichter an den Homemanager übermittelt, dieser bietet aber keine Abfragemöglichkeit für die Bruttoerzeugung an. Er sendet die Daten an das SMA Portal, wo sie nach Login auch nahezu verzögerungsfrei dargestellt werden, die Verbindung muss aber schon nach wenigen Minuten neu aufgebaut werden und der automatisierte Login und Abruf sind in den Nutzungsbedingungen ohnehin ausgeschlossen. Die Kommunikation des Homemanagers mit dem Sunny-Portal ist verschlüsselt und kann nicht ausgewertet werden. Die Lizenz-konforme Möglichkeit, die Anlagendaten im Web zu publizieren, und wieder abzurufen ist unbrauchbar, da der Status nur alle zwei Stunden (!!) aktualisiert wird, mit dem kostenpflichtigen (!) "Professional Package" alle 15 Minuten.
VG,
Peter