Raspberry Pi

IOTstack auf dem Raspberry Pi: Node-RED, InfluxDB und Grafana mit einem Cloud-MQTT-Broker

Betreiben Sie mit IOTstack Node-RED, InfluxDB und Grafana in Docker auf einem Raspberry Pi, verzichten Sie auf den lokalen Mosquitto-Container und verbinden Sie Node-RED stattdessen mit einem externen Cloud-MQTT-Broker.

Docker-Container für Node-RED, InfluxDB und Grafana auf einem IOTstack Raspberry Pi, verbunden mit einem Cloud-MQTT-Broker
Probieren Sie es auf Ihrem eigenen MQTT-Broker ausHolen Sie sich im Free-Tarif einen privaten, verwalteten MQTT-Broker und starten Sie mit fertigen Codebeispielen.
Kostenlos testen Codebeispiele Keine Kreditkarte erforderlich

Ein IOTstack-Setup auf dem Raspberry Pi liefert Ihnen Node-RED, InfluxDB und Grafana als Docker-Container, die Sie mit wenigen Befehlen neu aufbauen, aktualisieren und sichern können. In diesem Tutorial installieren Sie IOTstack, wählen die benötigten Container aus, verbinden Node-RED mit einem externen MQTT-Broker statt mit einem lokalen Mosquitto-Container, speichern Messwerte in InfluxDB und stellen sie in Grafana dar. Am Ende haben Sie einen reproduzierbaren Stack und eine klare Vorstellung davon, was auf den Pi gehört und was nicht.

Was IOTstack ist und warum es hilft

IOTstack ist ein Community-Projekt, das Docker Compose in ein Menü verpackt. Sie wählen Dienste aus einer Liste, IOTstack erzeugt eine docker-compose.yml mit sinnvollen Volumes und Ports, und Sie starten alles mit einem Befehl. Die Vorteile gegenüber der nativen Installation jedes Werkzeugs sind real:

  • Isolation. Die Node.js-Version von Node-RED kann mit nichts anderem auf dem Pi in Konflikt geraten.
  • Reproduzierbarkeit. Der gesamte Stack ist in einer Datei plus einem Ordner volumes beschrieben. Kopieren Sie beides auf einen neuen Pi, und Sie sind wieder einsatzbereit.
  • Saubere Upgrades. Ein neueres Image ziehen, den Container neu erstellen und bei Problemen zurückrollen.

Das Menü bietet auch einen Mosquitto-Container an, und viele Anleitungen installieren ihn reflexartig. Überlegen Sie, ob Sie ihn brauchen. Ein lokaler Broker bedient nur Geräte, die den Pi erreichen können. Befinden sich Ihre Sensoren an mehr als einem Ort, wollen Sie ohne offene Ports vom Smartphone auf Daten zugreifen oder möchten Sie die Broker-Sicherheit einfach nicht selbst pflegen, ist ein externer Broker die bessere Wahl. Hier verwenden wir den Cloud-MQTT-Broker von ConnectMQ, und der Pi wird zum reinen Verarbeitungs- und Speicherknoten.

Dienst Container in diesem Tutorial Port
Node-RED Ja 1880
InfluxDB 1.8 Ja 8086
Grafana Ja 3000
Portainer CE Optional 9000
Mosquitto Nein, durch einen Cloud-MQTT-Broker ersetzt n/a

IOTstack auf dem Raspberry Pi installieren

Beginnen Sie mit Raspberry Pi OS Lite oder Desktop, 64 Bit, vollständig aktualisiert. Das IOTstack-Installationsskript richtet Docker, das Compose-Plugin und den IOTstack-Ordner in Ihrem Home-Verzeichnis ein:

sudo apt update && sudo apt full-upgrade -y
curl -fsSL https://raw.githubusercontent.com/SensorsIot/IOTstack/master/install.sh | bash

Das Skript fordert Sie eventuell zu einem Neustart auf, damit Ihr Benutzer der Gruppe docker beitritt. Prüfen Sie nach dem Neustart, dass Docker ohne sudo funktioniert:

docker version
docker compose version

Starten Sie dann das Menü:

cd ~/IOTstack
./menu.sh

Wählen Sie Build Stack und markieren Sie mit der Leertaste nodered, influxdb und grafana (und portainer-ce, wenn Sie eine Weboberfläche für Container möchten). Bei der Auswahl von Node-RED bietet das Menü Zusatz-Nodes an. Haken Sie node-red-contrib-influxdb und node-red-dashboard an (oder das neuere Dashboard-2.0-Paket, falls aufgeführt). Lassen Sie mosquitto abgewählt. Verlassen Sie das Menü und starten Sie den Stack:

cd ~/IOTstack
docker compose up -d
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'

Alle drei Container sollten Up melden. Die Daten liegen unter ~/IOTstack/volumes/, ein Ordner pro Dienst.

Die InfluxDB-Datenbank anlegen

Der Dienst influxdb in IOTstack ist InfluxDB 1.8, das InfluxQL verwendet und keinen Einrichtungsassistenten hat. Legen Sie eine Datenbank und eine Aufbewahrungsrichtlinie innerhalb des Containers an:

docker exec -it influxdb influx
CREATE DATABASE sensors
CREATE RETENTION POLICY "ninety_days" ON "sensors" DURATION 90d REPLICATION 1 DEFAULT
SHOW DATABASES
exit

Container im selben Compose-Projekt teilen sich ein Netzwerk und erreichen einander über den Dienstnamen. Deshalb verwenden Node-RED und Grafana http://influxdb:8086 und nicht localhost.

Node-RED mit einem externen MQTT-Broker verbinden

Öffnen Sie Node-RED unter http://<pi-ip>:1880. Ziehen Sie einen mqtt in-Node auf die Arbeitsfläche und bearbeiten Sie seinen Server:

  • Server: broker.connectmq.com
  • Port: 1883 zum Testen auf dem Öffentlichen MQTT-Broker
  • Protokoll: MQTT V5 (oder 3.1.1)
  • Client ID: etwas Eindeutiges und nicht Leeres, zum Beispiel iotstack-nr-5d02e8
  • Topic: connectmq/demo/5d02e8/+/climate
  • Ausgabe: ein geparstes JSON-Objekt

Der Öffentliche MQTT-Broker benötigt keine Zugangsdaten, Sie können also sofort testen. Denken Sie daran, dass der kostenlose Öffentliche MQTT-Broker für jeden lesbar ist – deshalb enthält das Topic ein zufälliges Segment. Wenn Sie neu bei den MQTT-Nodes von Node-RED sind, erklärt das Node-RED MQTT Tutorial den Konfigurations-Node ausführlich.

Der Node-RED-Flow: MQTT nach InfluxDB

Importieren Sie den folgenden Flow über Menü, Import. Er abonniert das Klima-Topic jedes Raums, extrahiert den Raumnamen aus dem Topic und schreibt einen Datenpunkt in InfluxDB.

[
  {
    "id": "mqttIn1",
    "type": "mqtt in",
    "name": "climate in",
    "topic": "connectmq/demo/5d02e8/+/climate",
    "qos": "1",
    "datatype": "json",
    "broker": "broker1",
    "nl": false,
    "rap": true,
    "rh": 0,
    "inputs": 0,
    "x": 140, "y": 100,
    "wires": [["toPoint1"]]
  },
  {
    "id": "toPoint1",
    "type": "function",
    "name": "to InfluxDB point",
    "func": "const room = msg.topic.split('/')[3];\nconst p = msg.payload;\nif (typeof p.t !== 'number') { return null; }\nmsg.measurement = 'climate';\nmsg.payload = [\n  { temperature: p.t, humidity: p.rh },\n  { room: room }\n];\nreturn msg;",
    "outputs": 1,
    "x": 360, "y": 100,
    "wires": [["influxOut1"]]
  },
  {
    "id": "influxOut1",
    "type": "influxdb out",
    "influxdb": "influxCfg1",
    "name": "write sensors",
    "measurement": "",
    "precision": "",
    "retentionPolicy": "",
    "x": 580, "y": 100,
    "wires": []
  },
  {
    "id": "broker1",
    "type": "mqtt-broker",
    "name": "ConnectMQ public",
    "broker": "broker.connectmq.com",
    "port": "1883",
    "clientid": "iotstack-nr-5d02e8",
    "autoConnect": true,
    "usetls": false,
    "protocolVersion": "5",
    "keepalive": "60",
    "cleansession": true
  },
  {
    "id": "influxCfg1",
    "type": "influxdb",
    "hostname": "influxdb",
    "port": "8086",
    "database": "sensors",
    "name": "IOTstack InfluxDB",
    "influxdbVersion": "1.x"
  }
]

Der Function-Node gibt ein Array aus zwei Objekten zurück, zuerst die Felder, dann die Tags – genau das Format, das node-red-contrib-influxdb für einen einzelnen Datenpunkt mit Tags erwartet. Klicken Sie auf Deploy und veröffentlichen Sie dann einen Testwert:

mosquitto_pub -h broker.connectmq.com -p 1883 -i tester-5d02e8 -q 1 \
  -t connectmq/demo/5d02e8/office/climate -m '{"t":22.4,"rh":41}'

Prüfen Sie, ob er angekommen ist:

docker exec -it influxdb influx -database sensors \
  -execute 'SELECT * FROM climate ORDER BY time DESC LIMIT 5'

Grafana auf dem IOTstack Raspberry Pi

Öffnen Sie Grafana unter http://<pi-ip>:3000, melden Sie sich mit dem Standard-Admin-Konto an und ändern Sie das Passwort. Fügen Sie eine Datenquelle hinzu:

  1. Connections, Data sources, Add, InfluxDB.
  2. Abfragesprache: InfluxQL.
  3. URL: http://influxdb:8086.
  4. Datenbank: sensors. Mit der Standardkonfiguration von IOTstack sind weder Benutzer noch Passwort nötig.
  5. Save and test.

Erstellen Sie ein Dashboard mit einem Time-series-Panel und dieser Abfrage:

SELECT mean("temperature") FROM "climate"
WHERE $timeFilter
GROUP BY time($__interval), "room" fill(none)

Tragen Sie $tag_room in das Feld ALIAS des Abfrage-Editors ein, und Sie erhalten pro Raum eine klar beschriftete Linie. Wenn Sie InfluxDB 2 und Flux bevorzugen, bietet IOTstack auch einen Dienst influxdb2; das Raspberry Pi Grafana InfluxDB Tutorial zeigt die Flux-Seite im Detail.

Produktion: private Broker-Zugangsdaten und TLS

Für echte Installationen ersetzen Sie den Öffentlichen MQTT-Broker durch einen privaten. Bei einem verwalteten MQTT-Broker wie ConnectMQ erstellen Sie im Portal einen Broker und erhalten Benutzernamen, Passwort und Client-ID. Bearbeiten Sie in Node-RED den Konfigurations-Node mqtt-broker:

  • Port 8883, Use TLS anhaken und eine TLS-Konfiguration mit aktiviertem Verify server certificate hinzufügen. ConnectMQ verwendet ein Let's-Encrypt-Zertifikat, eine eigene CA-Datei ist also nicht nötig.
  • Client ID: YOUR_CLIENT_ID. ConnectMQ bindet Client-IDs an die ausgestellten Zugangsdaten, verwenden Sie also genau die im Portal angezeigte.
  • Reiter Security: YOUR_USERNAME und YOUR_PASSWORD.

Node-RED speichert Zugangsdaten verschlüsselt in flows_cred.json innerhalb von ~/IOTstack/volumes/nodered/data. Setzen Sie in settings.js im selben Ordner ein credentialSecret, damit der Schlüssel auch nach dem Neuaufbau des Containers gleich bleibt.

Backups und Updates

Die Stärke von IOTstack ist, dass alles Wichtige an zwei Orten liegt: docker-compose.yml und volumes/. Eine einfache Routine:

  1. Stoppen Sie den Stack kurz mit docker compose stop (oder nutzen Sie die Backup-Skripte von IOTstack, falls installiert).
  2. Archivieren Sie den Ordner: sudo tar czf ~/iotstack-$(date +%F).tgz -C ~ IOTstack/docker-compose.yml IOTstack/volumes.
  3. Starten Sie mit docker compose up -d neu und kopieren Sie das Archiv vom Pi weg.

Images aktualisieren:

cd ~/IOTstack
docker compose pull
docker compose up -d
docker image prune -f

Fixieren Sie Image-Tags in docker-compose.yml für Dienste, bei denen ein überraschendes Major-Upgrade schmerzen würde, insbesondere bei InfluxDB.

Fehlerbehebung

Symptom Ursache Abhilfe
MQTT-Node in Node-RED bleibt auf „connecting“ Falscher Port oder falsche TLS-Einstellung 1883 ohne TLS, 8883 mit TLS
Node-RED zeigt direkt nach dem Verbinden „disconnected“ Doppelte Client-ID Jeder Client braucht eine eigene ID
InfluxDB-Node meldet ENOTFOUND influxdb Host auf localhost gesetzt Dienstnamen influxdb verwenden
Grafana meldet „database not found“ Datenbank nicht angelegt CREATE DATABASE sensors ausführen
Container stoppen nach Neustart Neustartrichtlinie fehlt IOTstack setzt restart: unless-stopped, Datei prüfen

Starten Sie mit ConnectMQ

Überlassen Sie IOTstack die Verarbeitung und einem verwalteten MQTT-Broker die Verbindungen. Erstellen Sie ein kostenloses Konto unter app.connectmq.com, wählen Sie den Serverless-Tarif ohne Kreditkarte und fügen Sie die generierten Zugangsdaten in Ihren Node-RED-Konfigurations-Node ein. Weitere Pi-Projekte finden Sie im Raspberry Pi MQTT Tutorial.

Häufig gestellte Fragen

Brauche ich den Mosquitto-Container in IOTstack?

Nur wenn sich alle Geräte im selben lokalen Netzwerk befinden und Sie den Broker auf dem Pi haben möchten. Mit einem externen Cloud-MQTT-Broker abonniert Node-RED über das Internet, und Sie müssen die Broker-Sicherheit nicht auf dem Pi pflegen.

Welche InfluxDB-Version verwendet IOTstack?

Der Dienst influxdb ist InfluxDB 1.8 mit InfluxQL, ein separater Dienst influxdb2 bietet Version 2 mit Flux. Entscheiden Sie sich für eine und bleiben Sie dabei, da sich die Einstellungen in Node-RED und Grafana unterscheiden.

Kann ich IOTstack auf einem 32-Bit-Raspberry-Pi-OS betreiben?

Manche Images werden noch als 32-Bit-Builds veröffentlicht, doch die Unterstützung schrumpft. Ein 64-Bit-System vermeidet die meisten Kompatibilitätsprobleme mit Images.

Wie ziehe ich IOTstack auf einen neuen Raspberry Pi um?

Installieren Sie IOTstack auf dem neuen Pi, stoppen Sie es, stellen Sie dann Ihre docker-compose.yml und den Ordner volumes wieder her und führen Sie docker compose up -d aus.

Verwandte Artikel

Raspberry Pi RFID MQTT: Zutrittsprotokollierung mit dem RC522-Leser

Schließen Sie einen RC522-RFID-Leser an einen Raspberry Pi an, lesen Sie Tags mit Python, prüfen Sie sie gegen eine lokale Allowlist und veröffentlichen Sie jeden Zutrittsversuch als MQTT-Ereignis, das Logger, Dashboards und Alarmwerkzeuge verarbeiten können.

7 Min. Lesezeit

Pico W vs. Pico 2 W für MQTT: RP2040 vs. RP2350 bei Leistung, Speicher und TLS

Der Pico 2 W behält Formfaktor und WLAN-Chip des Pico W, ersetzt aber den RP2040 durch den schnelleren RP2350. Dieser Vergleich zeigt, was das für MQTT-Geräte bedeutet: CPU, Speicher, TLS, Sicherheitsfunktionen, Softwareunterstützung und welches Board für welches Projekt.

8 Min. Lesezeit

Alle Artikel →

Ihr privater MQTT-Broker ist nur wenige Klicks entfernt

Konto anlegen, Broker-Zugangsdaten erhalten und das erste Gerät verbinden — ohne Server, die installiert, gepatcht oder skaliert werden müssen.