03 February 2021
by Georg Ledermann

Photovoltaik-Dashboard als Web-Applikation

Visualisierung von Messwerten einer Solaranlage

  • # Ruby on Rails
  • # InfluxDB
  • # Raspberry Pi
Blick auf die Solarmodule

Photovoltaik-Dashboard als Web-Applikation

Die Energiewende findet seit kurzem auch im eigenen Heim statt - auf dem Dach unseres Hauses befindet sich nun eine Photovoltaik-Anlage. Damit kommt der im Haus benötigte Strom größtenteils aus der Solarenergie und nicht mehr aus der Verbrennung von Kohle, was unabhängig von der Frage nach der finanziellen Rentabilität eine gute Sache ist - und außerdem für einen Web-Entwickler eine interessante Herausforderung darstellt, über die ich berichten möchte.

Im Keller befindet sich jetzt ein SENEC.Home V3 hybrid duo, der in der Größe eines Kühlschranks neben dem Wechselrichter auch einen Batteriespeicher enthält, sodass überschüssige Energie bevorzugt nicht in die wenig lukrative Einspeisung, sondern in den eigenen Verbrauch der kommenden Nacht und des nächsten Tages fließen kann.

Die SENEC-Box sammelt nebenbei auch eine große Anzahl an Messwerten und übermittelt diese in kurzen Zeitabständen über das Internet an den Hersteller, wo ich als Anlagenbetreiber Einblick in die eigene Energieerzeugung nehmen kann. SENEC stellt hierfür ein Web-Portal sowie eine Mobile-App bereit, so dass man ohne weiteres Zutun eine mehr oder weniger hübsche Visualisierung erhält.

Diese Einblicke sind ganz nützlich, lassen sich aber auch besser machen. Hier möchte ich skizzieren, wie ich mit Ruby on Rails ein eigenes Photovoltaik-Dashboard erstellt habe. Vorab ein Blick auf das Endergebnis:

Solectrus Screenshot

Live: https://solectrus.ledermann.dev

Warum eine eigene Applikation?

An den SENEC-Angeboten stören mich einige Dinge:

  • Fünf-Minuten-Interval: Die Messwerte werden zwar kontinuierlich ermittelt, aber nur alle fünf Minuten an SENEC übertragen. Blickt man also in deren Mobile-App oder ins Web-Portal, sieht man für die Jetzt-Situation Werte, die bis zu fünf Minuten alt sein können. Das kann irritierend sein, weil sich z.B. längst eine große Wolke vor die Sonne geschoben habe könnte und die Energieausbeute im Moment eine ganz andere ist als dargestellt.
  • Rentabilität: SENEC lässt den finanziellen Aspekt komplett außen vor. Inwieweit sich die Investition in die Anlage bereits amortisiert hat, erfährt man dort nicht. Es gibt keine Gegenüberstellung von Investitionsaufwand und Ertrag.
  • Keine Vorhersage: Mittels solarspezifischer Wettervorhersage ließe sich prinzipiell die zu erwartende Strommenge prognostizieren, was beispielsweise interessant sein könnte, wenn es um das “Betanken” des Elektromobils geht. Wenn ich weiß, dass es morgen viel Sonnenenergie geben wird, lade ich das Auto eher morgen auf als heute. SENEC unterstützt dies aber nicht.
  • Visuelle Darstellung: Die Benutzeroberfläche des Web-Portals ist recht altbacken. Die App hingegen sieht zwar besser aus, ist aber auch nicht das Gelbe vom Ei.
  • Stabilität: Die von SENEC bereitgestellten Dienste scheinen des öfteren Lastprobleme zu haben. Die Antwortzeiten sind oft recht lang und manchmal fällt der Server auch ganz aus, was dann so aussieht:

SENEC App

Erste Schritte

Da die SENEC-Box auch einen Web-Server enthält und über das lokale Ethernet erreichbar ist, besteht prinzipiell die Möglichkeit, selbst aktiv zu werden. Nach ersten Experimenten mit dem lokalen SENEC-Webserver wird schnell klar, dass sich wesentliche Messwerte leicht auslesen lassen:

SENEC Server

Damit beginnt die Sache aus Sicht eines Web-Entwicklers interessant zu werden. Ein paar Wochen später ist die Web-Applikation SOLECTRUS entstanden, deren Komponenten ich allesamt im Quellcode veröffentliche.

An dieser Stelle sei darauf hingewiesen, dass ich außer meiner Eigenschaft als Kunde in keinerlei Verbindung zum Unternehmen SENEC stehe.

Die Komponenten von SOLECTRUS

Einzelne Messwertabfrage

Um die Messwerte für einen einzelnen Zeitpunkt abzufragen, habe ich einen kleinen Ruby-Client geschrieben. Dieser kontaktiert den lokalen SENEC-Webserver über dessen IP-Adresse, fragt die wichtigsten Messwerte über einen POST-Request ab und decodiert die Antwort.

Den Ruby-Client habe ich als Gem senec veröffentlicht. Die Ermittlung der aktuellen Messwerte erfolgt damit sehr einfach:

request = Senec::Request.new host: '10.0.1.18'

request.inverter_power
# => 6302

request.house_power
# => 560

Regelmäßige Datenermittlung und -übertragung

Der SENEC-Webserver lässt sich nur über das lokale Netzwerk erreichen. Das soll auch so bleiben, eine Erreichbarkeit von außen kommt aus Sicherheitsgründen nicht in Frage. Die Messwerte müssen also regelmäßig abgefragt und in eine externe Datenbank übertragen werden. Um dies stromsparend und zuverlässig rund um die Uhr zu erledigen, verwende ich den Einplatinencomputer Raspberry Pi. Für diesen habe ich das kleine Ruby-Script SENEC collector geschrieben, das regelmäßig (alle 5 Sekunden) die Messwerte abfragt und weitergibt.

Bei der Suche nach einem Anbieter für Solar-Prognosen bin ich auf forecast.solar gestoßen: Dort steht eine öffentliche API bereit, mit der man automatisiert unter Angabe von Geo-Koordinaten, Hausausrichtung, Dachneigung und Maximal-Leistung (kWp) die in den nächsten Tagen voraussichtlich produzierte Energiemenge der eigenen Photovoltaikanlage abrufen kann. Diese API wird vom gleichen Script ebenfalls regelmäßig (alle 15 Minuten) abgefragt und die erhaltenen Werte weitergegeben.

Da es sich bei den entstehenden Daten um Zeitreihen handelt und voraussichtlich größere Mengen anfallen werden, bietet sich die Verwendung einer darauf spezialisierten Datenbank wie InfluxDB an. Damit lassen sich spätere Auswertungen leicht und effizient durchführen.

Den SENEC collector habe ich als Docker-Container verpackt, so dass er leicht auf einem Raspberry Pi betrieben werden kann.

Insgesamt entsteht damit eine Datensammlung in InfluxDB, die permanent mit aktuellen Werten befüllt wird. Um historische Daten zu ergänzen, die vor Inbetriebnahme des Collectors entstanden sind, gibt es auch eine Möglichkeit: SENEC selbst stellt auf ihrem Web-Portal die erhaltenen Daten (naja, nicht alle, aber die wichtigsten) im CSV-Format wochenweise zum Download bereit. Um diese ebenfalls nach InfluxDB zu übernehmen, habe ich noch das kleine CLI-Tool SENEC importer geschrieben. Lässt man dieses über die heruntergeladenen CSV-Dateien laufen, ist die Influx-Datenbank komplett und enthält sämtliche Werte seit Inbetriebnahme der Photovoltaik-Anlage (anfangs im 5-Minuten-Takt, später dann im 5-Sekunden-Takt).

Visualisierung der Daten als Dashboard

Die Rails-Applikation SOLECTRUS entnimmt die Daten aus InfluxDB und stellt sie über eine ansprechende Oberfläche dar. Dies ist die umfangreichste Komponente und erledigt folgende Aufgaben:

  • Dargestellt werden die Messwerte sowie der Stromfluss zwischen Stromerzeugung, Stromverbrauch und Speicher
  • Es wird unterschieden zwischen aktueller Messung (Jetzt) und vergangenen Zeiträumen (Tag, Woche, Monat, Jahr und Gesamt)
  • Berücksichtigt werden die Messwerte Erzeugung, Hausverbrauch, Einspeisung, Netzbezug, Akku-Beladung, Akku-Entnahme, Ladezustand und Wallbox
  • Der zeitliche Verlauf von Messwerten wird als Diagramm dargestellt
  • Bei der Darstellung der Stromerzeugung eines Tages wird im Diagramm zusätzlich die Prognose visualisiert
  • Errechnet wird der Autarkie-Grad sowie der Gewinn des gewählten Zeitraums. Letzterer ergibt sich aus der Einsparung aufgrund der Stromerzeugung zuzüglich der Einspeisevergütung.
  • Die Darstellung ist responsive und funktioniert sowohl im Desktop-Browser als auch auf Smartphone und Tablet

Ich verwende folgenden Tech-Stack:

Veröffentlichungen

Alle Komponenten stehen auf GitHub im Quelltext bereit:
https://github.com/solectrus

Das Dashboard kann mit echten Daten hier öffentlich eingesehen werden:
https://solectrus.ledermann.dev

Gut erkennbar ist zur Zeit, dass Photovoltaik im deutschen Winter ein limitiertes Vergnügen ist - im Rest des Jahres dürfte das aber ganz anders aussehen.