SMA Portal PV Erzeugung dauerhaft auslesen

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Antworten
PeterAC
Beiträge: 69
Registriert: 19.12.2014, 14:07
Hat sich bedankt: 3 Mal
Danksagung erhalten: 6 Mal

SMA Portal PV Erzeugung dauerhaft auslesen

Beitrag von PeterAC » 18.07.2020, 15:00

Für die Anbindung meiner PV Anlage mit einem SMA Sunny Home Manager an homematic sollte die PV-Erzeugung aus dem Webportal ausgelesen werden. Bekanntlich gibt es dabei dass Problem, das SMA wiederholtes Auto-Login und Grabben der Daten von dort als nicht autorisierte Verwendung des Portals ansieht und Gegenmaßnahmen ergreift bzw androht.
Es besteht allerdings im Sunny Portal die Möglichkeit, einige Daten der eigenen Anlage per Link mit einer Art GUID-Schlüssel allgemein frei zugeben. Ein Abruf dieser Daten ist dann mit Kenntnis der GUID auch ohne Login beliebig oft möglich. Gegen diese Verwendung dürften eigentlich keine Einwände bestehen. Allerding werden die Daten nur alle 15 Minuten aktualisiert.

Screenshot_2020-07-18 Anlagenübersicht - (-Name-)- Sunny Portal.png
Screenshot_2020-07-18 Anlagenübersicht - (-Name-)- Sunny Portal.png (10.88 KiB) 3404 mal betrachtet

Der Abruf dieser Seite ergibt im Webbrowser das folgenden Ergebnis:

Anmerkung 2020-07-18 124156.png

Das Skript ruft nun auf der CCU2 diese Webseite ab und filtert die Zeilen mit den interesssanten Informationen für aktuelle PV-Leistung und Zählerstand der Tageserzeugung heraus. Aus dem Zählerstand wird der Mittelwert der PV-Erzeugung über das zurückliegende Abfrage-Intervall ermittelt. Das Skript wird abgebrochen, wenn der Zeitstempel der Daten auf der Webseite sich gegenüber der vorherigen Abfrage nicht geändert hat (GUID anonymisiert).

Code: Alles auswählen

!- 2020-07-18 Abruf der PV-Leistung von freigegebener SMA-Seite "Anlagendaten" (ca. alle 15 Minuten aktualisiert)

string lGetOut;          !- Ergebnise des HTML-Abrugs
string lGetErr;          !- Fehler

!- Abfrage der HTML-Seite und Ausfiltern der aktuellen Leistung und des Zeitstempels (GUID anonymisiert)
integer ErrorCode = system.Exec("/usr/local/addons/cuxd/extra/curl -G  https://www.sunnyportal.com/Templates/PublicPage.aspx?page=abcdefab-abcd-0123-4567-0123456789ab | grep -e 'data-value=' -e 'data-timestamp=' -e '_energyYieldValue' -e 'energyYieldUnit'",&lGetOut,&lGetErr);
if (ErrorCode) { quit; } !- Abbruch bei Fehlercode <> 0

!- Vearbeitung der Zeitstempel
time PVPower_TS = lGetOut.StrValueByIndex("\"" , 3).Replace("T", " ").ToTime();
time _vSMA_PV_Power_TS = dom.GetObject("_vSMA_PV_Power_TS").Value().ToTime(); !- Zeitstempel auswerten
if (_vSMA_PV_Power_TS == PVPower_TS) { quit;} ! Nur bei aktualisierten Daten fortfahren

real PVPower = lGetOut.StrValueByIndex("\"" , 1).ToFloat(); !- Auslesen der aktuellen Erzeugung

string PVEnergy_Unit = lGetOut.StrValueByIndex(">" , 5).StrValueByIndex("<",0);           !- Auslesen der Einheit für die Tagesenergie
real   PVEnergy      = lGetOut.StrValueByIndex(">" , 3).StrValueByIndex("<",0).ToFloat(); !- Auslesen der Tagesenergie
if(PVEnergy_Unit == "Wh")  { PVEnergy =  0.001 * PVEnergy; } !- Skalierung entsprechend der Einheit falls "Wh" (morgens)
if(PVEnergy_Unit == "MWh") { PVEnergy = 1000.0 * PVEnergy; } !- Skalierung entsprechend der Einheit falls "MWh" (möglich bei Anlagen ab 150 kWp)

!- Behandlung des Rücksetzens des Tagesenergiezählers
real _vSMA_PV_Energy = dom.GetObject("_vSMA_PV_Energy").Value();
if (_vSMA_PV_Energy > PVEnergy) { _vSMA_PV_Energy = 0;}

real PVPower_avg = 3600000.0*(PVEnergy - _vSMA_PV_Energy)/(PVPower_TS-_vSMA_PV_Power_TS).ToInteger();

!- Zurückschreiben der Daten in die Systemvariablen
dom.GetObject("SMA PV-Leistung").State(PVPower);
dom.GetObject("SMA PV-Leistung (mittl)").State(PVPower_avg);
dom.GetObject("_vSMA_PV_Power_TS").State(PVPower_TS);
dom.GetObject("_vSMA_PV_Energy").State(PVEnergy);
Wegen der Aktualisierung nur alle 15 M inuten ist es nicht sinnvoll das Skript öfters aufzurufen. Ich lösen das Skript daher alle 15 Minuten zu den Zeitpunkten der Aktualisierungen plus 30 Sekunden Verzögerung für das Skript selbst. Leider ist es damit nur eingeschränkt möglich die Daten vom SMA Energy Meter so zu verknüpfen, dass eine konsistente Aufteilung von in Erzeugung und Eigenverbrauch gelingt, wenn hier Minuten-Mittelwerte vom EM mit 15-Minuten-Mittelwerten vom Portal verknüft werden. Mit einer Mittelung der EM-Werte über die letzten 15 Minuten vom EM sollte es dagegen korrekt funktioneren.

Screenshot_2020-07-18 CUxD-Highcharts(1).png

Leider habe ich auch bisher noch keine akzeptable Methode finden können um mit der existierenden Hardware (Sunny Boy 5000TL21, SMA Home Manager 045 und SMA Energy Meter 1.0, BT-Kopplung) eine Minuten-Auflösung der PV-Erzeugung zu erhalten. Der 15-Minuten-Abruf läuft nun aber schon seit knapp einer Woche zuverlässig.

Vg,
Peter

Xel66
Beiträge: 14277
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 599 Mal
Danksagung erhalten: 1527 Mal

Re: SMA Portal PV Erzeugung dauerhaft auslesen

Beitrag von Xel66 » 18.07.2020, 15:12

Und was machst Du mit den Daten der Erzeugung? Hat das für die Hausautomation irgendeinen praktischen Nutzen oder geht es Dir nur darum, diese in einer Visualisierung anzuzeigen. Dann wäre der entsprechende Rechner, der die Visu hostet, der geeignetere für solche Spielereien. Wozu die Rega alle paar Minuten mit irgendwelchen Scripläufen belasten, die noch nicht mal eine brauchbare Ausgabe haben. Einige Visualisierungen bringen schon geeignete Adapter und eine Datenbankanbindung von Haus aus mit. Und die ein, zwei Werte, mit denen man was aus der momentanen Erzeugung ableiten kann, kann man dann besser von außen in die CCU schreiben.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

PeterAC
Beiträge: 69
Registriert: 19.12.2014, 14:07
Hat sich bedankt: 3 Mal
Danksagung erhalten: 6 Mal

Re: SMA Portal PV Erzeugung dauerhaft auslesen

Beitrag von PeterAC » 18.07.2020, 15:36

Finde es im Moment eigentlich nur interessant die Daten zu wissen. Extra Rechner oder HW wird nicht dafür gebraucht, das macht ja die CCU2 und die macht es mit links. Das Skript läuft auch nur alle 15 Minuten. Die Werte werden permanent auf meinem Smartphone mit Virtuino MQTT über CCU-Jack bereitgestellt, außerdem mit CUxD geloggt.

Die Kurvenverläufe von CUxD rufe mit einem beliebigen Browser nach Bedarf ab, kann man ggf. auch in Virtuino integrieren. Bei meinem ollen Note 2 klappt der CUxD-Abruf aber nach ein paar Tagen nicht mehr, weil das WWW-Anzeige-Element von Andriod 4.4. nicht mehr auf der Höhe ist und möglicherweise ein Memory leak hat. Dann muss ich Virtuino neu starten.

In einem anderen Thread hat es jemand als Helligkeits-Signal verwendet.

Screenshot_2020-07-18 CUxD-Highcharts(2).png
Mit allen 94 Skripten liegt die CPU-Auslastung bei mir im Mittel um die 20%, solange das WebUI nicht läuft. Stabilitätsprobleme habe ich keine.


VG,
Peter

PeterAC
Beiträge: 69
Registriert: 19.12.2014, 14:07
Hat sich bedankt: 3 Mal
Danksagung erhalten: 6 Mal

Re: SMA Portal PV Erzeugung dauerhaft auslesen

Beitrag von PeterAC » 08.08.2020, 17:57

Noch eine Modifikation des Skriptes im Zusammenhang mit dem seit gestern von 15 min uaf 120 min verlängerten Aktualisierungsintervall von SMA. Dadurch, dass der erste gültige Abruf nach Ende der Einspeisung mit neuem Zeitstempel dadurch nach Mitternacht liegt, wird auf der Status-Webseite von SMA nicht mehr die Tagesproduktion sondern die Monatsproduktion angezeigt. Das ändert sich im Laufe der Nacht wieder und wechselt spätestens mit dem Beginn der Erzeugung auf die Tagesproduktion. Das Skript erkennt dies nun und verwechselt dies nicht mehr.
Beim 15 min Abruf war das kein Problem, da das Skript nach Sonnenuntergang nur noch solange aufgerufen wird, bis die Produktion Null erkannt wurde. Dann fängt es erst mit dem neuen Tag wieder an.

Code: Alles auswählen

!- 2020-08-08 Abruf der PV-Leistung von freigegebener SMA-Seite "Anlagendaten" (ca. alle 15 Minuten aktualisiert)

string lGetOut;          !- Ergebnise des HTML-Abrugs
string lGetErr;          !- Fehler
real   PVEnergy;

!- Abfrage der HTML-Seite und Ausfiltern der aktuellen Leistung und des Zeitstempels
integer ErrorCode = system.Exec("/usr/local/addons/cuxd/extra/curl -G  https://www.sunnyportal.com/Templates/PublicPage.aspx?page=abcdef12-1234-5678-9abc-def012345678| grep -e 'data-value=' -e 'data-timestamp=' -e '_energyYieldValue' -e 'energyYieldUnit' -e 'energyYieldPeriodTitle'",&lGetOut,&lGetErr);
if (ErrorCode) { quit; } !- Abbruch bei Fehlercode <> 0

!- Vearbeitung der Zeitstempel
time PVPower_TS = lGetOut.StrValueByIndex("\"" , 3).Replace("T", " ").ToTime();
time _vSMA_PV_Power_TS = dom.GetObject("_vSMA_PV_Power_TS").Value().ToTime(); !- Zeitstempel auswerten
if (_vSMA_PV_Power_TS == PVPower_TS) { quit;} !- Nur bei aktualisierten Daten fortfahren

real PVPower = lGetOut.StrValueByIndex("\"" , 1).ToFloat(); !- Auslesen der aktuellen Erzeugung

!- Auslesen der Tagesenergie, falls 'energyYieldPeriodTitle' nicht 'Today' ist, sind die Zahlen Monatsangaben (zwischen Null Uhr und Sonnenaufgang)
if (lGetOut.Contains("Today"))
{  string PVEnergy_Unit = lGetOut.StrValueByIndex(">" , 5).StrValueByIndex("<",0);           !- Auslesen der Einheit für die Tagesenergie
   PVEnergy      = lGetOut.StrValueByIndex(">" , 3).StrValueByIndex("<",0).ToFloat(); !- Auslesen der Tagesenergie
   if(PVEnergy_Unit == "Wh")  { PVEnergy =  0.001 * PVEnergy; } !- Skalierung entsprechend der Einheit falls "Wh" (morgens)
   if(PVEnergy_Unit == "MWh") { PVEnergy = 1000.0 * PVEnergy; } !- Skalierung entsprechend der Einheit falls "MWh" (möglich bei Anlagen ab 150 kWp)
}
else { PVEnergy = 0; } !- noch keine PV-Energie während des laufenden Tages

!- Detektierung des Rücksetzens des Tagesenergiezählers
real _vSMA_PV_Energy = dom.GetObject("_vSMA_PV_Energy").Value();
if (_vSMA_PV_Energy > PVEnergy) { _vSMA_PV_Energy = 0;}

real PVPower_avg = 3600000.0*(PVEnergy - _vSMA_PV_Energy)/(PVPower_TS-_vSMA_PV_Power_TS).ToInteger();

!- Zurückschreiben der Daten in die Systemvariablen
dom.GetObject("SMA PV-Leistung").State(PVPower);
dom.GetObject("SMA PV-Leistung (mittl)").State(PVPower_avg);
dom.GetObject("_vSMA_PV_Power_TS").State(PVPower_TS);
dom.GetObject("_vSMA_PV_Energy").State(PVEnergy);
Ich hoffe sehr, dass das Intervall wieder auf 15 min zurückgesetzt wird, denn mit 2 h Verzögerung sind die Daten nun wirklich wertlos. Ob SMA damit diese Verwendung unterbinden will? Bis dahin sah es eigentlich ganz gut aus.
Screenshot_2020-08-08 CUxD-Highcharts.png
An nächsten Tag leider so:
Screenshot_2020-08-08 CUxD-Highcharts(1).png
Übrigens wird die Verbrauchsmessung aus dem SMA Energy Meter mit einer Minute Auflösung dargestellt, solange keine Solarproduktion stattfindet. Weil zur Ermittlung des internen Verbrauchs die Daten von Netzbezug/-Einspeisung aber mit den Mittelwerten der Solarproduktion dann nicht zusammenpassen würden, werden die Daten des Energy Meters für eine gemeinsame Anzeige mit einem anderen Skript über denselben Zeitraum gemittelt, wie die Daten der PV-Erzeugung. Das führt dann auch zu konsistenten Darstellungen. Bei 15 min wäre das auch noch einigermaßen brauchbar. Die augenblickliche Einspeisung bzw. der augenblickliche Netzbezug stehen aber in jedem Fall über das Energy Meter ohne Verzögerung zur Verfügung und könnte für eine Eigenvrbauchsoptimierung benutzt werden.


VG,
Peter

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“