Raspberry contrôler sa maison en python depuis internet

Qui veut contrôler sa maison via une magnifique interface internet de n’importe où. Un article pour piloter une led en Python en utilisant une interface web.

Bon sur la présentation, je vends un peu du rêve mais après tout, il faut bien rêver. Il est temps d’être sérieux, je ne vous propse pas ici un système clé en main pour allumer et contrôler toutes les ampoules de chez vous, mais en suivant cet article, vous serez capable de le faire. Je pose ici les bases au travers d’un simple exemple d’allumage et d’extinction d’une LED (WWWWOOOOUUUUAAAAHHHHH!!!!!!).

Matériels nécessaires

Bon comme je l’ai dit, on est loin du projet domotique final qui vous permettra de commander votre maison, vous allez avoir besoin :

  • un Raspberry
  • une led et une résistance de 270Ω
  • un connecteur pour faciliter le montage (optionnel)

Installation des paquets

Je ne vais pas détailler plus que ça, vous allez pouvoir suivre ces deux articles :

Pour faire simple, dans un terminal :

#pour le serveur
sudo apt-get install apache2 php5 mysql-server libapache2-mod-php5 php5-mysql
#pour utiliser les broches GPIO en python
sudo apt-get install python-rpi.gpio python3-rpi.gpio

Le processus vous demandera des mots de passe et quelques validations pour le serveur, restez attentifs.

Utilisation des broches GPIO en python

Si vous avez suivi l’article sur le fonctionnement des broches GPIO en python, vous avez donc un système qui fonctionne cependant, lorsque vous exécutez votre script de votre console, vous êtes avec un utilisateur qui à les droits de le faire.

En passant par le navigateur et donc le serveur Apache, vous utilisez sans le vouloir un autre utilisateur : www-data. Celui-ci n’a pas les droits pour faire fonctionner vos ports GPIO, nous allons les lui donner.

Attention, niveau sécurité, ce n’est pas top, les plus sécuritaires vont crier au meurtre, ne vous servez pas de votre Raspberry dans cette configuration pour vous faire un vrai serveur web avec une porte d’accès sur l’extérieur, www-data est l’utilisateur de base de votre serveur, en lui donnant tous les droits, des petits malins pourraient vous pourrir votre vie

Depuis le terminal, faites sudo visudo , et ajouter : www-data        ALL=(ALL) NOPASSWD:ALL

Câblage du montage de test

Raspberry montage controle led navigateur
Raspberry montage controle led navigateur

Arborescence de notre dossier web

Attention au chemin de vos dossier, dans le cas de changement par rapport à ce que je propose, faire les changements

Page index.php

Avec l’installation d’apache, vous avez maintenant un nouveau dossier : /var/www/html, dans celui-ci vous allez créer un nouveau dossier : mkdir /var/www/html/led .

Placez vous dans le dossier led : cd /var/www/html/led

Créer un fichier index.php contenant :

<!DOCTYPE html>
<html>
<head>
        <meta charset="UTF-8">
        <title>Allumer / Eteindre une lED</title>
        <link rel="stylesheet" type="text/css" href="style/style.css">
        <script src="/led/script/jquery.js">
        </script>

</head>
<body>
        <script>
                $(document).ready(function(){
                        $('#action_led').click(function(){
                                var contenu = $('#action_led').text();
                                if(contenu == "Allumer"){
                                        $('#action_led').text('Eteindre');
                                        $('#dessin').attr('src','/led/media/allumee.png');
                                        action_led('allumer');
                                }else{
                                        $('#action_led').text('Allumer');
                                        $('#dessin').attr('src','/led/media/eteinte.png');
                                        action_led('eteindre');
                                }
                        });
                        function action_led(action){
                                $.get('/led/script/action.php?action='+action,function(data,status){
                                        $('#derniere_modification').text(data);
                                });
                        }
                });
        </script>
        <p>Cliquer sur le bouton pour éteindre ou allumer la lumière</p>
        <button id="action_led">Allumer</button>
        <div id="ampoule">
                <img id="dessin" src="/led/media/eteinte.png" />
        </div>
        <p>Date et heure de la dernière modification :</p>
        <div id="derniere_modification"></div>
</body>
</html>

C’est la page qui s’affichera, vous pouvez protéger l’accès en php et avec un fichier .htaccess.

Explication de la page index.php

Dans le header, je fais appel au fichier css pour le formatage de la page et j’appelle le fichier pour le jquery.

Le script permet de surveiller le clic sur le bouton, en fonction de l’action « allumer » ou « éteindre », je modifie l’image de l’état de la lampe et j’effectue une requête HTTP GET (dans la fonction) avec une valeur de la variable différente en fonction de l’action de l’état présent puis je mets à jour la div #derniere_modification.

Le faite de mettre à jour est juste pour montrer que vous pouvez retourner n’importe quelle valeur de votre Raspberry par exemple, une valeur d’un capteur de température …

page style.css

Dans le dossier /var/www/html/led, créer un dossier style : mkdir /var/www/html/led/style  et y créer un fichier style.css, y écrire :

html{
        text-align:center;
}
#dessin{
        margin:20px;
        height:200px;
}

Il n’y a pas grand chose dedans, à vous d’agrémenter votre page comme bon vous semble.

Fichier jquery

Pour une meilleur compatibilité, j’utilise le JQUERY, afin d’éviter à devoir le télécharger au chargement de la page, rendez-vous sur la page de téléchargement de jquery et enregistrer le fichier .js en le renommant jquery.js.

Sur votre Rasspberry, placez-le dans /var/www/html/led/script/.

Fichier action.php

<?php
if(isset($_GET['action'])){
        $date = date("d-m-Y");
        $heure = date("H:i");
        switch($_GET['action']){
                case "allumer":
                        exec('python /var/www/html/led/script/action_led.py allumer');
                        break;
                case "eteindre":
                        exec('python /var/www/html/led/script/action_led.py eteindre');
                        break;
        }
        echo $date." à ".$heure;
}
?>

Il s’agit du fichier situé en /var/www/html/led/ script qui va appeler un script python (qui permet d’allumer ou d’éteindre la led) puis on retourne la date et l’heure de l’action.

Si votre fichier action_led.py ne fonctionne pas via le navigateur, cela signifie que l’utilisateur par défaut d’Apache ne possède pas les droits pour exécuter le script. Dans ce cas revenir au chapitre sur l’utilisation des GPIO.

Fichier action_led.py

Il s’agit du script python qui va nous permettre de commander les GPIO du Raspberry, dans notre cas une led mais vous pouvez mettre autre chose qu’une led, cela peut être un transistor, un relais …

Ce script prend un argument qui peut avoir deux valeurs : « allumer » et « eteindre » (sans accent).

Pour tester le script seul, dans un terminal et en étant dans le dossier contenant le script, faire : python ./action_led.py allumeret pour éteindre faites :python ./action_led.py eteindre, si la led s’éteint et s’allume, tout est correct.

Il faut mettre les permissions pour l’exécution du fichier, pour cela, en étant dans le dossier contenant le script python, faites : sudo chmod a+x /var/www/html/led/script/action_led.py .

#!/usr/bin/env python

import RPi.GPIO as GPIO
import sys

GPIO.setwarnings(False)
if len(sys.argv)>=2:
        pin = 7
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(pin,GPIO.OUT)
        if sys.argv[1] == 'allumer':
                GPIO.output(pin,True)
        if sys.argv[1] == 'eteindre':
                GPIO.output(pin,False)
                GPIO.cleanup()
else:
        GPIO.cleanup()

Si vous avez suivi cet article, vous avez pu commander une led, ce n’est pas très impressionnant, mais à partir de maintenant avec quelques modifications vous pouvez ajouter des boutons et d’autres GPIO sur lesquelles peuvent être reliés des interrupteurs, des relais, des capteurs que vous jugez utiles pour un système domotique ou autre.

Vous pouvez récupérer les dossiers sur le git et récupérer le dossier python_led_navigateur/led.

Vous avez aimez, dites le en commentaire et partagez.

Laisser un commentaire