DIY Domotique maison

Serveur de domotique DIY

Prérequis :

  • 2 raspberry pi (avec connection à internet)
  • 1 capteur dht11 (capteur température + humidité)
  • Cables de branchement
  • Module caméra pour raspberry pi

Objectif

Le but de se projet est de voir comment connecter capteurs, camera, etc... à un rapsberry pi et comment récupérer les valeurs pour les afficher sur une page web accessible depuis n'importe où.

Nous allons également voir comment interagir avec le raspberry à travers de la page pour activer/désactiver une lumière, un ventilateur ou tout autre objet électrique.

Préparation du Raspberry Pi 1 (rp1)

Le but de ce rp1 est de faire le lien entre internet et le reste de la maison, ça sera le seul point d'entrée du réseau local. Nous allons installer un serveur web apache + php et nous allons utiliser un template admin en vuejs afin d'afficher les informations remontées par les capteurs. En bonus j'ai également installé une seedbox sur ce rp1 (vous pouvez retrouver le tuto ici

Installation de apache + php

Sources

Tous est très bien expliqué dans le lien ci-dessus mais au cas ou le lien ne fonctionne plus, je fais un petit résumé

Tout d'abord, on met à jour raspbian

sudo apt update

sudo apt upgrade

Ensuite on installe apache2

sudo apt install apache2

Un petit coup de chmod

sudo chown -R pi:www-data /var/www/html/

sudo chmod -R 770 /var/www/html/

Vous l'aurez compris, le dossier contenant l'application sera dans le dossier `/var/www/html`

On peut vérifier que apache fonctionne en faisant :

wget -O verif_apache.html http://127.0.0.1

cat ./verif_apache.html

Si la console nous retourne `Hello world`, tout fonctionne ;) Si on se trouvait sur le réseau local, on pouvait aussi taper l'ip du rp1 dans un navigateur pour voir le résultat de la page ;)

On peut passer à l'installation de php (qui nous servira un peu plus tard dans le tuto)

sudo apt install php php-mbstring

Pour vérifier que php fonctionne, on peut supprimer le fichier `index.html` qui est dans /var/www/html pour le remplacer par un fichier `index.php`

sudo rm /var/www/html/index.html

echo "< ? php phpinfo(); ?>" > /var/www/html/index.php (attention il y a des espaces en < et ?, ne pas les mettre lors du lancement de la commande)

Il nous reste plus qu'à taper l'ip du rp1 dans un navigateur pour voir si on a bien les infos d'apache

Vous avez un serveur apache fonctionnel.

Ajout du template admin vuejs

Il ne reste maintenant plus qu'à copier votre site dans le dossier `/var/www/html`

Préparation du Raspberry Pi 2 (rp2)

Le but de ce rp2 est de récupérer les valeurs émisent par les capteurs et de les renvoyer au rp1 pour qu'il les affichent sur le template. Pour celà nous allons avoir besoin d'un serveur nodejs (via express) afin de call le script python (qui lie les valeurs des capteurs) et les retourner sous forme de texte au rp1

Connecter capteur DHT11 (capteur de température & humidité) en Python

Source : http://www.circuitbasics.com/how-to-set-up-the-dht11-humidity-sensor-on-the-raspberry-pi/

Installer git pour pouvoir télécharger la lib : sudo apt-get install git-core

Installer la librairie : git clone https://github.com/adafruit/Adafruit_Python_DHT.git

Entrez dans le dossier : cd Adafruit_Python_DHT

Installer python : sudo apt-get install build-essential python-dev

Et enfin lancer le script d'installation : sudo python setup.py install

Script python (sortie sur terminal + utilisation de la pin 4)

#!/usr/bin/python
import sys
import Adafruit_DHT

while True:

    humidity, temperature = Adafruit_DHT.read_retry(11, 4)

    print 'Temp: {0:0.1f} C  Humidity: {1:0.1f} %'.format(temperature, humidity)

Vous pouvez tester le script avec la commande : sudo python votre_fichier.py

Adaptation du script pour retourner une chaine de la forme `23.0 || 40.0`

#!/usr/bin/python
import sys
import Adafruit_DHT

while True:

    humidity, temperature = Adafruit_DHT.read_retry(11, 4)
    print('{0:0.1f} || {1:0.1f}').format(temperature, humidity)
    sys.stdout.flush()

Installation du serveur nodejs (avec express)

Sources

Vous aurez besoin de node + npm pour lancer le serveur, normalement node est installé par défaut sur raspbian mais pas npm. Pour fixer tout ça, je vous invite à suivre ce tuto : https://www.instructables.com/id/Install-Nodejs-and-Npm-on-Raspberry-Pi/

Petit récap du tuto :

  • Tout d'abord il faut détecter quel version de Raspberry pi nous avons. Pour cela taper la commande : uname -m. Cette commande devrait vous retourner `armv6`, `armv7`, `armv8`, etc..
  • Ensuite il faut se rendre sur la page de téléchargement de node https://nodejs.org/en/download/. Trouvez la colonne correspondante à votre version de raspberry pour la ligne `Linux Binaries (ARM)`, faites clique droit `copier l'adresse du lien`
  • Sur votre raspberry faites un wget + l'url que vous venez de copier : wget https://nodejs.org/dist/v8.9.0/node-v8.9.0-linux-armv6l.tar.gz
  • Ensuite il ne vous reste plus qu'à extraire avec cette commande : tar -xzf node-v8.9.0-linux-armv6l.tar.gz
  • Et enfin copier le contenu dans `/usr/local` avec ces commandes : cd node-v6.11.1-linux-armv6l/ et sudo cp -R * /usr/local/
  • Voila, si tout est bon, vous pouvez maintenant faire un `node -v` et un `npm -v`

Script nodejs (server.js):

Préalablement il faudra installer express avec la commande : npm install express

                                                           
const express = require('express')
const app = express()

let runPy = new Promise(function(success, nosuccess) {
    const { spawn } = require('child_process');
    const pyprog = spawn('python', ['./test.py']);
    pyprog.stdout.on('data', function(data) {
        success(data);
    });

    pyprog.stderr.on('data', (data) => {
        nosuccess(data);
    });
});

// Add headers
app.use(function (req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
    res.setHeader('Access-Control-Allow-Credentials', true);
    next();
});

app.get('/', (req, res) => {
    //res.write('welcome\n');
    runPy.then(function(fromRunpy) {
        console.log('tostring', fromRunpy.toString());
        res.end(fromRunpy);
    });
})
app.listen(4000, () => console.log('Application listening on port 4000!'))

Lancer le script avec la commande suivante : node server.js

Il nous reste un problème, il faudrait que si le script se coupe, il se relance automatiquement, on va pour celà installer pm2 qui est un gestionnaire de script js. Installez le avec la commande suivante : npm install pm2 -g

Il ne nous reste plus qu'à lancer le script avec la commande : pm2 start server.js

Vous pouvez vérifier que le serveur fonctionne bien en allant à l'url: http://localhost:4000 ou http://192.168.1.42:4000. Vous devriez voir quelque chose comme ça : 24.0 || 50.0, ce qui correspond à la température || humidité

Il nous vous reste plus qu'à call cette url à partir du serveur Apache sur le rpi1 pour avoir vos valeurs de capteur.

Retour sur le rpi1

Maintenant que le rpi2 est configuré, il ne nous reste plus qu'à écrire un script php qui va call l'url http://192.168.1.42:4000 => besoin de call cette url à partir d'un serveur qui est sur le réseau local, sinon il faudrait ouvrir le rpi2 sur internet avec un nom de domaine spécial via no-ip.com. Le script PHP permet de ne pas avoir à ouvrir le rpi2 sur internet.

Script php (server.php)

< ? php
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET,POST, OPTIONS");
$data = file_get_contents('http://192.168.1.42:4000');
echo $data;

Maintenant que le script est prêt, il ne nous reste plus qu'à faire un call à ce script en ajax à partir du fichier .vue. Voir le projet front (app admin en vuejs) à cette adresse : https://gitlab.com/rocket10/dashboard-home

Pour le call ajax, voir le fichier `src/components/Dashboard/Views/Overview.vue`