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.
Der Abruf dieser Seite ergibt im Webbrowser das folgenden Ergebnis:
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);
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