SMLIGHT-Schlüsselverbindung zu Zigbee2Mqtt auf Gladys (Vollständig SSL/TLS) (MQTT und Z2M extern)

Hallo,

Wie versprochen, hier ist ein Tutorial, um einen SMLIGHT-Schlüssel über das Netzwerk und nicht über USB mit Gladys zu verbinden, denn sonst verliert man den ganzen Sinn dieses Schlüssels, wenn man ihn per USB anschließt :blush:

Da Gladys nur den USB-Modus unterstützt @pierre-gilles, korrigiere mich, wenn ich mich irre :upside_down_face:, bin ich auf eine Installation mit einem externen MQTT und Z2M zu Gladys gegangen.
Das könnte vielleicht Gegenstand eines Funktionswunsches sein, was denkst du @pierre-gilles ?

Hier für z2m in https verwende ich den Port 443, aber um Konflikte zu vermeiden, wenn ihr alles auf derselben Maschine installiert, müsst ihr den Port auf 4343 ändern :slight_smile:

Ich hatte damals schon ein vollständiges Tutorial zu HAOS erstellt, als ich es verwendet habe, das ihr hier finden könnt:

Installation Mosquitto (Mqtt)

Installiert eine VM unter Ubuntu 24.04, aktualisiert sie vollständig und führt die folgenden Befehle aus:

Um Docker zu installieren:

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

Fügt einen Benutzer docker_mosquitto hinzu, z. B.:

adduser docker_mosquitto

Holt seine ID ab: (Hier 1002)

cat /etc/passwd [ grep docker_mosquitto

image

Erstellt den Ordner mosquitto in /opt

mkdir /opt/mosquitto

Erstellt die Datei docker-compose.yml mit dem folgenden Inhalt: (Ersetzt 1002 durch die ID, die ihr gerade abgeholt habt)

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

Erstellt einen Ordner mosquitto und die Unterordner und wendet die Berechtigungen an: (Dieser enthält die Konfiguration, die Daten und die Protokolle)

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

Erstellt die Konfigurationsdatei in /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

Aktiviert SSL: (Angepasst je nach Plugin, das ihr verwendet, um das Zertifikat eures Domänennamens zu erhalten) Hier handelt es sich um ein Beispiel mit 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'

Standardmäßig installiert certbot einen Dienst, der die Zertifikate automatisch periodisch erneuert. Dazu muss der Befehl den API-Schlüssel kennen, sonst scheitert er stillschweigend.

Um die automatische Erneuerung eurer generischen Zertifikate zu aktivieren, müsst ihr /lib/systemd/system/certbot.service ändern. Fügt dort in Service die folgende Zeile hinzu, wobei ihr „ durchErsetzen Sie dies durch die IP Ihres Schlüssels und vergessen Sie nicht, auth_token und password zu ändern

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

SSL aktivieren: (Angepasst an das Plugin, das Sie zur Abfrage des Zertifikats Ihrer Domain verwenden) Hier ein Beispiel mit 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'

Standardmäßig installiert certbot einen Dienst, der die Zertifikate automatisch periodisch erneuert. Dazu muss der Befehl den API-Schlüssel kennen, andernfalls wird er stillschweigend fehlschlagen.

Um das automatische Erneuern Ihrer generischen Zertifikate zu aktivieren, müssen Sie /lib/systemd/system/certbot.service ändern. Fügen Sie in Service die folgende Zeile hinzu, wobei Sie <YOUR_API_TOKEN> durch Ihren Token ersetzen:

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

Hinzufügen (Wenn Sie einen Tipp haben, wie man ein Reload integrieren kann, bin ich offen dafür :slight_smile:

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

In der Datei /etc/systemd/system/zigbee2mqtt.service musste ich User=pi durch User=root ersetzen. Ich habe noch keine andere Möglichkeit gefunden, dies zu tun, aber wenn Sie eine Idee haben, wie man es mit einem Benutzer mit weniger Rechten laufen lassen kann, bin ich ebenfalls offen dafür :wink:

Container starten

cd /opt/z2m
docker compose up -d

Zigbee2mqtt sollte nun unter der Adresse https://z2m.xxx.local.srv-home.fr verfügbar sein, wobei das Passwort, das Sie in auth_token angegeben haben, korrekt angegeben werden muss

SSL/TLS nicht verwenden

Sie können den SSL/TLS-Teil weglassen und Port 8080 für Z2M und Port 1883 mit Mqtt verwenden, indem Sie die Konfiguration ändern

Z2M-Konfiguration:

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"  # Externer Port 8080 → interner Port 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

MQTT-Konfiguration:

persistence true
persistence_location /mosquitto/data/

log_dest file /mosquitto/log/mosquitto.log

listener 1883
allow_anonymous false
password_file /mosquitto/config/passwd

Anschließend Gladys so konfigurieren, dass sie den externen MQTT-Broker verwendet:

Und alles sollte in Ordnung sein:

Der Tutorial ist vielleicht nicht perfekt, aber er versucht, alle möglichen Fälle abzudecken, und es ist möglich, dass ich etwas vergessen habe. Wenn Sie also Anmerkungen oder Fragen haben, zögern Sie nicht :slight_smile:

Danke für das Tutorial! :slight_smile:

Für die Installation von Mosquitto wäre es über Docker wirklich viel einfacher ^^

Ja, auf jeden Fall!

Ja, wenn ich etwas Zeit habe, schaue ich, wie ich es bei mir anwende und den Leitfaden anpasse :slight_smile:

Hier ist es erledigt: https://community.gladysassistant.com/t/prise-en-charge-des-cles-smlight-via-reseau/

Hier, das ist angepasst :slight_smile:

Nach diesem Beitrag:

Habe ich die Mosquitto-Version auf 2.0.22 erzwungen.