Dernière mise à jour : 1er septembre 2019

Retour à l'index

Allumer la LED depuis une page web

On a réussi à piloter la LED avec des commandes en python, j'aimerais maintenant faire la même chose depuis une page web.

Mes habitudes me poussent vers un script PHP (j'ai installé le serveur) qui appelle le script python avec un simple shell_exec($command)

Par ailleurs je me demande si on peut générer la page web directement avec du python, j'ai entendu dire que...

Recherche faite, oui on peut. Il faut utiliser des frameworks comme Django, mais ça demande un peu trop d'investissement pour ce que je veux faire. J'y reviendrai peut être un de ces jours, mais pour l'instant on va se contenter d'un simple PHP qui appelle du python. Enfin si on y arrive...

PHP et python

On se fait donc une petite page web qui sort le résultat d'une commande passée par shell_exec

Déjà se monter un disque logique sur le répertoire des pages web située dans le Rasp:

Paramètres du sshfs :

On commence par une commande système simple, lister les fichier locaux : ls -al

Paf !

1567324290529

On voit que dans mon répertoire j'ai :

J'ai recopié localement les 2 scripts python disponibles en bas de la note sur la LED

Passons aux choses sérieuses : exécuter le script d'allumage. Exécution !

Fail !

Évidemment ça ne marche pas. Heureusement d'ailleurs. Problème de droits. PHP n'est pas autorisé à exécuter python j'imagine ( NON, on va voir plus bas que j'ai tort !). PHP est lancé avec quel user? Don't know. Faut que je cherche un peu.

Ah oui, bien sûr, l'utilisateur qui fait tourner PHP est www-data. Et là ça se corse pour moi, comment je fais pour lui donner cette autorisation ? ...

Pour essayer de comprendre je regarde dans les logs apache (ils sont dans /var/log/apache2) :

Je pressens que je me trompe. Pour être sûr je fais un petit script python test.py de 3 lignes.

Et je teste en modifiant led.php pour appeler ce script de test

1567331076985

Ça marche. J'avais donc bien tort : le PHP peut appeler du python. Le problème est ailleurs, dans l'accès aux GPIO.

J'essaye de comprendre l’enchaînement.

Le navigateur accède à la page > apache sert cette page > dedans y'a du PHP qui se déclenche > PHP lance shell_exec qui déclenche du python > accès librairie GPIO 🛑 blocage !

En farfouillant je vois qu'il y a un groupe gpio et je me dis que ce serait pas idiot d'y ajouter l'exécuteur de tout ça, l'utilisateur www-data

1567332435399

Si je comprends bien les groupes et leurs utilisateurs sont dans /etc/group. J'utilise grep pour trouver le groupe gpio, je vois le user pi, mais pas www-data bien sûr. Je cherche comment l'ajouter : on va utiliser usermod.

Je remets la $command = escapeshellcmd('python3 on-led.py');

F5 (recharge la page web)

Fail...

Peut être un chtio reboot de M Raspberry pour prendre en compte les modifs de groupes?...

sudo reboot

F5...

Victory !!!!!

1567332677399

Bon côté page web c'est moins impressionnant mais c'est du détail, on va s'occuper de ça.

1567332820692

Crois moi si tu veux, "python off-led.py" marche aussi ! 😜

Y'a plus qu'à passer des paramètres à la page pour demander ce qu'on veut exécuter comme script. On fait encore dans le simple : on utilise la transmission de paramètres via l'URL. Je propose un champ action qui prendra la valeur on ou off.

On s'occupe déjà de récupérer le champs action.

Et dans la partie HTML j'ajoute 2 liens qui permettent de recharger la page avec ce champs action positionné selon notre bon vouloir.

Le survol du lien indique la bonne URL, et faudra me croire sur parole, ça fonctionne.

1567342040697

Pour traiter le clignotement, on va éviter d'appeler notre script sans fin avec un lamentable while True: , ici on peut utiliser un petit bout de javascript côté client qui s'occupera de séquencer les on et off.

Je vais utiliser un peu brutalement des appels ajax qui permettent de solliciter le serveur sans recharger la page dans le navigateur. Ne pas trop baisser la fréquence (j'ai mis 500ms), ça ne se passe pas bien :)

Le code final avec l'ajout du javascript et des liens HTML pour démarrer ou stopper ce magistral clignotement.

 

1567344512876

Tout marche. Je suis joie.