Wie lese ich meinen Shelly Stromverbrauch aus und lasse Ihn mir in Grafana anzeigen? Speichere Deine Daten mittels Mosquitto über Telegraf in einer InfluxDB v2 und zeige Deine Daten in Grafana an. Und das allles mit Docker als Basis.
Inhaltsverzeichnis
Du benötigst Folgendes:
- Linux Distribution
- Docker installiert
- Docker Compose installiert (optional)
Docker mittels Repository unter Debian installieren
Docker auf dem Raspberry Pi 4 installieren
Docker Compose installieren – Debian 11 oder Raspberry Pi 4
Debian 11 VM in Proxmox erstellen und installieren
RaspiOS 64-Bit auf dem Raspberry Pi 4 installieren
1. Installiere Eclipse Mosquitto im Docker Container
Mittels Eclipse Mosquitto installierst Du einen Server auf Deinem Raspberry Pi als Docker Container, welcher die MQTT Kommunikation verstehen kann. An diesen Server wird der Shelly später mittels MQTT seine Daten senden.
Damit Deine Daten auch persistent gesichert sind, musst Du zunächst drei Ordner auf Deinem Raspberry Pi anlegen.
mkdir mosquitto
mkdir mosquitto/config
mkdir mosquitto/data
mkdir mosquitto/log
Lege im mosquitto/config Ordner eine neue Datei als Konfigurationsdatei an.
nano mosquitto/config/mosquitto.conf
In dieser Datei gibst Du an, dass die Daten persistent sind und im Ordner /mosquitto/data gespeichert werden sollen. Ebenfalls wird für die Logs ein eigener Ordner und darin eine eigene Datei definiert. Des Weiteren soll er auf dem Port 1883 hören und auch Daten von anonymen Geräten empfangen.
allow_anonymous true
listener 1883
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
Speicher und schließe dann die Datei mit Strg + S und Strg + X.
Jetzt kannst Du auch schon den Docker Container mit Eclipse Mosquitto starten.
docker run -it -p 1883:1883 -p 9001:9001 -v $PWD/mosquitto.conf:/mosquitto/config/mosquitto.conf -v $PWD/mosquitto/data -v $PWD/mosquitto/log eclipse-mosquitto
Alternativ kann das Ganze auch in einer docker-compose Datei ausgeführt werden.
services:
eclipse-mosquitto:
container_name: eclipse-mosquitto
image: eclipse-mosquitto:latest
ports:
- "1883:1883"
- "9001:9001"
volumes:
- '/mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf'
- '/mosquitto/data:/mosquitto/data'
- '/mosquitto/log:/mosquitto/data'
restart: unless-stopped
Achtung! Achte darauf auch den richtigen Pfad für Deine Ordner anzugeben. Und der Port 1883 darf nicht geändert werden, da über diesen die Kommunikation stattfinden wird.
2. Shelly Plug S für MQTT einrichten
Wenn Dein Shelly Plug S oder anderes IoT Gerät schon in Deinem WLAN sich befindet und eine IP-Adresse hat, dann solltest Du diese IP-Adresse aufrufen und das Dashboard von dem Gerät einsehen können.
Bist Du mit dem Shelly Plug S verbunden, kannst Du unter Internet & Security unter dem Punkt ADVANCED – DEVELOPER SETTINGS MQTT aktivieren.
Achtung! Dabei wird die Verbindung zur Cloud von Shelly deaktiviert!
Hier trägst Du unter Server die IP-Adresse und den Port Deines Mosquitto Servers ein. Unter dem Punkt ‘Use custom MQTT prefix’ oder ‘Will Topic’ wird der Name Deines Shelly Plug S angegeben. Das einmal speichern und der Shelly Plug S rebootet kurz.
Jetzt sollte der Shelly Plug S mit dem Mosquitto Server kommunizieren.
3. Installiere die InfluxDB v2 im Docker Container
Die InfluxDB ist eine Timeseries Datenbank, weshalb sie sich bestens für dieses Projekt eignet. In ihr können schnell und einfach Daten gespeichert werden.
Lege einen neuen Ordner an:
mkdir influxdb2
mkdir influxdb2/data
mkdir influxdb2/config
Wieder als einfachen Einzeiler kannst Du die InfluxDB v2 wie folgt starten:
docker run -d -p 8086:8086 --name influxdb2 -v $PWD/influxdb2/data:/var/lib/influxdb2 -v $PWD/influxdb2/config:/etc/influxdb2 influxdb:latest
Das ganze kann aber auch wieder in einer Docker Compose Datei so aussehen:
services:
influxdb2:
container_name: influxdb2
image: influxdb:latest
ports:
- "8086:8086"
volumes:
- '/influxdb2/data:/var/lib/influxdb2'
- '/influxdb2/config:/etc/influxdb2'
restart: unless-stopped
3.1 InfluxDB einrichten
Jetzt, wo auch die Datenbank steht, verbinde Dich mittels IP-Adresse und Port mit der InfluxDB. Hier solltest Du mit folgendem Screen begrüßt werden:
Fülle die gewünschten Felder aus:
Kopiere den Token und speichere diesen gut, da dies Dein Admin Token ist. Da die Daten von extern per MQTT in die Datenbank geschrieben und wir die Daten in Grafana anzeigen werden. Können wir die Konfiguration zunächst überspringen.
Für Grafana müssen wir nun jedoch auch noch einen Token generieren lassen, welcher die Daten ausschließlich aus unserem Bucket lesen kann.
Dafür gehe zu Load Data und wähle dort die API Tokens aus.
Erstelle hier einen Custom Token und gebe Deinem Bucket nur die Read Rechte, zum ausschließlich lesen der Daten.
Stelle auch hier sicher, dass Du den Token Dir abspeicherst.
3.2 Telegraf Konfiguration erstellen
Gehe links wieder auf den Pfeil und dann auf Telegraf.
Hier erstellst Du eine neue Konfiguration mit Create Configuration.
Wähle den Default Bucket Home-Bucket aus und suche nach MQTT.
Und bestätigen dies.
Jetzt wurde eine Defaultkonfiguration generiert, welcher Du einen aussagekräftigen Namen und Beschreibung geben kannst. Hast Du das getan, speicher sie zunächst einmal ab.
Das Fenster kannst Du mit den Token auch erst einmal ignorieren und schließen.
Wenn Du jetzt nochmal auf den Namen der Telegraf Konfiguration klickst, öffnet sich die gesamte Konfiguration, soweit auch schon fertig konfiguriert. Was wir nun machen müssen, ist unter anderem den MQTT Teil anzupassen an den Shelly Plug S.
In meinem Fall steht der Influx-Token in Zeile 86, hier wird aktuell die Variable verwendet, ich persönlich trage aber lieber den Admintoken ein, welcher zu Beginn der Einrichtung von der InfluxDB generiert wurde.
Im weiteren Schritt passe ich den Server, auf meine IP-Adresse auf dem der Mosquitto liegt an. Ebenfalls ersetze ich die topics durch ein Topic, welches die aktuelle Wattanzahl aus meinem Shelly ausliest. Zum Ende hingebe ich noch das Dateiformat value und den Dateityp float an. Da ich in meinem Falle nur eine Zahl auslesen möchte, welche Nachkommastellen mit aufweist. Wie und wo Du Dein Topic herbekommst, kannst Du ganz einfach mittels des MQTT Explorers herausfinden. Diesen einfach herunterladen, einmal ausführen, mit Deinem Mosquitto verbinden und Dein Gerät heraussuchen. Um welchen Shelly es sich genau handelt, findest Du über das Will Topic im Shelly selbst heraus.
Das ganze sieht dann so aus bei mir:
Alle weiteren Angaben, welche Du in der Konfiguration findest, können so bleiben. Lade Dir die Konfiguration herunter, speicher und schließe den Editor.
4. Installiere Telegraf mittels Docker Container
Installiere Telegraf auf Deinem Raspberry Pi, um mittels Telegraf die Daten aus Mosquitto auszulesen und diese dann in die InfluxDB zu speichern. Hierfür nutzen wir die Konfigurationsdatei, welche wir so eben erstellt haben.
Erstelle einen Ordner, in dem die Telegraf Konfigurationsdatei angelegt werden kann.
mkdir telegrafconfigfiles
Verbinde Dich nun mit WinSCP oder einem anderen SCP Tool mit Deinem Server und speichere die Konfigurationsdatei, welche Du so eben erstellt und heruntergeladen hast, in diesem Ordner ab.
Jetzt kannst Du den Telegraf auch schon starten, nur musst Du ihm dabei über das Volumen die Konfigurationsdatei mit angeben und das wie folgt:
docker run -v /<Dein Pfad und Dateiname>:/etc/telegraf/telegraf.conf:ro telegraf
Hier solltest Du jetzt die ersten Ausgaben vom Telegraf bekommen und kannst prüfen, ob es auch funktioniert. Das ganze kannst Du Dir dann auch in der InfluxDB anzeigen lassen über den Data Explorer.
Wenn das alles klappt, kann der Telegraf auch in einer Docker Compose Datei eingebaut werden.
services:
telegraf:
image: telegraf
container_name: telegraf
restart: unless-stopped
volumes:
- /<Dein Pfad und Dateiname>:/etc/telegraf/telegraf.conf:ro
4.1 Daten in der InfluxDB anzeigen
Wenn Du Dich zurück auf der InfluxDB anmeldest, kannst Du links über den Grafen auf den Daten Explorer zugreifen.
Dort wählst Du Deinen Bucket aus, gehst in dem nächsten Filter auf topic, wählst Dein Gerät aus und filterst im Nächsten nach _field und selektierst value.
Wähle unten rechts noch last aus, bestätige Deine Auswahl mit Submit und bekomme Deinen aktuellen Verbrauch in einem Grafen angezeigt.
Hier nach solltest Du im Grafen die ersten Werte sehen können. Du kannst hier auch noch die gewünschte Zeitspanne mit angeben.
5. Installiere Grafana im Docker Container
Grafana wird als Dashboard werden, in dem die Daten aus der InfluxDB angezeigt werden sollen. Und das wird wie folgt installiert:
Lege in diesem Fall ein Docker Volumen an:
docker volume create grafana
docker run -d -p 3000:3000 --name=grafana --volume grafana:/var/lib/grafana grafana/grafana
Oder auch wieder als Docker-Compose Datei dabei wird das Volumen vom Stack selber angelegt:
services:
grafana:
image: grafana/grafana-enterprise
container_name: grafana
restart: unless-stopped
ports:
- '3000:3000'
volumes:
- grafana-storage:/var/lib/grafana
volumes:
grafana-storage: {}
5.1 Grafana Administrator anlegen
Beim ersten Login lautet der Nutzername admin und auch das Passwort admin. Danach wirst Du dazu aufgefordert, ein anderes Passwort zu nutzen.
5.2 InfluxDB mit Grafana verbinden
Gehe links oben auf das Burger Menü, die drei Striche, wähle Connections und dort Data sources aus.
Hier klickst Du auf Add data source in der Mitte, um die InfluxDB einzubinden.
Wähle unter denTime series databases die InfluxDB aus.
Du kannst der Datenbank hier auch nochmal einen eigenen Namen geben und bitte dran denken unter der Query language von InfluxQL zu Flux zu wechseln, da wir ja die InfluxDB 2.x nutzen.
Unter dem Punkt HTTP trägst Du die URL Deiner InfluxDB ein, mit entsprechendem Port und URL. Die beiden anderen Felder können frei bleiben.
Bei Auth ist bereits die Basic Auth ausgewählt, weshalb Du hier unter den Basic Auth Details zum Beispiel Deine Grafana Admin Credentials angeben musst, für die Authentifizierung.
Den Custom HTTP Headers Teil kannst Du überspringen, jedoch musst Du nun unter dem Punkt InfluxDB Details Deine Organzisation, Deinen Token und Dein Default Bucket angeben.
Deine Organisation ist Deine Initial Organization Name, Dein Token ist der von Dir generierte Token für Grafana aus der InfluxDB und Dein Default Bucket ist der Initial Bucket Name.
Prüfe mit einem Klick auf Save & Test, ob die Verbindung zur InfluxDB steht, kommt die Meldung wie hier, dann hat es geklappt.
5.3 Daten aus der InfluxDB in Grafana anzeigen
Erstelle ein neues Dashboard in Grafana. Über das Plus oben rechts.
Füge die erste Virtualisierung hinzu, um in einem Grafen die Werte aus der InfluxDB anzuzeigen.
Wähle die eben angelegte InfluxDB aus.
Gehe dann zurück in Deine InfluxDB, selektiere Deinen gewünschten Zeitraum und öffne dann den Skript-Editor.
Hier kopierst Du die angegebenen Zeilen heraus und fügst diese im Anschluss in den Query Editor von Grafana ein.
Das könnte zu Beginn so aus sehen:
Und schon kannst Du Deinen Daten von Deinem Shelly in einem Grafana Dashboard anzeigen lassen.
Vielen Dank auch hier an Dennis Schröder und Thorsten Kukuk
Quellen:
- https://www.thkukuk.de/blog/mqtt-broker/ (24.11.2023 21:34)
- https://schroederdennis.de/tutorial-howto/shelly-tasmota-mqtt-node-red-influxdb-ins-grafana-dashboard-anleitung/ (24.11.2023 21:34)
- https://hub.docker.com/_/eclipse-mosquitto (24.11.2023 20:41)
- https://nodered.org/docs/getting-started/docker (24.11.2023 21:13)
- https://hub.docker.com/_/influxdb (24.11.2023 21:58)
- https://hub.docker.com/r/grafana/grafana (24.11.2023 22:20)
- https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/ (24.11.2023 22:20)
- https://shelly-api-docs.shelly.cloud/gen1/#shelly-plug-plugs-mqtt (24.11.2023 23:09)
- https://hub.docker.com/_/telegraf (30.11.2023 17:23)
- https://www.influxdata.com/blog/running-influxdb-2-0-and-telegraf-using-docker/ (02.12.2023 00:09)
Titelbild von InfluxDB, Shelly, Grafana, MQTT und Mosquitto