Zigbee2mqtt: Docker-Testimage basierend auf Gladys v4

EDIT: Zigbee2mqtt ist jetzt nativ in Gladys integriert!

Hallo zusammen,

Nach Monaten des Wartens gibt es jetzt ein neues Testbild von Gladys mit dem integrierten Zigbee2mqtt-Dienst.

In dieser Version ist alles automatisch: Es ist nicht mehr nötig, Docker-Container manuell zu starten.
Daher habe ich eine Ansicht hinzugefügt, um den Status des Dienstes bei der Aktivierung zu verfolgen:

Ich habe auch die Tabelle mit dem Container-Status beibehalten, falls jemand Hilfe benötigt, aber ich denke, ich werde sie in der Version entfernen, die in Gladys integriert wird.

  • Ihr könnt das Bild auf Dockerhub herunterladen:

Zur Info, ich habe es mit der Gladys-Version getaggt, auf der es basiert, und füge ein -n hinzu, wobei n die Entwicklungen des Zigbee2mqtt-Dienstes darstellt.
Daher heißt diese Version v4.0.0-1.
Wenn ihr es mit dem Tag latest installiert und Watchtower auf eurem Rechner läuft, wird es automatisch bei jeder Entwicklung aktualisiert.

  • Oder ihr installiert und startet es direkt mit dem in der Gladys-Dokumentation angegebenen Befehl:
docker run -d \
--log-opt max-size=10m \
--restart=always \
--privileged \
--network=host \
--name gladys-zigbee2mqtt \
-e NODE_ENV=production \
-e SERVER_PORT=80 \
-e TZ=Europe/Paris \
-e SQLITE_FILE_PATH=/var/lib/gladysassistant/gladys-production.db \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/lib/gladysassistant:/var/lib/gladysassistant \
-v /dev:/dev \
-v /run/udev:/run/udev:ro \
r6n0/gladys-zigbee2mqtt:latest 

Im Vergleich zur Gladys-Dokumentation habe ich die Option -v /run/udev:/run/udev:ro hinzugefügt, die mehr Informationen über USB-Geräte (insbesondere den Hersteller) liefert. Dadurch können Sie z. B. die Dongles unterscheiden, wenn Sie einen Zigbee2mqtt-Dongle und einen Z-Wave-Dongle einstecken.

Zögert nicht, eure Erfahrungen in diesem Thema zu kommentieren und auch Issues auf meinem GitHub zu hinterlassen, um Fehler und nicht unterstützte Geräte zu identifizieren. Bitte beschreibt eure Installation und wie ihr den Fehler verursacht habt, so detailliert wie möglich.

Vielen Dank an alle für eure Geduld, in der Hoffnung, dass es bestmöglich funktioniert.

Super Arbeit! Das ist, glaube ich, die am meisten erwartete Funktion.

Ein kurzer Rückblick @Reno

2020-11-15T13:23:59+0100 <info> index.js:63 (Server.<anonymous>) Server hört auf Port 1080
2020-11-15T13:25:26+0100 <info> init.js:49 () Zigbee2mqtt USB Dongle an /dev/ttyACM2 angeschlossen
2020-11-15T13:25:37+0100 <info> init.js:49 () Zigbee2mqtt USB Dongle an /dev/ttyACM2 angeschlossen
2020-11-15T13:25:37+0100 <info> installMqttContainer.js:30 (Zigbee2mqttManager.installMqttContainer) MQTT-Broker wird als Docker-Container installiert...
2020-11-15T13:25:37+0100 <info> installMqttContainer.js:31 (Zigbee2mqttManager.installMqttContainer) eclipse-mosquitto:latest-Image wird heruntergeladen...
2020-11-15T13:25:38+0100 <info> installMqttContainer.js:34 (Zigbee2mqttManager.installMqttContainer) Broker-Umgebung wird vorbereitet...
2020-11-15T13:25:38+0100 <info> installMqttContainer.js:38 (Zigbee2mqttManager.installMqttContainer) Container wird erstellt...
2020-11-15T13:25:39+0100 <info> installMqttContainer.js:52 (Zigbee2mqttManager.installMqttContainer) Zigbee2MQTT MQTT-Broker startet...
2020-11-15T13:25:45+0100 <info> installMqttContainer.js:58 (Zigbee2mqttManager.installMqttContainer) Benutzer/Kennwort wird erstellt...
2020-11-15T13:25:45+0100 <info> installMqttContainer.js:69 (Zigbee2mqttManager.installMqttContainer) MQTT-Broker-Container erfolgreich gestartet
2020-11-15T13:25:45+0100 <info> installZ2mContainer.js:59 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt startet...
2020-11-15T13:25:45+0100 <info> installZ2mContainer.js:71 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt erfolgreich gestartet
2020-11-15T13:25:45+0100 <warn> connect.js:32 (MqttClient.<anonymous>) Fehler beim Verbinden mit MQTT - Fehler: Verbindung abgelehnt: Nicht autorisiert
2020-11-15T13:25:45+0100 <warn> connect.js:41 (MqttClient.<anonymous>) Von MQTT-Server getrennt
2020-11-15T13:25:50+0100 <warn> connect.js:32 (MqttClient.<anonymous>) Fehler beim Verbinden mit MQTT - Fehler: Verbindung abgelehnt: Nicht autorisiert
2020-11-15T13:25:55+0100 <warn> connect.js:32 (MqttClient.<anonymous>) Fehler beim Verbinden mit MQTT - Fehler: Verbindung abgelehnt: Nicht autorisiert
2020-11-15T13:26:00+0100 <warn> connect.js:32 (MqttClient.<anonymous>) Fehler beim Verbinden mit MQTT - Fehler: Verbindung abgelehnt: Nicht autorisiert

Zur Info, ich habe bereits einen MQTT-Container auf dem Host und einen zigbee2mqtt-Container. Können wir in diesem Fall die Möglichkeit haben, einfach eine MQTT-Adresse anzugeben?

Edit: Mein Zigbee2mqtt-Container existierte bereits unter diesem Namen, daher funktioniert es nicht. Ich denke, es sollte ein Präfix hinzugefügt werden.

Laut deinen Logs gibt es keine Fehler bei der Installation und dem Start der Container.
Das ist erstaunlich, da du sagst, du hättest bereits einen Container mit diesem Namen.

Der MQTT-Broker wird auf Port 1884 gestartet, um Konflikte mit dem MQTT-Dienst zu vermeiden.
Soweit ich verstanden habe, bevorzugte @pierre-gilles einen separaten Broker.

Kannst du daher die Logs der beiden Container des Dienstes überprüfen, um dein Verbindungsproblem zu lösen?

Ich habe vergessen, Ihnen zu sagen, dass man physisch sehen kann, ob die Service-Konfiguration erfolgreich war: Beim Start sollte die LED des Dongles ausgehen.

Ach ja, es gibt ein verstecktes Bonus-Feature in einem der Reiter. Ein Pluspunkt für den, der es findet… :wink:

Hallo, zuerst möchte ich dir für deine Arbeit danken, es wird cool sein, sich eine Xiaomi-Gateway sparen zu können :slight_smile:

Ich habe jedoch ein Berechtigungsproblem bei meiner Installation, der MQTT-Container startet zwar, startet aber in einer Endlosschleife neu, weil er seine Konfigurationsdatei nicht öffnen kann (Log des MQTT-Containers: 1605448659: Error: Unable to open config file /mosquitto/config/mosquitto.conf.).
Ich habe zwar die Zuordnung $DATA_PATH/gladys_zigbee:/var/lib/gladysassistant in meinen Volumes und habe auch erzwungen, dass Gladys den Benutzer root verwendet (user: « 0:0 ») in meiner docker-compose-Datei, aber es ändert sich nichts…

Ideen?

Du sagst, du verwendest ein docker-compose. Könntest du es teilen?

Angesichts des Problems wurde die Konfigurationsdatei des Brokers nicht generiert.
Könntest du auch dein Gladys-Log wie Vonox teilen?

OK, ich schau mir das heute Abend an, aber das Problem ist, dass der Container bereits existiert und nicht für den vom Service erstellten MQTT-Container konfiguriert ist.

Ich halte dich auf dem Laufenden.

Die Konfigurationsdatei scheint korrekt auf meinem Host (in diesem Fall HypriotOS) mit folgendem Inhalt generiert worden zu sein:

port 1884
allow_anonymous false
# connection_messages false
allow_duplicate_messages true
password_file /mosquitto/config/mosquitto.passwd

Die Logs von Gladys zeigen Folgendes:

2020-11-15T14:52:29+0100 <info> index.js:63 (Server.<anonymous>) Server hört auf Port 7124
2020-11-15T14:54:34+0100 <info> init.js:49 () Zigbee2mqtt USB-Dongle an /dev/ttyACM0 angeschlossen
2020-11-15T14:54:41+0100 <info> init.js:49 () Zigbee2mqtt USB-Dongle an /dev/ttyACM0 angeschlossen
2020-11-15T14:54:41+0100 <info> installMqttContainer.js:30 (Zigbee2mqttManager.installMqttContainer) MQTT-Broker wird als Docker-Container installiert...
2020-11-15T14:54:41+0100 <info> installMqttContainer.js:31 (Zigbee2mqttManager.installMqttContainer) eclipse-mosquitto:latest-Image wird heruntergeladen...
2020-11-15T14:54:43+0100 <info> installMqttContainer.js:34 (Zigbee2mqttManager.installMqttContainer) Broker-Umgebung wird vorbereitet...
2020-11-15T14:54:43+0100 <info> installMqttContainer.js:38 (Zigbee2mqttManager.installMqttContainer) Container wird erstellt...
2020-11-15T14:54:43+0100 <info> installMqttContainer.js:52 (Zigbee2mqttManager.installMqttContainer) Zigbee2MQTT MQTT-Broker startet...
2020-11-15T14:54:49+0100 <info> installMqttContainer.js:58 (Zigbee2mqttManager.installMqttContainer) Benutzer/Kennwort wird erstellt...
2020-11-15T14:54:49+0100 <error> installMqttContainer.js:73 (Zigbee2mqttManager.installMqttContainer) MQTT-Broker-Container konnte nicht gestartet werden: Fehler: (HTTP-Code 409) unerwartet - Container 759eade851c945c48f396ace17a720ae1494882d4fbce9deeee5f6284b1c38de wird neu gestartet, warten Sie, bis der Container läuft
    bei /src/server/node_modules/docker-modem/lib/modem.js:257:17
    bei getCause (/src/server/node_modules/docker-modem/lib/modem.js:287:7)
    bei Modem.buildPayload (/src/server/node_modules/docker-modem/lib/modem.js:256:5)
    bei IncomingMessage.<anonymous> (/src/server/node_modules/docker-modem/lib/modem.js:232:14)
    bei IncomingMessage.emit (events.js:326:22)
    bei endReadableNT (_stream_readable.js:1223:12)
    bei processTicksAndRejections (internal/process/task_queues.js:84:21) {
  reason: undefined,
  statusCode: 409,
{
    message: 'Container 759eade851c945c48f396ace17a720ae1494882d4fbce9deeee5f6284b1c38de wird neu gestartet, warten Sie, bis der Container läuft'
  }
}
2020-11-15T14:54:49+0100 <error> index.js:14 (process.<anonymous>) unhandledRejection gefangen: Promise {
  <rejected> Error: (HTTP-Code 409) unerwartet - Container 759eade851c945c48f396ace17a720ae1494882d4fbce9deeee5f6284b1c38de wird neu gestartet, warten Sie, bis der Container läuft 
      bei /src/server/node_modules/docker-modem/lib/modem.js:257:17
      bei getCause (/src/server/node_modules/docker-modem/lib/modem.js:287:7)
      bei Modem.buildPayload (/src/server/node_modules/docker-modem/lib/modem.js:256:5)
      bei IncomingMessage.<anonymous> (/src/server/node_modules/docker-modem/lib/modem.js:232:14)
      bei IncomingMessage.emit (events.js:326:22)
      bei endReadableNT (_stream_readable.js:1223:12)
      bei processTicksAndRejections (internal/process/task_queues.js:84:21) {
    reason: undefined,
    statusCode: 409,
    json: {
      message: 'Container 759eade851c945c48f396ace17a720ae1494882d4fbce9deeee5f6284b1c38de wird neu gestartet, warten Sie, bis der Container läuft'
    }
  }
}
2020-11-15T14:54:49+0100 <error> index.js:15 (process.<anonymous>) Error: (HTTP-Code 409) unerwartet - Container 759eade851c945c48f396ace17a720ae1494882d4fbce9deeee5f6284b1c38de wird neu gestartet, warten Sie, bis der Container läuft 
    bei /src/server/node_modules/docker-modem/lib/modem.js:257:17
    bei getCause (/src/server/node_modules/docker-modem/lib/modem.js:287:7)
    bei Modem.buildPayload (/src/server/node_modules/docker-modem/lib/modem.js:256:5)
    bei IncomingMessage.<anonymous> (/src/server/node_modules/docker-modem/lib/modem.js:232:14)
    bei IncomingMessage.emit (events.js:326:22)
    bei endReadableNT (_stream_readable.js:1223:12)
    bei processTicksAndRejections (internal/process/task_queues.js:84:21) {
  reason: undefined,
  statusCode: 409,
{
    message: 'Container 759eade851c945c48f396ace17a720ae1494882d4fbce9deeee5f6284b1c38de wird neu gestartet, warten Sie, bis der Container läuft'
  }
}
2020-11-15T14:56:41+0100 <info> init.js:49 () Zigbee2mqtt USB-Dongle an /dev/ttyACM0 angeschlossen
2020-11-15T14:56:41+0100 <info> installMqttContainer.js:83 (Zigbee2mqttManager.installMqttContainer) Zigbee2MQTT MQTT-Broker startet...
2020-11-15T14:56:46+0100 <info> installMqttContainer.js:95 (Zigbee2mqttManager.installMqttContainer) MQTT-Broker-Container erfolgreich gestartet
2020-11-15T14:56:47+0100 <info> installZ2mContainer.js:29 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt wird als Docker-Container installiert...
2020-11-15T14:56:47+0100 <info> installZ2mContainer.js:30 (Zigbee2mqttManager.installZ2mContainer) koenkk/zigbee2mqtt:latest-Image wird heruntergeladen...
2020-11-15T14:56:49+0100 <info> installZ2mContainer.js:33 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt-Umgebung wird vorbereitet...
2020-11-15T14:56:49+0100 <info> installZ2mContainer.js:39 (Zigbee2mqttManager.installZ2mContainer) Container wird erstellt...
2020-11-15T14:56:49+0100 <info> installZ2mContainer.js:47 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt erfolgreich als Docker-Container installiert
2020-11-15T14:56:49+0100 <info> installZ2mContainer.js:59 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt startet...
2020-11-15T14:56:54+0100 <info> installZ2mContainer.js:71 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt erfolgreich gestartet
2020-11-15T14:56:55+0100 <warn> connect.js:41 (MqttClient.<anonymous>) Von MQTT-Server getrennt

Meine docker-compose.yml-Datei sieht wie folgt aus:

version: "2.4"

services:
    gladys:
        image: r6n0/gladys-zigbee2mqtt:latest
        container_name: Gladys_Zigbee2Mqtt
        restart: always
        user: "0:0"
        privileged: true
        # depends_on: 
        #   - zigbee2mqttAssistant
        #   - rhasspy
        logging:
          options:
            max-size: "10m"
        network_mode: host
        dns:
          - 1.1.1.1
          - 1.0.0.1
        # ports:
        #   - $GLADYS_PORT:$GLADYS_PORT
        environment:
          - "TZ=${TZ}"
          - "NODE_ENV=production"
          - "SERVER_PORT=$GLADYS_PORT"
          - "SQLITE_FILE_PATH=/var/lib/gladysassistant/gladys-production.db"
        volumes:
          - "/etc/timezone:/etc/timezone:ro"
          - "/etc/localtime:/etc/localtime:ro"
          - "/var/run/docker.sock:/var/run/docker.sock"
          - "/run/udev:/run/udev:ro"
          - "/dev:/dev"
          - "$DATA_PATH/gladys_zigbee:/var/lib/gladysassistant"
        labels:
          - "hidden_${COMPOSE_PROJECT_NAME}"
          - "com.centurylinklabs.watchtower.enable=true"
          - "traefik.enable=false"

Mit folgenden Umgebungsvariablen:

COMPOSE_PROJECT_NAME=Gladys

#-----------------------------------------------------
## GLOBAL
#-----------------------------------------------------
PUID=0
PGID=0

TZ=Europe/Paris

CONFIG_PATH=./.config
LOG_PATH=/var/data/logs/gladys
DATA_PATH=/var/data/docker/gladys
#-----------------------------------------------------


#-----------------------------------------------------
## Gladys
#-----------------------------------------------------
GLADYS_PORT=7124
#-----------------------------------------------------

Ich glaube, das kommt daher.
Allerdings hätte sich Gladys mit dem Broker verbinden müssen…

Das muss eine Frage der Berechtigungen sein.
Überprüfe die Berechtigungen der Datei /var/lib/gladysassistant/zigbee2mqtt/mqtt/mosquitto.conf.
Im mqtt-Container ist der Benutzer nicht root, sondern mosquitto. Das könnte das Problem sein.

Die Berechtigungen der Datei sind korrekt auf root/root mit dem Wert 644 gesetzt, egal ob ich in meiner docker-compose-Datei den Wert user: "0:0" hinzufüge oder nicht.

Gibt es eine Möglichkeit, dem MQTT-Container den zu verwendenden Benutzer zuzuweisen? (Wenn es derselbe wie der von Gladys ist, würde das die Sache erleichtern und solche Probleme in Zukunft vermeiden.)

EDIT: Oder eine alternative Image zu verwenden?
In meinem Fall habe ich bei vorherigen Tests die Image eclipse-mosquitto verwendet, die, soweit ich mich erinnere, standardmäßig als root läuft (auch wenn das nicht unbedingt sicher ist…).

Aus Sicherheitsgründen ist es absolut nicht ratsam, die Container als Root zu starten!
Warum startest du Gladys auf diese Weise?
Das Beispiel in der Dokumentation tut das nicht. Allerdings wird die Option privileged verwendet.

Es ist tatsächlich das eclipse-mosquitto-Image, das gestartet wird, und es verwendet nicht den Root-Benutzer. Kein gut gemachtes Image, übrigens…

Für die Nutzung von root war das nur ein Test (so starte ich es normalerweise nicht), um zu sehen, ob die Hinzufügung eines Benutzers die Berechtigungen für die Konfigurationsdatei von Mosquitto ändert, aber das ändert nichts.

Es muss also an HypriotOS liegen, da alle Dateien von Gladys von root erstellt werden…


Schade, ich mochte diese leichte Distribution mit einem einfachen Docker darauf.

Man kann es trotzdem versuchen, das interessiert mich.
Könntest du die Berechtigungen im Verzeichnis Zigbee2mqtt auflisten?

Ja, hier sind sie:

$ ls -al /var/data/docker/gladys/gladys_zigbee/zigbee2mqtt/
insgesamt 12
drwxr-xr-x 3 root root 4096 nov.  15 17:04 .
drwxr-xr-x 3 root root 4096 nov.  15 17:04 ..
drwxr-xr-x 2 root root 4096 nov.  15 17:04 mqtt
HypriotOS/armv7: pirate@black-pearl in ~/Docker/Gladys_Rhasspy_Zigbee
$ ls -al /var/data/docker/gladys/gladys_zigbee/zigbee2mqtt/mqtt/
insgesamt 12
drwxr-xr-x 2 root root 4096 nov.  15 17:04 .
drwxr-xr-x 3 root root 4096 nov.  15 17:04 ..
-rw-r--r-- 1 root root  139 nov.  15 17:04 mosquitto.conf
-rw-r--r-- 1 root root    0 nov.  15 17:04 mosquitto.passwd

Normalerweise sollte der Besitzer des mqtt-Verzeichnisses 1883:1883 auf dem Host und mosquitto:mosquitto im Container sein.
Du musst den Container ohne den Benutzer root neu starten, aber vorher musst du das bereinigen, was von der vorherigen Installation generiert wurde:

  • Lösche die Dateien und Verzeichnisse:

rm -r /var/lib/gladysassistant/zigbee2mqtt

  • Lösche die Container z2m-mqtt und zigbee2mqtt.

Es handelt sich tatsächlich um den Container ohne den Benutzer root und mit vorheriger Bereinigung, ich glaube, dass standardmäßig bei HypriotOS der Benutzer, der die Rechte an Docker hat, root ist, egal welchen Container ich starte, die persistenten Daten gehören immer root…

Da bin ich wieder

Ich konnte nicht mehr testen, weil man diesen Fehler beheben muss (die Info in der UI zurückgeben)

2020-11-15T18:05:02+0100 <error> installMqttContainer.js:43 (Zigbee2mqttManager.installMqttContainer) MQTT-Broker konnte nicht als Docker-Container installiert werden: Error: (HTTP-Code 500) Serverfehler - toomanyrequests: Sie haben Ihr Pull-Rate-Limit erreicht. Sie können das Limit erhöhen, indem Sie sich authentifizieren und aufrüsten: https://www.docker.com/increase-rate-limit 
    at /src/server/node_modules/docker-modem/lib/modem.js:257:17
    at IncomingMessage.<anonymous> (/src/server/node_modules/docker-modem/lib/modem.js:284:9)
    at IncomingMessage.emit (events.js:326:22)
    at endReadableNT (_stream_readable.js:1223:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  reason: 'server error',
  statusCode: 500,
  json: null
}

Das ist mir noch nie passiert, aber egal, ich hatte nicht die Info, dass etwas schiefgehen könnte :wink:

Du kannst ein „docker login“ auf deinem Docker-Host ausführen, damit kannst du dich beim Docker Hub anmelden, der jetzt eine Authentifizierung erfordert, da es eine Begrenzung für die Anzahl der Pulls vom Docker Hub gibt…