Tutoriels

Node-RED et MQTT : se connecter, s’abonner et publier

Utilisez MQTT dans Node-RED : configurez le nœud broker, abonnez-vous avec mqtt in, publiez avec mqtt out, analysez le JSON, topics dynamiques et flow à importer.

Mis à jour · 7 min de lecture

Node-RED et MQTT forment un duo naturel : MQTT transporte les messages entre les appareils, et Node-RED vous permet de brancher ces messages sur des tableaux de bord, des bases de données, des alertes et des API sans écrire une application complète. Node-RED fournit d’emblée deux nœuds MQTT — mqtt in et mqtt out — ainsi qu’un nœud de configuration du broker partagé. Ce tutoriel couvre les trois et se termine par un flow que vous pouvez importer.

Lancer Node-RED

Si vous n’avez pas encore Node-RED, les options les plus rapides sont npm ou Docker :

bash
# with Node.js installed
npm install -g --unsafe-perm node-red
node-red

# or with Docker
docker run -it -p 1880:1880 -v node_red_data:/data --name nodered nodered/node-red

Ouvrez http://localhost:1880 dans votre navigateur. Node-RED n’est que le côté client — il vous faut toujours un broker. Pour le développement local, lancez Mosquitto dans Docker à côté ; pour un test rapide, le broker public HiveMQ fonctionne sans aucune configuration.

Configurer le nœud de broker MQTT

Faites glisser un nœud mqtt in sur le canevas, double-cliquez dessus, puis cliquez sur l’icône en forme de crayon à côté de Server pour créer une configuration de broker. Tous les nœuds MQTT qui utilisent le même nœud de configuration partagent une seule connexion.

Onglet / champQue saisir
Connection — Server, PortLe nom d’hôte uniquement (par exemple broker.hivemq.com), port 1883 pour TCP en clair ou 8883 pour TLS
Connection — Use TLSÀ activer pour le port 8883 ; ajoutez une configuration TLS avec un certificat de CA si votre broker utilise une CA privée
Connection — ProtocolMQTT V3.1.1 ou MQTT V5
Connection — Client IDLaissez vide pour une génération automatique, ou définissez une valeur unique
Connection — Keep Alive60 secondes est une valeur par défaut raisonnable
Security — Username, PasswordVos identifiants du broker (stockés dans le fichier d’identifiants chiffré de Node-RED)
Messages — Birth, Close, WillMessages de statut facultatifs, par exemple un topic retenu online/offline

Le message Will de l’onglet Messages est le Last Will de MQTT — voir Last Will and Testament. Une étiquette verte connected sous chaque nœud MQTT après le déploiement signifie que le broker a accepté la connexion. Vous ne savez pas quel port utilise votre broker ? Consultez les ports MQTT expliqués.

S’abonner avec le nœud mqtt in

Définissez le Topic auquel s’abonner — les jokers (wildcards) sont autorisés, ainsi testmqtt/nodered-demo/+/telemetry reçoit la télémétrie de toutes les pièces. Chaque message entrant devient un msg Node-RED avec :

  • msg.payload — le corps du message
  • msg.topic — le topic concret sur lequel il est arrivé
  • msg.qos et msg.retain — les détails de livraison

Testez vos filtres de topic avec le testeur de topics MQTT avant de déployer. L’option Output détermine le type de msg.payload :

  • auto-detect (string or buffer) — le texte devient une chaîne, les données binaires restent un Buffer.
  • a parsed JSON object — le nœud exécute JSON.parse pour vous, donc msg.payload.temp est directement utilisable. Un JSON invalide produit une erreur que vous pouvez intercepter avec un nœud catch.
  • auto-detect (parsed JSON object, string or buffer) — analyse le JSON quand c’est possible et se rabat sinon sur une chaîne.

Si vous préférez, gardez la sortie par défaut et ajoutez un nœud json après mqtt in ; il convertit une chaîne JSON en objet et inversement.

Abonnements dynamiques

Régler le type de topic du nœud mqtt in sur Dynamic subscription lui ajoute une entrée. Envoyez-lui un message avec msg.action défini à subscribe (et le topic dans msg.topic), unsubscribe, connect ou disconnect pour le piloter à l’exécution — utile quand la liste des appareils évolue.

Publier avec le nœud mqtt out

Le nœud mqtt out publie msg.payload. Si le payload est un objet, il est automatiquement converti en chaîne JSON. Ses champs servent de valeurs de repli :

  • Topic — laissez-le vide pour utiliser msg.topic. C’est ainsi que l’on publie sur des topics dynamiques, par exemple un topic par appareil.
  • QoS et Retain — laissez-les vides pour reprendre msg.qos et msg.retain depuis le message.

Un nœud function est le moyen le plus simple de construire le topic de chaque message :

nœud function
const room = msg.payload.room || 'unknown';
msg.topic = 'testmqtt/nodered-demo/' + room + '/telemetry';
msg.payload = { temp: msg.payload.temp, ts: Date.now() };
msg.qos = 1;
return msg;

Statut retenu et messages de naissance

Le nœud de configuration du broker peut publier un message Birth à la connexion, un message Close avant une déconnexion propre et un message Will si la connexion tombe. Diriger les trois vers un même topic retenu, comme nodered/status avec online et offline, donne aux autres systèmes un moyen fiable de savoir si votre instance Node-RED est opérationnelle. Les messages retenus sont expliqués dans les messages retenus MQTT.

Avec le protocole réglé sur MQTT V5, les nœuds exposent des options supplémentaires comme l’expiration des messages, le content type, les user properties et les flags d’abonnement No Local, Retain As Published et Retain Handling.

Exemple de flow à importer

Ce flow publie une température aléatoire toutes les 10 secondes sur testmqtt/nodered-demo/room1/telemetry, s’abonne à toutes les pièces avec l’analyse JSON activée et affiche dans la barre latérale de debug les mesures supérieures à 24 °C. Copiez-le, ouvrez le menu, choisissez Import, collez et déployez.

node-red-mqtt-flow.json
[
  {
    "id": "b1a1c0de00000001",
    "type": "mqtt-broker",
    "name": "HiveMQ public",
    "broker": "broker.hivemq.com",
    "port": "1883",
    "clientid": "",
    "autoConnect": true,
    "usetls": false,
    "protocolVersion": "4",
    "keepalive": "60",
    "cleansession": true
  },
  {
    "id": "b1a1c0de00000002",
    "type": "inject",
    "name": "every 10 s",
    "props": [{ "p": "payload" }],
    "repeat": "10",
    "once": true,
    "onceDelay": "1",
    "payload": "",
    "payloadType": "date",
    "x": 130,
    "y": 80,
    "wires": [["b1a1c0de00000003"]]
  },
  {
    "id": "b1a1c0de00000003",
    "type": "function",
    "name": "build reading",
    "func": "msg.topic = 'testmqtt/nodered-demo/' + 'room1' + '/telemetry';\nmsg.payload = { temp: +(18 + Math.random() * 8).toFixed(1), ts: msg.payload };\nreturn msg;",
    "outputs": 1,
    "x": 320,
    "y": 80,
    "wires": [["b1a1c0de00000004"]]
  },
  {
    "id": "b1a1c0de00000004",
    "type": "mqtt out",
    "name": "publish",
    "topic": "",
    "qos": "1",
    "retain": "false",
    "broker": "b1a1c0de00000001",
    "x": 510,
    "y": 80,
    "wires": []
  },
  {
    "id": "b1a1c0de00000005",
    "type": "mqtt in",
    "name": "subscribe",
    "topic": "testmqtt/nodered-demo/+/telemetry",
    "qos": "1",
    "datatype": "json",
    "broker": "b1a1c0de00000001",
    "nl": false,
    "rap": true,
    "rh": 0,
    "inputs": 0,
    "x": 140,
    "y": 160,
    "wires": [["b1a1c0de00000006"]]
  },
  {
    "id": "b1a1c0de00000006",
    "type": "switch",
    "name": "temp > 24",
    "property": "payload.temp",
    "propertyType": "msg",
    "rules": [{ "t": "gt", "v": "24", "vt": "num" }],
    "checkall": "true",
    "outputs": 1,
    "x": 330,
    "y": 160,
    "wires": [["b1a1c0de00000007"]]
  },
  {
    "id": "b1a1c0de00000007",
    "type": "debug",
    "name": "too warm",
    "active": true,
    "tosidebar": true,
    "complete": "true",
    "x": 510,
    "y": 160,
    "wires": []
  }
]

Observez les mêmes messages depuis l’extérieur de Node-RED pour confirmer qu’ils atteignent bien le broker :

Voir vos messages Node-RED en direct

Dépannage

  • Bloqué sur « connecting » — mauvais port ou mauvais réglage TLS, ou le champ Server contient mqtt://. Saisissez uniquement le nom d’hôte.
  • Se connecte puis se déconnecte en boucle — un autre client utilise le même client ID, souvent une seconde instance Node-RED avec un flow copié. Videz le champ.
  • Aucun message n’arrive — le topic d’abonnement ne correspond pas au topic de publication (la casse compte), ou une ACL du broker le refuse. Plus de détails dans le guide des erreurs de connexion MQTT.

Vous comptez plus tard sortir la logique de Node-RED vers un script ? Le générateur de code MQTT produit du code client pour les paramètres de votre broker en Python, JavaScript et d’autres langages, et le client MQTT en ligne est pratique pour explorer les topics pendant que vous construisez vos flows.

Questions fréquentes

Node-RED inclut-il un broker MQTT ?

Non. Node-RED fournit des nœuds clients MQTT (mqtt in et mqtt out) mais pas de broker. Vous les connectez à un broker existant comme Mosquitto, EMQX, un broker managé ou un broker de test public. Des nœuds communautaires peuvent embarquer un broker, mais un broker séparé reste la configuration habituelle.

Comment définir dynamiquement le topic MQTT dans Node-RED ?

Laissez vide le champ Topic du nœud mqtt out et définissez msg.topic dans un nœud précédent, comme un nœud change ou function. Le nœud publie alors chaque message sur le topic contenu dans msg.topic. La QoS et le retain peuvent de même provenir de msg.qos et msg.retain.

Pourquoi mon nœud MQTT Node-RED affiche-t-il « disconnected » ?

Vérifiez le nœud de configuration du broker : l’hôte, le port et le réglage TLS doivent correspondre au listener du broker, les identifiants vont dans l’onglet Security, et le client ID doit être unique ou vide. Deux nœuds ou instances avec le même client ID se déconnecteront mutuellement sans cesse.