Integración MQTT
MQTT conecta HyperVisu con el mundo de publicación/suscripción: Zigbee2MQTT, Tasmota, Shelly (modo MQTT), ESPHome, pasarelas de energía y cualquier firmware personalizado que se comunique con un broker MQTT. HyperVisu es un cliente MQTT: se suscribe a los topics en los que los dispositivos publican su estado y publica comandos en los topics que los dispositivos escuchan. No hay sondeos (polling): un dispositivo que cambia de estado publica de inmediato y el widget se actualiza al instante.
En el centro se ubica un broker. Puede ser uno que ya esté en funcionamiento (Mosquitto, EMQX, el incluido con una instalación de Zigbee2MQTT, …) o el broker integrado en HyperVisu, que el servidor puede ejecutar directamente para que los dispositivos se conecten a él (consulte «El broker MQTT integrado»). Todo lo expuesto en este artículo se aplica en ambos casos: el broker integrado es un broker estándar al que se accede mediante una conexión habitual.
Lo que necesita: la dirección y el puerto del broker, sus credenciales si las requiere, y los topics y el formato de payload del dispositivo (obtenidos de su documentación o leídos directamente del broker con el explorador de topics que se describe a continuación).
Conexiones. Active primero MQTT Protocol en la página Servicios (consulte «Servicios y protocolos»); por defecto está desactivado en un servidor nuevo. MQTT admite múltiples conexiones: una conexión por cada broker (consulte «Conexiones»). En Añadir conexión, seleccione la tarjeta MQTT: el cuadro de diálogo solicita un Nombre de instancia, la Dirección del broker, el Puerto, el ID de cliente y las credenciales, e incluye un botón Probar. El Certificado CA y las Opciones del broker (Keepalive, QoS por defecto, Topic de disponibilidad, Clean session) no se encuentran en este diálogo: se configuran en la conexión guardada, que se abre en su editor en cuanto hace clic en Crear conexión. El editor de conexiones contiene:
| Campo | Descripción |
|---|---|
| Dirección del broker | Host, o una URL completa: mqtt://, mqtts://, ws://, wss:// (un host simple implica mqtt://). Se conserva la ruta en la dirección; por ejemplo, ws://192.168.1.30/mqtt. |
| Puerto | El puerto de escucha: normalmente 1883 para MQTT estándar y 8883 para MQTT sobre TLS. Especifíquelo siempre: en el diálogo Añadir conexión, un puerto vacío se guarda como 1883 independientemente del esquema, y el campo Puerto tiene prioridad sobre el puerto indicado en la dirección. |
| Usuario / Contraseña | Dejar vacío para un broker anónimo. |
| ID de cliente | Dejar vacío para derivar uno a partir de la dirección MAC del servidor. |
| Aceptar certificados autofirmados | Visible solo para mqtts:// / wss://. Desactivado por defecto: el certificado del broker debe estar firmado por una autoridad de confianza. Si se activa, el certificado no se verifica. |
| Certificado CA | Visible solo para TLS: el certificado PEM de la autoridad que firmó el broker, cuando no es una entidad pública. |
| Keepalive | Tiempo máximo que un enlace inactivo puede permanecer abierto antes de enviar un ping (por defecto 60 s). |
| QoS por defecto | 0 · como máximo una vez, 1 · al menos una vez o 2 · exactamente una vez: utilizado por todos los objetos que no definan el suyo propio. |
| Topic de disponibilidad / Anunciar disponibilidad de HyperVisu | Dónde publica HyperVisu su propio estado online / offline (por defecto hypervisu/status, retenido). El broker publica offline en su nombre si se pierde la conexión. |
| Clean session | Activado (por defecto): el broker descarta las suscripciones si la conexión se interrumpe y HyperVisu se vuelve a suscribir al reconectarse. Desactívelo solo si el broker debe almacenar mensajes en cola mientras HyperVisu no esté disponible. |
El botón Probar en una conexión MQTT realiza una comprobación real: el servidor se conecta al broker y espera su confirmación (en un plazo de 10 s). Un resultado correcto muestra Conexión establecida. En el diálogo Añadir conexión, Probar comprueba los valores introducidos antes de crear la conexión. En una conexión guardada, Probar verifica los datos almacenados, no los campos que aún no se hayan guardado: haga clic primero en Guardar conexión y luego en Probar. Una prueba correcta demuestra que la dirección, el puerto, las credenciales y la configuración TLS son aceptados por el broker; no confirma que un topic específico contenga datos.
El estado de la conexión muestra Conectado mientras el enlace con el broker esté activo. Si el broker deja de estar disponible, se reintenta la conexión cada pocos segundos indefinidamente; no requiere reiniciar el servidor.
📘 Nota: Tras crear o guardar una conexión, aparece Aplicar cambios con un contador en la barra lateral. La conexión ya está operativa sin este paso; al aplicar los cambios se recarga la configuración del servidor y se restablece el contador.

Vinculación de un objeto (consulte «Vinculación MQTT» a continuación). Para cada objeto se introduce un Topic; la administración lo almacena como <conexión>:<topic>, lo que permite que dos brokers utilicen el mismo nombre de topic. La dirección del objeto determina su comportamiento:
| Dirección | Comportamiento |
|---|---|
| Entrada | Se suscribe al topic (topic de estado). Se admiten comodines: + para un nivel, # para los restantes. |
| Salida | Publica en el topic (topic de comando). Debe ser un topic concreto, sin comodines. |
| Entrada/Salida | Se suscribe y publica en el mismo topic. Solo es adecuado para dispositivos que mantienen el estado retenido en un único topic; se recomienda utilizar dos objetos (uno de Entrada y uno de Salida). |
El códec de payload —cómo se convierte el payload en un valor y viceversa— se define mediante la cadena de tipo de datos del objeto, generada por el editor a partir de los siguientes campos:
| Campo | Almacenado como | Significado |
|---|---|---|
| Formato de payload | — / PATH= | Valor sin procesar: la totalidad del payload es el valor. JSON: el valor se extrae en la Ruta JSON (state, sensor.temperature, values[0]). |
| Token ON / Token OFF | ON= / OFF= | Para objetos booleanos: lo que el dispositivo escribe y espera para verdadero/falso (p. ej. ON / OFF). Sin tokens, se interpretan true/false, 1/0 y on/off en la entrada y se publica true/false. |
| Escala / Offset | SCALE= / OFFSET= | Lectura: valor = raw × escala + offset; la publicación aplica la función inversa, raw = (valor − offset) ÷ escala. Un objeto de comando y su objeto de respuesta toman por tanto la misma escala. |
| Plantilla de payload | PUB= | Plantilla de publicación opcional; {{value}} se sustituye por el valor, p. ej. {"state":"{{value}}"}. Dejar vacío para publicar el valor directamente. |
| QoS | QOS= | Por defecto del broker, 0, 1 o 2 para este comando. |
| Retener mensajes publicados | RETAIN=1 | Desactivado por defecto. |
| Intervalo mínimo (ms) | THROTTLE= | Los sensores de alta frecuencia se limitan a esta tasa (por defecto 100 ms); el último valor siempre se procesa. 0 desactiva la limitación. |
La cadena tiene la estructura TIPO:parámetro:parámetro… — por ejemplo BOOL:PATH=state:ON=ON:OFF=OFF o FLOAT:SCALE=0.3937:PUB={"brightness":{{value}}}. Una cadena vacía significa «utilizar el payload sin procesar según el tipo del objeto». El editor de objetos no incluye un selector de tipo de datos: el tipo corresponde al indicado en el campo seleccionado en el explorador de topics (más adelante), y al hacer clic en un campo se adapta automáticamente el tipo del objeto. Los objetos de color (RGB) aceptan {"r","g","b"}, {"red","green","blue"}, [r,g,b], #RRGGBB y 255,128,0 en la entrada, y publican {"r":…,"g":…,"b":…} salvo que una plantilla especifique otro formato.
⚠️ Advertencia: Un comando retenido se vuelve a ejecutar cada vez que el dispositivo se reconecta al broker. Se debe retener el estado, no los comandos; el editor muestra una advertencia si se activa la retención en un objeto de salida.
Explorador de topics. MQTT es un protocolo cuyas direcciones pueden identificarse directamente en la red. En el editor de objetos, en Configuración del topic MQTT, haga clic en Escanear broker: el servidor escucha la totalidad del broker durante cuatro segundos e indica el número de topics detectados (los topics retenidos se reciben de inmediato, por lo que un escaneo rápido muestra la mayoría de los elementos útiles; para un dispositivo sin retención, genere una nueva lectura y escanee de nuevo). La lista se limita a un máximo de 500 topics. El editor de objetos no realiza escaneos parciales: abra Topic y escriba en Buscar topics… para filtrar los resultados, o introduzca el topic completo manualmente. Cada fila muestra el topic y su último payload, junto con una etiqueta de retenido. Seleccione un topic y:
- en un payload JSON, cada campo se desglosa en Seleccione el valor que debe seguir este objeto: un solo clic define la ruta JSON, el tipo de objeto y, en booleanos, los tokens ON/OFF con la sintaxis exacta del dispositivo;
- en un payload simple, Usar el payload sin procesar como
establece el tipo.
Seleccione el topic antes de hacer clic en un campo: elegir otro topic restablece el formato del payload, la ruta JSON y los tokens. Esta acción no rellena Escala ni Offset.
También es posible introducir un topic que no haya aparecido en el escaneo: un topic de comando puede no haber sido publicado nunca, y un objeto de entrada puede requerir un comodín. Escríbalo en Topic y haga clic en Usar "…" en la lista.

Comportamientos a tener en cuenta
- Estado instantáneo tras un reinicio. El broker reenvía los mensajes retenidos en cada conexión o reconexión, de modo que los widgets muestran sus valores sin esperar a la siguiente publicación del dispositivo.
- Sin confirmaciones simuladas. Un comando solo se confirma cuando el dispositivo publica en su topic de estado (o el broker lo reenvía), exactamente igual que los objetos de estado en KNX. Si el dispositivo no responde, el widget no simula el cambio.
- Comandos durante una pérdida de conexión. Los comandos con QoS 1 o 2 se almacenan en cola mientras el broker no esté accesible y se entregan al restablecerse el enlace; los comandos con QoS 0 enviados a un broker inaccesible fallan y se registran en el log.
- Protección. Los payloads superiores a 64 KB se descartan con un aviso; se crea una única suscripción por cada filtro de topic distinto, con independencia de cuántos objetos lo compartan.
Ejemplo práctico: una lámpara regulable en Zigbee2MQTT
Zigbee2MQTT publica el estado de la lámpara en formato JSON en zigbee2mqtt/lamp ({"state":"ON","brightness":178}) y recibe comandos en zigbee2mqtt/lamp/set. La regulación de brillo va de 0 a 254.
- Cree una conexión MQTT para el broker (consulte «Conexiones»): dirección del broker
192.168.1.10, puerto1883y las credenciales del broker Zigbee2MQTT si son necesarias. Haga clic en Probar; debe confirmar la conexión. - En Dispositivos, añada un widget de tipo Regulador llamado «Lámpara de oficina». En Protocolo, seleccione la conexión del broker por el nombre asignado. El dispositivo se genera con cuatro objetos: Conmutación ON/OFF, Respuesta de conmutación, Consigna de regulación y Respuesta de regulación.
- En Conmutación ON/OFF (comando de encendido/apagado): introduzca
zigbee2mqtt/lamp/seten Topic y haga clic en Usar "…" en la lista. Configure Token ON comoON, Token OFF comoOFFy Plantilla de payload como{"state":"{{value}}"}. Escriba los tokens manualmente: los textos en grisONyOFFson solo sugerencias; sin ellos, el conmutador publicarátrueofalse. - En Respuesta de conmutación (estado de encendido/apagado): haga clic en Escanear broker, elija
zigbee2mqtt/lampy seleccione el campostate: el editor configurará la ruta JSONstatey los tokensON/OFF. - En Consigna de regulación (comando de brillo): topic
zigbee2mqtt/lamp/set, Plantilla de payload{"brightness":{{value}}}, Escala0.3937, Offset0. - En Respuesta de regulación (estado de brillo): topic
zigbee2mqtt/lamp, seleccione el campobrightnessy configure la misma Escala0.3937. Este factor equivale aproximadamente a100/254: los valores recibidos se multiplican por él (Zigbee 0–254 pasa a 0–100 %) y los valores emitidos se dividen por él (0–100 % pasa a 0–254). - Haga clic en Guardar objeto en cada uno de ellos, luego en Aplicar cambios en la barra lateral y confirme.
- Ajuste el brillo al
50 %en la aplicación. La lámpara recibe aproximadamente127y su respuesta devuelve cerca del50 %. El deslizador se actualiza a partir del topic de estado y el accionamiento mediante un mando físico también actualiza la aplicación.
📘 Nota: El valor transmitido no se redondea:
50 %se publica como127.000254. El editor de objetos no incluye un selector de tipo de datos, por lo que no es posible forzar un número entero en el objeto de comando. Asegúrese de que la lámpara admita valores decimales de brillo.
Vinculación MQTT
Los objetos MQTT se configuran en el cuadro de diálogo de ajustes del objeto (abra el objeto con Editar, consulte «Ajustes de objetos, registro y notificaciones»). La sección específica del protocolo se organiza en tres bloques:
Configuración del topic MQTT
| Campo | Descripción |
|---|---|
| Topic | El topic al que se suscribe este objeto (Entrada: un topic de estado; admite comodines + y #) o en el que publica (Salida: un topic de comando; sin comodines). Selecciónelo en la lista tras Escanear broker o escríbalo manualmente. La dirección almacenada es <conexión>:<topic>. |
| Escanear broker | Escucha en el broker durante unos segundos y muestra los topics detectados, cada uno con su Último payload y una etiqueta de retenido. Con un topic seleccionado, si el payload es JSON se muestran sus campos en Seleccione el valor que debe seguir este objeto; un clic completa la ruta JSON, el tipo de datos y los tokens ON/OFF. Si es un payload simple, ofrece Usar el payload sin procesar como |
| Formato de payload | Valor sin procesar (la totalidad del payload es el valor) o JSON con una Ruta JSON (state, sensor.temperature, values[0]). |
| Token ON / Token OFF | Objetos booleanos: lo que el dispositivo escribe y espera para verdadero/falso (p. ej. ON / OFF). |
Publicación (objetos de salida)
| Campo | Descripción |
|---|---|
| Plantilla de payload | Opcional. {{value}} se sustituye por el valor; dejar vacío para publicar el valor sin formato. |
| QoS | Por defecto del broker, 0, 1 o 2: garantía de entrega para este comando. |
| Retener mensajes publicados | Desactivado por defecto. Un comando retenido se vuelve a ejecutar cada vez que el dispositivo se reconecta; retenga el estado, no los comandos. |
Suscripción (objetos de entrada)
| Campo | Descripción |
|---|---|
| Intervalo mínimo (ms) | Los sensores de alta frecuencia se limitan a esta tasa (por defecto 100 ms); el último valor siempre se procesa. 0 desactiva la limitación. |
| Escala / Offset | Objetos numéricos: valor = raw × escala + offset en la entrada, y la operación inversa al publicar. |
Los campos se guardan como la cadena de tipo de datos del objeto (p. ej. BOOL:PATH=state:ON=ON:OFF=OFF); la sintaxis, el explorador de topics y un ejemplo práctico se detallan en la sección MQTT superior.
