[V4] Intégration Zigbee2mqtt

Ok je vois, merci pour l’explication :slight_smile: Et ça, est-ce qu’il y aurait moyen de faire ça dans l’image Docker directement? Comme ça on peut le mettre à jour au fur et à mesure?

Il y’a un equivalent pour alpine linux : Alpine Linux packages
J’ai envie de dire oui mais faut que je teste.

Si ça fonctionne effectivement c’est mieux dans l’image docker directement

Edit ça marche:

image

1 « J'aime »

Je suis du même avis que @Reno concernant l’option --privileged. En sécurité, il faut travailler avec le principe « du moindre privilège ».
Pour du débug et du développement, pas de soucis. Mais en production, surtout sur une image que Gladys distribuera, c’est important de considérer la sécurité à tous les niveaux.

Plusieurs personnes se sont déjà posé la question : Docker - a way to give access to a host USB or serial device? - Stack Overflow
En gros la meilleure manière en terme de sécurité c’est de partager seulement l’équipement voulu (lien vers la documentation Docker qui le confirme) sans utiliser l’option --privileged :

docker run -t -i --device=/dev/ttyUSB0 ubuntu bash

Pour donner accès à tout le dossier /dev l’option --privileged doit être utilisée, mais donne aussi tous les droits sur l’hôte !
Docker l’explique très bien :

In other words, the container can then do almost everything that the host can do.

Rien ne nous empêche de monter tous les devices qui nous intéresse :

docker run -t -i \
--device=/dev/ttyACM0 \
--device=/dev/ttyACM1 \
 ubuntu bash

Dans /dev se trouvent tous les périphériques du système, pourquoi Gladys aurait besoin d’accéder aux partitions des disques, loopback, etc ?
En étant installé sur l’hôte, l’OS aurait empêché l’accès à ces périphériques (sauf avec root évidemment), mais avec l’option --privileged je pense ce ne sera pas le cas.



Totalement d’accord avec toi, si Gladys est compliquée à déployer, maintenir et demande du temps à l’utilisateur final, ça ne fonctionnera pas.

Gladys utilise Docker pour faciliter les mises à jour, donc à chaque nouvelle version, le conteneur est supprimé puis créé à nouveau, non ?

Ce fonctionnement nous permettra donc facilement de modifier les paramètres de lancement de Gladys pour ajouter de nouveaux accès au RPi et suivre les évolutions. La sécurité et la facilité d’utilisation sont donc bien pris en compte :wink:



Dernière remarque niveau sécurité, une fois le travaille de développement terminé, on pourrait se pencher sur les Linux Capabilities. Ce sont des paramètres à passer au conteneur pour forcer Docker à limiter les droits d’accès sur l’hôte. Gladys n’a pas nécessairement besoin de créer une nouvelle carte réseau, d’interagir avec le kernel, d’accéder à des fichiers systèmes (sauf périphériques), modifier les partitions, déboguer un processus, etc.

Ces options sont très utiles pour s’assurer qu’en cas de compromission du conteneur (via un module malveillant ou si un utilisateur a directement exposé son RPi contrairement aux bonnes pratiques par exemple), celui-ci ne puisse pas exploiter l’hôte et faire plus de dégât (Ransomware sur le réseau, espionnage, etc.).

J’ai essayé de limiter les droits des conteneurs que j’utilise sur mon serveur perso, si ça vous intéresse voici la documentation et les exemples :

Exemple tiré de la documentation Docker :

For interacting with the network stack, instead of using --privileged they should use --cap-add=NET_ADMIN to modify the network interfaces.

$ docker run -it --rm  ubuntu:14.04 ip link add dummy0 type dummy

RTNETLINK answers: Operation not permitted

$ docker run -it --rm --cap-add=NET_ADMIN ubuntu:14.04 ip link add dummy0 type dummy

Merci et bravo si vous avez tout lu :sweat_smile:
Désolé de pas encore vous aider niveau dev, dès que j’ai un peu plus de temps je me lance dans mon projet domotique et je vous donne un coup de main !

Impossible de savoir d’avance combien de périphériques a l’utilisateur.
Je creuse le sujet avec des règles udev

Alors non c’est pas comme ça que ça se passe, le conteneur est recréé avec les même commandes. On utilise Watchtower

Vraiment intéressant tout ça ( j’ai un peu de lecture à faire ), mais attention y’ pas que des hotes linux.

ça n’existe plus les modules :wink: tout est intégré.

Merci pour tes propositions. Toute aide est la bienvenue.

Oups, effectivement je ne suis pas encore au point sur tout le fonctionnement de Gladys v4 :sweat_smile:

Concernant les périphériques c’est vrai qu’il y a matière à creuser pour savoir quoi monter. Les environnements des utilisateurs seront tous différents, difficile de prévoir ce qu’il aura.

Pour terminer, mes remarques pour Docker sont bien applicables à Linux et pas Windows :wink:

Hello,

Voila un petit retour de mes tests :

  • Le process de configuration est top (après avoir passé la petite difficulté liée à la détection du stick Zigbee), par contre toujours besoin de faire un force refresh pour faire apparaître mes devices sur la page discover après qu’ils aient été détectés par le stick
  • Si on navigue directement sur l’onglet discover (par exemple en tapant dans l’URL), les devices détectés n’apparaissent pas, il faut passer par l’onglet devices puis retourner sur l’onglet discover pour les voir
  • Sur le dashboard, si je passe en mode édition, je ne peux pas ajouter de box et ne peux plus changer de page : tout bug. (J’ai vérifié, je n’ai pas ce problème sur la version “normale” de Gladys)
    J’ai l’erreur suivante dans la console :
Console
RoomSelector.jsx:21 Uncaught (in promise) TypeError: Cannot read property 'map' of undefined
    at RoomSelector.jsx:21
    at Array.map (<anonymous>)
    at t.o.componentWillReceiveProps (RoomSelector.jsx:18)
    at b (preact.min.js:1)
    at preact.min.js:1
    at p (preact.min.js:1)
    at h (preact.min.js:1)
    at b (preact.min.js:1)
    at d (preact.min.js:1)

En dehors de ça, mes devices sont bien détectés et les valeurs remontent bien, j’ai testé les devices suivant :

  • Xiaomi magic cube
  • Xiaomi capteur de température
  • Xiaomi capteur ouverture de porte
  • Xiaomi capteur fuite d’eau
  • Ikea prise E1603/E1702
  • Ikea télécommande E1810
  • Ikea ampoule couleur LED1624G9 → reconnu avec fonctionnalités switch/light brightness, pas reconnu en tant que lumière, et pas d’option concernant le choix de couleur (mais il me semble que c’est une discussion en cours à plus haut niveau pour savoir comment gérer un color picker ?)

(J’aurais bientôt de nouveaux devices à tester, j’updaterai dès que possible)

Merci beaucoup pour ce service, ça va être top :smile:

PS : j’ai mis à jour les devices testés :wink:

2 « J'aime »

Je remonte un peu le topic pour avoir des infos.

Quel stick “clef-en-main” est utilisable ?

Y’a pas de clé en main, il faut à minima flasher la clé

1 « J'aime »

C’est surtout de l’assemblage tout fait qu’il me faut et pas envie de flasher avec de l’hardware.
Du coup, j’en ai trouvé 2 sur ta liste qui m’intéresse avec des antennes.

Elles peuvent servir de relais ?
Genre j’en branche une sur le pi et une autre sur le secteur, le maillage va se créer ?

Ouai c’est ce que j’ai , il y’ a un firmware pour le relai. ( ils appellent ça un coordinator )
Tous mes devices c’est du xiaomi

T’es obligé de flasher

Oui oui, il y a juste plusieurs méthodes apparemment selon la clé et je veux pas acheter du matos supplémentaire pour pouvoir le faire.

Une fois flashé, ya pas de maintenance, de maj à faire sur cette clé ?

Reflasher pour mettre à jour le firmware ( je l’ai jamais fait :slight_smile: )
Une fois configuré t’y touche plus

Une petite précision quand même pour que ce soit clair, le zigbee2mqtt n’est pas encore intégré à la v4. C’est en cours de développement !

1 « J'aime »

Il me semble que ça avance bien tout de même ?

C’est pour bientôt en test…

@VonOx, c’est sympa ton affichage du réseau. Tu le fais à partir du frontend de Zigbee2mqtt ou tu l’as fait toi-même via un logiciel ?
Je prévois d’intégrer la reconnaissance et affichage du réseau dans Gladys, par la suite.

1 « J'aime »

Comme j’ai rien pour gérer pour le moment j’utilise ça + HA:

Au niveau des tests unitaires, tu en es où ? :slight_smile: N’hésite vraiment pas si tu as des questions à les mettre ici.

Et niveau rebase avec le master actuel de Gladys v4, tu l’as fais récemment / pas encore ?

Niveau prettier / eslint la PR était bonne ?

(Désolé pour toutes ces questions, c’est juste pour me faire une idée de l’avancement!)

Je suis d’accord que publier une image de test est une première étape, mais j’ai vraiment peur du merge de cette PR qui est basée sur du code quasi vieux d’un an si je me rappelle bien ?

Je sais qu’on met la barre assez haut dans Gladys Assistant 4 sur la qualité de code, mais c’est vraiment la seule façon d’avoir un logiciel stable sur le long terme. Je suis toujours disponible pour aider à mettre en place les bonnes pratiques si besoin :slight_smile:

J’ai fait le rebase ce WE quand j’ai vu que la v4 était lancée. :+1:
J’ai mis beaucoup de temps pour m’inspirer au maximum de ce qui était déjà fait dans les autres services donc je pense que c’est pas trop sale.
Prettier OK. Eslint à faire.
Mon but est de délivrer une image pour avoir des retours de tests dans des configurations variées.
Je ferai les tests unitaires pendant que les utilisateurs testent l’image.

Après, il y aura toujours des aller-retour mais je pense qu’on y arrivera sans trop de casse. :crossed_fingers:

Bonne nouvelle ! Ouf c’est rassurant, j’ai eu peur que ce soit plus vieux :slight_smile:

Ok !

ça marche. Je ne sais pas combien de lignes de code il y a dans ta PR, mais il y aura probablement autant de code dans les tests donc ne sous estime pas le temps nécessaire pour les écrire, c’est important les tests et ça prend du temps :smiley:

Pour la prochaine fois, essaie vraiment de faire en sorte que les tests fassent partie de ton flow de développement. Faire tout le code d’un coup puis tous les tests d’un coup n’est pas vraiment le plus simple ni le plus motivant, les tests doivent t’aider à développer. Ecrire des tests « juste pour écrire des tests » n’est pas vraiment le but de l’opération :slight_smile:

Je comprends bien le principe mais je suis un “vieux” qui a commencé en assembleur puis en C sur de tous petits microcontrôleurs…
A l’époque, ça n’existait pas et j’ai vraiment du mal à m’y mettre, habitué au test en réel…
Déjà qu’il a fallu que je me mette à Node…

Juste un petit message pour dire à ceux qui n’osent pas participer (c’était mon cas au début), que connaissant le développement logiciel et en s’y mettant un peu, on peut arriver à contribuer sur Gladys.

2 « J'aime »