PRTG Kostal Pico 15
Seit der Installation meines Wechselrichters sind 4 Jahre vergangen und mittlerweile hat auch Net at Work das Büro nicht nur mit einer Kühlung für den Sommer versehen sondern erzeugt den dafür benötigten Strom über Solarzellen auf dem Dach. Klar, dass diese Daten auch wieder in das eigene Monitoring eingebunden werden müssen. Allerdings hat sich in der Zeit auch beim Wechselrichter etwas getan, der zwar vom gleichen Hersteller ist aber natürlich eine andere Generation.
Diese API ist nicht mit dem Pico 10.1 und nicht mit dem Plenticore 10 kompatibel
Portal und Zugriff
Natürlich kann ich über einen Webbrowser einfach auf den Wechselrichter zugreifen und mit die Daten anschauen. Es gibt einmal den "unangemeldeten" Zugriff als Gast, der schon den Status und zwei Werte anzeigt:
Aber schon hier ist zu sehen, dass die Daten aktualisiert werden, ohne dass die Webseite komplett neu geladen wird. Eine klassische Funktion mit JavaScript, um die Daten im Hintergrund zu laden und die Anzeige zu aktualisieren. Also habe ich im Browser einfach mal "F12" tippen und unter Netzwerk sehen Sie schon die zyklischen Abrufe im Hintergrund:
Die URL sehe ich dann in den Details zum Eintrag und als Antwort kommt eine JSON-Datenstruktur
Diese URL habe ich dann natürlich umgehend in PowerShell angesprochen. Das geht ja schnell und einfach.
PS C:\> Invoke-RestMethod "http://192.168.1.8/api/dxs.json?dxsEntries=33556736&dxsEntries=67109120&dxsEntries=16780032" dxsEntries session ---------- ------- {@{dxsId=33556736; value=23,353172}, @{dxsId=67109120; value=0,000000}, @{dxsId=16780032; value=0}} @{sessionId=0; ... PS C:\> (Invoke-RestMethod "http://192.168.1.8/api/dxs.json?dxsEntries=33556736&dxsEntries=67109120&dxsEntries=16780032").dxsEntries dxsId value ----- ----- 33556736 4505,603027 67109120 4277,493164 16780032 4
Das war schon mal sehr einfach. Anscheinend enthält die URL die gewünschten Variablen, die in der Antwort enthalten sein sollen.
dxsId | Beispiel | Beschreibung |
---|---|---|
33556736 |
2307,589355 |
Total DC Input Aktuelle Gesamtleistung auf der Gleichstromseite in Watt |
67109120 |
2167,225830 |
"Output power" Aktuell Gesamtleistung, die gerade ins Netz abgegeben wird. |
16780032 |
3 |
Betriebsart |
Damit kann man schon mal anfangen, aber gibt es noch mehr?
Authentifizierung und Sicherheit
Mehr Daten bekomme ich nach der Anmeldung am Portal mit dem Standarduser "pvserver" und dem Kennwort "pvwr" angezeigt.
Bitte ändern Sie die Standardzugangsdaten und passen Sie diese dann auch im Monitoring an.
Leider kann der der Wechselrichter keine Zertifikate nutzen und hat auch kein vordefiniertes selbstsigniertes Zertifikat. Insofern ist die Eingabe des Kennworts als Formular komplett ungesichert. Sie sollten daher diesen Weg nie über das Internet nutzen. Eine Veröffentlichung über eine Fritz!Box o.ä. wäre grob fahrlässig. Das müssen Sie aber auch nicht, da jeder Kostal Wechselrichter einfach seine Daten auch an das Kostal Portal senden kann und es dazu sogar passende Apps gibt.
- KOSTAL Solar App
https://www.kostal-solar-electric.com/de-de/products/tools-and-software/monitoring - Kostal Portal
https://www.piko-solar-portal.com/UserLogin.aspx - App
Android: https://play.google.com/store/apps/details?id=com.kostal.solarapp.android
Apple: https://apps.apple.com/de/app/kostal-solar-app/id1451610122
Sobald ich angemeldet bin, gibt es links im Baum weitere Punkte, die für jeden einzelnen String und jede einzelne Phase die Momentdaten ermitteln.
Aber auch hier ist gut zu sehen, dass die Webseite selbst nicht nachgeladen wird sondern nur die Inhalte sich ändern. Entsprechend habe ich auch hier die verschiedenen URLs zu den Meldungen eingefangen. So eine URL war dann einfach um einiges länger.
http://192.168.1.8/api/dxs.json?dxsEntries=33555202&dxsEntries=33555201&dxsEntries=33555203 &dxsEntries=33555458&dxsEntries=33555457&dxsEntries=33555459 &dxsEntries=33555714&dxsEntries=33555713&dxsEntries=33555715 &sessionId=4214538416
Interessanterweise enthält die URL im Browser noch eine "SessionID". Zuerst dachte ich, dass damit die Authentifizierung erfolgt. Aber auch ein Abruf ohne diese ID hat die gleichen Daten geliefert. So konnte ich mit dieser URL einfach die Daten per PowerShell abrufen. Sicher ist anders aber in dem Fall vereinfacht es meine Arbeit.
Interessant war hier, dass die PowerShell sich nicht gegen den Wechselrichter authentifizieren musste. Die "Sicherheit" der Anmeldung beruht also nur darauf, dass nach erfolgreicher Anmeldung die Webseite die weiteren Menüs anzeigt. Ich hoffe mal, dass Konfigurationsänderungen nicht ebenfalls ungesichert sind. Dann könnte man sich die Authentifizierung gleich ganz sparen.
Bedeutung der dxsID
Ich habe also alle "dxsID"s ermittelt, die in den grafischen Bilder gesehen haben und per Debugging ausgelesen habe. Hier meine Ergebnisse, die vermutlich unvollständig sind und vielleicht sogar je nach Anlage und Version variieren. Hier war es ein Kostal Pico 15 mit Firmware 6.02 und UI 6.50:
Hinweis: Die meisten Werte sind "Momentaufnahmen" zum Zeitpunkt der Abfrage und keine Mittelwerte über eine längere Zeit. Sie sind daher schwankend und nur bedingt für Auswertungen zu nutzen. Nur die wenigen aufaddierenden Summenzähler sind für Mengenmessungen sinnvoll nutzbar.
Bild |
Parameter |
---|---|
|
Home ÜbersichtLiefert die momentan globalen Leistungswerte für DC und AC als auch den Betriebstatus. 0: {dxsId: 33556736, value: 7084.690918} 1: {dxsId: 67109120, value: 6793.15918} 2: {dxsId: 16780032, value: 3} |
|
PV GeneratorDie momentanen Details zur Eingangsseite pro String mit Spannung, Strom und Leistung 0: {dxsId: 33555202, value: 737.653503} 1: {dxsId: 33555201, value: 3.863922} 2: {dxsId: 33555203, value: 2849.636475} 3: {dxsId: 33555458, value: 745.806763} 4: {dxsId: 33555457, value: 4.961382} 5: {dxsId: 33555459, value: 3699.952148} 6: {dxsId: 33555714, value: 510.796875} 7: {dxsId: 33555713, value: 1.184482} 8: {dxsId: 33555715, value: 604.519165} |
|
Grid (Wechselstromseite)Die Details zur Wechselstromseite, auf welcher Phase welche Energie eingespeist wird. Es ist gut zu sehen, dass die Webseite die gemeldeten Werte noch rundet. 0: {dxsId: 67109120, value: 6851.743164} 1: {dxsId: 67110400, value: 49.996948} 2: {dxsId: 67110656, value: 1} 3: {dxsId: 67110144, value: 100} 4: {dxsId: 67109378, value: 231.085876} 5: {dxsId: 67109377, value: 9.970093} 6: {dxsId: 67109379, value: 2279.586914} 7: {dxsId: 67109634, value: 229.602386} 8: {dxsId: 67109633, value: 9.963989} 9: {dxsId: 67109635, value: 2262.42627} 10: {dxsId: 67109890, value: 232.654144} 11: {dxsId: 67109889, value: 10.031128} 12: {dxsId: 67109891, value: 2309.730225} |
|
AnalogeingängeDie sind hier nicht genutzt und daher alle "0 Volt". Aber so könnte man diese Werte auch abfragen. Denkbar wäre z:B. der Anschluss eines Helligkeitsmelder oder Thermometer 0: {dxsId: 167772417, value: 0} 1: {dxsId: 167772673, value: 0} 2: {dxsId: 167772929, value: 0} 3: {dxsId: 167773185, value: 0} |
|
S0-InputMit diesem Digital-Eingang könnte der Wechselrichter andere Zähler mit S0-Ausgang einlesen. 0: {dxsId: 184549632, value: 0} 1: {dxsId: 150995968, value: 900} |
|
TagessummeDieser Wert erhöht sich während des Tages und wird über Nacht wieder zurück gesetzt. Das Auslesen der Werte auf den Strings selbst oder der Netzseite sind ja nur Momentaufnahmen und eignen sich nicht zum Summieren. 0: {dxsId: 251658754, value: 21482.984375} Dieser Wert eignet sich durch seine Summierung gut für eine Erfassung. Wer die eingespeiste Leistung erfassen will, sollte den Wert lesen und durch Subtraktion vom vorherigen Messwert die Zunahme ermitteln. |
Yield (Gesamtsumme)Analog zum Summenzähler pro Tag enthält dieser Count die Gesamtmenge der erzeugten Leistung und ins Netz abgegebenen Leistung. Sie können darauf aber nicht auf den Eigenverbrauch schließen. 0: {dxsId: 251658753, value: 29.068207} 1: {dxsId: 251658496, value: 10} Dieser Wert eignet sich durch seine Summierung gut für eine Erfassung. Wer die eingespeiste Leistung erfassen will, sollte den Wert lesen und durch Subtraktion vom vorherigen Messwert die Zunahme ermitteln. |
Mich würde natürlich noch interessieren, ob der Wechselrichter weitere interessante Counter hat, die für eine Auswertung sinnvoll sind. Mir fallen da spontan folgende Informationen ein:
- Innentemperatur
Ich bin mir ziemlich sicher, dass im Gehäuse auch Temperatursensoren verbaut sind um bei Überhitzung abzuschalten. - Alarmstatus oder Werte/Logeinträge
Der Wechselrichter protokolliert Fehler. Numerisch wäre die Anzahl der Fehler seit der Installation, seit letzten Einschalten oder dem letzten Tag interessant, um Trigger auszulösen. - Drosselung durch Rundsteuerempfänger
Mit mehr als 10kWp kann der Energieversorger (EVU) die Anlage aus der Ferne mit einem zu installierenden Rundsteuerempfänger abschalten. Wäre nett per Parameter zu erkennen, wie stark das System gerade gedrosselt wird.
Leider habe ich aber keine öffentliche Dokumentation gefunden. Mit den Werten der "dxsID" oder auch einfach dem String "dxsID" finden sich aber auch Beiträge in diversen Foren. Hier eine interessante Tabelle, die meine Ermittlungen zum Teil bestätigt und weitere Werte liefert:
//Leistungswerte ID_DCEingangGesamt = 33556736; // in W ID_Ausgangsleistung = 67109120; // in W ID_Eigenverbrauch = 83888128; // in W //Status ID_Status = 16780032; // 0:Off //Statistik - Tag ID_Ertrag_d = 251658754; // in Wh ID_Hausverbrauch_d = 251659010; // in Wh ID_Eigenverbrauch_d = 251659266; // in Wh ID_Eigenverbrauchsquote_d = 251659278; // in % ID_Autarkiegrad_d = 251659279; // in % //Statistik - Gesamt ID_Ertrag_G = 251658753; // in kWh ID_Hausverbrauch_G = 251659009; // in kWh ID_Eigenverbrauch_G = 251659265; // in kWh ID_Eigenverbrauchsquote_G = 251659280; // in % ID_Autarkiegrad_G = 251659281; // in % ID_Betriebszeit = 251658496; // in h //Momentanwerte - PV Genertor ID_DC1Spannung = 33555202; // in V ID_DC1Strom = 33555201; // in A ID_DC1Leistung = 33555203; // in W ID_DC2Spannung = 33555458; // in V ID_DC2Strom = 33555457; // in A ID_DC2Leistung = 33555459; // in W //Momentanwerte Haus ID_HausverbrauchSolar = 83886336; // in W ID_HausverbrauchBatterie = 83886592; // in W ID_HausverbrauchNetz = 83886848; // in W ID_HausverbrauchPhase1 = 83887106; // in W ID_HausverbrauchPhase2 = 83887362; // in W ID_HausverbrauchPhase3 = 83887618; // in W //Netz Netzparameter ID_NetzAusgangLeistung = 67109120; // in W ID_NetzFrequenz = 67110400; // in Hz ID_NetzCosPhi = 67110656; //Netz Phase 1 ID_P1Spannung = 67109378; // in V ID_P1Strom = 67109377; // in A ID_P1Leistung = 67109379; // in W //Netz Phase 2 ID_P2Spannung = 67109634; // in V ID_P2Strom = 67109633; // in A ID_P2Leistung = 67109635; // in W //Netz Phase 3 ID_P3Spannung = 67109890; // in V ID_P3Strom = 67109889; // in A ID_P3Leistung = 67109891; // in W Quelle: FHEM Forum: HttpUtils # in URL https://forum.fhem.de/index.php?topic=75939.0
Letztlich sind es sehr viele Werte, von denen aber nur ein paar Werte für eine dauerhafte Erfassung interessant sind. Es ist aber nicht ausgeschlossen, dass Sie
Auswertung mit PRTG
Natürlich wollte ich die Daten auch per PRTG erfassen. Dabei haben ich schnell gemerkt, dass die Auswertung dieser Daten per Skript deutlich einfach ist als meine Version für meinen eigenen älteren Wechselrichter (Siehe dazu PRTG-Solar). Ich muss ja keine HTML-Ausgabe mehr parsen. Dennoch habe ich darauf verzichtet, alle einzelnen Werte als Sensoren und Kanäle in PRTG aufzunehmen. Ich beschränke mich auf wenige Werte und habe per PowerShell und den Parametern gearbeitet.
(Invoke-Webrequest ` -URI "http://192.168.8.1/api/dxs.json?dxsEntries=251658753&dxsEntries=33555203&dxsEntries=33555459&dxsEntries=33555715&dxsEntries=251658496" ` -UseBasicParsing).content {"dxsEntries":[{"dxsId":251658753,"value":38.109718},{"dxsId":251658496,"value":13}],"session":{"sessionId":0,"roleId":0},"status":{"code":0}}
Im Content steht die JSON-Struktur, die ich nun mal auffächere, damit sie die Query-Strings für PRTG besser sehen:
{"dxsEntries": [ {"dxsId":251658753,"value":38.109718}, {"dxsId":33555203,"value":0.000000}, {"dxsId":33555459,"value":0.000000}, {"dxsId":33555715,"value":0.000000}, {"dxsId":251658496,"value":13} ], "session":{"sessionId":0,"roleId":0}, "status":{"code":0} }
Die Werte kommen hier als Array zurück. So kann ich mich also auf wenige Werte beschränken. Aber nun muss ich diese Werte natürlich noch in PRTG füttern. Es gab in PRTG schon länger einen Sensor, der einen einzelnen Wert aus einer JSON-Struktur als einzigen Kanal in einem Sensor geliefert hat. Aber ich wollte nicht für jeden Werte einen eigenen (lizenzpflichtigen) Sensor installieren. Es macht auch in der Anzeige viel mehr Sinn in einem Bild die verschiedenen Werte überlappend zu sehen.
Früher hätte ich nun wieder PowerShell angeworfen, um die Daten zu parsen und an PRTG zu melden. Aber es geht mittlerweile viel einfacher. Auf der Seite PRTG und JSON nutze ich den Kostal 15 als Beispiel, um den PRTG-Sensor zu erklären. Ich habe hier nur das Template zur Konvertierung dokumentiert:
{ "prtg": { "result": [ { "Channel": "Gesamteinspeisung", "CustomUnit": "kWh", "Float": 1, "Mode": "Difference", "Value": $.dxsEntries[0:1].value }, { "Channel": "String1", "CustomUnit": "Wh", "Float": 1, "Mode": "Absolute", "Value": $.dxsEntries[1:2].value }, { "Channel": "String2", "CustomUnit": "Wh", "Float": 1, "Mode": "Absolute", "Value": $.dxsEntries[2:3].value }, { "Channel": "String3", "CustomUnit": "Wh", "Float": 1, "Mode": "Absolute", "Value": $.dxsEntries[3:4].value }, { "Channel": "Betriebsstunden", "CustomUnit": "h", "Float": 0, "Mode": "Absolute", "Value": $.dxsEntries[4:5].value }, ] } }
Alle weitere Details zur Einrichtung mit PRTG finden Sie dann auf PRTG und JSON. Das Ergebnis der Sensoren sieht schon mal nett aus:
Historische Daten liefere ich später nach.
Kostal zu MQTT
Schade eigentlich, dass der Wechselrichter nicht auch eine MQTT-Schnittstelle hat, mit der man die Daten an einen Broker senden kann. Für die Haussteuerung wäre es so noch mal einfacher die Daten abzugreifen und zu visualisieren. Mit dem Wissen um die Abfrage per REST und die bekannten Module für MQTT sollte es aber ein leichtes sein, einen entsprechenden Konverter zu bauen, der zyklisch die Daten aus dem Wechselrichter liest und an einen Broker übergibt. Wobei viele Steuerungssysteme natürlich auch JSON per HTTP/HTTPS abfragen und auswerten können.
Kostal Portal
Da ich die Daten alle selbst direkt am Wechselrichter abgreifen kann, ist die Verbindung zum Portal eigentlich nur "Backup". In der Konfiguration des Wechselrichters kann ein Portal anhand eines Hersteller-Codes ausgewählt werden, zum dem die Wechselrichter dann ihre Daten senden. Da bei mir die Wechselrichter in einem eigenen VLAN stecken und einer Firewall den Zugang kontrolliert, ist schon anhand der Auslastung schön zu sehen, dass 4 Mal pro Tag eine überschaubare Datenmenge übertragen wird
Die Auswertung der Daten kann dann per Webbrowser oder App erfolgen. Eine kurze Kontrolle hat ergeben, dass die Werte stimmig sind.
Weitere Links
- PRTG-Solar
- PRTG und JSON
- FHEM Forum: HttpUtils # in URL
https://forum.fhem.de/index.php?topic=75939.0 - Kostal Wechselrichter - Auslesen der
Werte über HTTP
https://www.loxwiki.eu/pages/viewpage.action?pageId=28803569 - PRTG Manual: HTTP XML/REST Value Sensor
https://www.paessler.com/manuals/prtg/http_xmlrest_value_sensor - Kostal Piko WR
https://openwb.de/forum/viewtopic.php?f=5&t=11&sid=3d5b631d39cf5983ec31f3079e1956fb - Inkonsistente Daten beim Loggen (Piko BA
8.0)
https://www.photovoltaikforum.com/thread/128518-inkonsistente-daten-beim-loggen-piko-ba-8-0/ - Neue Weboberfläche von KOSTALPIKO, das
Modul liefert keine Werte mehr
https://forum.fhem.de/index.php?topic=43396.0