Maison intelligente dans des conteneurs (ioBroker + Zigbee dans Docker)

Entrée


Pendant un certain temps, j'ai utilisé plusieurs relais Sonoff standard qui contrôlent la lumière via le Google Home Mini. Mais au final, j'en voulais plus. La fonctionnalité standard ne suffit pas, j'ai décidé de rendre progressivement le système quelque chose de plus flexible. J'ai choisi ioBroker.

Au début, comme d'habitude, j'ai regardé, choisi, vérifié des fonctionnalités. Lorsque, séparément, les nécessités de base ont fonctionné, il a commencé à s'organiser. Et, bien sûr, j'ai rencontré des problèmes.

Les principales difficultés:

  • Que choisir exactement? Après tout, il existe de nombreuses façons de mettre en œuvre notre plan. Et même dans la solution choisie, il existe de nombreuses options ...
  • Il n'y a pas d'instructions prêtes à l'emploi pour assembler exactement l'ensemble des solutions que j'ai choisies et précisément dans mes configurations.

Ce que j'ai choisi, pourquoi, quelles difficultés j'ai rencontrées et comment les résoudre, et ce sera discuté.

Pour l'avenir, je vais décrire comment ioBroker a été lancé dans Docker sur un ancien ordinateur portable et y a jeté Zigbee pour interagir directement avec les capteurs Xiaomi, sans passerelle. Je ne donne pas d'instructions standard, seulement mes "bosses".

Puisqu'il n'est pas encore productif, il est tout à fait possible de changer quelque chose. Je serai donc reconnaissant pour les conseils et corrections :)

Liste de souhaits et le train de mes pensées


Il y avait des bobines Sonoff (enroulées dans eWeLink), une sorte de rallonge (Tuya SmartLife), une passerelle Xiaomi avec plusieurs capteurs (Mi Home), une colonne Google Home Mini.

eWeLink et SmartLife ont normalement repris sur Google Home, écouté des commandes vocales telles que «Allumez les lumières sur la table». Mi Home n'a pas démarré (il y a peu d'appareils Xiaomi pris en charge dans Google Home).

J'ai mis ioBroker, ramassé la passerelle Xiaomi, en principe, tout a fonctionné. Tout est beau, j'ai vérifié les scripts, ils sont écrits (j'ai choisi Node-Red), j'ai décidé de tout faire là-dessus.

Cependant, je ne suis pas un administrateur professionnel, je peux comprendre comment le préparer, mais je ne sais pas dans quelles subtilités comme les bibliothèques et les composants (et je ne veux pas approfondir). Par conséquent, cela me dérangeait un peu que ioBroker ait besoin de nodejs, des npm avec lesquels je n'avais pas affaire auparavant. Il y a des difficultés avec les versions (comme le yum standard du référentiel mis trop vieux nodejs, etc.).

Eh bien, c'est-à-dire J'ai tout commencé, mais la peur est restée dans mon cœur que même si ça marche, je ne comprends pas comment. Et si, par exemple, quelque chose se casse pendant une mise à niveau, je ne saurai pas y remédier. Mais en plus d'ioBroker, je voulais également empiler d'autres systèmes sur l'ordinateur portable.

Je vais, par exemple, mettre à jour quelque chose qui semble fonctionner. Et après un certain temps, il s'avère que cela fonctionne mal. Nous devrons annuler la sauvegarde il y a un mois. De plus, la sauvegarde n'est pas seulement de ce système, mais de tous les autres, car je ne comprends pas jusqu'au bout d'où de quel système sont les fichiers exécutables, où sont les fichiers de configuration, où sont les données elles-mêmes ...

Cela me dérangeait beaucoup, alors j'ai décidé d'utiliser Docker. Le code dans le conteneur. Les données séparément, le répertoire est monté sur l'hôte. Facile à sauvegarder.

Existe-t-il une nouvelle version? Oui, même sur une autre machine virtuelle, il est facile de vérifier le fonctionnement de la nouvelle version du conteneur avec les données de ce répertoire. Différents systèmes n'interfèrent pas entre eux. Il est facile de restaurer les fichiers binaires de certains systèmes. Encore une fois, il est facile de passer à autre chose (ioBroker dans le conteneur fonctionne à la fois sur Synology et sur carte unique). La beauté!

Il y aura plus d'exigences (pour rendre disponible via Internet, mais pas publiquement disponible pour la sécurité), elles affecteront davantage lors du choix des configurations.

L'installation


Le système d'exploitation hôte n'est pas critique, j'ai téléchargé CentOS (à partir de l'ancienne mémoire, je me suis souvenu que pour toutes les tâches réseau, il fonctionnait de manière assez stable et sans bourrelet). La version actuelle était Cent OS 8.

Mettez-le. J'ai fait des paramètres de base tels que le nom d'hôte, fail2ban (juste une habitude, bien que l'hôte soit uniquement en LAN). Mettez Docker. Je ne m'attarderai pas là-dessus. Exemple d'instructions .

Il est temps de lancer ioBroker. Mais quel réseau choisir? Hôte ou Macvlan?

Tout d'abord, Macvlan voulait que chaque conteneur obtienne son adresse IP du routeur. Mais il a alors décidé d'abandonner cette entreprise:

  • Avec Host, bien sûr, vous devez indiquer explicitement les ports à transférer, assurez-vous qu'ils ne se croisent pas avec d'autres conteneurs. Mais
  • iptables devra être configuré à l'intérieur de chaque conteneur. Y compris après chaque redémarrage avec d'autres paramètres, mise à niveau / remplacement. Et en mode hôte, c'est un point unique de gestion de la sécurité.
  • Je prévois toujours de le rendre disponible non seulement à partir du WiFi domestique. Et dans ce cas, il est plus pratique de rendre un hôte accessible de l'extérieur (et un mappage de port dessus) que de le configurer pour plusieurs.

Actuellement cochée ZeroTier One. Installé uniquement sur l'hôte. L'accès à l'adresse IP de cet hôte (non local, mais émis par ZeroTier) et au port 8082 depuis le téléphone mobile via GPRS lorsque le client ZeroTier fonctionne parfaitement ouvre l'interface vis).

Si standard

docker run -d --name ioBroker -p 8081:8081 -p 8082:8082 -v /opt/iobroker/:/opt/iobroker/ --device=/dev/ttyACM0 --env-file /opt/ioBroker_env.list --restart=always buanet/iobroker:latest 

Oups Quelque chose a mal tourné.

docker logs ioBroker montre qu'à la dernière étape, il n'y a pas de connexion aux ressources externes. Je ne peux pas obtenir un nom de razorolvit.

docker exec -it ioBroker bash montre que le ping sur IP passe bien, mais pas par nom.

Google, je trouve un tas de liens sur la façon dont le docker remplace incorrectement le serveur DNS, je règle /etc/docker/daemon.json, je comprends dnsmasq - rien n'y fait.

Une pensée se glisse, tout à coup quelque chose est bloqué au niveau du réseau. Mais il n'y a ni telnet ni boucle dans le conteneur, je ne peux pas vérifier. L'installation n'est pas non plus facile - l'installation yum ne fonctionne pas. Vous pouvez bien sûr spécifier manuellement les hôtes nécessaires dans / etc / hosts, mais cela prend trop de temps, je ferais mieux de vérifier les autres versions.

Par exemple, j'arrête stupidement firewalld sur l'hôte dans l'espoir que tout s'ouvrira. Mais non.

Je rappelle que la disponibilité du port peut toujours être vérifiée avec wget. Et il est dans le conteneur! Et ne peut rien télécharger même par IP. Même l'interface Web du routeur domestique ne peut pas se connecter. Eh bien, cela signifie que le problème n'est certainement pas dans le DNS, mais dans iptables.

En conséquence, tout a fonctionné après l'ajout de l'interface docker à la zone de confiance:

 sudo firewall-cmd --permanent --zone=trusted --change-interface=docker0 sudo firewall-cmd --reload 

C'est même intéressant, est-ce que j'ai oublié quelque part dans les instructions?

Ou ne prendrais-je pas CentOS 8, mais autre chose, il n'y aurait pas de problème (dans les autres OS il ne pare-feu pas par défaut)?

Ou est-ce si évident pour tout le monde qu'ils n'écrivent pas dans les instructions, je suis stupide depuis longtemps?

Zigbee


Donc, mon ioBroker est dans le conteneur, et il n'a publié que quelques ports. Maintenant, c'est l'administrateur 8081 et vis 8082, puis mqtt 1883 sera ajouté et, peut-être, quelque chose pour prendre en charge Tuya (j'ai vu un tel pilote, mais je ne l'ai pas encore compris).

Hélas, pour interagir avec les appareils Xiaomi via sa passerelle, des multidiffusions sont nécessaires, et avec cela dans cette configuration de complexité. Par conséquent, j'ai décidé de jeter un conteneur de clé USB. Également un fonctionnement normal.

Sur la ligne de commande, vous avez déjà vu --device=/dev/ttyACM0 pour cela. L'appareil dans le conteneur est apparu. Dans ioBroker, j'ai activé le pilote standard "Zigbee pour Xiaomi et autres appareils", mais cela n'a pas fonctionné.

Google suggère que pour accéder au port série, vous devez ajouter l'utilisateur au groupe de numérotation. Je vais dans le conteneur, j'ajoute iobroker à ce groupe - ça n'aide pas.

Je vois les conseils dont vous avez besoin pour installer le package serialport via npm.

Je ne peux pas, pas de droits. Google plus loin.

Bluefox seul dit à quelqu'un que cela doit être fait à partir du répertoire /opt/iobroker/node_modules/iobroker.javascript/ - je n'en ai pas, et je n'ai toujours pas de droits d'installation (enfin, l'installation démarre, puis plante).

Enfin, il me vient à l'esprit que je dois spécifier explicitement dans la ligne de commande dans quel répertoire placer.

 npm install -g serialport --production --save --prefix "/opt/iobroker" 

Il est installé, mais n'aide pas.

Je commence à soupçonner que vous devez encore gérer les droits d'accès. Vérification (de l'intérieur du conteneur, bien sûr):

 test -w /dev/ttyACM0 && echo success || echo failure 

Succès C'est-à-dire Pourtant, le docker a jeté l'appareil correctement.

 sudo -H -u iobroker test -w /dev/ttyACM0 && echo success || echo failure 

Dingo! Échec

bash à l'intérieur du conteneur s'exécute sous la racine, mais à partir de l'utilisateur iobroker, il n'y a pas d'accès au port. Malgré l'ajout préalable au groupe de numérotation.

ls -l /dev/ttyACM0 donne

 crw-rw----. 1 root 18 166, 0 Nov 3 18:14 /dev/ttyACM0 

Ha! Qu'est-ce que 18 au lieu du nom du groupe?

Tout est correct sur l'hôte principal: crw-rw----. 1 root dialout 166, 0 Nov 3 15:15 /dev/ttyACM0 crw-rw----. 1 root dialout 166, 0 Nov 3 15:15 /dev/ttyACM0

Il s'avère que sur l'hôte principal dans / etc / group dialout:x:18 , et dans le conteneur dialout:x:20

Bien que j'aie ajouté un utilisateur au groupe portant ce nom, cela n'a aucun sens, le nombre n'est pas le même. J'ai donc créé un autre groupe avec l'identifiant 18, et y ai déjà ajouté l'utilisateur:

 groupadd -g 18 serial usermod -a -G serial iobroker 

J'ai tout redémarré pour plus de certitude. Et là-dessus ma confrontation s'est terminée :)

Il a délié calmement tous les capteurs de la passerelle Xiaomi, l'a lié à ioBroker.

Je les vois comme des objets dans ioBroker lui-même:



Les lectures Vis sont lues:



Lorsque les contacts du capteur de fuite sont fermés, des données sont reçues. Et l'image change:



Et dans Node-Red, le signal arrive. En conséquence, bien que des e-mails ou autre chose soient envoyés, un fichier vocal ou MP3 est envoyé à la colonne GH Mini:



Au fait, lors de la visualisation des objets, une surprise m'attendait:



J'ai tourné le Xiaomi Cube d'un autre côté. Les dernières modifications sont affichées en vert.
Flip90 a changé - c'est compréhensible. Ce signal est capté pour le contrôle. Mais, il s'avère, il y a encore flip90_from et flip90_to - avec quel côté il s'est tourné.

Il s'avère que, en théorie, vous pouvez obtenir encore plus de signaux de contrôle du cube. Par exemple, si vous dessinez des flèches sur les bords (comme si dans un cercle), vous pouvez suivre non seulement "tourner à 90", mais aussi dans quelle direction (de vous-même à vous-même, à gauche ou à droite).

Pour flip180, cela fonctionne également. Et pour d'autres gestes, il y a des informations supplémentaires similaires (côté supérieur sur flip 180 °, côté supérieur sur glissière, côté supérieur sur robinet)

Non pas que c'était désespérément nécessaire. Mais dans le Mi Home standard, il n'y avait aucune information sur les visages. Il semble qu'avec la connexion précédente via Xiaomi Gateway, je ne l'ai pas non plus vue, je ne savais pas que chaque visage avait un numéro. Auparavant, je ne connaissais que l'action supplémentaire de la chute (chute libre), ce qui était le cas, mais ils ont été expulsés de Mi Home (apparemment, ils l'ont laissé tomber trop souvent).

Finale


Tout ce dont j'ai besoin, c'est de travailler. Ensuite, vous pouvez apporter de la beauté, écrire des scripts, connecter Tuya, lancer un conteneur avec Blynk pour d'autres projets ...

Et, peut-être, pour refaire quelque chose en fonction de vos commentaires :)

Source: https://habr.com/ru/post/fr474354/


All Articles