X

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren

Geschrieben amgeschrieben von Stefan, zuletzt aktualisiert am RSS Feed
In dieser Anleitung zeigen wir euch, wie ihr beliebige Daten aus einem MQTT-Stream mit Node-RED in eine InfluxDB2 schreibt und diese anschließend in Grafana visualisieren könnt. Die Anleitung ist für fortgeschrittene Benutzer gedacht, da wir hier aufgrund der Menge an Informationen nicht auf alle Einzelheiten eingehen können.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Viele Smarthome Geräte wie z.B. die Shelly-Produkte können ihre Daten per MQTT mitteilen oder nehmen über MQTT Befehle entgegen. Wir kümmern uns hier um die Sammlung und Speicherung von Daten, die via MQTT an unseren MQTT-Broker (Server) gesendet werden.

Exemplarisch benutzen wir hier wieder einen Raspberry Pi 4 B *, ihr könnt aber auch einen älteren Raspberry Pi 3 B+ * oder ein anderes System benutzen, so lange dieses über ein 64 bit Betriebssystem verfügt. Die hier verwendete InfluxDB2 benötigt zwingend ein 64 bit Betriebssystem und läuft damit nicht auf älteren Raspberry Pi.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Das Betriebssystem (Raspberry Pi OS 64 bit) haben wir mit dem Raspberry Pi Imager auf einer SD-Karte installiert. Das Betriebssystem basiert aktuell auf Debian 11.7 "Bullseye".

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Wir lesen hier Daten von Shelly Produkten und evcc aus, die Anleitung könnt ihr aber auch auf andere Produkte anwenden, im Prinzip ist das Verfahren immer identisch: Daten aus MQTT auslesen, Daten aufbereiten, Daten filtern und anschließend die Daten in eine InfluxDB2 schreiben.

Die InfluxDB2 ist eine Datenbank, die für das Speichern und schnelle Abrufen von zeitbasierten Daten konzipiert wurde. Die Abfragen unterscheiden sich teilweise sehr deutlich von normalen SQL-Abfragen, so dass wir euch in diesem Artikel auch zeigen wollen wie ihr relativ einfach mit dem Influx Query Builder Abfragen erstellen könnt.


Benutzte Software


  • MQTT Broker (Server), wir verwenden hier Mosquitto

  • MQTT-Explorer (optional, zur einfachen Identifizierung der MQTT-Daten)

  • Node-RED (Datenaufbereitung)

  • InfluxDB2 (Datenbank zur Speicherung der aufbereiteten Daten)

  • Grafana (für die Visualisierung)



Bevor wir mit der Datenverarbeitung richtig loslegen können, installieren wir zunächst einmal die Software die wir später benötigen. Optional ist der MQTT-Explorer, der eine einfache Oberfläche zu eurem MQTT-Broker bietet. Hier könnt ihr nicht nur kontrollieren, ob eure Geräte ihre Daten korrekt an den MQTT-Broker senden.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Der MQTT-Explorer ist bei der ersten Sichtung der Daten und der MQTT-Speicherorte sehr hilfreich, so dass ich euch die Installation des MQTT-Explorers auf eurem Client (z.B. Windows 11) empfehle.



Mosquitto MQTT-Broker / Server installieren


In der Befehlszeile / Terminal oder via SSH installieren wir zunächst den MQTT-Broker:
sudo apt install mosquitto mosquitto-clients


Anschließend erlauben wir dem Server, Verbindungen von externen Geräten entgegenzunehmen:
sudo nano /etc/mosquitto/mosquitto.conf


Hier geben wir folgende beiden Zeilen ein:
listener 1883 0.0.0.0
allow_anonymous true


Die Datei wird mit Strg+O gespeichert und mit Strg+X beenden wir anschließend den Texteditor.

Nun richten wir den MQTT-Broker noch als Systemdienst ein, damit sich dieser nach einem Neustart des Raspberry Pi automatisch startet. Anschließend wird der Serverdienst gestartet:
sudo systemctl enable mosquitto
sudo systemctl start mosquitto


Über den folgenden Befehl könnt ihr auf Wunsch kontrollieren, ob der MQTT-Server auf dem Port 1883 läuft:
sudo netstat -tunlp




Node-RED installieren


Nachdem unser MQTT-Server läuft und Daten von anderen Geräten empfängt, benötigen wir nun eine Software um die MQTT-Daten aufzubereiten und abzuspeichern. Dafür verwenden wir Node-RED. Bevor wir die Software installieren können, müssen wir die Abhängigkeiten installieren:
sudo apt install build-essential git curl


Anschließend können wir nun Node-RED installieren:
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)


Während der Installation werdet ihr auf einem Raspberry Pi gefragt, ob ihr die Pi-specific nodes installieren möchtet. Damit kann Node-RED unter anderen die GPIO Pins ansprechen, z.B. um eine LED bei bestimmten Aktionen anzusprechen. Wir verwenden in dieser Anleitung keine Raspberry Pi spezifischen Funktionen, die Auswahl liegt also bei euch.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Nach der Installation könnt ihr die Grundeinstellungen direkt vornehmen. Erstellt euch hier euren Benutzer, alle anderen Einstellungen belasst ihr zunächst auf dem Standard, mit Ausnahme von "Provide a passphrase to encrypt your credentials file", hier legt ihr eine Zeichenfolge zum verschlüsseln fest.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Anschließend richten wir Node-RED als Systemdienst ein, damit es nach einem Boot automatisch gestartet wird:
sudo systemctl enable nodered.service


Um Node-RED nun zum ersten Mal zu starten, gebt ihr folgendes ein:
node-red-start


Node-RED wird per Weboberfläche bedient und ist über die IP-Adresse eures Systems auf dem Port 1880 erreichbar.



InfluxDB2 installieren


Um die InfluxDB2 zu installieren geben wir folgenden Befehl ein:
sudo curl https://repos.influxdata.com/influxdata-archive.key | gpg --dearmor | sudo tee /usr/share/keyrings/influxdb-archive-keyring.gpg >/dev/null


sudo echo "deb [signed-by=/usr/share/keyrings/influxdb-archive-keyring.gpg] https://repos.influxdata.com/debian $(lsb_release -cs) stable main" | sudo tee /etc/apt/sources.list.d/influxdb.list


Nun aktualisieren wir den Paketmanager apt, welcher nun auch die InfluxDB Quellen umfasst:
sudo apt-get update


Anschließend installieren wir nun die InfluxDB:
sudo apt-get install influxdb2


Damit ist die Datenbank auch bereits installiert und als Systemdienst eingerichtet. D.h. die Datenbank startet sich automatisch auch nach einem Neustart des Systems. Die Weboberfläche der InfluxDB ist nun über den Browser mit der IP-Adresse http://localhost:8086 erreichbar, wobei ihr "localhost" durch die IP-Adresse eures Raspberry Pis ersetzen müsst.


Über die Weboberfläche erstellen wir uns zunächst ein Benutzerkonto. Wichtig ist hier das Access Token, welches für euren Benutzer generiert wird. Dieses müsst ihr euch notieren, denn wir benötigen das Token um uns aus anderen Quellen mit der Datenbank zu verbinden.

Bei der Erstellung legt ihr auch die Tabelle in der Datenbank fest, in der eure Daten gespeichert werden sollen. In InfluxDB nennt sich die Tabelle "Bucket". Ich habe hier evcc_log gewählt. Andere Buckets lassen sich später über die Weboberfläche der InfluxDB mit einem Klick erstellen, so dass diese Einstellung hier erstmal nicht wichtig ist.



Grafana installieren


Um unsere Daten später zu visualisieren, nutzen wir Grafana. Grafana unterstützt nativ die von uns genutzte InfluxDB2. Die Installation von Grafana auf dem Raspberry Pi wird in der hauseigenen Dokumentation beschrieben und ähnelt im Vorgehen der Installation der InfluxDB.

Als erstes wird wieder das Repository der Software in unseren Paketmanager apt integriert:
sudo wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -


sudo echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list


Aktualisierung des lokalen Repositorys:
sudo apt-get update


... und Installation von Grafana:
sudo apt-get install -y grafana


Da sich Grafana im Gegensatz zur InfluxDB nicht selbst als Systemdienst registriert, müssen wir dies manuell erledigen:
sudo /bin/systemctl enable grafana-server


Gestartet wird Grafana dann über:
sudo /bin/systemctl start grafana-server


Die Weboberfläche von Grafana ist über http://localhost:3000 erreichbar, "localhost" muss wieder durch die IP-Adresse eures Raspberry Pis ersetzt werden. Hinweis: der erste Start des Grafana Servers kann bis zu 5 Minuten dauern. Die Weboberfläche ist anfangs ggf. nicht zu erreichen. Einfach etwas warten, dann sollte es gehen.

Für die erste Anmeldung nutzt ihr den Benutzer admin mit dem Passwort admin. Anschließend werdet ihr aufgefordert ein neues Passwort für den admin Benutzer festzulegen.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Damit wir aus Grafana auf unsere Daten, die in der InfluxDB liegen, zugreifen können, müssen wir zunächst eine Verbindung zur InfluxDB anlegen. Diese können wir über das seitliche Menü und dann Connections und Add new connection anlegen. Im Suchfeld könnt ihr bequem nach der Schnittstelle zur InfluxDB suchen.


Hier ändern wir als erstes die Query Language auf Flux und dann geben wir die Verbindungsdaten des InfluxDB-Servers ein. Hier benötigt ihr zudem wieder euer InfluxDB Token.



Der erste Flow in Node-RED


Nachdem auf unserem System alle Softwarepakete installiert sind und laufen, können wir nun endlich unseren ersten Node-RED Flow zur Datenverarbeitung erstellen. Dazu meldet ihr euch in der Node-RED Weboberfläche mit dem während der Installation festgelegten Benutzernamen an.

Hinweis: Ab diesem Punkt gehen wir, wie eingangs erwähnt, nicht mehr auf jedes Detail ein, da dies den Rahmen dieser Anleitung sprengen würde.

Node-RED besitzt nativ die Möglichkeit via MQTT Daten zu lesen und zu schreiben. Die Verbindung zur InfluxDB2 muss aber durch die Installation eines Plugins zunächst ermöglicht werden. Im rechten Menü wählt ihr den Punkt Palette verwalten aus. Klickt dann auf den Reiter Installation und sucht nach dem Plugin node-red-contrib-influxdb. Dieses könnt ihr dann mit einen einfachen Klick installieren.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren

An dieser Stelle müsst ihr sicherstellen das ihr bei dem von euch genutzten Geräten die MQTT-Funktion aktiviert habt und euer Server hinterlegt ist. Bei einem Shelly Pro 3EM * sieht das z.B. so aus:

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Um unsere erste MQTT-Verbindung in einem Flow zu erstellen, wählen wir auf der linken Seite nun das Element mqtt in aus. Bei der erstmaligen Verwendung des mqtt Elements müssen wir die Verbindungsdaten zu unserem MQTT Server eingeben.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Als nächstes muss dann die MQTT-Quelle im Feld Topic eingegeben werden.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Um herauszufinden welchen Pfad man hier eingeben muss, kann der von uns eingangs erwähnte MQTT Explorer genutzt werden. Hier sieht man alle MQTT-Quellen und muss dann gucken wo die gewünschten Werte angezeigt werden. Hat man die Daten gefunden wählt man diese links aus und der benötigte Pfad wird dann oben rechts angezeigt.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Um zu überprüfen ob Node-RED eine Verbindung zu unserem MQTT-Broker aufbauen kann, klicken wir oben in der Menüleiste auf Übernahme (deploy). Unterhalb des Elements sollte nun ein grünes Kästchen mit dem Hinweis "Verbunden" erscheinen.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Steht die Verbindung zum MQTT-Broker, können wir mit Hilfe des debug Elements überprüfen, ob die Daten unseres Shelly Smartmeters via MQTT in Node-RED landen. Dafür fügen wir ein debug Element ein und verbinden dieses mit unserem MQTT-Element. Unsere Änderung übernehmen wir wieder mit Übernahme (deploy). Im rechten Bereich können wir uns nun das Debug-Fenster einblenden, welches alle Debug-Nachrichten anzeigt.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Funktioniert auch das, müssen wir nun entschieden, welche Daten wir später in unsere InfluxDB2 speichern möchten. Um ungewollte Daten herauszufiltern, nutzen wir das Element change und platzieren es zwischen dem MQTT und dem debug element in unserem Flow.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
In unserem Beispiel wollen wir die beiden Daten "id" und "n_current" aus dem Datensatz den wir via MQTT erhalten, löschen da diese für uns später nicht interessant sind und nur unnötigen Speicherplatz in unserer Datenbank belegen würden. Nach der Übernahme (deploy) erhalten wir nun in der Debug-Ausgabe den um die beiden Datensätze gefilterten Daten.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Um die Datenmenge in unserer Datenbank noch weiter zu Reduzieren, macht unter Umständen das filter Element Sinn. Dieses kann den Flow in sofern blockieren, dass dieser nur bei einer Werteveränderung weiter ausgeführt wird.

Als Beispiel sei hier z.B. ein Smartmeter einer PV-Anlage genannt, welches uns via MQTT die Erzeugungsleistung der PV-Anlage in Watt übergibt. Da Nachts eine PV-Anlage bekannterweise keine Energie erzeugt, müssen wir die Erzeugungsleistung in der Nacht nicht in die Datenbank schreiben. Dies wäre über das filter Element realisierbar.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Um nun unsere gefilterten Daten in die InfluxDB2 zu schreiben, verwenden wir das influxdb out Element. Wie beim MQTT Element auch, müssen wir bei der erstmaligen Verwendung zunächst die Verbindung zu unserer InfluxDB einstellen. Achtet hier darauf, dass die Version auf 2.0 steht, da sich die Syntax zur älteren InfluxDB 1.x deutlich unterscheidet.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Ihr müsst zudem eure Bucket (also eine Datenbanktabelle, die ihr zuvor in der InfluxDB angelegt habt) sowie den Namen des Messwertes (Ebene unterhalb des Buckets) eingeben. Dies bestimmt wo eure Daten in der InfluxDB abgelegt werden.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Hinweis: Ihr könnt auf Wunsch im Flow das debug Element belassen und zusätzlich das Datenbank Element verbinden.



Datenprüfung und Erstellung von Abfragen in der InfluxDB2


In der Weboberfläche der InfluxDB könnt ihr prüfen, ob eure Daten korrekt in der jeweiligen Bucket abgelegt werden. Dazu navigiert ihr über das seitliche Menü auf das Icon mit dem nach Oben gerichteten Pfeil der für Load Data steht. Hier wählt ihr über Buckets eure Bucket aus.

Ihr seht nun den Data Explorer. Hier könnt ihr nun eure Buckets durchgehen und prüfen ob eure Daten korrekt durch Node-RED abgelegt werden. Auch erste Abfragen lassen sich über den Query Builder einfach erstellen.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren
Ihr könnt in der Ansicht jederzeit zwischen dem Query Builder und dem Script Editor wechseln. Im Script Editor seht ihr die über den Query Builder erstellte Datenbankabfrage, was gerade für Anfänger sehr hilfreich ist. Nachdem ihr euch eine Abfrage erstellt habt, könnt ihr diese so sehr einfach in die Grafana Oberfläche kopieren.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren



InfluxDB Daten in Grafana visualisieren


Die Verbindung zwischen Grafana und unserer InfluxDB2 hatten wir ja bereits während der Softwareinstallation erledigt. Um auf einen Datensatz zuzugreifen, erstellen wir uns einen einfachen Chart in Grafana.


Als Datenquelle nutzen wir die InfluxDB, die Query können wir uns über die InfluxDB Oberfläche und dem Query Builder einfach zusammenstellen. Anschließend speichern wir das Dashboard, damit unsere Abfrage nicht verloren geht.

Als Beispiel hier mein Dashboard zur Überwachung und Auswertung meiner PV-Anlage, die über Shelly Geräte gemessen wird. Das alles läuft wie in dieser Anleitung beschrieben über MQTT, Node-RED und landet am Ende in der InfluxDB2.

MQTT Daten mit Node-RED in InfluxDB2 speichern und in Grafana visualisieren

Bei Links, die mit einem * gekennzeichnet sind, handelt es sich um Affiliate-Links, bei denen wir bei einem Kauf eine Vergütung durch den Anbieter erhalten.
VG-Wort

Kommentare (4)

Kommentar
Christian
Geschrieben am29.01.2024
Genialer Artikel - ich habe die Visualisierung meiner Stromzähler-Daten erfolgreich einrichten können.
Das gerade "kopierte" Wissen will ich jetzt "verstehen" - und für andere Daten umsetzen.
Herzlichen Dank von einem Umsteiger auf Node-RED und Neueinsteiger in InfluxDB bzw. Grafana.
Kommentar
Stefan (Team)
Geschrieben am24.10.2023
@Wolfgang: hast Du mal mit dem MQTT-Explorer geschaut wie die Syntax auf dem MQTT Server ist ? Eigentlich sollte das so aussehen wie bei mir. Haben das jetzt auch in einem anderen Haushalt aufgebaut, dort ist es genauso.
Kommentar
Wolfgang
Geschrieben am15.10.2023
Hallo Stefan,
zunächst einmal herzlichen Dank für den Umfassenden Artikel.
Ich hab bei mir just eine vergleichbare Konfiguration: Shellies, PV, Node-Red, influxDB und Grafana und ich kriege auch Werte von den Shellies und der PV bis zu Grafana. Aber, hab jetzt mal den vorgestellten Weg ausprobiert (MQTT in - Filter influx out). Wenn ich jetzt aber den 3EM auslesen möchte (z.B. shellies/xyz/emeter/#) dann kommen bei mir die Werte (obwohl die Ausgabe auf analysiertes parsed JSON Objekt gestellt oder auf Auto) leider einzeln an (also z.B. Topic .../current und als Payload dann ein Value)
=> in influxDB kommen zwar Werte an, aber zu unterschiedlichen Topics und diese unterscheidet die influxDB natürlich nicht.

Desweiteren würde ich der influxDB gerne auch Tags übergeben. Ich messe ja an verschiedensten Stellen so Sachen wie Leistung oder Energie. Da halte ich es für sinnvoll in der Influx nicht jeweils ein Bucket zu erstellen, sondern ein Bucket für die Leistung und dann z.B. ein Tag für den Messort.
Gibts dazu eine einfache Lösung?
Beste Grüße
Kommentar
Pepe
Geschrieben am28.09.2023
Hi und Danke für dein Tutorial, das hat bei mir wunderbar zum Auslesen eines gasGuard mit den Services auf einer Synology Diskstation geklappt!
Viele Grüße!

Diesen Artikel kommentieren:

Hinweis:

  • Nur Fragen / Antworten direkt zum Artikel
  • Kein Support für andere Hard- oder Software !


   
   
Ergebnis der Rechenaufgabe   Bild neu laden

   
optional
  Wenn Du eine E-Mail-Adresse angibst, informieren wir dich, sobald es hier etwas Neues gibt.
   
 
E-Mail Abo
E-Mail Benachrichtigung bei neuen Artikeln
RSS Feed
Abonniert unseren RSS-Feed
benötigt einen RSS-Reader