Raspberry Pi

IOTstack sur Raspberry Pi : Node-RED, InfluxDB et Grafana avec un broker MQTT cloud

Utilisez IOTstack pour faire tourner Node-RED, InfluxDB et Grafana dans Docker sur un Raspberry Pi, laissez de côté le conteneur Mosquitto local et connectez plutôt Node-RED à un broker MQTT cloud externe.

Conteneurs Docker Node-RED, InfluxDB et Grafana tournant sur un IOTstack Raspberry Pi connecté à un broker MQTT cloud
Essayez-le sur votre propre broker MQTTObtenez un broker MQTT privé et managé avec l’offre Free et partez d’exemples de code prêts à l’emploi.
Essayer gratuitement Exemples de code Aucune carte bancaire requise

Une installation IOTstack sur Raspberry Pi vous fournit Node-RED, InfluxDB et Grafana sous forme de conteneurs Docker que vous pouvez reconstruire, mettre à jour et sauvegarder en quelques commandes. Dans ce tutoriel, vous allez installer IOTstack, sélectionner les conteneurs dont vous avez besoin, connecter Node-RED à un broker MQTT externe plutôt qu'à un conteneur Mosquitto local, stocker les mesures dans InfluxDB et les représenter dans Grafana. À la fin, vous disposerez d'une stack reproductible et d'une idée claire de ce qui a sa place sur le Pi et de ce qui ne l'a pas.

Ce qu'est IOTstack et pourquoi c'est utile

IOTstack est un projet communautaire qui habille Docker Compose d'un menu. Vous choisissez des services dans une liste, il génère un docker-compose.yml avec des volumes et des ports cohérents, et vous démarrez le tout en une commande. Les avantages par rapport à l'installation native de chaque outil sont réels :

  • Isolation. La version de Node.js de Node-RED ne peut entrer en conflit avec rien d'autre sur le Pi.
  • Reproductibilité. Toute la stack est décrite dans un fichier plus un dossier volumes. Copiez les deux sur un nouveau Pi et vous repartez immédiatement.
  • Mises à jour propres. Récupérez une image plus récente, recréez le conteneur, et revenez en arrière s'il se comporte mal.

Le menu propose aussi un conteneur Mosquitto, que beaucoup de guides installent par réflexe. Demandez-vous si vous en avez besoin. Un broker local ne sert que les appareils capables d'atteindre le Pi. Si vos capteurs sont répartis sur plusieurs sites, si vous voulez consulter vos données depuis votre téléphone sans ouvrir de ports, ou si vous ne voulez tout simplement pas gérer vous-même la sécurité du broker, un broker externe est le meilleur choix. Ici, nous utilisons le broker cloud ConnectMQ, et le Pi devient un pur nœud de traitement et de stockage, par exemple pour les capteurs de votre maison connectée.

Service Conteneur dans ce tutoriel Port
Node-RED Oui 1880
InfluxDB 1.8 Oui 8086
Grafana Oui 3000
Portainer CE Facultatif 9000
Mosquitto Non, remplacé par un broker cloud n/a

Installer IOTstack sur le Raspberry Pi

Partez de Raspberry Pi OS Lite ou Desktop, en 64 bits, entièrement à jour. L'installateur d'IOTstack configure Docker, le plugin Compose et le dossier IOTstack dans votre répertoire personnel :

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

Le script peut vous demander de redémarrer pour que votre utilisateur rejoigne le groupe docker. Après le redémarrage, vérifiez que Docker fonctionne sans sudo :

docker version
docker compose version

Lancez ensuite le menu :

cd ~/IOTstack
./menu.sh

Choisissez Build Stack, puis utilisez la barre d'espace pour sélectionner nodered, influxdb et grafana (et portainer-ce si vous aimez avoir une interface web pour les conteneurs). Lorsque vous sélectionnez Node-RED, le menu propose des nœuds complémentaires. Cochez node-red-contrib-influxdb et node-red-dashboard (ou le paquet plus récent Dashboard 2.0 s'il est listé). Laissez mosquitto décoché. Quittez le menu et démarrez la stack :

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

Les trois conteneurs doivent afficher Up. Les données se trouvent sous ~/IOTstack/volumes/, avec un dossier par service.

Créer la base InfluxDB

Le service influxdb d'IOTstack est InfluxDB 1.8, qui utilise InfluxQL et n'a pas d'assistant de configuration. Créez une base de données et une politique de rétention depuis le conteneur :

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

Les conteneurs d'un même projet Compose partagent un réseau et se joignent par leur nom de service. C'est pourquoi Node-RED et Grafana utiliseront http://influxdb:8086, et non localhost.

Connecter Node-RED à un broker MQTT externe

Ouvrez Node-RED sur http://<pi-ip>:1880. Faites glisser un nœud mqtt in sur le canevas et modifiez son serveur :

  • Server : broker.connectmq.com
  • Port : 1883 pour les tests sur le broker public
  • Protocol : MQTT V5 (ou 3.1.1)
  • Client ID : une valeur unique et non vide, par exemple iotstack-nr-5d02e8
  • Topic : connectmq/demo/5d02e8/+/climate
  • Output : un objet JSON analysé

Le broker public ne demande aucun identifiant : vous pouvez tester tout de suite. N'oubliez pas que le serveur MQTT public gratuit est lisible par tout le monde et réservé aux tests, d'où le segment aléatoire dans le topic. Si vous découvrez les nœuds MQTT de Node-RED, le tutoriel Node-RED MQTT détaille le nœud de configuration.

Le flow Node-RED : de MQTT vers InfluxDB

Importez le flow ci-dessous via Menu, Import. Il s'abonne au topic climat de chaque pièce, extrait le nom de la pièce du topic et écrit un point dans 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"
  }
]

Le nœud function renvoie un tableau de deux objets, les champs d'abord et les tags ensuite, ce qui correspond au format attendu par node-red-contrib-influxdb pour un point unique avec tags. Déployez, puis publiez une mesure de test :

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}'

Vérifiez qu'elle est bien arrivée :

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

Grafana sur l'IOTstack Raspberry Pi

Ouvrez Grafana sur http://<pi-ip>:3000, connectez-vous avec le compte admin par défaut et changez le mot de passe. Ajoutez une source de données :

  1. Connections, Data sources, Add, InfluxDB.
  2. Langage de requête : InfluxQL.
  3. URL : http://influxdb:8086.
  4. Base de données : sensors. Aucun utilisateur ni mot de passe n'est nécessaire avec la configuration IOTstack par défaut.
  5. Save and test.

Créez un tableau de bord avec un panneau Time series et cette requête :

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

Saisissez $tag_room dans le champ ALIAS de l'éditeur de requête et vous obtenez une courbe clairement libellée par pièce. Si vous préférez InfluxDB 2 et Flux, IOTstack propose aussi un service influxdb2 ; le tutoriel Raspberry Pi Grafana InfluxDB présente la partie Flux en détail.

Production : identifiants de broker privé et TLS

Pour de vrais déploiements, remplacez le broker public par un broker privé. Sur un broker MQTT managé comme ConnectMQ, vous créez un broker dans le portail et recevez un nom d'utilisateur, un mot de passe et un client ID. Dans Node-RED, modifiez le nœud de configuration mqtt-broker :

  • Port 8883, cochez Use TLS et ajoutez une configuration TLS avec Verify server certificate activé. ConnectMQ utilise un certificat Let's Encrypt : aucun fichier d'autorité de certification personnalisé n'est nécessaire.
  • Client ID : YOUR_CLIENT_ID. ConnectMQ lie les client ID aux identifiants délivrés : utilisez exactement celui affiché dans le portail.
  • Onglet Security : YOUR_USERNAME et YOUR_PASSWORD.

Node-RED stocke les identifiants chiffrés dans flows_cred.json à l'intérieur de ~/IOTstack/volumes/nodered/data. Définissez un credentialSecret dans le settings.js du même dossier pour que la clé de chiffrement reste stable d'une reconstruction de conteneur à l'autre.

Sauvegardes et mises à jour

La force d'IOTstack est que tout ce qui compte se trouve à deux endroits : docker-compose.yml et volumes/. Une routine simple :

  1. Arrêtez brièvement la stack avec docker compose stop (ou utilisez les scripts de sauvegarde d'IOTstack si vous les avez installés).
  2. Archivez le dossier : sudo tar czf ~/iotstack-$(date +%F).tgz -C ~ IOTstack/docker-compose.yml IOTstack/volumes.
  3. Redémarrez avec docker compose up -d et copiez l'archive hors du Pi.

Pour mettre à jour les images :

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

Figez les tags d'image dans docker-compose.yml pour les services où une mise à niveau majeure inattendue ferait mal, InfluxDB en particulier.

Dépannage

Symptôme Cause Solution
Le nœud MQTT de Node-RED reste sur « connecting » Mauvais port ou réglage TLS 1883 sans TLS, 8883 avec TLS
Node-RED affiche « disconnected » juste après la connexion Client ID en double Chaque client a besoin de son propre ID
Erreur du nœud InfluxDB ENOTFOUND influxdb Hôte réglé sur localhost Utilisez le nom de service influxdb
Grafana « database not found » Base de données non créée Exécutez CREATE DATABASE sensors
Les conteneurs s'arrêtent après un redémarrage Politique de redémarrage absente IOTstack définit restart: unless-stopped, vérifiez le fichier

Démarrer avec ConnectMQ

Laissez IOTstack se charger du traitement et un broker managé gérer les connexions. Créez un compte gratuit sur app.connectmq.com, choisissez l'offre Serverless sans carte bancaire et collez les identifiants générés dans votre nœud de configuration Node-RED. D'autres projets Pi sont rassemblés dans le tutoriel MQTT sur Raspberry Pi.

Questions fréquentes

Ai-je besoin du conteneur Mosquitto dans IOTstack ?

Seulement si tous les appareils sont sur le même réseau local et que vous voulez le broker sur le Pi. Avec un broker cloud externe, Node-RED s'abonne via Internet et vous évitez de gérer la sécurité du broker sur le Pi.

Quelle version d'InfluxDB IOTstack utilise-t-il ?

Le service influxdb correspond à InfluxDB 1.8 avec InfluxQL, et un service distinct influxdb2 fournit la version 2 avec Flux. Choisissez-en un et tenez-vous-y, car les réglages de Node-RED et de Grafana diffèrent.

Puis-je faire tourner IOTstack sur un Raspberry Pi OS 32 bits ?

Certaines images publient encore des versions 32 bits, mais leur prise en charge diminue. Un système 64 bits évite la plupart des problèmes de compatibilité d'images.

Comment déplacer IOTstack vers un nouveau Raspberry Pi ?

Installez IOTstack sur le nouveau Pi, arrêtez-le, puis restaurez votre docker-compose.yml et votre dossier volumes et lancez docker compose up -d.

Articles liés

Journal d'accès RFID MQTT sur Raspberry Pi avec le lecteur RC522

Câblez un lecteur RFID RC522 sur un Raspberry Pi, lisez les badges en Python, vérifiez-les dans une liste blanche locale et publiez chaque tentative d'accès sous forme d'événement MQTT exploitable par vos outils de journalisation, tableaux de bord et alertes.

8 min de lecture

Installer Mosquitto sur Raspberry Pi comme broker MQTT local sécurisé

Installez Mosquitto sur un Raspberry Pi, sécurisez-le avec des mots de passe et une configuration de listener raisonnable, testez-le avec mosquitto_pub et mosquitto_sub, et découvrez quand un broker local doit faire un pont vers un broker cloud.

9 min de lecture

Tous les articles →

Votre broker MQTT privé, à quelques clics

Créez un compte, récupérez les identifiants de votre broker et connectez votre premier appareil — aucun serveur à installer, mettre à jour ou dimensionner.