KiwiHC16 / Abeille

Abeille pour Jeedom (Gateway ZiGate)
GNU Affero General Public License v3.0
60 stars 52 forks source link

GPIO and Docker for PiZigate #1396

Closed KiwiHC16 closed 3 years ago

KiwiHC16 commented 4 years ago

Clarifier comment on gere la PiZigate dans Docker GPIO Docker + simplification du test #1391

KiwiHC16 commented 4 years ago

Comment passe t on les GPIO à docker ? Pour le port serie pas de soucis. Mais comment faire pour les deux PIN IO pour alim et reset ?

Est ce qu'on detecter si le script tourne sur le host ou dans un docker ?

KiwiHC16 commented 4 years ago

https://blog.hypriot.com/post/lets-get-physical/

KiwiHC16 commented 4 years ago

https://blog.alexellis.io/gpio-on-swarm/

edgd1er commented 4 years ago

https://stackoverflow.com/questions/30059784/docker-access-to-raspberry-pi-gpio-pins

KiwiHC16 commented 4 years ago

@edgd1er Puis je te laisser investiguer ce sujet ?

tcharp38 commented 4 years ago

@tcharp38 : as tu quelque chose comme ça sur ton orangePi ? ici c'est ce que j'ai sur un raspberry 2

A priori oui.

orangepi@FelicityDBox:~$ ls -R /sys/class/gpio /sys/class/gpio: export gpiochip0 gpiochip352 unexport

tcharp38 commented 4 years ago

Au vu des differents echanges, je vois les choses comme suit

Docker etant une feature "advanced" ca ne semble faire du sens et heureusement on ne joue pas avec les GPIO a beaucoup d endroits et on peut ainsi limiter les exigences au niveau plateforme. Ca fait du sens ?

KiwiHC16 commented 4 years ago

Je suis ok avec ca. Reste a trouver le moyen de le faire.

tcharp38 commented 4 years ago

Dans le cas "docker" et uniquement dans ce cas, trouver comment controler les GPIO (via /dev/gpiomem ? via /sys/class ?)

Reste qu'a résoudre ce pb. Le reste n'est pas compliqué.

KiwiHC16 commented 4 years ago

@edgd1er , pour dis tu: "Il y a effectivement une modification sur la présence de gpiomem qui correspond au matériel "officiellement" supporté par le concepteur du pizigate. Cette modification ne marcherait pas sur les rpi like."

C est quoi cette modification ?

PS: Pour moi, si jeedom tourne sur une plateforme, Abeille doit aussi tourner. Il peut être nécessaire de petits ajustements mais on s adapte. Apres si on n'a pas le temps de supporter alors on n'a pas le temps. Et comme tout est ouvert et dispo, chacun peut faire ses adaptations.

edgd1er commented 4 years ago

La commande ajoutée etait:

[[ ! -e /dev/gpiomem ]] && echo "Erreur,pas de device GPio" && exit

et l'orangePi n'a pas ce /dev/gpiomem d ou la régression pour Tcharp.


Nativement, le raspberry et le orange a priori gere les gpio via le programme gpio. Avoir acces au gpio depuis un conteneur n'est pas natif. il faut ajouter de la configuration au lancement du conteneur. Une fois dans le conteneur, l'utilisation et le parametrage des pin est identique entre le mode natif et le mode conteneur.

Je vais créer un projet pour trouver et valider la configuration nécéssaire pour que le programme gpio marche aussi dans un conteneur.

edgd1er commented 4 years ago

Bon voila le résultat des courses, j'ai fait un projet pour valider tout cela: https://github.com/edgd1er/docker-rpi-gpio un simple git clone https://github.com/edgd1er/docker-rpi-gpio.git && cd docker-rpi-gpio && docker-compose up --build permet d'avoir l affichage des pin gpio dans le conteneur.

les informations

@tcharp38 , pourrais tu exécuter ce projet sur un orangePi, ce qui permettrait de s'assurer que le moyen de démarrer un conteneur avec accès au gpio sur OrangePi est identique aux raspberry Pi ? il faut installer docker et docker-compose sur un OrangePi,je ne sais pas si cela est possible. je ne connais pas ces bestioles.

Execution du script dans le conteneur:

Recreating gpio_gpio_1 ... done
Attaching to gpio_gpio_1
gpio_1  | uid=0(root) gid=0(root) groups=0(root)
gpio_1  | fd
gpio_1  | full
gpio_1  | mem
gpio_1  | mqueue
gpio_1  | null
gpio_1  | ptmx
gpio_1  | pts
gpio_1  | random
gpio_1  | shm
gpio_1  | stderr
gpio_1  | stdin
gpio_1  | stdout
gpio_1  | tty
gpio_1  | urandom
gpio_1  | zero
gpio_1  |  +-----+-----+---------+------+---+---Pi 3B--+---+------+---------+-----+-----+
gpio_1  |  | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
gpio_1  |  +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
gpio_1  |  |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
gpio_1  |  |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |
gpio_1  |  |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
gpio_1  |  |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 0 | IN   | TxD     | 15  | 14  |
gpio_1  |  |     |     |      0v |      |   |  9 || 10 | 1 | IN   | RxD     | 16  | 15  |
gpio_1  |  |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
gpio_1  |  |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
gpio_1  |  |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
gpio_1  |  |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
gpio_1  |  |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
gpio_1  |  |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
gpio_1  |  |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
gpio_1  |  |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
gpio_1  |  |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
gpio_1  |  |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
gpio_1  |  |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
gpio_1  |  |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
gpio_1  |  |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
gpio_1  |  |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
gpio_1  |  |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
gpio_1  |  +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
gpio_1  |  | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
gpio_1  |  +-----+-----+---------+------+---+---Pi 3B--+---+------+---------+-----+-----+
edgd1er commented 4 years ago

Conclusion:

Avec ces résultats voici un proposition pour tester si le gpio fonctionne dans jeedom: (compatible RPI et orangePi) gpio readall 2>&1 >/dev/null [[ $? -gt 0 ]] && echo "Erreur" && exit

Qu'en pensez vous ?

edgd1er commented 4 years ago

@tcharp,

il semblerait qu'il faille un binaire spécifique OrangePi pour faire fonctionner le gpio. il y a de l'information ici: http://www.orangepi.org/Docs/WiringPi.html

pour entrer dans le conteneur:docker-compose exec gpio bash

Pour l'orangePi, le binaire gpio est il inclus dans la distribution ? comment l'as tu installé ? cette commande issu de installWiring.sh fonctionne t-elle sur un orangePi ? sudo apt-get -y install wiringpi

tcharp38 commented 4 years ago

J'ai pas installé wiringpi mais WiringOPI. Mais ne te focalise pas sur l'OPI. Il faut choisir la meilleure methode pour un acces "docker" sans tout peter pour la majorité "non docker". Mon installation n'est peut etre pas complete par rapport à un WiringPi par defaut. Par ex, le "/dev/gpiomem" peut etre une option.

tcharp38 commented 4 years ago

Conclusion:

Avec ces résultats voici un proposition pour tester si le gpio fonctionne dans jeedom: (compatible RPI et orangePi) gpio readall 2>&1 >/dev/null [[ $? -gt 0 ]] && echo "Erreur" && exit

Qu'en pensez vous ?

Contrairement à mon test qui ne verifie que si la commande "gpio" est presente, le tient va tester en + qu'il s'execute bien. Donc partant. Mais "echo "error" && "exit" non. Tu vires un message d'erreur explicite et tu ne retournes aucun code d'err (donc ca sera 0=no err).

Je fais donc une contre proposition. On remplace

hash gpio 2>/dev/null if [ $? -ne 0 ]; then echo "= ERREUR: Commande 'gpio' manquante !" echo "= Le package 'WiringPi' est probablement mal installé." exit 4 fi

par

gpio readall 2>&1 >/dev/null if [ $? -ne 0 ]; then echo "= ERREUR: Problème avec la commande 'gpio' !" echo "= Le package 'WiringPi' est probablement mal installé." exit 4 fi

Ca te convient ?

Ceci étant cette modif n'a aucun interet pour docker. Ca change rien. N'est ce pas ?

Il me reste à faire la manip que tu demandes avec "docker-rpi-gpi". Je te tiens au jus

edgd1er commented 4 years ago

on est d'accord, docker ou pas ça ne change rien . il faut juste pouvoir alerter l'utilisateur que la pizigate ne marchera pas. Si le gpio readall se comporte de manière identique avec un orangePi, alors le test sera efficace.

il faut vérifier via la docker-compose + manip spécifique orangePi que le comportement du binaire est celui attendu.

tcharp38 commented 4 years ago

Salut. Désolé pour le manque de reactivite. J'ai eu qq soucis à installer docker mais la je trouve pas le "docker-compose" dont tu parles. Par contre j'ai pu faire un "docker run hello-world" donc il est la

Hello from Docker! This message shows that your installation appears to be working correctly.

KiwiHC16 commented 4 years ago

Si ca peut aider: http://kiwihc16.free.fr/Docker.html

edgd1er commented 4 years ago

Bjr @tcharp38 , pas de soucis. docker-compose est un outil en plus de docker. il faut l'installer. Pour raspberry, j'utilise un projet sur github pour avoir une version a jour. C'etait important quand les version des docker-compose.yaml changeaient rapidement et qu'il fallait une version récente de l'outil pour bénéficier des nouvelles fonctionnalités.

En faisant, une recherche rapide, je n'ai pas trouvé l'équivalent pour orange Pi. peut etre que l'installation

a priori, maintenant, les packages python fonctionnent pour avoir docker-compose: sudo apt-get install -y python python-pip libffi-dev sudo apt-get install python-backports.ssl-match-hostname sudo pip install docker-compose

tcharp38 commented 4 years ago

Salut @edgd1er Je vais tacher de trouver du temps pour essayer ca mais j'avoue ne pas savoir ou on va avec cette manip. A terme tu envisages de remplacer les appel "gpio mode X out" ou "gpio write x y" par quoi ?

edgd1er commented 4 years ago

l'action est de remplacer le test hash gpio 2>/dev/null par command - v gpio && gpio readall 2>&1 >/dev/null.

le premier produit un hash d'un fichier et donc ne test rien hormis la présence du fichier. le second valide que la commande existe, soit executable et lit les ports gpio. Le code retour donne l'état.

le fait que tu l’exécutes sur un orangePi est pour vérifier que le résultat est le même, puisque ce matériel n'est pas identique aux raspberry. et aussi de valider le comentaire sur comment rendre accessible le gpio dans un conteneur.

le principal etant la validation des commandes. le faire dans un conteneur est un bonus pour valider le commentaire, donc pas primordial.

tcharp38 commented 4 years ago

Ok donc on change rien à l execution. C etait gpio avant ca reste gpio puisque la tu n'as changé que des "tests de presence d'une commande".

Je veux bien croire que "command " vs "hash " est plus adapté mais la encore docker n'a rien à voir dans l'histoire. Donc j'ai toujours rien compris. Qu'est ce qui ne marche pas avec docker si on utilise toujours la commande gpio ?

tcharp38 commented 4 years ago

Ok je complete et je resume

Correct ?

edgd1er commented 4 years ago

oui

tcharp38 commented 4 years ago

ok parfait alors. Ca reste bien compatible aux non docker par defaut. Nickel

tcharp38 commented 3 years ago

@edgd1er Abeille fonctionne sous docker avec tes modifs ?

edgd1er commented 3 years ago

@tcharp38 ,

oui, Abeille fonctionne avant et après mes modifs. pas de soucis. avec deux bémols, je n'ai qu'une zigate usb en production et une pour le dev.

tcharp38 commented 3 years ago

@edgd1er C'était pas ma question. Est ce que ca marche sous docker ? Si oui on n'a rien changé pour ca et tout etait dans la config docker. On est bien d'accord ?

Cote USB ou PI ca semble ok chez moi.

edgd1er commented 3 years ago

@tcharp38 , Tu poses une question, je te répond oui et tu me dis ce n’était pas ta question. je ne suis pas sur de comprendre. j'aurais du peut etre repréciser que pour mes dev et ma prod, je fais tout avec docker.

pour tout les utilisateurs (docker, non docker, rpi, non rpi ) les tests ont été changés et cela valide mieux les conditions. (hash remplacé par command -v). A partir de la, on ne peut pas dire que rien n'a changé. le résultat est plus fiable et si cela marchait pour toi, cela marche encore, et donc cela n'a rien changé dans ce cas la.

la config /dev/mem et cap_app rawsysio est spécifique pour docker et doit être intégré à la séquence de lancement du conteneur avant même que jeedom n'apparaisse.

tcharp38 commented 3 years ago

Ha ok tu bosses tout sous docker donc je comprends mieux ta reponse. Merci. Donc docker ca fonctionne, ce qui reponds à vos besoins. Et les GPIO sont ok Je clos