Smartmeter per Android-Handy und RaspberryPi mittels SML auslesen

 

                        SML_2_Ethernet-Java-Software (JAR) | Android-App (APK) | Quelltext auf GitHub

Im Verlauf der nächsten Jahre werden immer mehr Haushalte ein sogenanntes Smartmeter statt der bislang üblichen Ferraris-Zähler erhalten. Im Februar 2021 habe auch ich ein solch neues Teil in den Zählerschrank bekommen. Über zwei IR-Dioden kann man in der Regel mit den Geräten direkt kommunizieren, was meinen Basteltrieb wieder geweckt hat. Es gibt im Internet inzwischen zahlreiche Programme und Tools, um mit den Zählern per SML (Smart Meter Language) zu sprechen.

Nach einer ersten Suche habe ich allerdings keine App für mein Telefon gefunden, die diese zahlreichen Werte einfach ohne Schnörkel anzeigen konnte. Also habe ich Kontakt mit Daniel Hirscher aufgenommen (http://www.daniel-hirscher.de/photovoltaik.html), der bereits eine App zum grundsätzlichen Auslesen programmiert hatte. Seine in Java geschriebene Anwendung für einen RaspberryPi war allerdings schon fast zu umfangreich, weshalb ich eine eigene Java-Anwendung geschrieben habe, die lediglich eine UART-Verbindung zum IR-Schreib-Lesekopf öffnet, die SML-Daten mittels einer bestehenden Bilbliothek von OpenMUC (jSML, https://www.openmuc.org/sml/) ausliest, aufbereitet und lediglich die gewünschten Werte via Netzwerk an die Handyapp weiterreicht. Dabei habe ich die App weiterentwickelt, sodass sie nun in einer schicken Graph-Anzeige Spannung, Strom und Leistung für alle drei Phasen in Echtzeit plottet (Bild folgt noch)

Nach ein paar Tagen Wartezeit konnte ich die "erweiterte" Datenausgabe freischalten, sodass nun die momentane Leistung per UART empfangen werden kann. Leider liefert mein Gerät keine Werte für Spannung, Strom und Leistung für die einzelnen Phasen mit, sodass die App nun lediglich mit den zur Verfügung stehenden Daten umgehen kann (1.8.0, 2.8.0 und aktuelle Leistung). Weitere Informationen zum SML-Protokoll findet man entweder auf Wikipedia (https://de.wikipedia.org/wiki/Smart_Message_Language) oder z.B. im FHEM-Forum, der OpenMUC-Website oder anderen Internetquellen wie vzlogger (https://wiki.volkszaehler.org/software/sml).

 

Notwendige Hard- und Software

Wieder dient ein Raspberry Pi (egal ob Modell 1 bis 4 oder Zero) als Grundlage. Auf dem Pi läuft die oben zum Download angebotene Java-Anwendung "SML_2_Ethernet", die eine in der Settings.json angegebene UART (beim Pi 4 eine der integrierten 5 UARTS /dev/ttyAMA0, /devAMA1, etc.). Mit 9600 Baud rauschen dann die Daten des IR-Schreib-Lesekopfs (eBay oder Selbstbau von hier: https://wiki.volkszaehler.org/hardware/controllers/ir-schreib-lesekopf-rs232-ausgang) in die Java-App. Diese Daten werden dann über die jSML-Bibliothek von OpenMUC (Danke ans Fraunhofer ISE) geparst und in die Klasse AppData gepackt. Diese Klasse wird dann als Bytearray übers Netzwerk zur Android-Handy-App geschickt, die die Daten auswertet. Es werden die Werte 1.8.0 (gesamter bisheriger Bezug - also Zählerstand ) und 2.8.0 (gesamte bisherige Einspeisung), sowie die aktuelle Gesamtleistung mitübertragen. Tages- und Stundenwerte für 1.8.0 und 2.8.0, sowie Sekundenwerte für die Leistung der letzten 7 Tage werden ebenfalls zum Handy übertragen.

Die Android-App zeigt dann in Text-Boxen die aktuellen Werte der Leistungen und im Graphen dann die einzelnen Messwerte übersichtlich für die letzten 7 Tage an. Der Graph kann dabei zwischen Live-Ansicht (Sekundenschritte) und 7-Tages-Historie umgeschaltet werden. 

Aktuell besitzt die App folgende Funktionen:

  • Wichtigste Daten als Zahlenwerte (Aktuelle Leistung, Bezug und Einspeisung Gesamt und für aktuellen Tag)
  • Live-Graph mit Daten im Sekundentakt für: Bezug und Einspeisung, Leistungen, Spannungen und Ströme für alle drei Phasen
  • History-Graph mit Werten für die letzten 7 Tage: Bezug und Einspeisung und Leistung

Nachfolgend sieht man ein paar Screenshots der App auf meinem Handy. Das rechte Bild enthält noch zum größeren Teile Daten ohne Pin:

 stromzaehler main    stromzaehler stats     stromzaehler history

Stromzaehler App Quer

Die App ist schnell gestartet und man kann so auf einen schnellen Blick auch den Stromverbrauch einzelner Geräte super tracken - da der Zähler geeicht ist sind die Werte auch sehr verlässlich. Ein sehr schönes Stück Technik. An dieser Stelle einen ganz herzlichen Dank an Daniel Hirscher für die Zusendung seines Codes und die Möglichkeit der Weiterentwicklung. Hoffentlich hilft euch die App ebenfalls.

 

Loggen der Daten

Der Java-Server besitzt inzwischen auch eine eigene Datenbank für die Energien, die man mittels Netzwerkschnittstelle abrufen kann. Somit braucht es keine zusätzlichen Datenbanken, um sich seinen Verbrauch der letzten Wochen und Monate anzuschauen. Mit php und chartjs habe ich hierfür eine schöne Darstellung programmiert. Die php-Seite ruft per Socket-Verbindung die Stundenwerte der letzten 7 Tage für 1.8.0 und 2.8.0 ab und zeigt sie übersichtlich in einer hübschen Darstellung als Zeitverlauf. Die Website wird zudem alle 50 Sekunden aktualisiert, sodass man die Darstellung auch schön auf einem Tablet laufen lassen kann:

SmartMeter phpclient

Was kann man nun noch mit den Daten anfangen, wenn man das Handy nicht dauern laufen lassen möchte? Man kann z.B. Grafana verwenden und seine Daten in eine Datenbank schreiben. Grafana ist eine plattformübergreifende Open-Source-Anwendung zur grafischen Darstellung von Daten aus verschiedenen Datenquellen wie z. B. InfluxDB, MySQL, PostgreSQL, Prometheus und Graphite. Ich habe mich allerdings für ein Docker-Image von ELK entschieden, was eine Kombination aus ElasticSearch, Logstash und Kibana als grafische Web-Oberfläche darstellt. Man muss hier nicht mit SQL-Befehlen herumhantieren, sondern speichert seine Messdaten einfach in beliebigen Zeitabständen per URL-Aufruf in die ElasticSearch-Datenbank ab. Kibana greift dann auf diese Daten zu und zeigt sie schließlich an.

Damit die Datenmengen über die nächsten Jahre nicht ausufert, werden in der Java-Anwendung alle eingehenden Sekunden-Daten zunächst intern abgespeichert (integriert = addiert) und dann stündlich mit der Einheit Wh in ElasticSearch abgelegt. Somit fallen pro Jahr nur ca. 9000 Datenpunkte für die Energien an. Sicherlich könnte man nun auch über 15-Minuten- oder 10-Minuten-Werte nachdenken, aber Stundenwerte sollten für schöne Graphen über die Zeit völlig ausreichen und z.B. den Monats-Energieverbrauch ausreichend fein-granularig abbilden können. So sieht mein Kibana-Graph für Bezug und Einspeisung aus (im Vergleich zur Handy-App ein Bild weiter oben). Hier habe ich mich für eine bessere Übersicht für eine quadratisch-logarithmische Darstellung entschieden, um große und kleine Werte zeitgleich gut sehen zu können:

SmartMeter ELK1

Der ELK-Stack (ElasticSearch + Kibana) bietet bei den Graphen auch die Möglichkeit, die Summe in einer anderen Zeitbasis darzustellen und summiert die Werte automatisch auf. So sieht der obere Graph mit der Zeitbasis "Tage" aus - es werden alle einzelnen Energien automatisch aufsummiert und nur der Tageswert angezeigt:

SmartMeter ELK2

 

Dynamische Last in Abhängigkeit der PV-Einspeisung regeln

Da man mit einem Balkon-Kraftwerk bekanntlich keine Einspeisevergütung bekommt wollte ich meine erzeugte PV-Leistung nicht einfach ins Versorgungsnetz verschenken, sondern lokal im Gebäude verwenden. Daher habe ich eine Zusatzfunktion und ein kleines Gerät entwickelt, mit dem man anhand der aktuellen Leistung (aus dem Smart-Meter) eine Last (Heizung, Peltier-Element, Beleuchtung, Lüfter, etc.) in der Leistung nachregelt. Das Smart-Meter liefert im Sekundentakt die aktuelle Leistung an die Java-App. Diese stellt via TCP-Server eine Zusatzfunktion für einen per WLAN angebundenen ESP8266 bereits, der ebenfalls im Sekundentakt einen PID-Regler innerhalb des Java-Servers abruft. Als Leistungs-Sollwert stellt man z.B. zwischen -100W und -50W ein (also zur Sicherheit ein wenig Einspeisen, statt direkt auf 0W zu regeln). Der PID-Regler erhöht dann bei höherer Einspeisung den Ausgangswert und erhöht dann über eine PWM, bzw. einem DMX512-Signal die bezogene Leistung. Verschattet dann die PV-Anlage oder ein größeres Gerät wird eingeschaltet, so reduziert der Regler gemäß seiner Reglerparameter die geregelte Last. Die Reglerparameter, als auch der Sollwert können dabei via Konfigurationsdatei am RaspberryPi vorgegeben werden. Setzt man Kp und Kd auf 0, so hat man einen einfachen I-Regler.

Die Software für den ESP8266 habe ich in das GitHub-Repository abgelegt (Link siehe oben). Zum Kompilieren kann man z.B. Arduino IDE 2.0 verwenden. Das WLAN kann man innerhalb des Codes konfigurieren und dabei auch zwischen WPA2 und WPA2-Enterprise wählen. Die PWM kann man z.B. für eine LED-Last verwenden. Für größere Lasten kann man an der zweiten UART einen SN75176 anschließen und somit die an dieser UART bereitgestellten DMX512-Daten an ein Dimmerpack übergeben. Somit kann man beliebig hohe Lasten sehr einfach regeln.

Funktionsprinzip WiFiPVLast

Stand 24.03.2021: derzeit muss das Gerät noch an mein DMX512-Dimmerpack angeschlossen werden. Sobald ich Fotos, weitere Daten und Zeitverläufe habe, werde ich diese hier posten.