Zigbee2MQTT es un puente de código abierto que habla directamente con dispositivos Zigbee (sensores, bombillas, enchufes, interruptores) a través de un coordinador USB y publica su estado en un broker MQTT. Así puedes usar dispositivos de muchos fabricantes sin sus pasarelas propietarias. En este tutorial instalarás Mosquitto y Zigbee2MQTT en Ubuntu 24.04, lo ejecutarás como servicio de systemd, emparejarás un dispositivo y lo integrarás con Home Assistant.
Requisitos previos
Para seguir esta guía necesitas:
- Un equipo con Ubuntu 24.04 LTS (o Debian 12) al alcance de la radio de tus dispositivos: un mini PC, un Raspberry Pi 4/5 o un servidor doméstico. El coordinador se conecta por USB, así que un servidor en un centro de datos no sirve para esta parte.
- Un usuario no root con privilegios
sudo. - Un coordinador Zigbee compatible. Los más habituales son:
| Coordinador | Chip | Valor de adapter |
|---|---|---|
| SONOFF Zigbee 3.0 USB Dongle Plus (ZBDongle-P) | TI CC2652P | zstack |
| SONOFF Zigbee 3.0 USB Dongle Plus (ZBDongle-E) | Silicon Labs EFR32MG21 | ember |
| ConBee II / ConBee III | Dresden Elektronik | deconz |
Consejoconecta el coordinador con un cable alargador USB, lejos de puertos USB 3.0 y discos externos. Sus interferencias en 2,4 GHz son la causa más frecuente de una red Zigbee inestable.
Paso 1: Identificar el coordinador
Conecta el coordinador y localiza su ruta estable en /dev/serial/by-id/. Esta ruta no cambia entre reinicios, a diferencia de /dev/ttyUSB0 o /dev/ttyACM0:
ls -l /dev/serial/by-id/
lrwxrwxrwx 1 root root 13 Sep 25 10:12 usb-ITead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_4c2f1a7b-if00-port0 -> ../../ttyUSB0
Copia la ruta completa; la usarás en el paso 5. El dispositivo pertenece al grupo dialout, así que añade tu usuario a ese grupo para que Zigbee2MQTT pueda abrirlo:
sudo usermod -aG dialout $USER
Cierra la sesión SSH y vuelve a entrar para que el cambio de grupo tenga efecto. Compruébalo con groups; dialout debe aparecer en la lista.
Paso 2: Instalar y configurar Mosquitto
Zigbee2MQTT publica el estado de los dispositivos y recibe órdenes a través de MQTT. Instala el broker Mosquitto y sus clientes:
sudo apt update
sudo apt install mosquitto mosquitto-clients
Crea un usuario para Zigbee2MQTT. El comando pide la contraseña dos veces:
sudo mosquitto_passwd -c /etc/mosquitto/passwd z2m
sudo chown mosquitto:mosquitto /etc/mosquitto/passwd
sudo chmod 600 /etc/mosquitto/passwd
Si más adelante conectas Home Assistant, crea otro usuario para él con el mismo comando pero sin -c, que sobrescribiría el fichero.
Activa la autenticación y un listener en el puerto 1883:
sudo nano /etc/mosquitto/conf.d/zigbee.conf
listener 1883
allow_anonymous false
password_file /etc/mosquitto/passwd
Reinicia Mosquitto y comprueba que acepta al usuario. Sustituye your_mqtt_password por la contraseña que acabas de crear:
sudo systemctl restart mosquitto
mosquitto_pub -h localhost -u z2m -P your_mqtt_password -t prueba -m hola && echo OK
OK
Paso 3: Instalar Node.js 22 y dependencias de compilación
Zigbee2MQTT 2.x necesita Node.js 20 o superior, y Ubuntu 24.04 trae la 18. Añade el repositorio de NodeSource para la rama 22 LTS con su clave en /etc/apt/keyrings:
sudo apt install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
Instala Node.js junto con git y las herramientas que necesitan algunos módulos nativos:
sudo apt update
sudo apt install nodejs git make g++ gcc libsystemd-dev
Zigbee2MQTT usa pnpm como gestor de paquetes. Node.js 22 incluye Corepack, que lo proporciona:
sudo corepack enable
node --version
pnpm --version
v22.19.0
10.15.1
La primera llamada a pnpm puede pedir confirmación para descargarlo; responde Y.
Paso 4: Descargar Zigbee2MQTT
Crea el directorio de instalación, dáselo a tu usuario y clona la rama estable:
sudo mkdir /opt/zigbee2mqtt
sudo chown -R $USER: /opt/zigbee2mqtt
git clone --depth 1 https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
Instala las dependencias exactas del fichero de bloqueo:
cd /opt/zigbee2mqtt
pnpm install --frozen-lockfile
La instalación tarda unos minutos en un Raspberry Pi. Termina sin errores con un resumen de paquetes añadidos.
Paso 5: Configurar Zigbee2MQTT
Parte del fichero de ejemplo que incluye el repositorio:
cp /opt/zigbee2mqtt/data/configuration.example.yaml /opt/zigbee2mqtt/data/configuration.yaml
nano /opt/zigbee2mqtt/data/configuration.yaml
Ajusta estas secciones y deja el resto del fichero (incluida la clave version) como está:
homeassistant:
enabled: false
frontend:
enabled: true
port: 8080
mqtt:
base_topic: zigbee2mqtt
server: mqtt://localhost:1883
user: z2m
password: your_mqtt_password
serial:
port: /dev/serial/by-id/usb-ITead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_4c2f1a7b-if00-port0
adapter: zstack
advanced:
network_key: GENERATE
pan_id: GENERATE
ext_pan_id: GENERATE
log_level: info
serial.portes la ruta del paso 1 yadapterel valor de la tabla de requisitos.GENERATEhace que Zigbee2MQTT cree una clave de red y unos identificadores aleatorios en el primer arranque y los guarde en este fichero. No los cambies después: todos los dispositivos emparejados dependen de ellos.
Haz una primera ejecución manual para ver los mensajes de arranque:
cd /opt/zigbee2mqtt
pnpm start
[2026-09-25 10:25:31] info: z2m: Starting Zigbee2MQTT version 2.6.1
[2026-09-25 10:25:33] info: z2m: Coordinator firmware version: '{"meta":{...},"type":"zStack3x0"}'
[2026-09-25 10:25:34] info: z2m: Connected to MQTT server
[2026-09-25 10:25:34] info: z2m: Started frontend on port 8080
[2026-09-25 10:25:34] info: z2m: Zigbee2MQTT started!
La primera vez compila el código antes de arrancar, así que tarda algo más. Cuando veas Zigbee2MQTT started!, detenlo con Ctrl+C.
Paso 6: Ejecutar Zigbee2MQTT como servicio
Crea una unidad de systemd para que arranque con el sistema y se reinicie si falla:
sudo nano /etc/systemd/system/zigbee2mqtt.service
Sustituye your_user por tu nombre de usuario:
[Unit]
Description=Zigbee2MQTT
After=network.target mosquitto.service
[Service]
Environment=NODE_ENV=production
ExecStart=/usr/bin/node index.js
WorkingDirectory=/opt/zigbee2mqtt
User=your_user
Restart=always
RestartSec=10s
[Install]
WantedBy=multi-user.target
Recarga systemd y activa el servicio:
sudo systemctl daemon-reload
sudo systemctl enable --now zigbee2mqtt
sudo systemctl status zigbee2mqtt
● zigbee2mqtt.service - Zigbee2MQTT
Loaded: loaded (/etc/systemd/system/zigbee2mqtt.service; enabled; preset: enabled)
Active: active (running) since Thu 2026-09-25 10:31:02 CEST; 6s ago
Los mensajes del servicio se consultan con journalctl -u zigbee2mqtt -f.
Paso 7: Emparejar un dispositivo
La interfaz web escucha en el puerto 8080. Si solo vas a usarla desde tu red local, ábrela para esa red; sustituye 192.168.1.0/24 por tu rango:
sudo ufw allow from 192.168.1.0/24 to any port 8080 proto tcp
Abre http://your_server_ip:8080 en el navegador y pulsa Permit join (All). La red acepta dispositivos nuevos durante unos minutos. Pon el dispositivo en modo de emparejamiento según su manual (normalmente mantener pulsado el botón unos segundos o encender y apagar una bombilla varias veces).
También puedes abrir el emparejamiento por MQTT durante 180 segundos:
mosquitto_pub -h localhost -u z2m -P your_mqtt_password -t zigbee2mqtt/bridge/request/permit_join -m '{"time": 180}'
Cuando el dispositivo se una, el registro lo confirma:
journalctl -u zigbee2mqtt -n 20 --no-pager
info: z2m: Device '0x00158d0001a2b3c4' joined
info: z2m: Successfully interviewed '0x00158d0001a2b3c4', device has successfully been paired
Dale un nombre descriptivo. Puedes hacerlo desde la interfaz web o por MQTT:
mosquitto_pub -h localhost -u z2m -P your_mqtt_password -t zigbee2mqtt/bridge/request/device/rename -m '{"from": "0x00158d0001a2b3c4", "to": "salon/sensor_temperatura"}'
Comprueba que el dispositivo publica su estado en el nuevo topic:
mosquitto_sub -h localhost -u z2m -P your_mqtt_password -t 'zigbee2mqtt/salon/#' -v
zigbee2mqtt/salon/sensor_temperatura {"battery":100,"humidity":52.3,"linkquality":120,"temperature":21.8,"voltage":3005}
Pulsa Ctrl+C para salir.
Paso 8: Integrar con Home Assistant
Zigbee2MQTT anuncia cada dispositivo a Home Assistant mediante MQTT Discovery, de modo que aparecen solos con sus entidades. Activa la integración en configuration.yaml:
nano /opt/zigbee2mqtt/data/configuration.yaml
homeassistant:
enabled: true
Reinicia el servicio:
sudo systemctl restart zigbee2mqtt
En Home Assistant ve a Ajustes > Dispositivos y servicios > Añadir integración > MQTT e indica la IP de este equipo, el puerto 1883 y un usuario de Mosquitto. Si Home Assistant está en otra máquina, permite su IP en el cortafuegos:
sudo ufw allow from 192.168.1.50 to any port 1883 proto tcp
Tras unos segundos, los dispositivos de Zigbee2MQTT aparecen en la integración MQTT con sus sensores y controles.
Paso 9: Actualizar firmware de dispositivos (OTA)
Muchos dispositivos admiten actualizaciones de firmware por el aire. La forma más sencilla es la pestaña OTA de la interfaz web, que busca y aplica actualizaciones por dispositivo. Por MQTT, primero comprueba si hay una disponible:
mosquitto_pub -h localhost -u z2m -P your_mqtt_password -t zigbee2mqtt/bridge/request/device/ota_update/check -m '{"id": "salon/sensor_temperatura"}'
Si la hay, lanza la actualización:
mosquitto_pub -h localhost -u z2m -P your_mqtt_password -t zigbee2mqtt/bridge/request/device/ota_update/update -m '{"id": "salon/sensor_temperatura"}'
La actualización puede tardar más de 30 minutos en dispositivos a batería; el progreso aparece en el registro del servicio.
Solución de problemas
Error: Failed to connect to the adapter o Permission denied al abrir el puerto. Comprueba que la ruta de serial.port existe con ls -l /dev/serial/by-id/, que tu usuario está en dialout y que el valor de adapter corresponde al chip del coordinador.
Not authorized al conectar con MQTT. El usuario o la contraseña de la sección mqtt no coinciden con los de Mosquitto. Pruébalos con mosquitto_sub -h localhost -u z2m -P your_mqtt_password -t prueba.
Los dispositivos se desconectan o no se emparejan. Aleja el coordinador de puertos USB 3.0 con un alargador y añade dispositivos alimentados por red (enchufes, bombillas) entre el coordinador y los sensores lejanos: actúan como repetidores. La pestaña Map de la interfaz web muestra la calidad de cada enlace.
Conclusión
Tienes Zigbee2MQTT funcionando como servicio, con Mosquitto protegido por contraseña, un dispositivo emparejado con nombre propio e integración automática con Home Assistant. Como siguientes pasos, puedes proteger la interfaz web con frontend.auth_token, hacer copias de seguridad periódicas del directorio /opt/zigbee2mqtt/data (contiene la clave de red y la base de datos de dispositivos) y actualizar Zigbee2MQTT con git pull seguido de pnpm install --frozen-lockfile y un reinicio del servicio.
