PRTG Kostal 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.

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
0 = aus
1 = Leerlauf (?)
2 = Anfahren, DC Spannung noch zu klein (?)
3 = Einspeisen (MPP)
4 = Einspeisen (abgeregelt)

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. 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.

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 Übersicht

Liefert 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 Generator

Die 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änge

Die 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-Input

Mit diesem Digital-Eingang könnte der Wechselrichter andere Zähler mit S0-Ausgang einlesen.

0: {dxsId: 184549632, value: 0}
1: {dxsId: 150995968, value: 900}

Tagessumme

Dieser 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