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
volumesbeschrieben. 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:
1883zum 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:
- Connections, Data sources, Add, InfluxDB.
- Abfragesprache: InfluxQL.
- URL:
http://influxdb:8086. - Datenbank:
sensors. Mit der Standardkonfiguration von IOTstack sind weder Benutzer noch Passwort nötig. - 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_USERNAMEundYOUR_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:
- Stoppen Sie den Stack kurz mit
docker compose stop(oder nutzen Sie die Backup-Skripte von IOTstack, falls installiert). - Archivieren Sie den Ordner:
sudo tar czf ~/iotstack-$(date +%F).tgz -C ~ IOTstack/docker-compose.yml IOTstack/volumes. - Starten Sie mit
docker compose up -dneu 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.



