Zigbee2mqtt : Image docker de test basée Gladys v4

Bonjour à tous,

Après des mois d’attente, voici une nouvelle image de test de Gladys incluant le service Zigbee2mqtt.

Sur cette version, tout est automatique : il n’y a plus besoin d’utiliser des commandes pour lancer les containers Docker à la main.
Du coup, j’ai ajouté une vue pour suivre l’état de fonctionnement du service, au moment de son activation :

J’ai laissé également le tableau avec l’état des containers, au cas où, pour dépanner un utilisateur, si besoin, mais je pense que je le supprimerai dans la version qui sera intégrée à Gladys.

  • Vous pouvez télécharger l’image sur dockerhub :

Pour info, je l’ai tag avec la version de Gladys, sur laquelle elle est basée, et à laquelle j’ai ajouté un -n où n représente les évolutions du service Zigbee2mqtt.
Ainsi, cette version se nomme v4.0.0-1.
Si vous l’installez avec le tag latestet que watchtower tourne sur votre machine, elle sera mise à jour automatiquement à chaque évolution.

  • Ou l’installer et la lancer directement avec la commande indiquée dans la doc Gladys:
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 

Par rapport à la doc Gladys, j’ai rajouté l’option -v /run/udev:/run/udev:ro qui permet d’obtenir plus d’informations sur les devices USB (notamment le fabricant). Ça permet de différencier les dongles si vous insérer, par exemple, un dongle Zigbee2mqtt et un dongle Z-wave.

N’hésitez pas à commenter votre ressenti dans ce sujet et même à déposer des issues sur mon github pour identifier les bugs et les appareils qui ne sont pas gérés. Par contre, merci de détailler au maximum votre installation et comment vous avez produit le bug.

Merci à tous pour votre patience, en espérant que ça fonctionnera au mieux.

4 Likes

Super travail ! C’est la fonctionnalité la plus attendu je pense

Un ptit retour @Reno

2020-11-15T13:23:59+0100 <info> index.js:63 (Server.<anonymous>) Server listening on port 1080
2020-11-15T13:25:26+0100 <info> init.js:49 () Zigbee2mqtt USB dongle attached to /dev/ttyACM2
2020-11-15T13:25:37+0100 <info> init.js:49 () Zigbee2mqtt USB dongle attached to /dev/ttyACM2
2020-11-15T13:25:37+0100 <info> installMqttContainer.js:30 (Zigbee2mqttManager.installMqttContainer) MQTT broker is being installed as Docker container...
2020-11-15T13:25:37+0100 <info> installMqttContainer.js:31 (Zigbee2mqttManager.installMqttContainer) Pulling eclipse-mosquitto:latest image...
2020-11-15T13:25:38+0100 <info> installMqttContainer.js:34 (Zigbee2mqttManager.installMqttContainer) Preparing broker environment...
2020-11-15T13:25:38+0100 <info> installMqttContainer.js:38 (Zigbee2mqttManager.installMqttContainer) Creating container...
2020-11-15T13:25:39+0100 <info> installMqttContainer.js:52 (Zigbee2mqttManager.installMqttContainer) Zigbee2MQTT MQTT broker is starting...
2020-11-15T13:25:45+0100 <info> installMqttContainer.js:58 (Zigbee2mqttManager.installMqttContainer) Creating user/pass...
2020-11-15T13:25:45+0100 <info> installMqttContainer.js:69 (Zigbee2mqttManager.installMqttContainer) MQTT broker container successfully started
2020-11-15T13:25:45+0100 <info> installZ2mContainer.js:59 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt is starting...
2020-11-15T13:25:45+0100 <info> installZ2mContainer.js:71 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt successfully started
2020-11-15T13:25:45+0100 <warn> connect.js:32 (MqttClient.<anonymous>) Error while connecting to MQTT - Error: Connection refused: Not authorized
2020-11-15T13:25:45+0100 <warn> connect.js:41 (MqttClient.<anonymous>) Disconnected from MQTT server
2020-11-15T13:25:50+0100 <warn> connect.js:32 (MqttClient.<anonymous>) Error while connecting to MQTT - Error: Connection refused: Not authorized
2020-11-15T13:25:55+0100 <warn> connect.js:32 (MqttClient.<anonymous>) Error while connecting to MQTT - Error: Connection refused: Not authorized
2020-11-15T13:26:00+0100 <warn> connect.js:32 (MqttClient.<anonymous>) Error while connecting to MQTT - Error: Connection refused: Not authorized

image

Pour info j’ai déjà un conteneur MQTT sur l’hote et un conteneur zigbee2mqtt, est ce qu’on peut avoir la possibilité de juste spécifier une adresse MQTT dans ce cas ?

Edit: Mon conteneur Zigbee2mqtt existait déjà sous ce nom , du coup ça ne fonctionne pas, je penses qu’il faudre rajouter un prefix

1 Like

D’après ce que je vois dans tes logs, il n’y a pas d’erreur sur l’installation et le démarrage des containers.
C’est étonnant puisque tu dis avoir déjà un container avec ce nom.

Le broker mqtt est lancé sur le port 1884 pour ne pas entrer en conflit avec celui du service MQTT.
Si j’ai bien compris, @pierre-gilles préférait un broker séparé.

Du coup, pour ton problème de connexion, peux-tu regarder les logs des 2 containers du service ?

J’ai oublié de vous dire qu’on peut voir physiquement si la configuration du service a bien fonctionné : au démarrage, la led du dongle devrait s’éteindre.

Autre chose, il y a un bonus caché dans un des onglets. Un bon point à celui qui le trouve… :wink:

Hello, d’abord je souhaite te remercier pour ton taff, ça va être cool de pouvoir se passer d’une passerelle Xiaomi :slight_smile:

J’ai cependant un problème de droit sur mon installation, le conteneur MQTT démare bien mais redémarre en boucle, car il n’arrive pas à ouvrir son fichier de conf (log du conteneur mqtt : 1605448659: Error: Unable to open config file /mosquitto/config/mosquitto.conf.).
J’ai pourtant bien le mapping $DATA_PATH/gladys_zigbee:/var/lib/gladysassistant dans mes volumes et j’ai également forcé Gladys a utilisé l’user root (user: “0:0”) dans mon fichier docker-compose mais rien n’y fait…

Une idée ?

Tu dis utiliser un docker-compose. Pourrais-tu le partager ?

Vu le problème, le fichier de configuration du broker n’a pas été généré.
Pourrais-tu également donner ton log Gladys, comme l’a fait Vonox ?

OK je regarde ça ce soir, mais le problème c’est que comme le conteneur existe déjà, il n’est pas configuré pour le conteneur mqtt créé par le service.

Je te tiens au jus

Le fichier de config semble bien généré sur mon hote (en l’occurrence HypriotOS) avec le contenu suivant :

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

Les logs de Gladys indique ceci :

2020-11-15T14:52:29+0100 <info> index.js:63 (Server.<anonymous>) Server listening on port 7124
2020-11-15T14:54:34+0100 <info> init.js:49 () Zigbee2mqtt USB dongle attached to /dev/ttyACM0
2020-11-15T14:54:41+0100 <info> init.js:49 () Zigbee2mqtt USB dongle attached to /dev/ttyACM0
2020-11-15T14:54:41+0100 <info> installMqttContainer.js:30 (Zigbee2mqttManager.installMqttContainer) MQTT broker is being installed as Docker container...
2020-11-15T14:54:41+0100 <info> installMqttContainer.js:31 (Zigbee2mqttManager.installMqttContainer) Pulling eclipse-mosquitto:latest image...
2020-11-15T14:54:43+0100 <info> installMqttContainer.js:34 (Zigbee2mqttManager.installMqttContainer) Preparing broker environment...
2020-11-15T14:54:43+0100 <info> installMqttContainer.js:38 (Zigbee2mqttManager.installMqttContainer) Creating container...
2020-11-15T14:54:43+0100 <info> installMqttContainer.js:52 (Zigbee2mqttManager.installMqttContainer) Zigbee2MQTT MQTT broker is starting...
2020-11-15T14:54:49+0100 <info> installMqttContainer.js:58 (Zigbee2mqttManager.installMqttContainer) Creating user/pass...
2020-11-15T14:54:49+0100 <error> installMqttContainer.js:73 (Zigbee2mqttManager.installMqttContainer) MQTT broker container failed to start: Error: (HTTP code 409) unexpected - Container 759eade851c945c48f396ace17a720ae1494882d4fbce9deeee5f6284b1c38de is restarting, wait until the container is running 
    at /src/server/node_modules/docker-modem/lib/modem.js:257:17
    at getCause (/src/server/node_modules/docker-modem/lib/modem.js:287:7)
    at Modem.buildPayload (/src/server/node_modules/docker-modem/lib/modem.js:256:5)
    at IncomingMessage.<anonymous> (/src/server/node_modules/docker-modem/lib/modem.js:232:14)
    at IncomingMessage.emit (events.js:326:22)
    at endReadableNT (_stream_readable.js:1223:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  reason: undefined,
  statusCode: 409,
{
    message: 'Container 759eade851c945c48f396ace17a720ae1494882d4fbce9deeee5f6284b1c38de is restarting, wait until the container is running'
  }
}
2020-11-15T14:54:49+0100 <error> index.js:14 (process.<anonymous>) unhandledRejection catched: Promise {
  <rejected> Error: (HTTP code 409) unexpected - Container 759eade851c945c48f396ace17a720ae1494882d4fbce9deeee5f6284b1c38de is restarting, wait until the container is running 
      at /src/server/node_modules/docker-modem/lib/modem.js:257:17
      at getCause (/src/server/node_modules/docker-modem/lib/modem.js:287:7)
      at Modem.buildPayload (/src/server/node_modules/docker-modem/lib/modem.js:256:5)
      at IncomingMessage.<anonymous> (/src/server/node_modules/docker-modem/lib/modem.js:232:14)
      at IncomingMessage.emit (events.js:326:22)
      at endReadableNT (_stream_readable.js:1223:12)
      at processTicksAndRejections (internal/process/task_queues.js:84:21) {
    reason: undefined,
    statusCode: 409,
    json: {
      message: 'Container 759eade851c945c48f396ace17a720ae1494882d4fbce9deeee5f6284b1c38de is restarting, wait until the container is running'
    }
  }
}
2020-11-15T14:54:49+0100 <error> index.js:15 (process.<anonymous>) Error: (HTTP code 409) unexpected - Container 759eade851c945c48f396ace17a720ae1494882d4fbce9deeee5f6284b1c38de is restarting, wait until the container is running 
    at /src/server/node_modules/docker-modem/lib/modem.js:257:17
    at getCause (/src/server/node_modules/docker-modem/lib/modem.js:287:7)
    at Modem.buildPayload (/src/server/node_modules/docker-modem/lib/modem.js:256:5)
    at IncomingMessage.<anonymous> (/src/server/node_modules/docker-modem/lib/modem.js:232:14)
    at IncomingMessage.emit (events.js:326:22)
    at endReadableNT (_stream_readable.js:1223:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  reason: undefined,
  statusCode: 409,
{
    message: 'Container 759eade851c945c48f396ace17a720ae1494882d4fbce9deeee5f6284b1c38de is restarting, wait until the container is running'
  }
}
2020-11-15T14:56:41+0100 <info> init.js:49 () Zigbee2mqtt USB dongle attached to /dev/ttyACM0
2020-11-15T14:56:41+0100 <info> installMqttContainer.js:83 (Zigbee2mqttManager.installMqttContainer) Zigbee2MQTT MQTT broker is starting...
2020-11-15T14:56:46+0100 <info> installMqttContainer.js:95 (Zigbee2mqttManager.installMqttContainer) MQTT broker container successfully started
2020-11-15T14:56:47+0100 <info> installZ2mContainer.js:29 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt is being installed as Docker container...
2020-11-15T14:56:47+0100 <info> installZ2mContainer.js:30 (Zigbee2mqttManager.installZ2mContainer) Pulling koenkk/zigbee2mqtt:latest image...
2020-11-15T14:56:49+0100 <info> installZ2mContainer.js:33 (Zigbee2mqttManager.installZ2mContainer) Preparing Zigbee2mqtt environment...
2020-11-15T14:56:49+0100 <info> installZ2mContainer.js:39 (Zigbee2mqttManager.installZ2mContainer) Creating container...
2020-11-15T14:56:49+0100 <info> installZ2mContainer.js:47 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt successfully installed as Docker container
2020-11-15T14:56:49+0100 <info> installZ2mContainer.js:59 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt is starting...
2020-11-15T14:56:54+0100 <info> installZ2mContainer.js:71 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt successfully started
2020-11-15T14:56:55+0100 <warn> connect.js:41 (MqttClient.<anonymous>) Disconnected from MQTT server

Mon docker-compose.yml ressemble à ceci :

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"

Avec les variables d’environnement suivantes :

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
#-----------------------------------------------------

Je pense que ça vient de là également.
Par contre, Gladys aurait dû se connecter au broker…

Ce doit être une question de droits.
Vérifie que les droits sur le fichier /var/lib/gladysassistant/zigbee2mqtt/mqtt/mosquitto.conf.
Dans le container mqtt, l’utilisateur n’est pas root mais mosquitto. Ce pourrait être le problème.

Les droits sur le fichier sont bien en root/root et avec la valeur 644 que j’ajoute ou non dans mon docker-compose la valeur user: "0:0".

Du coup il y aurait un moyen de spécifier au conteneur MQTT l’utilisateur à utiliser ? (si il le même que celui de Gladys ça faciliterait la chose je pense et ça éviterai ce genre de soucis à l’avenir).

EDIT : ou bien d’utiliser une image alternative ?
Dans mon cas sur des test précédant j’utilisais l’image eclipse-mosquitto qui est si mes souvenirs sont bons en root par défaut (même si c’est pas top forcément niveau sécu…)

D’un point de vue sécurité, il n’est absolument pas conseillé de lancer les containers en tant que root !
Pourquoi lances-tu Gladys de cette façon ?
L’exemple de la doc ne le fait pas. Par contre, l’option privileged est utilisée.

C’est bien l’image eclipse-mosquitto qui est lancée et elle n’utilise pas l’utilisateur root. Aucune image bien faite, d’ailleurs…

Pour l’utilisation du root, c’était juste un test (ce n’est pas comme ça que je le lance habituellement) pour voir si l’ajout d’un user changeait les droits sur le fichier de config de mosquitto mais cela ne change rien.

Ça doit donc venir de HypriotOS alors, puisque l’ensemble des fichiers de Gladys sont créés par root…
Capture
Dommage j’aimais bien cette distri légère avec un simple docker dessus…

On peut essayer quand même, ça m’intéresse.
Pourrais-tu lister les droits dans le répertoire Zigbee2mqtt ?

Yes les voici :

$ ls -al /var/data/docker/gladys/gladys_zigbee/zigbee2mqtt/
total 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/
total 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

Normalement, le propriétaire du répertoire mqtt devrait être 1883:1883 sur l’hôte et mosquitto:mosquitto dans le container.
Il faut que tu relances le container sans l’utilisateur root mais avant, il faut nettoyer ce qui a été généré par l’install précédente :

  • Supprimer les fichers et répertoires :

rm -r /var/lib/gladysassistant/zigbee2mqtt

  • Supprimer les containers z2m-mqtt et zigbee2mqtt.

Il s’agit bien du conteneur sans l’utilisateur root et avec nettoyage au préalable, je pense que par défaut sur HypriotOS, l’utilisateur qui a les droits sur Docker est root, j’ai beau lancer n’importe quel conteneur, les données en persistances sont toujours root…

Me voilà de retour

J’ai pas pu tester plus car il faudra gérer cette erreur ( renvoyé l’info dans l’UI )

2020-11-15T18:05:02+0100 <error> installMqttContainer.js:43 (Zigbee2mqttManager.installMqttContainer) MQTT broker failed to install as Docker container: Error: (HTTP code 500) server error - toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: 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
}

ça ne m’était pas encore arrivé, quoi qu’il en soit j’avais pas l’info qu’un truc se passer mal :wink:

Tu peux faire un “docker login” sur l’hôte de ton docker, ça permet de se connecter au Docker Hub qui maintenant nécessite une authentification car il y a une limite sur le nombre de pull depuis ce Docker Hub…