Close

Einfaches Monitoring des Stromverbrauchs über Grafana

Da ich einen etwas genaueren Einblick in die Stromnutzung meiner Geräte haben wollte, habe ich mir ein Monitoring mittels Grafana und InfluxDB eingerichtet, in welchem ich eine detaillierte Auswertung über die genutzte Energie erhalte.

Die primären Komponenten sind hierbei ein TP-Link HS110 Smart Plug, ein Raspberry Pi und optional noch ein vServer oder ähnliches, welcher Grafana und InfluxDB als Anwendung bereitstellt und über das Internet verfügbar macht. Sollten die Anwendungen nur lokal im eigenen Netz erreichbar sein, wird ein solcher Server nicht benötigt.
Die Steckdose konnte ich im nahegelegenen Elektromarkt für 23€ erworben und sowohl den Pi, als auch den Server hatte ich ohnehin schon für andere Zwecke im Einsatz. Alles in allem war das ganze also kein teures Projekt.

Um den Aufbau etwas genauer darzustellen habe ich hier einmal die eben erwähnten Varianten dargestellt:

Anwendungen auf Pi, lokal erreichbar

Anwendungen auf Server, über Internet erreichbar

Einrichtung

Steckdose

Alles begann damit, dass ich die Steckdose einsteckte und mittels der App „Kasa“ einrichtete. Diese ist für Android und iOS verfügbar. Während der Einrichtung wird die Steckdose mit dem WLAN verbunden, woraufhin sie wie gewohnt eine IP Adresse bekommt und anschließend im Netzwerk erreichbar ist.

InfluxDB und Grafana

Anschließend richtete ich die Anwendungen InfluxDB und Grafana ein. InfluxDB dient als Datenbank zur Sicherung der Daten und mit Grafana lassen sich die Daten aus der Datenbank in einer schönen Art und Weise darstellen. In meinem Fall nutzte ich Docker-Compose um die Anwendungen zu betreiben. (hier ein Beispiel, wie mein Compose file ungefähr aussah: docker-compose.yml)
Die Anwendungen können aber auch auf anderem Wege installiert werden. Allerdings sollte beachtet werden, dass ich mit meinem Docker-Compose File direkt eine Datenbank initialisiere und einen Benutzer mit den entsprechenden Berechtigungen anlege. Werden die Anwendungen manuell installiert, muss dementsprechend auch manuell eine Datenbank und ein entsprechender Nutzer angelegt werden.

Datenverarbeitung durch Raspberry Pi

Als nächstes kam der Raspberry Pi zum Einsatz, welcher nun die Daten der Steckdose abfragen und in die Datenbank schreiben sollte. Um das zu erreichen orientierte ich mich an dem Artikel, welchen ich am Ende dieses Artikels verlinkt habe. In diesem wurde ein Python Skript genutzt, welches Anfragen an die Steckdose stellt und die Antwort der Steckdose in die Datenbank schreibt. Da das Skript so ausgelegt war, dass es in eine Graphite Datenbank schreibt, musste ich es für mich etwas anpassen. Außerdem hatte TP-Link seit Erstellung des Skriptes ein paar Änderungen bei der Abfrage der Daten eingebaut (wie hier am Ende des Artikels beschrieben), weshalb ich das Skript dahingehend ebenfalls anpassen musste.

Des Weiteren verweise ich im folgenden Skript noch darauf, dass das folgende Paket mittels „pip“ installiert werden muss, damit das Skript ausgeführt werden kann.

 pip3 install influxdb 

Nachdem ich meine Änderungen eingepflegt hatte sah das ganze dann wie folgt aus:

Mit den Variablen am Anfang des Skriptes werden die Verbindungsdetails zur InfluxDB definiert. Weiter unten in der Funktion „store_metrics“ habe ich dann definiert, wie die Daten in die Datenbank geschrieben werden sollen. Hierbei werden zwei measurements angelegt. „PowerData“ und „PowerUsage“. Measurements sind in etwa zu vergleichen mit Tabellen bei konventionellen Datenbanken. In „PowerData“ werden Werte wie die Spannung, Leistung und Stromstärke gespeichert. Da die HS110 Steckdose auch direkt Auskunft über den Gesamtverbrauch gibt, wird dieser zusätzlich noch in „PowerUsage“ gespeichert.

Wenn sowohl die Datenbank, als auch die Steckdose verfügbar sind, kann das Skript testweise ausgeführt werden. Wenn die Rückmeldung wie folgt aussieht, sollte das schreiben in die Datenbank erfolgreich gewesen sein.

Um das Skript nicht immer manuell laufen zu lassen, richtete ich einen systemd service ein, welcher dafür sorgt, dass das Skript im Hintergrund ausgeführt wird. Anschließend aktivierte ich den service, damit dieser bei jedem Systemstart automatisch ausgeführt wird.

nano /lib/systemd/system/hs110.service
[Unit]
Description=HS110 Service
After=syslog.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/scripts/
ExecStart=/usr/bin/python3 /root/scripts/hs110-data-collect-influxdb.py
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target
sudo systemctl enable hs110.service && sudo systemctl start hs110.service

Mit den bis zu diesem Punkt durchgeführten Schritten erreichte ich, dass die Stromdaten, welche von der Smarten Steckdose abgefragt werden, in eine Datenbank geschrieben werden. Im nächsten Schritt nutzte ich Grafana, um diese Daten abzufragen und darzustellen.

Darstellung

Zur Abfrage der Daten musste ich zunächst eine Verbindung zur Datenbank in Grafana eintragen. Im Bereich „Data Sources“ gab es bereits die Option eine InfluxDB hinzuzufügen. Nachdem ich die Zugangsdaten zu meiner InfluxDB eingetragen hatte und mir der Button „Save & Test“ eine positive Rückmeldung gab, konnte ich damit beginnen mein Dashboard zu erstellen. Die Verbindung zur Datenbank war somit erfolgreich.

Mit den Daten, welche ich aus der Datenbank lesen konnte, konnte ich mir diverse Anzeigen und Graphen anlegen. Bei einigen musste ich das Ergebnis vorher umrechnen, was aber kein großes Problem darstellte.

Da es den Artikel etwas sprengen würde, wenn ich jede einzelne Option in meinem Dashboard erklären würde, habe ich hier mal einen Export meines Dashboards im JSON Format erstellt, welchen jeder bei sich im Grafana einpflegen kann. Es sei zu beachten, dass in der JSON Datei von einer Data Source Namens „Steckdose“ ausgegangen wird und dass die Measurements „PowerData“ und „PowerUsage“ abgefragt werden. Diese Angaben müssen ggf. angepasst werden.

Link zur JSON Datei: https://gist.github.com/bjarneeins/076b874ef1027892d3b0bfa1df633fc5

Hier noch ein Screenshot des Dashboards, welches damit erstellt wird:

Mit dem Dashboard bekomme ich Auskunft über:

  • die aktuelle Leistung in Watt, welche genutzt wird
  • die Stromstärke in Ampere
  • die anliegende Spannung in Volt
  • den Stromverbrauch in Wh, unterteilt in Stunden
  • den Stromverbrauch in kWh, unterteilt in Tage
  • die Stromkosten pro Tag
  • die Stromkosten pro Woche

Bei der Berechnung der Stromkosten gehe ich von einem Preis von 0,35€/kWh aus. Dieser kann natürlich auch höher oder niedriger sein.

Zusatz

Damit die Datenbank nicht stetig wächst, habe ich noch eine „Retention Policy“ eingerichtet, welche die Daten in 24h Paketen nach 4 Wochen löscht. Dazu habe ich die folgenden beiden Kommandos ausgeführt:

influx -username 'admin' -password 'geheim' -execute 'CREATE RETENTION POLICY "four_weeks" ON "dosedata" DURATION 4w REPLICATION 1'
influx -username 'admin' -password 'geheim' -execute 'ALTER RETENTION POLICY "four_weeks" ON "dosedata" SHARD DURATION 1d DEFAULT'

Abschluss

Aktuell ist das Setup nur so ausgelegt, dass die Daten von nur einer Steckdose genutzt werden (was für meinen Anwendungszweck auch vollkommen ausreicht). Der Aufwand um das ganze so einzurichten, dass Daten von mehreren Steckdosen eingelesen werden, sollte aber überschaubar sein.

Ich bin außerdem jederzeit offen für Verbesserungsvorschläge zum. Sei es zum Artikel allgemein oder nur zu einzelnen Skripten. Falls euch etwas auffällt, könnt ihr dies gerne in die Kommentare posten. 🙂

Außerdem werde ich darauf achten, sowohl den Artikel, als auch die Skripte zu ergänzen, wenn ich Änderungen an meinem Setup vornehmen sollte.

Inspiration zu dem Projekt holte ich mir von folgendem Artikel: https://www.beardmonkey.eu/tplink/hs110/2017/11/21/collect-and-store-realtime-data-from-the-tp-link-hs110.html

Außerdem entnam ich Informationen zum abfragen der Verbrauchsdaten der Steckdose aus folgendem Github Repository: https://github.com/softScheck/tplink-smartplug

6 thoughts on “Einfaches Monitoring des Stromverbrauchs über Grafana

  1. Hi , bekomme das nicht zum laufen 🙁
    wenn ich das script *.py starte bekomme ich eine Fehlermeldung in Zeile 15

    Traceback (most recent call last):
    File „hs110-data-collect-influxdb.py“, line 15, in
    from Influxdb import InfluxDBClient

    1. Hey, das ist schade.

      Hast du denn das entsprechende Paket installiert, auf welches im Kommentar (Zeile 14) hingewiesen wurde? (needs to be installed (pip3 install influxdb)) 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

© 2020 oprtr.org | WordPress Theme: Annina Free by CrestaProject.