Intégration MQTT
MQTT connecte HyperVisu au monde du publish/subscribe : Zigbee2MQTT, Tasmota, Shelly (mode MQTT), ESPHome, passerelles d'énergie et tout firmware personnalisé communiquant avec un broker MQTT. HyperVisu agit en tant que client MQTT — il s'abonne aux topics sur lesquels les appareils publient leur état et publie des commandes sur les topics écoutés par les appareils. Il n'y a aucun polling : un appareil qui change d'état publie l'information, et le widget se met à jour instantanément.
Un broker fait office d'intermédiaire. Il peut s'agir d'un broker existant (Mosquitto, EMQX, celui inclus dans une installation Zigbee2MQTT, …) ou du broker intégré à HyperVisu, que le serveur peut exécuter directement afin que les appareils s'y connectent sans intermédiaire (voir « Le broker MQTT intégré »). L'ensemble de cet article s'applique dans les deux cas — le broker intégré fonctionne comme un broker ordinaire, accessible via une connexion standard.
Prérequis : l'adresse et le port du broker, ses identifiants le cas échéant, ainsi que les topics et le format de payload des appareils — issus de la documentation de l'appareil ou lus directement sur le broker via l'explorateur de topics (ci-dessous).
Connexions. Activez d'abord le Protocole MQTT sur la page Services (voir « Services & Protocoles ») ; il est désactivé par défaut sur un nouveau serveur. MQTT prend en charge plusieurs connexions : une connexion par broker (voir « Connexions »). Dans Ajouter une connexion, sélectionnez la carte MQTT : la boîte de dialogue demande un Nom de l'instance, l'Adresse du broker, le Port, le Client ID et les identifiants, et propose un bouton Tester. Le Certificat CA et les Options du broker (Keepalive, QoS par défaut, Topic de disponibilité, Clean session) ne figurent pas dans cette boîte de dialogue : configurez-les sur la connexion enregistrée, qui s'ouvre dans son éditeur dès que vous cliquez sur Créer la connexion. L'éditeur de connexion comprend :
| Champ | Description |
|---|---|
| Adresse du broker | Hôte, ou URL complète : mqtt://, mqtts://, ws://, wss:// (un simple hôte implique mqtt://). Tout chemin présent dans l'adresse est conservé, par exemple ws://192.168.1.30/mqtt. |
| Port | Le port d'écoute — généralement 1883 pour MQTT standard et 8883 pour MQTT sur TLS. Saisissez-le systématiquement : dans la boîte de dialogue Ajouter une connexion, un port vide est enregistré sous la valeur 1883 quel que soit le protocole, et le champ Port écrase tout port spécifié dans l'adresse. |
| Nom d'utilisateur / Mot de passe | Laissez vide pour un broker anonyme. |
| Client ID | Laissez vide pour dériver un identifiant à partir de l'adresse MAC du serveur. |
| Accepter les certificats auto-signés | Visible uniquement pour mqtts:// / wss://. Désactivé par défaut : le certificat du broker doit être signé par une autorité reconnue. Lorsqu'il est activé, le certificat n'est pas vérifié. |
| Certificat CA | Visible uniquement pour TLS : le certificat PEM de l'autorité ayant signé le certificat du broker, lorsqu'il ne s'agit pas d'une autorité publique. |
| Keepalive | Durée maximale d'inactivité de la liaison avant l'envoi d'un ping (60 s par défaut). |
| QoS par défaut | 0 · au plus une fois, 1 · au moins une fois ou 2 · exactement une fois — utilisé par chaque objet qui ne définit pas sa propre valeur. |
| Topic de disponibilité / Annoncer la disponibilité HyperVisu | Topic sur lequel HyperVisu publie son statut online / offline (par défaut hypervisu/status, conservé/retained). Le broker publie offline en son nom en cas de coupure de liaison. |
| Clean session | Activé (par défaut) : le broker efface les abonnements lors d'une déconnexion et HyperVisu se réabonne lors de la reconnexion. Désactivez cette option uniquement pour un broker devant mettre les messages en file d'attente pendant l'arrêt d'HyperVisu. |
Le bouton Tester sur une connexion MQTT effectue un test réel : le serveur se connecte au broker et attend son accusé de réception (délai de 10 s). Un résultat correct affiche Connexion réussie. Dans la boîte de dialogue Ajouter une connexion, Tester vérifie les valeurs saisies avant la création de la connexion. Sur une connexion existante, Tester vérifie les paramètres enregistrés et non les champs non sauvegardés : cliquez d'abord sur Enregistrer la connexion, puis sur Tester. Un test réussi confirme que l'adresse, le port, les identifiants et les paramètres TLS sont acceptés par le broker ; il ne garantit pas que les topics transmettent des données.
L'état de la connexion affiche Connecté tant que la liaison avec le broker est active. En cas d'interruption du broker, des tentatives de reconnexion s'effectuent toutes les quelques secondes, indéfiniment — aucun redémarrage du serveur n'est nécessaire.
📘 Note : Après avoir créé ou enregistré une connexion, le bouton Appliquer les modifications apparaît dans le menu latéral avec un compteur. La connexion fonctionne déjà sans cette étape ; l'application recharge la configuration du serveur et remet le compteur à zéro.

Liaison d'un objet (voir « Liaison MQTT » ci-dessous). Pour chaque objet, saisissez un Topic ; l'interface d'administration le stocke sous la forme <connexion>:<topic> afin que deux brokers puissent utiliser le même nom de topic. La direction de l'objet détermine son comportement :
| Direction | Comportement |
|---|---|
| In | S'abonne au topic (topic d'état). Les caractères génériques sont autorisés : + pour un niveau, # pour le reste. |
| Out | Publie sur le topic (topic de commande). Doit être un topic précis — aucun caractère générique. |
| In/Out | S'abonne et publie sur le même topic. Adapté uniquement aux appareils conservant leur état (retained) sur un topic unique ; privilégiez deux objets (un In, un Out). |
Le codec de payload — la méthode de conversion du payload en valeur et inversement — correspond à la chaîne de type de données de l'objet, générée par l'éditeur à partir de ces champs :
| Champ | Stocké sous | Description |
|---|---|---|
| Format du payload | — / PATH= | Valeur brute : l'intégralité du payload constitue la valeur. JSON : la valeur est extraite via le chemin JSON (state, sensor.temperature, values[0]). |
| Token ON / Token OFF | ON= / OFF= | Pour les objets booléens : valeurs lues et attendues par l'appareil pour vrai/faux (ex. ON / OFF). Sans tokens, true/false, 1/0, on/off sont interprétés en entrée et true/false est publié. |
| Facteur d'échelle / Offset | SCALE= / OFFSET= | En lecture : valeur = brut × échelle + offset ; en publication, la formule inverse s'applique : brut = (valeur − offset) ÷ échelle. Un objet de commande et son objet d'état partagent ainsi la même échelle. |
| Modèle de payload | PUB= | Modèle de publication optionnel ; {{value}} est remplacé par la valeur, ex. {"state":"{{value}}"}. Laissez vide pour publier la valeur brute. |
| QoS | QOS= | Valeur par défaut du broker, 0, 1 ou 2 pour cette commande. |
| Retenir les messages publiés | RETAIN=1 | Désactivé par défaut. |
| Intervalle minimum (ms) | THROTTLE= | Les données fréquentes de capteurs sont limitées à cette fréquence (100 ms par défaut) ; la dernière valeur est toujours transmise. 0 désactive la limitation. |
La chaîne adopte la structure TYPE:param:param… — par exemple BOOL:PATH=state:ON=ON:OFF=OFF ou FLOAT:SCALE=0.3937:PUB={"brightness":{{value}}}. Une chaîne vide signifie « utiliser le payload brut selon le type de l'objet ». L'éditeur d'objet ne possède pas de champ de sélection de type de données : le type est celui affiché sur le champ sélectionné dans l'explorateur de topics (ci-dessous), et cliquer sur un champ adapte automatiquement le type de l'objet. Les objets de couleur (RVB) acceptent {"r","g","b"}, {"red","green","blue"}, [r,g,b], #RRGGBB et 255,128,0 en entrée, et publient {"r":…,"g":…,"b":…} sauf si un modèle en dispose autrement.
⚠️ Avertissement : Une commande conservée (retained) est réexécutée à chaque reconnexion de l'appareil au broker. Conservez les états, pas les commandes — l'éditeur affiche un avertissement lorsque vous activez l'option retain sur un objet sortant.
Explorateur de topics. MQTT est le seul protocole dont les adresses peuvent être directement scannées sur le réseau. Dans l'éditeur d'objet, sous Configuration du topic MQTT, cliquez sur Scanner le broker : le serveur écoute l'ensemble du broker pendant quatre secondes et indique le nombre de topics détectés (les topics avec messages conservés/retained apparaissent instantanément, un scan court affiche donc l'essentiel des données utiles ; pour un appareil ne conservant pas ses messages, déclenchez une émission puis scannez à nouveau). La liste est limitée à 500 topics. L'éditeur d'objet ne permet pas de scanner une section spécifique du broker : ouvrez Topic et saisissez du texte dans Rechercher des topics… pour filtrer les éléments détectés, ou saisissez manuellement le topic complet. Chaque ligne indique le topic et son dernier payload, accompagné du badge retained. Sélectionnez un topic et :
- pour un payload JSON, l'ensemble des champs apparaît sous Sélectionnez la valeur suivie par cet objet — un clic configure le chemin JSON, le type d'objet et, pour les booléens, les tokens ON/OFF selon la syntaxe propre à l'appareil ;
- pour un payload simple, Utiliser le payload brut comme
définit le type.
Sélectionnez le topic avant de cliquer sur un champ : choisir un autre topic réinitialise le format de payload, le chemin JSON et les tokens. Ce clic ne renseigne pas le Facteur d'échelle ni l'Offset.
Vous pouvez également saisir un topic non détecté lors du scan — un topic de commande peut ne jamais avoir été publié, et un objet entrant peut nécessiter un caractère générique. Saisissez-le dans Topic et cliquez sur Utiliser « … » dans la liste.

Comportements à retenir
- État immédiat après redémarrage. Les messages conservés (retained) sont renvoyés par le broker à chaque connexion ou reconnexion, permettant aux widgets d'afficher leurs valeurs sans attendre la publication suivante de l'appareil.
- Aucun retour d'état simulé. Une commande n'est confirmée que lorsque l'appareil publie sur son topic d'état (ou lorsque le broker le renvoie) — exactement comme les objets d'état KNX. Si l'appareil est hors ligne, le widget ne simule aucun changement.
- Commandes pendant une coupure. Les commandes avec QoS 1 ou 2 sont mises en file d'attente lorsque le broker est inaccessible et transmises lors de la reconnexion ; les commandes QoS 0 vers un broker inaccessible échouent et sont consignées dans les logs.
- Sécurité. Les payloads supérieurs à 64 Ko sont ignorés avec un avertissement ; un seul abonnement est ouvert par filtre de topic distinct, quel que soit le nombre d'objets associés.
Exemple pratique — une lampe variable Zigbee2MQTT
Zigbee2MQTT publie l'état de la lampe en JSON sur zigbee2mqtt/lamp ({"state":"ON","brightness":178}) et reçoit les commandes sur zigbee2mqtt/lamp/set. La luminosité s'échelonne de 0 à 254.
- Créez une connexion MQTT pour le broker (voir « Connexions ») : adresse du broker
192.168.1.10, port1883, identifiants du broker Zigbee2MQTT si nécessaire. Cliquez sur Tester — la réussite doit être confirmée. - Dans Appareils, ajoutez un widget Variateur « Lampe bureau ». Sous Protocole, sélectionnez votre connexion broker selon le nom défini. L'appareil est créé avec quatre objets : Commutation ON/OFF, Retour commutation, Consigne de variation et Retour variation.
- Sur Commutation ON/OFF (commande marche/arrêt) : saisissez
zigbee2mqtt/lamp/setdans Topic et cliquez sur Utiliser « … » dans la liste. Définissez Token ON surON, Token OFF surOFFet Modèle de payload sur{"state":"{{value}}"}. Saisissez explicitement les tokens : les mentions griséesONetOFFne sont que des indications ; sans saisie, l'interrupteur publietrueoufalse. - Sur Retour commutation (état marche/arrêt) : cliquez sur Scanner le broker, sélectionnez
zigbee2mqtt/lamp, puis cliquez sur le champstate— l'éditeur applique le chemin JSONstateet les tokensON/OFF. - Sur Consigne de variation (commande de luminosité) : topic
zigbee2mqtt/lamp/set, Modèle de payload{"brightness":{{value}}}, Facteur d'échelle0.3937, Offset0. - Sur Retour variation (état de luminosité) : topic
zigbee2mqtt/lamp, cliquez sur le champbrightness, et appliquez le même Facteur d'échelle0.3937. Cela équivaut approximativement à100/254: les valeurs entrantes sont multipliées par ce facteur (Zigbee 0–254 devient 0–100 %), les valeurs sortantes sont divisées par celui-ci (0–100 % devient 0–254). - Cliquez sur Enregistrer l'objet pour chaque objet, puis cliquez sur Appliquer les modifications dans le menu latéral et confirmez.
- Réglez la luminosité sur
50 %dans l'application. La lampe reçoit environ127, et son retour d'état renvoie environ50 %. Le curseur se positionne d'après le topic d'état, et toute action physique sur la télécommande de la lampe met également l'application à jour.
📘 Note : La valeur transmise n'est pas arrondie :
50 %est publié sous la forme127.000254. L'éditeur d'objet ne comportant pas de champ de sélection de type de données, il n'est pas possible d'imposer un nombre entier sur un objet de commande. Assurez-vous que votre lampe accepte les valeurs décimales de luminosité.
Liaison MQTT
Les objets MQTT se configurent dans la boîte de dialogue des paramètres d'objet (ouvrez l'objet via Modifier, voir « Paramètres d'objet, journalisation & notifications »). La section propre au protocole se compose de trois cartes :
Configuration du topic MQTT
| Champ | Description |
|---|---|
| Topic | Le topic auquel cet objet s'abonne (In : topic d'état — caractères génériques + et # autorisés) ou sur lequel il publie (Out : topic de commande — sans caractère générique). Sélectionnez-le dans la liste après un Scan broker, ou saisissez-le. L'adresse enregistrée est <connexion>:<topic>. |
| Scanner le broker | Écoute le broker pendant quelques secondes et liste les topics détectés, avec leur Dernier payload et un badge retained. Lorsqu'un topic est sélectionné, un payload JSON présente ses champs sous Sélectionnez la valeur suivie par cet objet — un clic configure le chemin JSON, le type de données et les tokens ON/OFF ; un payload brut propose Utiliser le payload brut comme |
| Format du payload | Valeur brute (l'intégralité du payload constitue la valeur) ou JSON avec un Chemin JSON (state, sensor.temperature, values[0]). |
| Token ON / Token OFF | Objets booléens : valeurs transmises et attendues par l'appareil pour vrai/faux (ex. ON / OFF). |
Publication (objets sortants)
| Champ | Description |
|---|---|
| Modèle de payload | Optionnel. {{value}} est remplacé par la valeur ; laissez vide pour publier la valeur brute. |
| QoS | Valeur par défaut du broker, 0, 1 ou 2 — niveau de garantie de livraison pour cette commande. |
| Retenir les messages publiés | Désactivé par défaut. Une commande conservée (retained) se réexécute à chaque reconnexion de l'appareil — conservez les états, pas les commandes. |
Abonnement (objets entrants)
| Champ | Description |
|---|---|
| Intervalle minimum (ms) | Les données fréquentes de capteurs sont limitées à cette fréquence (100 ms par défaut) ; la dernière valeur est toujours transmise. 0 désactive la fonction. |
| Facteur d'échelle / Offset | Objets numériques : valeur = brut × échelle + offset en réception, opération inverse lors de la publication. |
Ces paramètres sont stockés sous forme de chaîne de type de données de l'objet (ex. BOOL:PATH=state:ON=ON:OFF=OFF) — la structure, l'explorateur de topics et un exemple détaillé sont présentés dans la section MQTT ci-dessus.
