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 :

  1. Installation Raspbian Lite sur ma carte SD
  2. Installation Apache, PHP, MySQL, Phpmyadmin également par facilité
  3. Installation python & librairie requise pour le GPIO
  4. Adapter le script python
  5. Cronjob qui insère les infos qui nous intéressent dans ma base de données toutes les X minutes
  6. Récupérer les données en PHP
  7. 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>
    <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>
    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
    <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++;
    }
    ?>
    Place à Morris, on lui fournit les données, ainsi que des paramètres d’affichage
    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 !