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`