Conexión de la clave SMLIGHT a Zigbee2Mqtt en Gladys (SSL/TLS completo) (MQTT y Z2M externos)

Hola,

Como prometí, aquí tienes un tutorial para conectar una clave SMLIGHT a Gladys a través de la red y no a través de USB, porque si no se pierde todo el interés de esta clave al conectarla por USB :blush:

Como Gladys solo admite el modo USB @pierre-gilles deténme si me equivoco :upside_down_face:, me decidí por una instalación con un MQTT y Z2M externos a Gladys.
Esto podría ser quizás objeto de una solicitud de funcionalidad, ¿qué opinas @pierre-gilles ?

Aquí para z2m en https uso el puerto 443, pero para evitar cualquier conflicto si decides instalar todo en la misma máquina, sería mejor cambiarlo al puerto 4343 por ejemplo :slight_smile:

Ya había hecho un tutorial completo sobre HAOS en la época en que lo usaba, que puedes encontrar aquí :
https://forum.hacf.fr/t/tuto-installer-haos-sur-proxmox-avec-z2m-et-mqtt-full-ssl-tls-lets-encrypt/

Instalación de Mosquitto (Mqtt)

Instalar una VM con ubuntu 24.04, actualízala completamente y ejecuta los siguientes comandos :

Para instalar docker :

curl -sSL https://get.docker.com/ | CHANNEL=stable sh
systemctl enable --now docker

Añadir un usuario docker_mosquitto por ejemplo :

adduser docker_mosquitto

Recuperar su ID : (Aquí 1002)

cat /etc/passwd [ grep docker_mosquitto

image

Crear la carpeta mosquitto en /opt

mkdir /opt/mosquitto

Crear el archivo docker-compose.yml con el siguiente contenido : (Reemplazar 1002 por los ID que se recuperaron justo antes)

services:
  mosquitto:
    image: eclipse-mosquitto:2.0.22
    container_name: mosquitto
    restart: unless-stopped
    user: "1002:1002"
    ports:
      - "1883:1883"    # MQTT
      - "8883:8883"    # MQTTS (secure)
      - "9001:9001"    # WebSockets
    volumes:
      - ./mosquitto/config:/mosquitto/config
      - ./mosquitto/data:/mosquitto/data
      - ./mosquitto/log:/mosquitto/log
      - /etc/localtime:/etc/localtime:ro
      - /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/chain.pem:/etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/chain.pem:ro
      - /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/privkey.pem:/etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/privkey.pem:ro
      - /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/cert.pem:/etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/cert.pem:ro

Crear una carpeta mosquitto y las subcarpetas y aplicar los permisos : (Esta contendrá la configuración, los datos y los registros)

mkdir /opt/mosquitto/mosquitto
mkdir /opt/mosquitto/mosquitto/data
mkdir /opt/mosquitto/mosquitto/config
mkdir /opt/mosquitto/mosquitto/log
touch mkdir /opt/mosquitto/mosquitto/log/mosquitto.log
chown -R 1002:1002 /opt/mosquitto/mosquitto

Crear el archivo de configuración en /opt/mosquitto/mosquitto/config/mosquitto.conf

persistence true
persistence_location /mosquitto/data/

log_dest file /mosquitto/log/mosquitto.log

listener 1883 localhost
allow_anonymous false
#password_file /mosquitto/config/passwd
tls_version tlsv1.3

listener 8883
certfile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/cert.pem
cafile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/chain.pem
keyfile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/privkey.pem

listener 9001
protocol websockets
certfile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/cert.pem
cafile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/chain.pem
keyfile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/privkey.pem

Activar el SSL : (Ajustar según el plugin que utilices para obtener el certificado de tu dominio) Aquí es un ejemplo con infomaniak

apt install certbot
apt install python3-pip
pip install certbot-dns-infomaniak
export INFOMANIAK_API_TOKEN=xxx
certbot certonly \
  --authenticator dns-infomaniak \
  --server https://acme-v02.api.letsencrypt.org/directory \
  --agree-tos \
  --rsa-key-size 4096 \
  -d 'mqtt.xxx.local.srv-home.fr'

Por defecto, certbot instala un servicio que renueva periódicamente sus certificados automáticamente. Para ello, el comando debe conocer la clave API, de lo contrario fallará en silencio.

Para activar el renovación automática de sus certificados genéricos, deberá modificar /lib/systemd/system/certbot.service. Añada la siguiente línea en Service, reemplazando,<YOUR_API_TOKEN> por su token:

Environment="INFOMANIAK_API_TOKEN=<YOUR_API_TOKEN>"

Luego abra el archivo de configuración

nano /etc/letsencrypt/renewal/xxx.conf

Agregar

renew_hook = docker restart mosquitto
chmod -R 755 /etc/letsencrypt/live
chmod -R 755 /etc/letsencrypt/archive

Ejecutar el contenedor

cd /opt/mosquitto
docker compose up -d

Puede ver los registros del contenedor de docker:

docker logs mosquitto -f

Activar la autenticación (Reemplazar username por un usuario, por ejemplo « mqttuser »

docker exec -it mosquitto mosquitto_passwd -c /mosquitto/config/passwd username

Descomentar la línea « password_file /mosquitto/config/passwd » en el archivo « /opt/mosquitto/mosquitto/config/mosquitto.conf » lo que dará ahora

persistence true
persistence_location /mosquitto/data/

log_dest file /mosquitto/log/mosquitto.log

listener 1883 localhost
allow_anonymous false
password_file /mosquitto/config/passwd
tls_version tlsv1.3

listener 8883
certfile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/cert.pem
cafile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/chain.pem
keyfile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/privkey.pem

listener 9001
protocol websockets
certfile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/cert.pem
cafile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/chain.pem
keyfile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/privkey.pem

Reiniciar el contenedor:

docker restart mosquitto

Luego podrá ingresar este inicio de sesión en Gladys y luego en zigbee2mqtt :slight_smile:

Instalación Zigbee2mqtt

Instalar una VM bajo ubuntu 24.04, actualícela por completo y siga el siguiente procedimiento:

Linux Docker | Zigbee2MQTT

Para instalar docker:

curl -sSL https://get.docker.com/ | CHANNEL=stable sh
systemctl enable --now docker

Aquí está mi archivo docker-compose.yml:

services:
  zigbee2mqtt:
    container_name: zigbee2mqtt
    image: koenkk/zigbee2mqtt:2.8.0
    restart: unless-stopped
    volumes:
      - ./data:/app/data
      - /run/udev:/run/udev:ro
      - /etc/localtime:/etc/localtime:ro
      - /etc/letsencrypt/live/z2m.xxx.local.srv-home.fr/fullchain.pem:/etc/letsencrypt/live/z2m.xxx.local.srv-home.fr/fullchain.pem:ro
      - /etc/letsencrypt/live/z2m.xxx.local.srv-home.fr/privkey.pem:/etc/letsencrypt/live/z2m.xxx.local.srv-home.fr/privkey.pem:ro
#    devices:
#      - /dev/serial/by-id/usb-Silicon_Labs_Sonoff_Zigbee_3.0_USB_Dongle_Plus_0001-if00-port0:/dev/serial/by-id/usb-Silicon_Labs_Sonoff_Zigbee_3.0_USB_Dongle_Plus_0001-if00-port0
    ports:
      - "443:443"  # Puerto externo 443 → puerto interno 443
    environment:
      - TZ=Europe/Paris
    networks:
      - z2m_net

networks:
  z2m_net:
    driver: bridge

Aquí está mi archivo /opt/z2m/data/configuration.yaml como ejemplo, debe modificar el auth_token que le permitirá conectarse a la interfaz web así como la contraseña del usuario z2m que configuramos anteriormente durante la instalación de MQTT

homeassistant:
  enabled: false
mqtt:
  base_topic: zigbee2mqtt
  server: mqtts://mqtt.xxx.local.srv-home.fr:8883
  user: mqttuser
  password: achanger
  keepalive: 60
  reject_unauthorized: true
  version: 4
  include_device_information: true
serial:
  port: tcp://192.168.xx.xx:7638
  baudrate: 460800
  adapter: zstack
  disable_led: false
advanced:
  pan_id: GENERATE
  network_key: GENERATE
  channel: 25
  homeassistant_legacy_entity_attributes: false
  legacy_api: false
  legacy_availability_payload: false
  log_level: info
  log_syslog:
    app_name: Zigbee2MQTT
    eol: /n
    host: localhost
    localhost: localhost
    path: /dev/log
    pid: process.pid
    port: 514
    protocol: udp4
    type: '5424'
  last_seen: ISO_8601
frontend:
  enabled: true
  package: zigbee2mqtt-windfront
  port: 443
  host: 0.0.0.0
  url: https://z2m.xxx.local.srv-home.fr
  ssl_cert: /etc/letsencrypt/live/z2m.xxx.local.srv-home.fr/fullchain.pem
  ssl_key: /etc/letsencrypt/live/z2m.xxx.local.srv-home.fr/privkey.pem
  auth_token: achanger

Reemplazar esto por la IP de su llave y no olvide cambiar auth_token y password

port: tcp://192.168.xx.xx:7638

Activar SSL: (Ajustar según el complemento que utilice para obtener el certificado de su nombre de dominio) Aquí es un ejemplo con infomaniak

apt install certbot
apt install python3-pip
pip install certbot-dns-infomaniak
export INFOMANIAK_API_TOKEN=xxx
certbot certonly \
  --authenticator dns-infomaniak \
  --server https://acme-v02.api.letsencrypt.org/directory \
  --agree-tos \
  --rsa-key-size 4096 \
  -d 'z2m.xxx.local.srv-home.fr'

Por defecto, certbot instala un servicio que renueva periódicamente sus certificados automáticamente. Para ello, el comando debe conocer la clave API, de lo contrario fallará en silencio.

Para activar el renovación automática de sus certificados genéricos, deberá modificar /lib/systemd/system/certbot.service. Agregue la siguiente línea en Service, reemplazando <YOUR_API_TOKEN> por su token:

Environment="INFOMANIAK_API_TOKEN=<YOUR_API_TOKEN>"
nano /etc/letsencrypt/renewal/z2m.xxx.local.srv-home.fr

Agregar (Si tiene un truco para integrar un recarga, lo acepto :slight_smile:

renew_hook = docker restart zigbee2mqtt
chmod -R 755 /etc/letsencrypt/live
chmod -R 755 /etc/letsencrypt/archive

En el archivo /etc/systemd/system/zigbee2mqtt.service tuve que reemplazar User=pi por User=root. No he encontrado una manera de hacerlo de otra manera por el momento, pero si tiene una idea para ejecutarlo con un usuario con menos privilegios, también lo acepto :wink:

Ejecutar el contenedor

cd /opt/z2m
docker compose up -d

Zigbee2mqtt debe estar ahora disponible en la dirección https://z2m.xxx.local.srv-home.fr indicando la contraseña que ha puesto en auth_token

No usar SSL/TLS

Puede prescindir perfectamente de la parte SSL/TLS y usar el puerto 8080 para Z2M y el puerto 1883 con Mqtt modificando la configuración

Config z2m:

docker-compose.yml:

services:
  zigbee2mqtt:
    container_name: zigbee2mqtt
    image: koenkk/zigbee2mqtt:2.8.0
    restart: unless-stopped
    volumes:
      - ./data:/app/data
      - /run/udev:/run/udev:ro
      - /etc/localtime:/etc/localtime:ro
#    devices:
#      - /dev/serial/by-id/usb-Silicon_Labs_Sonoff_Zigbee_3.0_USB_Dongle_Plus_0001-if00-port0:/dev/serial/by-id/usb-Silicon_Labs_Sonoff_Zigbee_3.0_USB_Dongle_Plus_0001-if00-port0
    ports:
      - "8080:8080"  # Puerto externo 8080 → puerto interno 8080
    environment:
      - TZ=Europe/Paris
    networks:
      - z2m_net

networks:
  z2m_net:
    driver: bridge

configuration.yaml:

homeassistant:
  enabled: false
mqtt:
  base_topic: zigbee2mqtt
  server: mqtt://mqtt.xxx.local.srv-home.fr:1883
  user: mqttuser
  password: achanger
  keepalive: 60
  reject_unauthorized: true
  version: 4
  include_device_information: true
serial:
  port: tcp://192.168.xx.xx:7638
  baudrate: 460800
  adapter: zstack
  disable_led: false
advanced:
  pan_id: GENERATE
  network_key: GENERATE
  channel: 25
  homeassistant_legacy_entity_attributes: false
  legacy_api: false
  legacy_availability_payload: false
  log_level: info
  log_syslog:
    app_name: Zigbee2MQTT
    eol: /n
    host: localhost
    localhost: localhost
    path: /dev/log
    pid: process.pid
    port: 514
    protocol: udp4
    type: '5424'
  last_seen: ISO_8601
frontend:
  enabled: true
  package: zigbee2mqtt-windfront
  port: 8080
  host: 0.0.0.0
  url: http://192.168.xx.xx
 # ssl_cert: /etc/letsencrypt/live/z2m.xxx.local.srv-home.fr/fullchain.pem
 # ssl_key: /etc/letsencrypt/live/z2m.xxx.local.srv-home.fr/privkey.pem
  auth_token: achanger


**Configuración de mqtt:**

persistence true
persistence_location /mosquitto/data/

log_dest file /mosquitto/log/mosquitto.log

listener 1883
allow_anonymous false
password_file /mosquitto/config/passwd


**Configurar Gladys para usar el broker MQTT externo:**

![image|690x346](upload://89sCSttGIcTvVAX5KPpkoGeYo55.png)

Y todo debería estar bien:

![image|690x186](upload://vtIXMTY5QPHGYzJqxCMQ8mJA7hm.png)

El tutorial no es perfecto, pero intenta cubrir todos los casos posibles y es posible que haya olvidado algo, así que si tienes comentarios o preguntas, no dudes en hacerlo :slight_smile:

¡Gracias por el tutorial! :slight_smile:

Para instalar Mosquitto, usando Docker sería mucho más fácil de todos modos ^^

¡Sí, definitivamente!

Sí, cuando tenga un poco de tiempo lo aplico en mi casa y modifico el tutorial :slight_smile:

Ya está hecho aquí: https://community.gladysassistant.com/t/prise-en-charge-des-cles-smlight-via-reseau/

Ya está modificado :slight_smile:

Tras este post:

He forzado la versión de mosquitto a 2.0.22