4h du matin, plus moyen de dormir.
Pas envie de lire, autant faire un truc plutot que de zoner sur mon gsm.
L’hiver approchant, j’aimerais pouvoir quantifier grossièrement l’apport de mon poele à bois dans les pièces de la maison. J’aimerais donc pouvoir suivre l’évolution de température dans une pièce donnée
Matériel :
- un raspberry qui d’habitude fait lecteur multimédia, iptv.
- On utilisera donc une autre carte SD (raspbian Lite, c’est plus marrant sans GUI)
- Un capteur KY-015, de mon kit qui trainait dans un tiroir (il a l’avantage de faire fournir également le taux d’humidité)
Etapes :
- Installation Raspbian Lite sur ma carte SD
- Installation Apache, PHP, MySQL, Phpmyadmin également par facilité
- Installation python & librairie requise pour le GPIO
- Adapter le script python
- Cronjob qui insère les infos qui nous intéressent dans ma base de données toutes les X minutes
- Récupérer les données en PHP
- Les utiliser avec une lib de chart JS appropriée
Et c’est parti pour le fun 🙂
- Il existe bien des tutos sur le net pour les étapes 1 & 2La seule config spécifique a été la création d’une base de donnée et d’une table dont la structure est la suivante.
- Noob dans le domaine du GPIO, je me suis largement inspiré de ce tuto pour les étapes 3 & 4
- Etape 4, le script python adapté
#!/usr/bin/python
import sys
import Adafruit_DHThumidity, temperature = Adafruit_DHT.read_retry(11, 4)
print '{0:0.1f};{1:0.1f}'.format(temperature, humidity)
- Etape 5
Modification du fuseau horaire avec
sudo timedatectl set-timezone 'Europe/Brussels'
Mon cron lancé toutes les 15 minutes, crontab -e
*/15 * * * * /home/pi/cron.sh >/dev/null 2>&1
Le shell script cron.sh :
#!/bin/bash
values=`python /home/pi/temp.py`
temp=`echo $values | cut -d \; -f 1`
hum=`echo $values | cut -d \; -f 2`
mysql -uroot -ppassword -e ' INSERT INTO temperature.`data` (`id`, `time`, `temperature`, `humidity`) VALUES (NULL, CURRENT_TIMESTAMP, '$temp', '$hum');'
On récupère puis parse les valeurs renvoyées par notre script python à savoir température;humidité
La commande sql (vérifiez le username & password) insère simplement les données dont on aura besoin dans la BDD. - Etape 6 & 7
Le projet n’étant pas amené à grandir énormément, tout se passera dans le fichier index.php. J’ai choisi la librairie morris.js par facilité puisque j’avais du l’utiliser chez mon précédant employeur.
<html>
On va chercher les données qui nous interessent et on les ordonne dans un tableau pour pouvoir les utiliser en json pour l’ami morris.js
<head>
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.min.js"></script>
</head>
<div id="tempChart" style=""></div>
</html>
Place à Morris, on lui fournit les données, ainsi que des paramètres d’affichage
<script>
<?php
try{
$bdd = new PDO('mysql:host=localhost;dbname=temperature;charset=utf8', 'root', 'password');
}
catch(Exception $e)
{
die('Erreur : ' . $e->getMessage());
}
$reponse = $bdd->query('SELECT * FROM data');
$i=0;
while($donnees = $reponse->fetch()){
$data[$i]['time'] = $donnees['time'];
$data[$i]['temperature'] = $donnees['temperature'];
$data[$i]['humidity'] = $donnees['humidity'];
$i++;
}
?>
new Morris.Line({
element: 'tempChart',
data: <?php echo json_encode($data); ?>,
xkey: 'time',
ykeys: ['temperature','humidity'],
labels: ['Temperature','Humidite'],
lineColors: ['red','blue']
});
</script>
Et voilà comment on se retrouve avec ceci
Reste maintenant à peaufiner, voir si on en tire des données intéressantes sur un laps de temps plus significatif, puis restera à ajouter la possibilité de spécifier les intervalles. A suivre donc !
No Comments Yet