En MQTT I: lo esencial vimos qué es un broker y cómo poner MQTT en marcha. Aquí entramos en lo que pasa por dentro: cómo aparecen solos los dispositivos, por qué a veces quedan entidades fantasma, cómo sabe Home Assistant que algo está desconectado y cómo depurar cuando no llega nada.
Fuente: documentación oficial de la integración MQTT.
1. Descubrimiento
El descubrimiento MQTT es lo que hace que un dispositivo de Zigbee2MQTT o Tasmota aparezca solo. El aparato publica una ficha de configuración en un tema especial y Home Assistant la convierte en un dispositivo con sus entidades.
El tema siempre sigue este formato:
<prefijo>/<tipo>/[<node_id>/]<object_id>/config
- Prefijo:
homeassistantpor defecto. Se cambia en las opciones de la integración. - Tipo: la plataforma (
sensor,light,switch…) odevicepara describir un dispositivo entero en un solo mensaje. - object_id: un identificador único; usa el mismo que el
unique_id. Solo letras, números,_y-. Elnode_ides opcional y Home Assistant lo ignora.
Descubrimiento por dispositivo
Es el formato recomendado hoy: un mensaje describe el dispositivo y todas sus entidades. Por ejemplo, un ESP32 en el garaje que publica temperatura y humedad en JSON en casa/garaje/clima. Su ficha, en el tema homeassistant/device/garaje_esp32/config:
{
"dev": { "ids": "garaje_esp32", "name": "Sensor del garaje", "mf": "Casero", "mdl": "ESP32" },
"o": { "name": "mi-firmware", "sw": "1.0" },
"state_topic": "casa/garaje/clima",
"availability_topic": "casa/garaje/estado",
"cmps": {
"temp": {
"p": "sensor",
"unique_id": "garaje_temperatura",
"name": "Temperatura",
"device_class": "temperature",
"unit_of_measurement": "°C",
"value_template": "{{ value_json.temperatura }}"
},
"hum": {
"p": "sensor",
"unique_id": "garaje_humedad",
"name": "Humedad",
"device_class": "humidity",
"unit_of_measurement": "%",
"value_template": "{{ value_json.humedad }}"
}
}
}
dev(dispositivo) yo(origen: quién publica la ficha) son obligatorios en el descubrimiento por dispositivo.state_topicyavailability_topicvan fuera decmpsporque los comparten las dos entidades.- Cada componente de
cmpsllevap(plataforma) y suunique_id. - Las claves admiten abreviaturas para ahorrar bytes en aparatos pequeños:
stat_tporstate_topic,uniq_idporunique_id,idsporidentifiers… La lista completa está en la documentación oficial.
Puedes probarlo sin programar nada: en Ajustes → Dispositivos y servicios → MQTT → Configurar → Publicar un paquete, pega el tema y el JSON, marca Retener y publica. El dispositivo aparece al momento.
Borrar lo descubierto (y las entidades fantasma)
Para eliminar un dispositivo descubierto, publica un mensaje vacío y retenido en su tema de configuración. Si solo quieres quitar una entidad de un dispositivo, publica la ficha con ese componente reducido a su p y, después, otra ficha sin él.
Las entidades fantasma son casi siempre fichas retenidas de aparatos que ya no existen: el broker se las sigue entregando a Home Assistant en cada arranque. Escucha homeassistant/# para encontrarlas y bórralas con el mensaje vacío.
¿Tienes un aparato con descubrimiento por entidad? La documentación oficial explica cómo migrar al formato por dispositivo sin perder el historial, con el mensaje
{"migrate_discovery": true }.
2. Retenidos, nacimiento y última voluntad
- Retenido (retain): el broker guarda el último mensaje de un tema y se lo entrega a quien se suscriba después. Es lo que permite que, tras reiniciar Home Assistant, cada sensor tenga valor al instante. Úsalo para estados y fichas de descubrimiento, no para órdenes: un «enciende» retenido se repetiría en cada reconexión.
- Nacimiento: al arrancar, Home Assistant publica
onlineenhomeassistant/status. Los aparatos bien hechos lo escuchan y vuelven a publicar su ficha tras una pausa aleatoria, para no saturar el broker. - Última voluntad (last will): al conectarse, un cliente deja dicho al broker qué publicar si desaparece. Home Assistant deja
offlineenhomeassistant/status. Tu aparato puede dejarofflineen su tema de disponibilidad.
Disponibilidad
Con la disponibilidad, una entidad pasa a No disponible cuando su aparato se cae, en vez de quedarse con el último valor como si nada:
availability_topic: el tema que vigilar. Por defecto,onlinesignifica disponible yoffline, no disponible (payload_availableypayload_not_available).- Con varios temas (una lista en
availability),availability_modedecide:all(todos online),any(basta uno) olatest(manda el último mensaje, por defecto). availability_templateextrae el estado si el mensaje es un JSON.
3. Calidad de servicio (QoS)
En casa, QoS 0 basta para sensores que publican cada pocos segundos y QoS 1 es la opción sensata para órdenes. QoS 2 casi nunca hace falta en una red local.
4. Entidades a mano, en YAML
Si un aparato publica por MQTT pero no tiene descubrimiento, defines tú la entidad en configuration.yaml. El formato recomendado es una lista con un elemento por entidad:
mqtt:
- sensor:
name: "Temperatura del trastero"
unique_id: trastero_temperatura
state_topic: "casa/trastero/clima"
value_template: "{{ value_json.temperatura }}"
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
availability_topic: "casa/trastero/estado"
- switch:
name: "Ventilador del trastero"
unique_id: trastero_ventilador
state_topic: "casa/trastero/ventilador"
command_topic: "casa/trastero/ventilador/set"
payload_on: "ON"
payload_off: "OFF"
- Pon siempre un
unique_id: sin él no podrás cambiar el nombre ni el área desde la interfaz. - Tras editar, recarga con Herramientas para desarrolladores → YAML → Entidades MQTT configuradas manualmente (la acción
mqtt.reload), sin reiniciar.
5. Publicar desde una automatización
La acción mqtt.publish envía cualquier mensaje. Por ejemplo, avisar a una pantalla casera de que alguien ha llamado:
actions:
- action: mqtt.publish
data:
topic: "casa/pantalla/aviso"
payload: "Han llamado a la puerta"
qos: 1
retain: false
Para lo contrario, reaccionar a un mensaje, usa el disparador MQTT.
6. Seguridad
- Usuarios distintos para cada aparato o grupo de aparatos, nunca el de un administrador.
- TLS: al reconfigurar la integración, en las opciones avanzadas del broker, la validación del certificado del broker puede ser Automática (certificados de confianza) o Personalizada (subes la CA de un certificado autofirmado). También admite certificado de cliente.
- Home Assistant usa la versión 5 del protocolo MQTT: tu broker debe admitirla. Mosquitto la admite.
- Transporte
tcp(normal) owebsocketssi tu broker solo es accesible así. - No expongas el puerto 1883 a Internet. Si un aparato está fuera de casa, usa una VPN.
- ActiveMQ y el plugin MQTT de RabbitMQ no están soportados: dan problemas con los mensajes retenidos.
7. Depurar
- Escucha
#en Configurar → Escuchar un tema. Si el mensaje no aparece, el problema está en el aparato o en el broker, no en Home Assistant. - Comprueba el JSON: si el mensaje llega pero la entidad no cambia, revisa el
value_template. Pruébalo en Herramientas para desarrolladores → Plantilla. - Activa el registro detallado un rato y mira Ajustes → Sistema → Registros:
logger:
default: warning
logs:
homeassistant.components.mqtt: debug
mqtt.dumpguarda en un fichero todos los mensajes de un tema durante unos segundos: útil para enviarlo en un informe de error.
Consulta siempre la fuente oficial: integración MQTT en home-assistant.io. La ficha resumida está en el Repositorio: MQTT.
Infografías: NODARA, a partir de la documentación oficial de Home Assistant.