SMLIGHT key connection to Zigbee2Mqtt on Gladys (Full SSL/TLS) (external MQTT and Z2M)

Bonjour,

Comme promis, voici un tutoriel afin de connecter une clé SMLIGHT à Gladys via le réseau et non via USB car sinon on perd tout l’intérêt de cette clé en la branchant en USB :blush:

Gladys ne prenant en charge que le mode USB @pierre-gilles arrête moi si je me trompe :upside_down_face:, je suis partie sur une installation avec un MQTT et Z2M externe à Gladys.
Cela pourrait peut-être faire l’objet d’une demande de fonctionnalité, qu’en penses-tu @pierre-gilles ?

Ici pour z2m en https j’utilise le port 443 mais pour éviter tout conflit si vous décider de tout installer sur la même machine il faudrait modifier par le port 4343 par exemple :slight_smile:

J’avais déjà fais un tuto complet sur HAOS à l’époque ou je l’utilisais que vous pouvez retrouver ici :

Installation Mosquitto (Mqtt)

Installer une VM sous ubuntu 24.04, mettez la complétement à jour et lancez les commandes suivantes :

Pour installer docker :

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

Ajouter un utilisateur docker_mosquitto par exemple :

adduser docker_mosquitto

Récuperer son ID : (Ici 1002)

cat /etc/passwd [ grep docker_mosquitto

image

Créer le dossier mosquitto dans /opt

mkdir /opt/mosquitto

Créer le fichier docker-compose.yml avec le contenu suivant : (Remplacer 1002 par les ID que l’on a récupéré juste avant)

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

Créer un dossier mosquitto et les sous dossiers et appliquer les droits : (Celui-ci contiendra la configuration les datas et les logs)

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

Créer le fichier de config dans /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

Activez le SSL : (A adapter en fonction du plugin que vous utilisez pour récupérer le certificat de votre nom de domaine) Ici il s’agit d’un exemple avec 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'

Par défaut, certbot installe un service qui renouvelle périodiquement ses certificats automatiquement. Pour ce faire, la commande doit connaître la clé API, sinon elle échouera silencieusement.

Afin d’activer le renouvellement automatique de vos certificats génériques, vous devrez modifier /lib/systemd/system/certbot.service. Ajoutez-y la ligne suivante dans Service, en remplaçant <YOUR_API_TOKEN> par votre jeton :

Environment="INFOMANIAK_API_TOKEN=<YOUR_API_TOKEN>"

Ensuite ouvrez le fichier de config

nano /etc/letsencrypt/renewal/xxx.conf

Ajouter

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

Lancer le container

cd /opt/mosquitto
docker compose up -d

Vous pouvez voir les logs du container docker :

docker logs mosquitto -f

Activer l’authentification (Remplacer username par un utilisateur, par exemple « mqttuser »

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

Décommenter la ligne « password_file /mosquitto/config/passwd » dans le fichier « /opt/mosquitto/mosquitto/config/mosquitto.conf » ce qui donner maintenant

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

Relancer ensuite le container :

docker restart mosquitto

Vous pourrez ensuite renseigner ce login dans Gladys et juste après dans zigbee2mqtt :slight_smile:

Installation Zigbee2mqtt

Installer une VM sous ubuntu 24.04, mettez la complétement à jour et suivre la procédure suivante :

Linux Docker | Zigbee2MQTT

Pour installer docker :

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

Voici mon fichier 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"  # Port externe 443 → port interne 443
    environment:
      - TZ=Europe/Paris
    networks:
      - z2m_net

networks:
  z2m_net:
    driver: bridge

Voici mon fichier /opt/z2m/data/configuration.yaml à titre d’exemple, il faut modifier le auth_token qui vous permettra de vous connecter à l’interface web ainsi que le mot de passe de l’utilisateur z2m que l’on a mis précédemment lors de l’installation 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

Remplacer ceci par l’IP de votre clé et n’oubliez pas de changer auth_token et password

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

Activer le SSL : (A adapter en fonction du plugin que vous utilisez pour récupérer le certificat de votre nom de domaine) Ici il s’agit d’un exemple avec 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'

Par défaut, certbot installe un service qui renouvelle périodiquement ses certificats automatiquement. Pour ce faire, la commande doit connaître la clé API, sinon elle échouera silencieusement.

Afin d’activer le renouvellement automatique de vos certificats génériques, vous devrez modifier /lib/systemd/system/certbot.service. Ajoutez-y la ligne suivante dans Service, en remplaçant <YOUR_API_TOKEN> par votre jeton :

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

Ajouter (Si vous avez une astuce pour intégrer un reload je suis preneur :slight_smile:

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

Dans le fichier /etc/systemd/system/zigbee2mqtt.service j’ai du remplacer User=pi par User=root. J’e n’ai pas trouvé de moyen de faire autrement pour le moment mais si vous avez une idée pour le faire tourner avec un utilisateur avec moins de droits, je suis preneur également :wink:

Lancer le container

cd /opt/z2m
docker compose up -d

Zigbee2mqtt doit être maintenant disponible à l’adresse https://z2m.xxx.local.srv-home.fr en indiquant bien le mot de passe que vous avez mis dans auth_token

Ne pas utiliser le SSL/TLS

Vous pouvez très bien vous passer de la partie SSL/TLS et utiliser le port 8080 pour Z2M et le port 1883 avec Mqtt en modifiant la conf

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"  # Port externe 8080 → port interne 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

Conf mqtt :

persistence true
persistence_location /mosquitto/data/

log_dest file /mosquitto/log/mosquitto.log

listener 1883
allow_anonymous false
password_file /mosquitto/config/passwd

Configurer ensuite Gladys pour utiliser le broker MQTT externe :

Et tout devrait être ok :

Le tutoriel n’est peut être pas parfait mais essaye de couvrir tout les cas possible et il est possible que j’ai oublié des choses donc si vous avez des remarques ou des questions, n’hésitez pas :slight_smile:

2 Likes

Thanks for the tutorial! :slight_smile:

To install Mosquitto, using Docker would be much simpler though ^^

Yes, absolutely!

1 Like

Yes, when I have a bit of time I’ll look at applying it on my setup and modify the tutorial :slight_smile:

It’s done here: https://community.gladysassistant.com/t/prise-en-charge-des-cles-smlight-via-reseau/

1 Like

There, it’s been modified :slight_smile:

Following this post:

I forced the mosquitto version to 2.0.22