IT Projekte / Home Lab / Smart Home / Games

Allgemein, Docker, Proxmox, Raspberry Pi

Shelly mit MQTT auslesen und in Grafana auswerten 2023

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.

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
Shelly Plug S auslesen - Mosquitto Konfigruation speichern
Shelly Plug S auslesen – Mosquitto Konfigruation speichern

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.

Shelly Plug S auslesen - MQTT Einstellungen setzen
Shelly Plug S auslesen – MQTT Einstellungen setzen

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:

Shelly Plug S auslesen - InfluxDB einrichten
Shelly Plug S auslesen – InfluxDB einrichten

Fülle die gewünschten Felder aus:

Shelly Plug S auslesen - InfluxDB Logindaten konfigurieren
Shelly Plug S auslesen – InfluxDB Logindaten konfigurieren

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.

Shelly Plug S auslesen - InfluxDB Admintoken sichern und Konfigurtion überspringen
Shelly Plug S auslesen – InfluxDB Admintoken sichern und Konfigurtion ü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.

Shelly Plug S auslesen - InfluxDB API Token für Grafana erstellen
Shelly Plug S auslesen – InfluxDB API Token für Grafana erstellen

Erstelle hier einen Custom Token und gebe Deinem Bucket nur die Read Rechte, zum ausschließlich lesen der Daten.

Shelly Plug S auslesen - InfluxDB Custom API Token für Grafana erstellen
Shelly Plug S auslesen – InfluxDB Custom API Token für Grafana erstellen
Shelly Plug S auslesen - InfluxDB Custom API Token für Grafana erstellen Home Bucket Read Only
Shelly Plug S auslesen – InfluxDB Custom API Token für Grafana erstellen Home Bucket Read Only

Stelle auch hier sicher, dass Du den Token Dir abspeicherst.

Shelly Plug S auslesen - InfluxDB Custom API Token speichern
Shelly Plug S auslesen – InfluxDB Custom API Token speichern

3.2 Telegraf Konfiguration erstellen

Gehe links wieder auf den Pfeil und dann auf Telegraf.

Shelly Plug S auslesen - Telegraf Konfiguration erstellen
Shelly Plug S auslesen – Telegraf Konfiguration erstellen

Hier erstellst Du eine neue Konfiguration mit Create Configuration.

Shelly Plug S auslesen - Telegraf Konfiguration erstellen
Shelly Plug S auslesen – Telegraf Konfiguration erstellen

Wähle den Default Bucket Home-Bucket aus und suche nach MQTT.

Shelly Plug S auslesen - Telegraf Konfiguration, wähle Bucket und MQTT
Shelly Plug S auslesen – Telegraf Konfiguration, wähle Bucket und MQTT

Und bestätigen dies.

Shelly Plug S auslesen - Telegraf Konfiguration, bestätigen
Shelly Plug S auslesen – Telegraf Konfiguration, bestätigen

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.

Shelly Plug S auslesen - Telegraf Konfiguration
Shelly Plug S auslesen – Telegraf Konfiguration

Das Fenster kannst Du mit den Token auch erst einmal ignorieren und schließen.

Shelly Plug S auslesen - Telegraf Konfiguration Token
Shelly Plug S auslesen – Telegraf Konfiguration Token

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.

Shelly Plug S auslesen - Telegraf Konfiguration auswählen
Shelly Plug S auslesen – Telegraf Konfiguration auswählen

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.

Shelly Plug S auslesen - Telegraf Konfiguration Token editieren
Shelly Plug S auslesen – Telegraf Konfiguration Token editieren

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:

Shelly Plug S auslesen - Telegraf Konfiguration
Shelly Plug S auslesen – Telegraf Konfiguration

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.

Shelly Plug S auslesen - Kopiere die Konfiguration
Shelly Plug S auslesen – Kopiere die Konfiguration

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.

Shelly Plug S auslesen - InfluxDB Daten Explorer
Shelly Plug S auslesen – InfluxDB Daten Explorer

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.

Shelly Plug S auslesen - InfluxDB Daten Explorer filtern
Shelly Plug S auslesen – InfluxDB Daten Explorer filtern

Wähle unten rechts noch last aus, bestätige Deine Auswahl mit Submit und bekomme Deinen aktuellen Verbrauch in einem Grafen angezeigt.

Shelly Plug S auslesen - InfluxDB Daten Explorer Filter bestätigen
Shelly Plug S auslesen – InfluxDB Daten Explorer Filter bestätigen

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.

Shelly Plug S auslesen - Grafana Login
Shelly Plug S auslesen – Grafana Login
Shelly Plug S auslesen - Grafana Login Passwort ändern
Shelly Plug S auslesen – Grafana Login Passwort ändern

5.2 InfluxDB mit Grafana verbinden

Gehe links oben auf das Burger Menü, die drei Striche, wähle Connections und dort Data sources aus.

Shelly Plug S auslesen - Grafana Login Datenbank einbinden
Shelly Plug S auslesen – Grafana Datenbank einbinden

Hier klickst Du auf Add data source in der Mitte, um die InfluxDB einzubinden.
Wähle unter denTime series databases die InfluxDB aus.

Shelly Plug S auslesen - Grafana Influx Datenbank einbinden
Shelly Plug S auslesen – Grafana Influx Datenbank einbinden

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.

Shelly Plug S auslesen - Grafana Sprache ändern
Shelly Plug S auslesen – Grafana Sprache ändern

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.

Shelly Plug S auslesen - Grafana InfluxDB URL eintragen
Shelly Plug S auslesen – Grafana InfluxDB URL eintragen

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.

Shelly Plug S auslesen - Grafana Admin Authentifizierung
Shelly Plug S auslesen – Grafana Admin 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.

Shelly Plug S auslesen - Grafana InfluxDB Daten angeben
Shelly Plug S auslesen – Grafana InfluxDB Daten angeben

Prüfe mit einem Klick auf Save & Test, ob die Verbindung zur InfluxDB steht, kommt die Meldung wie hier, dann hat es geklappt.

Shelly Plug S auslesen - Grafana InfluxDB Verbindung testen
Shelly Plug S auslesen – Grafana InfluxDB Verbindung testen

5.3 Daten aus der InfluxDB in Grafana anzeigen

Erstelle ein neues Dashboard in Grafana. Über das Plus oben rechts.

Shelly Plug S auslesen - Grafana neues Dashboard anlegen
Shelly Plug S auslesen – Grafana neues Dashboard anlegen

Füge die erste Virtualisierung hinzu, um in einem Grafen die Werte aus der InfluxDB anzuzeigen.

Shelly Plug S auslesen - Grafana Visualisierung hinzufügen
Shelly Plug S auslesen – Grafana Visualisierung hinzufügen

Wähle die eben angelegte InfluxDB aus.

Shelly Plug S auslesen - Grafana Datenquelle auswählen
Shelly Plug S auslesen – Grafana Datenquelle auswählen

Gehe dann zurück in Deine InfluxDB, selektiere Deinen gewünschten Zeitraum und öffne dann den Skript-Editor.

Shelly Plug S auslesen - InfluxDB öffne den Skript Editor
Shelly Plug S auslesen – InfluxDB öffne den Skript Editor

Hier kopierst Du die angegebenen Zeilen heraus und fügst diese im Anschluss in den Query Editor von Grafana ein.

Shelly Plug S auslesen - InfluxDB kopiere das Skript
Shelly Plug S auslesen – InfluxDB kopiere das Skript
Shelly Plug S auslesen - Grafana füge das Skript ein
Shelly Plug S auslesen – Grafana füge das Skript ein

Das könnte zu Beginn so aus sehen:

Shelly Plug S auslesen - Grafana die Daten aus Deinem Shelly
Shelly Plug S auslesen – Grafana die Daten aus Deinem Shelly

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:

Titelbild von InfluxDB, Shelly, Grafana, MQTT und Mosquitto