Data logging meines SMA Tripower 6.0 Inverters

Mein neuer Inverter bietet eine Vielzahl von Datenpunkten welche ich aktiv mitlogge. Ich erkläre wie ich diese auslese und verarbeite.

Das System holt sich täglich die CSV-Exporte vom Inverter per API, parst die Daten und schreibt sie in InfluxDB. Grafana zeigt dann Produktion, Umsatz und Peak-Leistung über Zeit. Die 5-Minuten-Werte reichen für Monitoring, die 1-Sekunden-Werte nutze ich für detaillierte Analysen.

[[img:1]]

Das Dashboard zeigt links die monatliche Produktion als Balken (PV vs Solar getrennt), in der Mitte Monats-Statistiken (159.85 kWh produziert, €71.93 Umsatz, 5.34 kW Peak), rechts den Tagesverlauf mit aktueller Leistung und die heutigen Werte (6.83 kWh, €3.07).

Erste Schritte mit Modbus

Da der Inverter Modbus unterstützt war das natürlich mein erster Versuch an die Daten zu kommen. Mit Python und pymodbus habe ich mir einen kleinen Modbus Master Service geschrieben welcher alle 10 Sekunden rund 20 Datenpunkte abfragt.

Das lief auch einige Stunden ganz gut. Ich musste dann aber feststellen dass das Modbus Modul nachts, um Strom zu sparen, ausgeschaltet wird. Des Weiteren war Modbus gar nicht so zuverlässig wie gedacht. Ich denke ich hab den Inverter etwas mit der Abfragegeschwindigkeit überfordert.

Eine andere Lösung muss her

Ein moderner Inverter von SMA bietet ein Webinterface an welches die Daten in verschiedenen Charts darstellt. Ich dachte vielleicht gibt es eine öffentliche API dazu aber leider konnte ich nichts dazu finden.

Also habe ich mir mal den Traffic zum Inverter über die Devtools des Browsers angeschaut.

Zuerst wollte ich den getValues Endpunkt ansprechen aber ich wusste nicht was die verschiedenen Parameter machen. Ein Request auf getValues sieht in etwa so aus:

POST /dyn/getValues.json?sid=xxxx
{"destDev":[],"keys":["6800_00A21E00","6800_00823400","6180_104A9A00","6180_104AB700","6180_084ABC00","6180_084A9600","6180_084A9800","6100_004AB600","6800_088A4D00","6180_084A6400"]}

Dann kam ich auf die Idee mir automatisch den CSV Export herunterzuladen und zu verarbeiten.

Es gibt 2 Arten von Exports: Tagesdaten als 5 Minuten oder 1 Sekunden Werte

So ein Export besteht aus mehreren CSV Dateien welche jede Nacht zu einer .zip verpackt werden.

Um auf die Dateien zu kommen gibt es den getFS Endpunkt.

POST /dyn/getFS.json?sid=xxx
{"destDev":[],"path":"/DIAGNOSE/ONLINE5M/"}

{
"result": {
"XXXX-XXXXXXXX": { // Irgendeine ID
"\/DIAGNOSE\/ONLINE5M\/": [
{
"f": "DA190912.ZIP", // Dateiname
"tm": 1568310258, // Timestamp
"s": 32200 // Dateigröße
},
{
"f": "DA190919.ZIP",
"tm": 1568914216,
"s": 32300
},
{
"f": "DA190925.011",
"tm": 1569429451,
"s": 12006
}
...
]
}
}
}

Da ich nun alle Namen habe konnte ich mir die Dateien einfach per curl herunterladen.

curl -s -k -X POST -H "Content-Type: application/json" -d "{}" "https://xxx/fs/DIAGNOSE/ONLINE5M/DA190919.ZIP?sid=?sid=xxx" --output "DA190919.ZIP"

Links:

SMA Tripower 6.0

pymodbus Documentation