MQTT Nachrichten in Datenbank speichern

Einleitung

In diesem Beitrag möchte ich euch zeigen wie ich die Daten meines Smart Meters in eine InfluxDB mittels Node Red speichere.

Import

Ich habe meinen Flow für euch Exportiert da muss man nur die MQTT und Datenbank Serverdaten ändern dann müsste das alles Funktionieren.

Import Flow

Vorraussetzung

Meine verwendete Version ist immer in den Klammern zu finden.

  • Node Red (v2.2.0)
  • InfluxDB (v1.8.10)
  • Mosquito MQTT Broker (v1.5.7)

Datenbank installieren und erstellen

Für die Installation gibt es schon einige Anleitungen daher nur der Verweis auf die Offizielle Dokumentation. (daruf ach)

Um Daten in die Datenbank zu schreiben muss eine Datenbank erstellt werden. Das funktioniert am besten über die Kommandozeile. Einfach den Befehl eingeben dann gelangt man in das Interface von InfluxDB.

influx          #öffnet das Interface
InfluxDB Interface
CREATE DATABASE SmartMeter     # erstellt eine Datenbank mit dem Namen SmartMeter  

Mit dem nächsten Befehl kann man sich alle Datenbanken ansehen und überprüfen ob die neu “SmartMeter” Datenbank erstellt wurde.

show Databases          # zeigt alle Datenbanken an.
Ausgabe der Datenbanknamen

Wenn die Datenbank hier erscheint gibt es keinen Fehler und die Datenbank ist erfolgreich erstellt worden.

Node Red installieren und Einrichten

Auch für die Installation und ersten Schritte gibt es schon genügend Anleitungen daher gehe ich da nicht mehr genauer drauf ein. Wenn vermehrt Fragen zur Installation kommen werde ich mich darum kümmern.

Es wird ein Erweiterung benötigt um von Node Red direkt in eine InfluxDB zu schreiben. Um diese zu Installieren muss man rechts Oben auf das Burgermenu –> Palette verwalten –> Installation. Im Video ist das auch alles ersichtlich.

node-red-contrib-influxdb       #Name der Node für die Installation
Installation der zusätlichen Node für InfluxDB

MQTT Nachrichten empfangen

In Node Red Befindet sich auf der Linken Seite die Verfügbaren Nodes. Unter dem Reiter Netzwerk gibt es zwei MQTT Nodes. Wir benötigen die “mqtt in” – Node. Weiters müssen wird noch mittteilen auf welchen MQTT Broker gehört werden soll. Dafür muss die “mqtt in” – Node in den Arbeitsbereich gezogen werden. Als nächstes einen Doppelklick auf die Node. Dann öffnet sich ein Fenster um Einstellungen vorzunehmen. Beim Server muss die eigene Server Adresse angegeben werden. Mein Raspberry Pi hat eine Fixe IP Adresse darum verwende ich diese aber es kann auch “localhost” angegeben werden. Um nun die Ersten Werte zu erhalten gebe ich das erste Topic an. Mit einer Debug Node gebe ich mir die Werte in der Konsole aus. Rechts Oben unterhalb des Hamburger-Menü-Icon befindet sich ein kleines Käfer-Icon dort werden die Werte der Debug Node ausgegeben.

Einrichten der ersten Node

Die “function” – Node ermöglicht einem alle Funktionen die man in JavaScript programmieren kann. Als Beispiel die Berechnung von mehreren Werten oder eine Einheiten Umrechnung. Es werden Wattstunden ausgegeben aber die übliche Einheit ist kWh daher möchte ich den Wert in kWh in die Datenbank ablegen. Das mache ich mir der “function” – Node.

var Wert = msg.payload;// Wert des Payload einlesen und der Variable Wert zuweisen
msg.payload = Wert/1000; // Den Berechnetet Wert dem Objekt msg zuweisen. 
return msg;
Einheit in kWh geändert

Nun hab ich alle MQTT-Topics eingelesen und in die gewünschte Einheit umgewandelt. Bei den Spannungen und Strömen L1 – L3 habe ich noch eine “function” – Node eingebaut um auf 2 Nachkommerstellen zu runden.

var Wert = msg.payload; // Wert einlesen aus dem Payload
msg.payload = parseFloat(Wert).toFixed(2) //Wert auf 2 Nachkommerstellen runden
return msg;
Alle MQTT Nachrichten einlesen

Um alle Daten gemeinsam in die Datenbank schreiben zu können müssen alle Nachrichten gebündelt auf eine werden. Das mache ich mit einem Objekt. Dafür muss ich jeder Nachricht eine “Überschrift” zuweisen. Das wird mir der “Change” – Node gemacht.

Überschrift für Objekt setzen

Wenn alle Nachrichten eine Vernünftige Überschrift haben. Wandel ich alle Werte noch in eine Zahl um das ich in der Datenbank später rechnen kann. Nicht das irgendein Wert noch ein String ist.

msg.payload = Number(msg.payload)
return msg;

Dann kann man mit einer “join” – Node alle Werte zu einem Objekt zusammenfügen. Um selber zu entscheiden wie das Objekt aussehen soll muss der Modus von Automatisch auf Manuell umgestellt werden. Weiters muss noch die Anzahl der eingehenden Nachrichten eingestellt werden wann ein Objekt erzeugt wird in diesem Fall sind es 12 Nachrichten. Wichtig ist noch den Hacken bei “und bei jeder nachfolgenden Nachricht” zu entfernen.

Objekt erzeugen

Als letztes fehlt nur noch die Daten in die InfluxDB zu schreiben. Dafür die “influxdb out” – Node verwenden. Es muss ein Server angelegt werden mit denn den Daten wie im Video. Die IP Adresse 127.0.0.1 ist die Lokale auf den Raspberry PI, wenn die Datenbank auf einen anderem Gerät läuft dann muss die geändert werden. Es muss noch ein Measurement angegeben werden das kann man sich vorstellen wie die Tabelle in der es abgelegt wird bei mir heißt die Leistungsdaten.

InfluxDB Server anlegen

Wenn das alles geklappt hat werden die Daten automatisch in der InfluxDB abgelegt und gespeichert. Im nächsten Blogbeitrag schreibe ich über die Auswertung mit Grafana.


13 comments

  • Hallo Mike,

    kurze Frage, warum befällst Du die InfluxDB nicht mittels Telegraf? Wäre doch native, oder?

    danke
    ciao
    Andiy

  • Guten Tag,
    da ich wirklich komplett verzweifle an der InfluxDB frage ich Sie um Rat.
    Ich komme dazu, dass Grafana und die DB sich verbinden. Allerdings wird die DB nie beschrieben. Auch .csv Nodes werden quasi ignoriert.
    Beim Debug Node im Node Red bekomme ich die Messages meines MQTT Brokers alle angezeigt. Bei Show Databases bekomme ich auch meine DB angezeigt.
    Leider finde ich keine Möglichkeit die DB initital zu beschreiben. Die Tutorials und die Shell Oberfläche sind ja schon fast nutzerfeindlich.. Ich möchte doch einfach nur meine Field Tags einfügen, um diese dann in Grafana zu selektieren (mir wird nichts angezeigt) und meine Werte graphisch darstellen….

    • wenn du alles wie greenMike gepostet hat umgesetzt hast liegt der Fehler in der Datenbank. greenMike hat die Datenbank nicht SmartMeter in NodeRed genannt sondern Hauptstromzähler

      ” “id”: “9d9ad3f4.49ce7”,
      “type”: “influxdb”,
      “hostname”: “192.168.1.99”,
      “port”: “8086”,
      “protocol”: “http”,
      “database”: “Hauptstromzaehler”,
      “name”: “”,
      “usetls”: false,
      “tls”: “”,
      “influxdbVersion”: “1.x”,
      “url”: “”,
      “rejectUnauthorized”: false”

      das könnte bei dir der Fehler sein.

  • Das Node-Red Programm läuft das im Webbrowser und muss es dafür geöffnet sein? Wie macht man das, dass das NodeJS Programm dauerhaft läuft, ohne dass man ein Programm geöffnet haben muss?

    • Hallo,
      Node Red ist auf dem Raspberry Pi installiert und der läuft bei mir immer, wie ein Homeserver. Die Weboberfläche dient rein zum Programmieren von einem anderen PC.
      Die Flows oder auch (Programmteile) laufen immer.

      LG Michael

    • Node RED als Service aktivieren, ich glaube das ist im how to set up Node RED on PI Manual drin.
      Startet sich danach automatisch sobald der Raspberry bestromt wird.

  • Toller informativer Beitrag, danke! Kanns kaum erwarten den Grafana Eintrag zu lesen. Dann kann ich mir auch endlich eine funktionierende Ausgabe basteln (oder zur Not abschreiben).

Schreibe einen Kommentar zu greenMike Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert