n8n dialogue avec MQTT grâce à deux nœuds core : le MQTT Trigger, qui s'abonne à des topics et lance un workflow pour chaque message reçu, et le nœud MQTT, qui publie des messages depuis n'importe quelle étape d'un workflow. Ajoutez un credential MQTT avec l'hôte, le port et les identifiants de votre broker, posez un trigger, activez le workflow, et chaque mesure de capteur peut partir vers Slack, un e-mail, une base de données, une API HTTP ou revenir vers un appareil.
Ce tutoriel construit deux workflows concrets — une alerte de température et une commande webhook vers appareil — et montre comment tester chaque étape avec un second client MQTT.
La place de n8n dans un système MQTT
n8n est un outil d'automatisation de workflows, pas un broker. Il se connecte à votre broker comme un client MQTT ordinaire :
| Rôle | Élément n8n | Action MQTT |
|---|---|---|
| Réagir aux données des appareils | Nœud MQTT Trigger | SUBSCRIBE à un ou plusieurs filtres de topic |
| Envoyer des commandes ou des données dérivées | Nœud MQTT | PUBLISH sur un topic |
| Liant | N'importe quel autre nœud (IF, Switch, HTTP Request, Code, Slack…) | — |
Tout ce que vous savez sur les clients MQTT s'applique donc : chaque trigger a besoin d'un client ID unique, la QoS se négocie par abonnement et les ACL du broker décident de ce que n8n peut lire et écrire. Si vous utilisez déjà Node-RED, le modèle est proche ; voyez Node-RED et MQTT pour comparer. La force de n8n, c'est la longue liste d'intégrations SaaS disponibles à côté des nœuds MQTT.
Lancer n8n en local
Le plus rapide pour expérimenter est l'image Docker officielle :
docker volume create n8n_data
docker run -it --rm --name n8n \
-p 5678:5678 \
-v n8n_data:/home/node/.n8n \
docker.n8n.io/n8nio/n8nOuvrez http://localhost:5678, créez le compte propriétaire et démarrez un nouveau workflow. n8n Cloud fonctionne de la même façon ; seule différence, le broker doit être joignable depuis Internet, car la connexion MQTT est ouverte par les serveurs de n8n, pas par votre portable.
Créer le credential MQTT
Ajoutez un nœud MQTT, ouvrez Credential to connect with et choisissez Create new credential. Le credential MQTT comporte ces champs importants :
| Champ | Valeur pour un test TCP | Valeur pour TLS |
|---|---|---|
| Protocol | mqtt | mqtts |
| Host | broker.connectmq.com | broker.connectmq.com |
| Port | 1883 | 8883 |
| Username / Password | les identifiants de votre broker | les identifiants de votre broker |
| Client ID | vide ou une valeur unique | idem |
| Clean Session | activé | activé |
Utilisez TLS (mqtts sur 8883) dès que vous dépassez le simple test : le credential est enregistré une fois et réutilisé par tous les nœuds, rien ne justifie d'envoyer des mots de passe en clair. n8n teste la connexion à l'enregistrement ; en cas d'échec, le texte d'erreur correspond généralement au reason code du CONNACK du broker. Consultez-le dans l'outil des reason codes MQTT.
Workflow 1 : alerte de température
Le premier workflow écoute les mesures des capteurs et envoie un message quand une valeur dépasse un seuil.
Étape 1 — MQTT Trigger. Renseignez Topics avec testmqtt/n8n/+/temperature. Le champ accepte une liste séparée par des virgules, et les wildcards + et # fonctionnent comme d'habitude (vérifiez vos filtres avec le topic matcher). Dans Options, activez JSON Parse Body pour transformer le payload en objet, et Only Message si vous n'avez pas besoin du topic par la suite. Gardez le topic lorsqu'un workflow gère de nombreux appareils.
Avec les options indiquées, un message arrive sous la forme d'un item comme celui-ci :
{
"topic": "testmqtt/n8n/greenhouse-1/temperature",
"message": { "value": 31.4, "unit": "C", "ts": 1760700000 }
}Étape 2 — Nœud IF. Ajoutez une condition : le nombre {{ $json.message.value }} est supérieur à 30.
Étape 3 — Notifier. Sur la branche true, ajoutez un nœud Slack, Telegram, Discord ou Send Email. Un texte utile :
🌡 {{ $json.topic.split('/')[2] }} est à {{ $json.message.value }} °{{ $json.message.unit }}Le split('/')[2] extrait l'ID de l'appareil du topic — c'est pourquoi une arborescence cohérente est payante ; voir les bonnes pratiques de conception des topics.
Tester avant d'activer
Cliquez sur Execute workflow (ou Listen for test event sur le trigger). Le trigger attend maintenant un message. Publiez une mesure depuis un terminal ou depuis le client MQTT en ligne :
mosquitto_pub -h broker.connectmq.com -p 1883 \
-t testmqtt/n8n/greenhouse-1/temperature \
-m '{"value": 31.4, "unit": "C", "ts": 1760700000}'Le workflow s'exécute une fois et vous pouvez inspecter les données de chaque nœud. Publiez un second message avec "value": 22 pour vérifier que la branche false reste muette.
Workflow 2 : du webhook à la commande d'appareil
Le sens inverse est tout aussi courant : quelque chose hors du monde MQTT (un formulaire, un agenda, un événement CRM, une autre API) doit piloter un appareil.
- Nœud Webhook, méthode
POST, pathlamp. Son URL de test ressemble àhttp://localhost:5678/webhook-test/lamp. - Nœud IF qui vérifie un en-tête contenant un secret partagé, par exemple que
{{ $json.headers['x-api-key'] }}soit égal à une valeur stockée dans n8n — ne laissez pas n'importe qui sur Internet publier vers vos appareils. - Nœud MQTT avec Topic
testmqtt/n8n/lamp-1/set. Désactivez Send Input Data et mettez Message à{{ $json.body.state }}. Dans les options, choisissez QoS 1 et laissez Retain désactivé pour les commandes ponctuelles.
Avec Send Input Data activé, n8n publie l'item d'entrée complet en JSON — pratique pour relayer, mais souvent trop pour un appareil qui attend ON ou OFF.
Surveillez le topic de commande dans un terminal et appelez le webhook dans un autre :
mosquitto_sub -h broker.connectmq.com -p 1883 -t 'testmqtt/n8n/+/set' -vcurl -X POST http://localhost:5678/webhook-test/lamp \
-H 'Content-Type: application/json' \
-H 'x-api-key: change-me' \
-d '{"state": "ON"}'Le terminal 1 doit afficher testmqtt/n8n/lamp-1/set ON. Pour le schéma inverse — des messages MQTT qui appellent un endpoint HTTP — voir MQTT vers webhook.
Activer le workflow
Les exécutions de test ne tournent que tant que l'éditeur écoute. Pour traiter les messages en permanence, enregistrez le workflow et activez-le (publiez-le). Dès lors, n8n garde l'abonnement ouvert en arrière-plan et chaque message crée une exécution consultable dans la liste des exécutions.
Deux réglages comptent dès que le trafic est réel :
- Volume d'exécutions. Chaque message est une exécution. Un capteur qui publie une fois par seconde génère 86 400 exécutions par jour, ce qui remplit l'historique et consomme du CPU. Agrégez en edge, publiez moins souvent ou abonnez-vous à un topic « événements » plutôt qu'à la télémétrie brute.
- Ordre. Par défaut, le trigger traite les messages en parallèle. Si l'ordre compte (changements d'état d'un même appareil), désactivez le traitement parallèle dans les options du trigger pour traiter les messages l'un après l'autre.
Garanties de livraison et redémarrages
n8n est un client : ses garanties de livraison sont celles du broker pour cet abonnement.
- Les messages QoS 0 publiés pendant un redémarrage de n8n sont perdus.
- QoS 1 avec une session persistante (Clean Session désactivé et client ID fixe) permet au broker de mettre les messages en file pendant l'arrêt de n8n et de les livrer à la reconnexion. Cela ne fonctionne qu'avec un broker qui conserve les sessions — l'endpoint de test partagé
broker.connectmq.comne stocke pas de sessions hors ligne, testez donc ce point sur votre propre instance privée de broker. - Les messages retenus sont livrés dès que le trigger s'abonne : un workflow activé peut donc se déclencher une fois par topic retenu correspondant. C'est souvent voulu pour les topics d'état et surprenant pour les topics d'alerte ; voir messages retenus.
Si vous faites tourner n8n en queue mode avec plusieurs workers, les triggers restent sur l'instance principale. Ne lancez pas plusieurs instances principales avec le même workflow MQTT actif, sinon chaque message sera traité plusieurs fois.
Check-list de dépannage
| Symptôme | Cause probable | Correctif |
|---|---|---|
| Le test du credential échoue avec "Not authorized" | Identifiants erronés ou utilisateur sans droit de CONNECT | Vérifiez d'abord la connexion avec mosquitto_pub/mosquitto_sub |
| Le trigger se connecte mais ne se déclenche jamais | Filtre de topic incorrect ou ACL qui refuse l'abonnement | Publiez sur le topic exact depuis le client en ligne ; vérifiez les ACL |
Les expressions renvoient undefined | JSON Parse Body désactivé, payload en chaîne | Activez l'option ou parsez dans un nœud Code |
| Le workflow se déclenche deux fois par message | Deux workflows actifs ou deux instances n8n abonnées | Désactivez les doublons ; une seule instance principale |
| n8n Cloud ne se connecte pas | Broker joignable seulement sur votre LAN | Utilisez un broker avec endpoint public et TLS |
Observer vos topics n8n dans le navigateur
n8n transforme des messages MQTT en workflows sans écrire de service : un trigger, quelques nœuds et une publication MQTT couvrent la plupart des cas d'alerte et de commande. Testez chaque workflow avec un second client avant de l'activer, donnez à n8n son propre utilisateur restreint sur le broker et gardez la télémétrie à haute fréquence hors des workflows pour que le nombre d'exécutions reste raisonnable.
Questions fréquentes
n8n a-t-il un nœud MQTT intégré ?
Oui. n8n fournit deux nœuds core : le MQTT Trigger, qui s'abonne à un ou plusieurs topics et lance un workflow pour chaque message, et le nœud MQTT, qui publie un message depuis un workflow. Les deux utilisent le même credential MQTT.
Pourquoi mon MQTT Trigger n8n ne se déclenche-t-il que pendant mes tests ?
Dans l'éditeur, « Listen for test event » ne fonctionne que tant que l'éditeur est ouvert. Pour un traitement permanent, il faut activer (publier) le workflow. Seul un workflow actif garde son abonnement MQTT ouvert en arrière-plan.
n8n peut-il parser automatiquement des payloads MQTT en JSON ?
Oui. Activez l'option « JSON Parse Body » sur le MQTT Trigger : le champ message devient un objet et des expressions comme {{ $json.message.temperature }} fonctionnent. Sans elle, le payload arrive sous forme de chaîne.



