Motivation

Seit nunmehr fast zwei Jahren versorge ich mich zumindest teilweise mit Solar-Energie. Der eingebaute Wechselrichter ist ein STP 5000TL-20 von der Firma SMA. Die Mär war: "Dieses Gerät besitzt einen Bluetooth- und einen Internet-Anschluss und lässt sich auslesen". Super! Da kann man dann die Großverbraucher, wie die Waschmaschine, zu Zeitpunkten einschalten, an denen ausreichend Solarenergie zur Verfügung steht. Das ganze dann noch kombiniert mit einer Wetterprognose für die nächsten Stunden, unter Berücksichtigung der Jahreszeit und der Tageszeit... Ein tolles Thema für ein interessantes und außerdem nutzbringendes Projekt.

Dann kam die Ernüchterung. SMA stellt PC-Software, ein Internet-Portal und ein Handy-App zur Verfügung, die aktuelle Anlagendaten und eine Historie der erzeugten Energien anzeigen oder als CSV-Dateien exportieren. Nur ist es so, dass das Protokoll nicht offengelegt ist. Eigener oder Open-Source-Software, z.B. openHAB, können die Daten nicht online zur Verfügung gestellt werden. SMA bietet eigene Lösungen an (z.B. Sunny Home Manager), mit denen man z.B. Funksteckdosen steuern kann. Es gibt auch eine Lösung die Daten per  Modbus Application Protocol (MBAP) zur Verfügung stellt. Alles in allem ist dies a) unflexibel (meine Waschmaschine lässt sich nicht mit einer Funksteckdose steuern) b) nicht einfach erweiterbar c) teuer!

Lösung

Also schauen, ob es eine Alternative gibt! Schaut man sich im Netz um, findet man eine Reihe von Leuten, die das gleiche Problem haben. Es gibt auch eine Reihe von Lösungsvarianten. Schaut man genauer hin, basieren viele auf dem Programm SBFSpot, ein in C++ geschriebenes Programm, mit dem man die verfügbaren Daten sowohl per Bluetooth als auch per LAN abrufen kann. Es bietet viele Möglichkeiten, wie Export als CSV, Speichern der Daten in einer Datenbank (MySQL, SQLite). Dieses Programm habe ich als Basis genommen, nach VB.Net transferiert, ein wenig Objektorientierung hinzugefügt und die Dinge hinausgeworfen, die für mich nicht relevant sind und das Ganze in eine Bibliothek gepackt. Das Ergebnis ist noch nicht perfekt, man könnte noch einiges verbessern. Aber es funktioniert und erfüllt so seinen Zweck. Hinzu kommt ein kleines Demo-Programm, dass die ausgelesenen Daten in einem Fenster anzeigt.

SBFspotVB

API

Die zentrale Klasse ist SmaInverter. Sie stellt Methoden bereit, mit denen die Daten des Wechselrichters ausgelesen werden können, nimmt die ausgelesen Daten aus und veröffentlicht sie als Eigenschaften.

Methode Funktion
new(PlantIPAddress, UserGroup, Password) Initialisiert eine neue Instanz der SmaInverter-Klasse.
Diese Methode meldet sich unter der angegebenen IP beim Wechselrichter an und erfragt die Anlagen-Stammdaten, den Betriebszustand, Input und Output.
Das Standard-Anmeldepasswort ist "0000" für Benutzer und "1111" für Installateure.
Refresh() Aktualisiert die Werte für Anlagedaten, Input, Output und Betrieb.
GetArchiveDayData(ArchiveDate) Ruft die Archivdaten für den angegebenen Tag ab (Bereitgestellte Energie in Fünf-Minuten-Abschnitten).
GetArchiveMonthData(ArchiveDate) Ruft die Archivdaten für den angegebenen Monat ab (bereitgestellte Energie pro Tag).
GetArchiveYearData(Year) Ruft die Archivdaten für das angegebene Jahr ab (bereitgestellte Energie pro Monat).

Die bereitgestellten Anlagendaten sind:

Kategorie: Anlagendaten Kategorie: Betrieb
Eigenschaft Bedeutung Eigenschaft Bedeutung
PlantIPAddress IP-Adresse der Anlage. OperationTime Gesamtbetriebszeit [h].
SUSyID SUSy-ID der Anlage. FeedInTime Einspeisezeit [h].
DeviceName Gerätebezeichnung. EnergyToday Die am lfd. Tag produzierte Energie [kWh].
DeviceTypeName Gerätetypenbezeichnung. EnergyTotal Insgesamt produzierte Energie [kWh].
DeviceClassName Geräteklasse. Temperature Aktuelle Temperatur des Geräts [°C].
DevClass Gerätetypenklasse. DeviceState Aktueller Betriebszustand.
SWVersion Aktuelle Software-Version. GridRelayState Aktuelle Einstellung des Netz-Relais.
Serial Seriennummer. InverterDatetime aktuell eingestellte Uhrzeit (lokale Zeit).
Pmax1 Maximalleistung [W]. WakeupTime Aktueller Einschaltzeitpunkt.
SleepTime Aktueller Ausschaltzeitpunkt des Geräts (im lfd. Betrieb ist dies die aktuelle Uhrzeit).
Kategorie: Input Kategorie: Output
Eigenschaft Bedeutung Eigenschaft Bedeutung
Pdc1 Aktuell von Solar-Panel-Block A gelieferte Leistung [W]. Pac1 Aktuell bereitgestellte Leistung für Phase L1 [W].
Pdc2 Aktuell von Solar-Panel-Block B gelieferte Leistung [W]. Pac2 Aktuell bereitgestellte Leistung für Phase L2 [W].
Udc1 Aktuell von Solar-Panel-Block A gelieferte Spannung [V]. Pac3 Aktuell bereitgestellte Leistung für Phase L3 [W].
Udc2 Aktuell von Solar-Panel-Block B gelieferte Spannung [V]. TotalPac Aktuell bereitgestellte Gesamtleistung [W].
Idc1 Aktuell von Solar-Panel-Block A gelieferte Stromstärke [A]. Uac1 Aktuelle Ausgangsspannung für Phase L1 [V].
Idc2 Aktuell von Solar-Panel-Block B gelieferte Stromstärke [A]. Uac2 Aktuelle Ausgangsspannung für Phase L2 [V].
Uac3 Aktuelle Ausgangsspannung für Phase L3 [V].
Iac1 Aktuell abgegebene Stromstärke für Phase L1 [A].
Iac2 Aktuell abgegebene Stromstärke für Phase L2 [A].
Iac3 Aktuell abgegebene Stromstärke für Phase L2 [A].
GridFreq Netzfrequenz [Hz].

Hinzu kommen die Klassen SmaArchiveDayData mit den archivierten Tagesdaten, SmaArchiveMonthData mit den archivierten Monatsdaten und SmaArchiveYearData mit den archivierten Jahresdaten.

SmaArchiveDayData SmaArchiveMonthData
Eigenschaft Bedeutung Eigenschaft Bedeutung
UnixTimeStamp Zeitstempel UTC im Unix-Format. UnixTimeStamp Zeitstempel UTC im Unix-Format.
TimeStamp Datum im Standard-dotNet-Format.   TimeStamp Datum im Standard-dotNet-Format.
TotalHarvest Bis zum Zeitpunkt erzeugte Energie [kWh].   TotalHarvest Bis zum Zeitpunkt erzeugte Energie [kWh].
AvgPower Durchschnittliche Leistung im Zeitraum (5 Minuten).   DaylyHarvest Tagesertrag [kWh].

Das zugehörige Klassendiagramm:

             Klassendiagramm SBFspotVB API

Für die einzelnen Eigenschaften habe ich eigenständige Klassen angelegt bei denen die ToString()-Methode überschrieben wurde. Dies ermöglicht die Ausgabe mit Einheiten in einem PropertyGrid.

Klassen zur Darstellung der Wechselrichter-Eigenschaften

Debug

Zu Debug-Zwecken wird der Datenverkehr mit dem Wechselrichter protokolliert. Das Protokoll kann über die Klasse SmaHistorie abgerufen werden. Einzelheiten kann man der Dokumentation im Source-Code oder der Hilfe-Datei entnehmen.

Klassen zum Datenaustausch-Protokoll

Test-Programm

Ein kleines Testprogramm ruft die Daten vom Wechselrichter ab und zeigt sie an:

Anlagendaten Tagesdaten Monatsdaten Jahresdaten
Anlagendaten Tagesdaten Monatsdaten Jahresdaten

Download

Binary   VS-Projekt
Binary   VS-Projekt

Links

James Ball: SMA Bluetooth Protocol

SBFSpot

volkerrichert/org.openhab.binding.sma

SMA Energy Meter

SMA Energy Meter Auslese Software

rhuss/net-bluetooth-sunny

groups.google.com: Forum sma-spot

PV-Wechselrichter (SMA) über Bluetooth auslesen und via Webinterface darstellen

Solar-Logger Wiki

SolarView