Zigbee2mqtt : Image docker de test basée Gladys v4

Avant il faut valider que sur Github lorsque nous sommes contributeur, il n’y a pas moyen de pousser les PR sur la branche master. (il me semble que c’est ce qu’on s’était dis hier).

Je ne pense pas qu’on fasse une branche mais plutot chacun peut aider sur une branche, par contre pas possible de pousser sur master :slight_smile:

Exact, le fameux ‘repo pourri’

1 « J'aime »

Je pense que c’est ce que VonOx voulait dire.

De mon côté voilà ce que j’imaginais :

  • Quelqu’un dev un service de son côté, par exemple Zigbee2Mqtt
  • Puis création d’une branch “Zigbee2Mqtt” avec une version de dev avancée (fonctionnelle mais a compléter, tester et valider) sur Gladys offciel
  • Tout le monde peut proposer des PR sur cette branche
  • Seul ceux qui ont les droits peuvent approuver une PR puis merger sur Master

Pour moi ça a clairement du sens et facilitera grandement les contribution sur un service en développement.

Oui c’est ce qu’on s’est dit hier lors du call developer , mais on doit tester ça sur un repo pour être sur que personne puisse merge sur master ( car on ne le souhaite pas )

J’espère bien, sinon j’imagine même pas l’anarchie :laughing:

J’ai un peu de temps pour aider sur cette feature et pour finaliser le super travail de @Reno
Je vais commencer par rebase, merge tes 2 PR @lmilcent et pousser une PR sur Gladys + nouvelle image.
Ensuite, il faut que je liste les dernières choses à faire (tests, bugs, …) et que je m’y mette :slight_smile:
Pendant ce temps, il faudrait tester le fonctionnement que vous décrivez sur un repo oui.

3 « J'aime »

Si jamais tu as besoin d’aide sur quelque chose hésites pas (test, bugsn …) :slight_smile:

1 « J'aime »

Idem, j’ai des périphériques Zigbee et je connais le NodeJS (+ docker), je peux t’aider à valider une partie dans mon environnement par exemple.
Merci et bon courage en tout cas :smiley:

1 « J'aime »

A vous 4, l’intégration Zigbee2mqtt sera fini ce soir!!

2 « J'aime »

Les gars je comprends rien a tout ce langage technique… mais ça bouge, c’ est génial !!

Bonjour à tous et bonne année !

Je vois que je me reconnecte enfin, au bon moment…

Désolé à tous mais j’ai dû me déconnecter très brusquement du projet et n’ai eu aucun moment pour m’y remettre depuis bien 2 mois…

Je suis tout à fait partant pour travailler à plusieurs sur le sujet et j’avais d’ailleurs fait la demande plusieurs fois, par le passé, vu mon temps disponible limité.

Par contre, je veux bien continuer à donner mon avis sur les modifications car les choix que j’avais pris, notamment à cause de l’utilisation de Docker, peuvent être difficile à comprendre.
Je m’explique :
Merci @lmilcent pour tes PRs mais je ne suis pas sûr que celles-ci résolvent le pb pour tous.
Dans le container Zigbee2mqtt, il est tout à fait normal que le device soit toujours le même à l’intérieur du container. C’est juste un lien vers le device sur la machine hôte qui est passé au container à son lancement et ça simplifie les choses car la config interne du container est tjs la même pour tous.
En fait, c’est la modification du champ PathOnHost dans le fichier /src/server/services/zigbee2mqtt/docker/zigbee2mqtt-container.json, qui passe le device au container mais il s’appelle tjs /dev/ttyACM0dans le container. (J’ai un dongle sur /dev/ttyUSB0 chez moi et ça fonctionne bien)
C’est fait ici dans le code :

Du coup, il me semble que ton problème est un cas particulier qu’il faudrait étudier à part.

Donnez-moi votre avis sur le sujet.

Aussi, j’avais eu un soucis sur ma PR sur le repo Gladys et je devais la recréer lorsque j’ai “disparu”…
Touts les modifs Zigbee2Mqtt pourraient être regroupées en 1 commit mais il faudrait des commits séparés pour quelques modifs que j’ai apportées sur le core, afin de faciliter la validation par @pierre-gilles.
De mémoire, ça portait sur :

1 « J'aime »

Welcome back @Reno

J’avais pas pigé ça du tout , peut importe le port source, tu bind su /tty/ACM0 dans le conteneur z2m.

Le problème avec ça c’est que pour changer ça , il faut recréé le conteneur.

J’ai bien compris ?

Bon retour parmi nous :wink:

J’ai suspecté que tu avais fait ça justement, garder le même chemin de périphérique dans le conteneur mais le binder au chemin réel sur l’OS.
Mais ce cas risque de poser un problème de compatibilité si un utilisateur souhaite finalement cloner le repo Gladys et le lancer sans utiliser Docker.

En tout cas de mon côté, le conteneur était lancé avec ttyACM0 côté OS ce qui évidemment provoquait une erreur au lancement du contenur puisque l’équipement n’existait pas.

Je te pose la question inverse : pourquoi ne pas garder le même chemin d’accès que le « réel » ?
En soit, si toute la configuration est dynamique (comme je le propose avec ma PR), ça devrait pas poser de problème.

Oui, tu as bien compris.
Dans le cas où on modifie le device dans le fichier de conf du container, il faudra également redémarrer le container pour le relire, il me semble.

J’ai fait ce choix :

  1. pour éviter d’avoir des config différentes de ce container Z2M qui serait complexe à débugger à distance,
  2. Pour éviter de partager tous les devices avec le container Z2M (que l’on ne maîtrise pas), mais seulement le dongle Z2M.

Ok ça me va , ça fait sens :+1:

Ça, du coup, c’est donc un bug du module car le container Z2M ne devrait pas se lancer si on n’a pas choisi de device ou alors, c’est le nom du device qui ne s’est pas écrit correctement dans la DB.

Ça demandait moins de modif de fichier (uniquement le fichier de configuration du container et pas celui de Z2M). Après ça devrait marcher aussi mais je ne comprends pas quelque chose : si tu as /dev/ttyACM0 dans ta variable dongle côté OS, lorsque tu l’écris dans le container Z2M, elle n’est tjs pas bonne ,non ?

Lors de mon dernier test, j’avais :

  1. Créé un nouvelle DB Gladys
  2. Sélectionné ttyUSB0
  3. Lancé la création des conteneurs via l’interface web

Et le conteneur z2m refusait de se lancer. Avec le modifs que je proposais, c’était nikel.

Mais je vais refaire le test à nouveau, avec un nouveau conteneur et une nouvelle DB Gladys pour vérifier. Je te dis ça dans quelques minutes.

Cool. Ça permettra d’être sûr car aucun autre utilisateur n’a eu ce soucis.

Quel matériel/OS utilises-tu ?

Test effectué, le conteneur zigbee2mqtt ne se lance pas. z2m se lance correctement en revanche.
zigbee2mqtt ne génère même pas de logs.

J’ai lancé le nouveau conteneur sans base de données puisque c’était un test (donc pas de persistance) et avec puis sans la ligne -v /var/lib/gladysassistant:/var/lib/gladysassistant.

docker run -ti \
--log-opt max-size=10m \
--restart=always \
--privileged \
--network=host \
--name gladysDEBUG \
-e NODE_ENV=production \
-e SERVER_PORT=80 \
-e TZ=Europe/Paris \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /dev:/dev \
-v /run/udev:/run/udev:ro \
r6n0/gladys-zigbee2mqtt

Voilà le détail des logs d’erreur :

Logs Gladys
2021-01-15T14:19:50+0100 <info> installMqttContainer.js:61 (Zigbee2mqttManager.installMqttContainer) Creating user/pass...
2021-01-15T14:19:50+0100 <info> installMqttContainer.js:73 (Zigbee2mqttManager.installMqttContainer) Zigbee2MQTT MQTT broker is starting...
2021-01-15T14:19:56+0100 <info> installMqttContainer.js:77 (Zigbee2mqttManager.installMqttContainer) MQTT broker container successfully started
2021-01-15T14:19:56+0100 <info> installZ2mContainer.js:25 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt is being installed as Docker container...
2021-01-15T14:19:56+0100 <info> installZ2mContainer.js:26 (Zigbee2mqttManager.installZ2mContainer) Pulling koenkk/zigbee2mqtt:latest image...
2021-01-15T14:19:57+0100 <info> installZ2mContainer.js:29 (Zigbee2mqttManager.installZ2mContainer) Preparing Zigbee2mqtt environment...
2021-01-15T14:19:57+0100 <info> installZ2mContainer.js:35 (Zigbee2mqttManager.installZ2mContainer) Creating container...
2021-01-15T14:19:57+0100 <info> installZ2mContainer.js:43 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt successfully installed as Docker container
2021-01-15T14:19:57+0100 <info> installZ2mContainer.js:55 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt is starting...
2021-01-15T14:19:58+0100 <error> installZ2mContainer.js:74 (Zigbee2mqttManager.installZ2mContainer) Zigbee2mqtt container failed to start: Error: (HTTP code 500) server error - Cannot restart container a1f72b47034f13c6169ea95e3cf961b08ae2d9ddcf50fca200888848b06d98ef: error gathering device information while adding custom device "/dev/ttyACM0": no such file or directory
    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:1241:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  reason: 'server error',
  statusCode: 500,
  json: {
    message: 'Cannot restart container a1f72b47034f13c6169ea95e3cf961b08ae2d9ddcf50fca200888848b06d98ef: error gathering device information while adding custom device "/dev/ttyACM0": no such file or directory'
  }
}
2021-01-15T14:19:58+0100 <error> index.js:14 (process.<anonymous>) unhandledRejection catched: Promise {
  <rejected> Error: (HTTP code 500) server error - Cannot restart container a1f72b47034f13c6169ea95e3cf961b08ae2d9ddcf50fca200888848b06d98ef: error gathering device information while adding custom device "/dev/ttyACM0": no such file or directory
      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:1241:12)
      at processTicksAndRejections (internal/process/task_queues.js:84:21) {
    reason: 'server error',
    statusCode: 500,
    json: {
      message: 'Cannot restart container a1f72b47034f13c6169ea95e3cf961b08ae2d9ddcf50fca200888848b06d98ef: error gathering device information while adding custom device "/dev/ttyACM0": no such file or directory'
    }
  }
}
2021-01-15T14:19:58+0100 <error> index.js:15 (process.<anonymous>) Error: (HTTP code 500) server error - Cannot restart container a1f72b47034f13c6169ea95e3cf961b08ae2d9ddcf50fca200888848b06d98ef: error gathering device information while adding custom device "/dev/ttyACM0": no such file or directory
    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:1241:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  reason: 'server error',
  statusCode: 500,
  json: {
    message: 'Cannot restart container a1f72b47034f13c6169ea95e3cf961b08ae2d9ddcf50fca200888848b06d98ef: error gathering device information while adding custom device "/dev/ttyACM0": no such file or directory'
  }
}

Docker Inspect zigbee2mqtt :

Docker
pi@gladys:~ $ docker inspect zigbee2mqtt
[
    {
        "Id": "4fbcdacaf09340f9db83412b29ce4a26c1cc20a30e5dc978a8a6797297e11c85",
        "Created": "2021-01-15T13:29:57.209300743Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "npm",
            "start"
        ],
        "State": {
            "Status": "created",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 128,
            "Error": "error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory",
            "StartedAt": "0001-01-01T00:00:00Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:8a57907f6c4ecebea7358def33c3f54ac1d70c8fbbf6bc9e7bc8d1f940e9fbb4",
        "ResolvConfPath": "/var/lib/docker/containers/4fbcdacaf09340f9db83412b29ce4a26c1cc20a30e5dc978a8a6797297e11c85/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/4fbcdacaf09340f9db83412b29ce4a26c1cc20a30e5dc978a8a6797297e11c85/hostname",
        "HostsPath": "/var/lib/docker/containers/4fbcdacaf09340f9db83412b29ce4a26c1cc20a30e5dc978a8a6797297e11c85/hosts",
        "LogPath": "/var/lib/docker/containers/4fbcdacaf09340f9db83412b29ce4a26c1cc20a30e5dc978a8a6797297e11c85/4fbcdacaf09340f9db83412b29ce4a26c1cc20a30e5dc978a8a6797297e11c85-json.log",
        "Name": "/zigbee2mqtt",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "/var/lib/gladysassistant/zigbee2mqtt/z2m:/app/data"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "host",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "always",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "host",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [
                {
                    "PathOnHost": "/dev/ttyACM0",
                    "PathInContainer": "/dev/ttyACM0",
                    "CgroupPermissions": "rwm"
                }
            ],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/d99dc73114e87665c992b2a548d43c1700aa7df2ca88643d06f9fb7f7c41a869-init/diff:/var/lib/docker/overlay2/80aa1b93c3f3ce9e58aff7a0e71b216ffa835a47b4b2c5097a625b8147d2b453/diff:/var/lib/docker/overlay2/838ab8fa2e9301bff69513f43fa4728623d955117284379be6dfacc6a5cff594/diff:/var/lib/docker/overlay2/54ca51484d1fa5efa7000e3f8e9ca86e7e0c8f58e507bf899de8d5a1a6890260/diff:/var/lib/docker/overlay2/337c5ff44785f260c0a7d62b79d8deab1f6b6236f47c197cdc6e629d48c02243/diff:/var/lib/docker/overlay2/2c5d4002df2d44ad8508f11431cef3ceb3704c30d22ea2439648cc4bb8f92e55/diff:/var/lib/docker/overlay2/8bbe4879392cd3ac7257f91e65399751571acf8f84230b637293bcd97ee763ac/diff:/var/lib/docker/overlay2/3557a8d8a1f38bc8dcaea362f62435c1dddf1e7f09ab1b681904bd664aebfc97/diff:/var/lib/docker/overlay2/047849d144fa5e49452ffe93f1e12d881524fdfca746b63e84eebc3d92ae9d93/diff:/var/lib/docker/overlay2/a4aae5f649b7020069af11ed9528930a917d13172ebb205a3257e56a664825a3/diff:/var/lib/docker/overlay2/0c5824017e1b39a0c82bdfacadc6c2670ca05f9ce7c372310adb4961bd9c4acb/diff:/var/lib/docker/overlay2/57ad8fb1dea139313619455a2bfdbab7875d480c4de01797326520df8bd6bdc4/diff:/var/lib/docker/overlay2/f4456017e082fa551e765733362324693d36b92cd0111619807c60b439a0fbd7/diff:/var/lib/docker/overlay2/876f3fe7a27660468d0d2a003f549c2f39ee660e138cdb91e1902f1cf5728309/diff:/var/lib/docker/overlay2/20c4c4b21539a77f1f066f4955a8b4f20bd687d4b80eb483672e68e4bab7e9e9/diff",
                "MergedDir": "/var/lib/docker/overlay2/d99dc73114e87665c992b2a548d43c1700aa7df2ca88643d06f9fb7f7c41a869/merged",
                "UpperDir": "/var/lib/docker/overlay2/d99dc73114e87665c992b2a548d43c1700aa7df2ca88643d06f9fb7f7c41a869/diff",
                "WorkDir": "/var/lib/docker/overlay2/d99dc73114e87665c992b2a548d43c1700aa7df2ca88643d06f9fb7f7c41a869/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/var/lib/gladysassistant/zigbee2mqtt/z2m",
                "Destination": "/app/data",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        "Config": {
            "Hostname": "gladys",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NODE_VERSION=12.20.0",
                "YARN_VERSION=1.22.5"
            ],
            "Cmd": [
                "npm",
                "start"
            ],
            "Image": "koenkk/zigbee2mqtt:latest",
            "Volumes": null,
            "WorkingDir": "/app",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "f45106576f3b03452b3347db23ae157b91ea7d6a9e7dc335ffad1f5ac560df7d",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/default",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "host": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "52cf186cb21192c3c9aa88cb4c94bb770b3deff48b02aa4392285f1cf4504c39",
                    "EndpointID": "",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": null
                }
            }
        }
    }
]

Voilà l’erreur au lancement de zigbee2mqtt, visible dans l’inspection du conteneur.