Arrêter un script python à partir d'une page web

Vous avez réalisé ou vous voulez réaliser un truc impensable avec votre Raspberry Pi ? Cet endroit est pour vous...

Modérateur : Francois

Tobin
Messages : 26
Enregistré le : mer. 23 nov. 2016 09:11

Re: Arrêter un script python à partir d'une page web

Message par Tobin » mer. 5 juil. 2017 21:50

Salut,
Merci pour vos brillantes réponses, j'ai appris pas mal de choses. Le problème posé est maintenant résolu, j'ai pu créer des fichiers de contrôle pour mes scripts. Seulement, je sèche un peu sur l'envoie d'événements en temps réel du serveur vers le client (je voudrais que mon client soit notifié en temps réel sur tout événement qui pourrait survenir : détection d'ouverture de porte, de mouvement, etc). Je développe en flask et après avoir fouillé un peu sur le net, j'ai découvert qu'il faut des websockets (gevent et compagnie) pour transformer son serveur en "push server". Mais les documentations sur lesquelles je suis tombé sont loin d'être potables pour moi. J'imagine que ce nouveau problème devrait faire office d'un nouveau post, mais si quelqu'un a tout de suite une piste de solution, je suis preneur :D . En attendant, avant de mettre ce post en résolu, une toute petite dernière question : connaissez-vous une manière très POSIX de vérifier si la raspberry (ou tout autre ordinateur sous linux) tourne ou pas ? Dans le genre, ma raspy s'éteint brusquement et sur mon tableau de bord je reçois une notification du genre : " votre raspy vient de s'éteindre" ?? Ou est-ce que cela se joue du côté client (JavaScript) ??

Avatar du membre
zeb
Raspinaute
Messages : 280
Enregistré le : ven. 19 sept. 2014 11:04

Re: Arrêter un script python à partir d'une page web

Message par zeb » jeu. 6 juil. 2017 11:16

Plop,

Le grand classique universel, pour RaspberryPi, Linux Server, poste Windows, ou autre.
Le ping !
Si ça répond, c'est que c'est encore vivant.
Si ça ne répond pas, c'est que c'est peut-être mort.

En shell :

Code : Tout sélectionner

#!/bin/sh
# mettre le nom ou l'adresse IP de la machine à surveiller, et l'intervalle de temps entre deux vérifications
MACHINE=framboise
INTERVALLE=10
STATUS=OKAY
while true; do
    sleep $INTERVALLE
    if ping -c1 $MACHINE >/dev/null 2>&1; then
        if [ $STATUS != 'OKAY' ]; then
            echo "Bonne nouvelle, $MACHINE est de nouveau en ligne." >&2
            mail -s "$MACHINE en ligne" tobin <<-EOF
                Un test de ping vers $MACHINE a été effectué à $( date ), avec succès.
                Message automatique. Ne pas y répondre.
            EOF

        fi
    else
        if [ $STATUS = 'OKAY' ]; then
            STATUS='FAIL'
            echo "Alerte, $MACHINE ne répond plus !" >&2
            mail -s "Alerte, $MACHINE ne répond plus !" tobin <<-EOF
                Un test de ping vers $MACHINE a été effectué à $( date ), sans succès.
                L'ordinateur ne répond plus.
                Message automatique. Ne pas y répondre.
            EOF
        fi
    fi
done
Dans mon panier : rpi1A+ : »:: »:: | rpi1B : »:: »:: | rpi1B+ : »:: »:: | rpi2B : »:: »:: | rpi3B : »:: »:: | rpi0 : »::

Tobin
Messages : 26
Enregistré le : mer. 23 nov. 2016 09:11

Re: Arrêter un script python à partir d'une page web

Message par Tobin » jeu. 6 juil. 2017 12:13

Merci @Zeb pour l'astuce et surtout pour l'exemple concret.
Et merci égalment à @Flachy joe, @Sylvain , @Bud Spencer, @Mainfraid pour votre aide.

Avatar du membre
zeb
Raspinaute
Messages : 280
Enregistré le : ven. 19 sept. 2014 11:04

Re: Arrêter un script python à partir d'une page web

Message par zeb » jeu. 6 juil. 2017 13:18

Merci pour tes mercis (c'est important, parce que sur un forum d'entraide, outre l'auto-satisfaction d'avoir pu rendre service, c'est notre seule rétribution ;) )
Mais je n'ai pas répondu à toutes tes questions.
tobin a écrit :je sèche un peu sur l'envoi d'événements en temps réel du serveur vers le client
Pour sûr.
Comme tu l'indiques, il y a des solutions tordues.
D'où le niveau de potabilité de la documentation.

Académiquement, c'est au client de prendre l'initiative, pas au serveur.
Exactement de la même façon que le script précédemment proposé.
Une boucle infinie côté client, qui interroge le serveur :
« T'es toujours là ? » demande le ping.
Dans ce contexte, le temps réel est impossible.
Mais si tu réduis suffisamment le temps entre deux requêtes, ça peut être suffisant.

Avant de te lancer dans des websockets et autres technos saugrenues, interroge-toi sur la façon dont tu pourrais faire avec du C/S classique.

---------

Que fait-on ? On continue ici ou tu crées un autre sujet...
Modifié en dernier par zeb le ven. 7 juil. 2017 09:58, modifié 1 fois.
Dans mon panier : rpi1A+ : »:: »:: | rpi1B : »:: »:: | rpi1B+ : »:: »:: | rpi2B : »:: »:: | rpi3B : »:: »:: | rpi0 : »::

Tobin
Messages : 26
Enregistré le : mer. 23 nov. 2016 09:11

Re: Arrêter un script python à partir d'une page web

Message par Tobin » jeu. 6 juil. 2017 20:04

Que fait-on ? On continue ici ou tu crées un autre sujet...
D'accord pour qu'on continue...
Avant de te lancer dans des websockets et autres technos saugrenues, interroge-toi sur la façon dont tu pourrais faire avec du C/S classique.
J'ai cru comprendre au fil de mes lectures qu'il n'était pas possible d'envoyer des notifications temps réel avec flask sans faire appel à ces "technos". J'ai donc pensé à une autre approche (sur laquelle j'ai des gros doutes, donc j'espère ne pas dire une bêtise) : je crée un fichier, que partageront flask et JavaScript. Quand un évènement survient, python écrit quelques choses dans le fichier (" hey JavaScript, il y'a quelque chose pour toi ici"). JavaScript, qui interroge régulièrement le fichier, trouve le petit mot, affiche le message correspondant et n'oublie pas de dire merci !!
Alors!?

Bud Spencer
Raspinaute
Messages : 609
Enregistré le : lun. 15 août 2016 21:38

Re: Arrêter un script python à partir d'une page web

Message par Bud Spencer » jeu. 6 juil. 2017 22:07

Tobin a écrit : ...
Alors!?

Franchement ? Avec tout le respect que je te dois, oublis tout ça. Si tu veux que ton (tes) client(s) interroge(nt) ton serveur web ‘proprement’ pour avoir des infos distilées sans avoir à recharger des pages complètes, il y a une techno qui s’appelle Ajax et qui est faite pour ça. Si tu veux que ton (tes) client(s) interagissent sur des events du (des) serveur(s) web (et vice versa), alors c’est socket web. La méthode que tu envisages n’est pas idiote, elle est juste lourde, vite ingérable et surtout complétement dépassée. C’est un peu dans le genre de ce que l’on faisait autrefois faute d’avoir de quoi faire mieu.

Crois moi, prend le temps de lire un petit peut le tuto que je t’avais mis en lien et test un ou deux exemples. Tu vas voir que les sockets web répondent de façon on ne peut plus simple à toutes tes questions. Après, que tu utilises un code serveur codé en python, c++, js ou n’importe quoi d’autre, c’est juste un choix. Certains langages permettent de mettre en œuvre ces technologies plus ou moins facilement qu’avec d’autres, mais ça vaut vraiment la peine de s’y intéresser et de creuser quand on vise ce genre de projet.

Si ça peu te rassurer, quand j’avais écrit ce tuto, j’avais envisagé de faire un exemple python-flask-socketIO. Après un peu d’expérimentation pour écrire la leçon, j’avais laissé tomber. Trop de code pour rien faire, une gestion des events socket pas toujours très fiable, des performances pythonesque ect … alors que la vocation du tuto était de présenter quelques choses d'efficace et simple à mettre en œuvre. D’un autre côté, même si j’ai commencé à faire du python par obligation il y a très longtemps, je n’ai jamais pu encadrer ce langage et je ne l’ai plus utilisé pendant des années, donc j’admets qu’il y a peut-être aussi un manque d’objectivité de ma part le concernant.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Tobin
Messages : 26
Enregistré le : mer. 23 nov. 2016 09:11

Re: Arrêter un script python à partir d'une page web

Message par Tobin » sam. 8 juil. 2017 19:17

Salut,
@Bud, j'ai suivi ton conseil, j'ai un peu creusé du côté des websockets, j'ai surtout relu la leçon 2 de ton tutoriel (merci encore pour ça). Et voilà ce que j'avais loupé lors de ma première lecture :
Les principales modifications portent sur l'ajout du paquet socket.io ainsi que sont chemin statique et sur une fonction qui va être a l'écoute de ce socket pour répondre.
Dans mon code HTML j'avais oublié de renseigner le chemin statique vers socketio (en fait j'ignorais qu'il fallait le faire, pensant que toute la magie s'opérait du côté serveur dans mon code python). Je me coucherais moins bête aujourd'hui :lol:
J'ai donc récupéré le fichier socket.io.js dans le dépôt officiel sur github. Dans les heures qui suivent je vais procéder à des tests, en espérant qu'ils seront cette fois concluants et me donneront moins de maux de tête :D
Merci,
A+

Bud Spencer
Raspinaute
Messages : 609
Enregistré le : lun. 15 août 2016 21:38

Re: Arrêter un script python à partir d'une page web

Message par Bud Spencer » dim. 9 juil. 2017 09:55

Bien sûr, il faut aussi inclure socket.io coté client. Avec flask, il faut faire attention à la compatibilité des versions coté client et serveur (de mémoire j’avais galéré un peu avec ca). Un autre petit rappel important pour t’éviter de trop tourner en rond : Penses à utiliser le débogueur de ton navigateur client. Cela va te permettre de t’assurer que la connexion du socket se fait bien et de tracer toutes les erreurs de ce côté. J’ai remarqué que beaucoup de personnes qui débutent avec ce type d’application perdent énormément de temps en focalisant sur le code serveur alors que très souvent, les erreurs sont explicite coté client. Il y a aussi un exemple concret concernant ce point sur le tuto.

Pour répondre à une de tes questions :
Tobin a écrit :..Dans le genre, ma raspy s'éteint brusquement et sur mon tableau de bord je reçois une notification du genre : " votre raspy vient de s'éteindre" ?? Ou est-ce que cela se joue du côté client (JavaScript) ??
La aussi un web socket solutionnera le problème. Dans le cas où le PI (serveur) s’éteindrait, la connexion du socket serait rompue et cela lèverait forcement une exception coté client (tableau de bord). Il suffit donc juste de mettre en place une fonction coté client pour gérer l’exception proprement en affichant l'info sur le tableau de bord. Pour aller encore plus loin dans le raisonnement, ton serveur pourrait aussi ‘pinguer’ périodiquement d’autres ip et retourner les résultats à ton tableau de bord client via le web socket.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Répondre

Retourner vers « Utilisateurs avancés »