Migrar Zigbee2MQTT de un Dongle Sonoff USB a un Sonoff Dongle-M por TCP/PoE sin perder dispositivos

Uno de los puntos débiles habituales en instalaciones de Home Assistant con Zigbee2MQTT es la ubicación física del coordinador Zigbee. Cuando usamos un dongle USB conectado directamente al servidor, dependemos de que el servidor esté en una zona adecuada para la cobertura Zigbee y, además, podemos sufrir interferencias por USB 3.0, mala ubicación del equipo, reinicios del host o problemas al mover Home Assistant entre máquinas.

Para resolver este problema, he cambiado el coordinador Zigbee USB de Sonoff por un Sonoff Dongle-M, un coordinador Zigbee/Thread que puede funcionar por Ethernet, WiFi o USB, alimentarse por PoE y conectarse a Zigbee2MQTT por TCP. El modelo Dongle-M aparece documentado por Zigbee2MQTT como un adaptador basado en EFR32MG24, con consola web integrada y posibilidad de conexión por Ethernet/WiFi/USB.

La idea es muy interesante: el coordinador Zigbee deja de estar atado físicamente al servidor de Home Assistant y puede colocarse en una zona más adecuada de la vivienda, alimentado por red y PoE.

El objetivo de este manual es documentar el cambio desde un dongle Sonoff USB a un Sonoff Dongle-M por TCP, manteniendo los dispositivos existentes en Zigbee2MQTT y evitando tener que reemparejar toda la red.


Objetivo de la migración

El objetivo es sustituir un coordinador Zigbee USB conectado directamente al servidor por un coordinador Zigbee conectado por red.

En mi caso, el cambio ha sido:

Coordinador antiguo:
Sonoff Zigbee USB DongleCoordinador nuevo:
Sonoff Dongle-M por TCP/PoE

Con esto se consigue:

- Mejor ubicación física del coordinador Zigbee.
- Menos dependencia del puerto USB del servidor.
- Posibilidad de alimentar el coordinador por PoE.
- Menos problemas si Home Assistant se mueve de máquina.
- Conexión por TCP mediante la red local.

Zigbee2MQTT permite usar adaptadores por red mediante una ruta de tipo tcp://IP:PUERTO. En su documentación indica expresamente que, para adaptadores Ethernet, el formato puede ser tcp://192.168.1.12:6638 y recomienda asignar IP estática al adaptador.


Antes de empezar

Antes de cambiar nada, es fundamental entender una cosa: los dispositivos Zigbee están asociados a una red Zigbee concreta. Esa red depende de varios datos importantes:

- IEEE address del coordinador.
- PAN ID.
- Extended PAN ID.
- Network key.
- Canal Zigbee.
- Base de datos de Zigbee2MQTT.

Si alguno de esos datos cambia incorrectamente, Zigbee2MQTT puede arrancar como si fuera una red nueva y los dispositivos dejarán de aparecer o dejarán de responder.

Zigbee2MQTT advierte que cambiar la network_key obliga a reemparejar todos los dispositivos, y que cambiar el canal puede requerir reemparejar algunos dispositivos si no soportan bien el cambio.

Por eso, antes de empezar:

- No borres database.db.
- No borres configuration.yaml.
- No cambies network_key.
- No cambies pan_id.
- No cambies ext_pan_id.
- No cambies el canal Zigbee si no es necesario.
- Haz copia de seguridad antes de tocar nada.

Paso 1: comprobar la IEEE del coordinador antiguo

Para que la migración sea limpia, el nuevo coordinador debe usar la misma IEEE address que el coordinador antiguo.

Zigbee2MQTT documenta que, al migrar de un coordinador a otro, es importante que el nuevo use la misma IEEE address, porque algunos dispositivos buscan al coordinador por esa dirección. También indica que se puede consultar desde el frontend de Zigbee2MQTT o en la primera línea de database.db.

Podemos verla desde el frontend de Zigbee2MQTT:

Zigbee2MQTT → Settings → About → Coordinator IEEE Address

O desde terminal, revisando el archivo database.db:

head -n 1 database.db

La salida será parecida a esta:

{"id":1,"type":"Coordinator","ieeeAddr":"0x00124b000e89686d","nwkAddr":0}

La dirección importante es esta:

0x00124b000e89686d

Esa es la IEEE del coordinador antiguo.


Paso 2: copiar la IEEE al Dongle-M

El siguiente paso es entrar en la interfaz web del Dongle-M y copiar la IEEE del coordinador antiguo al nuevo.

En mi caso, el Dongle-M se puede administrar desde su propia interfaz web. Dependiendo de la red, puede aparecer como:

http://Dongle-M.local

o directamente mediante su dirección IP:

http://192.168.1.X

Desde la interfaz del Dongle-M hay que localizar la opción de configuración Zigbee/Zigbee2MQTT/ZHA y cambiar la IEEE address por la del coordinador antiguo.

El objetivo es que el Dongle-M tenga la misma IEEE que tenía el dongle USB anterior.

Esto es muy importante. Si el Dongle-M arranca con una IEEE distinta, Zigbee2MQTT puede funcionar, pero los dispositivos pueden interpretar que están ante otro coordinador.


Paso 3: hacer copia completa de Zigbee2MQTT

Antes de modificar nada, hay que parar Zigbee2MQTT.

Desde Home Assistant:

Ajustes → Complementos → Zigbee2MQTT → Detener

Después hay que localizar la carpeta de configuración de Zigbee2MQTT.

Según la instalación, puede estar en una ruta parecida a:

/homeassistant/zigbee2mqtt

o:

/config/zigbee2mqtt

o en instalaciones recientes del add-on:

/addon_configs/45df7312_zigbee2mqtt

Desde terminal podemos localizarla así:

find /config /homeassistant /addon_configs -name database.db -o -name configuration.yaml -o -name coordinator_backup.json 2>/dev/null

Una vez localizada la carpeta correcta, hacemos una copia completa:

cd /addon_configs/45df7312_zigbee2mqtttar czvf /config/zigbee2mqtt-backup-antes-dongle-m-$(date +%F-%H%M).tar.gz .

Los archivos más importantes son:

configuration.yaml
database.db
coordinator_backup.json
devices.yaml
groups.yaml
state.json

El archivo más crítico para conservar dispositivos y nombres es:

database.db

Paso 4: configurar el Dongle-M con IP fija

Antes de tocar Zigbee2MQTT, conviene dejar el Dongle-M con IP fija.

Esto puede hacerse de dos formas:

- Reserva DHCP en el router/controlador de red.
- IP fija configurada en el propio Dongle-M.

Personalmente prefiero reserva DHCP en el router o controlador, porque centraliza la configuración de red y evita conflictos.

Ejemplo:

Dongle-M
IP: 192.168.1.50
Puerto TCP: 6638

La ruta TCP quedaría así:

tcp://192.168.1.50:6638

También se puede usar el nombre mDNS:

tcp://Dongle-M.local:6638

Pero para una instalación estable prefiero usar IP fija. Zigbee2MQTT recomienda que los adaptadores de red tengan IP estática.


Paso 5: cambiar la configuración en configuration.yaml

Con Zigbee2MQTT parado, editamos el archivo:

nano configuration.yaml

La configuración antigua podía ser algo parecido a esto:

serial:
port: /dev/serial/by-id/usb-SONOFF_Zigbee_3.0_USB_Dongle_Plus_xxxxx
adapter: zstack

o, según el modelo de dongle USB:

serial:
port: /dev/serial/by-id/usb-SONOFF_Zigbee_3.0_USB_Dongle_Plus_xxxxx
adapter: ember

Para el Sonoff Dongle-M por TCP, la configuración debe quedar de este estilo:

serial:
port: tcp://192.168.1.50:6638
adapter: ember
baudrate: 115200
rtscts: false

También se puede usar:

serial:
port: tcp://Dongle-M.local:6638
adapter: ember
baudrate: 115200
rtscts: false

La propia documentación de Sonoff para Dongle-M muestra una configuración de ejemplo con:

port: tcp://Dongle-M.local:6638
baudrate: 115200
adapter: ember
rtscts: false

Y Zigbee2MQTT documenta ember como uno de los tipos válidos de adaptador, junto con zstack, deconz, zigate y zboss.


Paso 6: cambiar también la configuración del add-on en Home Assistant

Este ha sido el punto clave de la migración.

No basta con cambiar únicamente el archivo:

configuration.yaml

En mi caso, también ha sido necesario cambiar la configuración del propio add-on de Zigbee2MQTT dentro de Home Assistant.

Si solo se cambia en un sitio, Home Assistant/Zigbee2MQTT puede seguir usando parte de la configuración anterior o interpretar el coordinador como un dispositivo nuevo. El resultado puede ser que los dispositivos desaparezcan o que parezca que se ha creado una red Zigbee nueva.

Por tanto, hay que revisar también:

Home Assistant → Ajustes → Complementos → Zigbee2MQTT → Configuración

Y en la sección correspondiente al puerto/adaptador serie hay que poner los mismos datos:

serial:
port: tcp://192.168.1.50:6638
adapter: ember
baudrate: 115200
rtscts: false

Este punto es especialmente importante.

La regla práctica es:

La configuración del archivo configuration.yaml
y la configuración del add-on en Home Assistant
deben apuntar al mismo coordinador.

En mi caso, hasta que no cambié ambas configuraciones, Zigbee2MQTT no conservó correctamente todos los dispositivos.


Paso 7: revisar coordinator_backup.json

Si se cambia de un coordinador de tipo zstack a uno de tipo ember, puede aparecer un error como este:

Error: [BACKUP] Current backup file is not for EmberZNet stack.

En ese caso, Zigbee2MQTT está intentando usar un backup de coordinador que no corresponde al stack del nuevo adaptador.

La solución prudente no es borrar directamente el archivo, sino renombrarlo:

mv coordinator_backup.json coordinator_backup.json.antiguo

Después se puede volver a arrancar Zigbee2MQTT.

Si el coordinador antiguo y el nuevo son de la misma familia, este paso puede no ser necesario. Pero si aparece ese error, conviene recordar que el problema no está en MQTT ni en Home Assistant, sino en el backup del coordinador.


Paso 8: arrancar Zigbee2MQTT

Una vez cambiada la configuración en los dos sitios:

- configuration.yaml
- configuración del add-on de Home Assistant

arrancamos Zigbee2MQTT:

Home Assistant → Ajustes → Complementos → Zigbee2MQTT → Iniciar

En el log deberíamos ver algo parecido a:

Starting Zigbee2MQTT
Starting zigbee-herdsman
zh:ember
Socket ready
ASH connected
EZSP started
Adapter version info
Zigbee2MQTT started

Si aparece algo como esto, la conexión TCP con el Dongle-M está funcionando:

Socket ready
ASH connected
EZSP started

Después entramos en el frontend de Zigbee2MQTT y comprobamos que siguen apareciendo los dispositivos.


Paso 9: comprobaciones finales

Una vez iniciado Zigbee2MQTT, conviene comprobar varias cosas.

Primero, que los dispositivos aparecen:

Zigbee2MQTT → Devices

Después, que responden:

- Probar enchufes Zigbee.
- Probar relés.
- Probar bombillas.
- Probar sensores de apertura.
- Probar sensores de temperatura.

Si algunos sensores de pila no responden inmediatamente, no hay que alarmarse. Muchos dispositivos a batería duermen y tardan en actualizar.

También conviene revisar en Home Assistant:

Ajustes → Dispositivos y servicios → MQTT

y comprobar que las entidades siguen asociadas correctamente.


Problema habitual: han desaparecido todos los dispositivos

Si al arrancar Zigbee2MQTT desaparecen todos los dispositivos, no hay que empezar a reemparejar a lo loco.

Primero hay que parar Zigbee2MQTT y revisar:

1. ¿Se ha restaurado el database.db correcto?
2. ¿La IEEE del Dongle-M coincide con la del coordinador antiguo?
3. ¿configuration.yaml apunta al Dongle-M?
4. ¿La configuración del add-on de Home Assistant también apunta al Dongle-M?
5. ¿Se ha cambiado por error network_key, pan_id, ext_pan_id o channel?

En mi caso, el problema estaba en que había cambiado la configuración en un sitio, pero no en el otro.

El aprendizaje importante es este:

No basta con cambiar configuration.yaml.
También hay que cambiar la configuración del propio add-on de Zigbee2MQTT en Home Assistant.

Cuando ambas configuraciones apuntaron al Dongle-M, todos los dispositivos volvieron a aparecer correctamente.


Comandos útiles de comprobación

Para localizar archivos de Zigbee2MQTT:

find /config /homeassistant /addon_configs -name database.db -o -name configuration.yaml -o -name coordinator_backup.json 2>/dev/null

Para comprobar la primera línea de database.db:

head -n 1 database.db

Para contar dispositivos en la base de datos:

grep -c '"ieeeAddr"' database.db

Para buscar la configuración Zigbee importante:

grep -E 'port|adapter|baudrate|rtscts|pan_id|ext_pan_id|network_key|channel' configuration.yaml

Para hacer copia completa de la carpeta actual:

tar czvf /config/zigbee2mqtt-backup-$(date +%F-%H%M).tar.gz .

Configuración final usada

En mi caso, la configuración final para el Dongle-M por TCP/PoE quedó de este estilo:

serial:
port: tcp://192.168.1.50:6638
adapter: ember
baudrate: 115200
rtscts: false

Manteniendo sin cambios la parte de red Zigbee:

advanced:
channel: XX
pan_id: XXXXX
ext_pan_id:
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
network_key:
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX

Los valores reales de network_key, pan_id y ext_pan_id no deben publicarse ni compartirse.


Conclusión

La migración de un dongle Zigbee USB a un Sonoff Dongle-M por TCP/PoE merece mucho la pena si queremos mejorar la ubicación del coordinador y separar la red Zigbee del servidor donde corre Home Assistant.

El cambio permite colocar el coordinador en una zona con mejor cobertura, alimentarlo por PoE y evitar depender de un puerto USB concreto.

Pero hay tres puntos críticos:

1. Copiar la IEEE del coordinador antiguo al Dongle-M.
2. Mantener intactos database.db, network_key, pan_id, ext_pan_id y channel.
3. Cambiar la configuración tanto en configuration.yaml como en el add-on de Home Assistant.

El tercer punto ha sido el más importante en mi caso. Si solo se cambia configuration.yaml, Zigbee2MQTT puede arrancar como si estuviera usando un coordinador nuevo y los dispositivos pueden desaparecer. Al cambiar también la configuración del add-on en Home Assistant, la migración se realizó correctamente y todos los dispositivos Zigbee se conservaron.

Por tanto, el resumen sería:

Copiar IEEE.
Hacer backup.
Cambiar configuration.yaml.
Cambiar configuración del add-on.
Arrancar Zigbee2MQTT.
Comprobar dispositivos.

Con esos pasos, el cambio de Sonoff USB Dongle a Sonoff Dongle-M por TCP/PoE puede hacerse sin perder la red Zigbee ni tener que reemparejar todos los dispositivos.


Fuentes técnicas consultadas

  • Zigbee2MQTT documenta el uso de adaptadores Ethernet mediante rutas tcp://IP:PUERTO y recomienda IP estática para adaptadores de red.
  • Zigbee2MQTT explica que, al migrar de coordinador, es importante copiar la IEEE address del coordinador antiguo al nuevo para evitar problemas con dispositivos que buscan al coordinador por esa dirección.
  • Zigbee2MQTT advierte que cambiar la network_key obliga a reemparejar todos los dispositivos, y que cambiar el canal puede requerir reemparejar algunos.
  • Sonoff documenta para Dongle-M una configuración Zigbee2MQTT por TCP con tcp://Dongle-M.local:6638, adapter: ember, baudrate: 115200 y rtscts: false.
  • Experiencia práctica contrastada con ChatGPT durante la migración.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *