Accueil > applications, Matériel, Raspberry > Projet HomeLab : Raspberry partie 3

Projet HomeLab : Raspberry partie 3

Pour cette partie, nous allons mettre en œuvre la récupération de la température où se situe le Raspberry à savoir dans le salon. Le but est de récupérer la température toutes les 15 minutes et de la stocker dans une base de données SQL Lite. Ensuite toutes les 30 minutes, nous allons créer 4 graphes à l’aide de Gnuplot (température sur un jour, une semaine, un mois et une année) qui seront affichés dans une page WEB. Le capteur de température utilisé sera le DS18B20.

On attaque par la partie électronique; le schéma de câblage sera le suivant :

image

Le capteur DS18B20 est un capteur utilisant la communication ‘1-Wire’, donc il va être nécessaire d’activer la gestion de ce protocole au niveau du Raspberry (le seul port gérant ce protocole est le GPIO 4). Il va falloir éditer le fichier /etc/modules et ajouter les lignes suivantes :

image

Ensuite redémarrer le Raspberry pour la prise en compte.

Pour vérifier que le capteur est bien géré, vérifier le contenu du répertoire /sys/bus/w1/devices :

image

Vous devez voir un dossier composé d’un numéro unique lié au capteur DS18B20; aller dans le dossier 10-xxxxx et taper la commande ‘more w1_slave’ :

image

La première ligne indique que la communication est bonne (affichage YES); la seconde ligne fournit la température (ici 21.75 °C).

Voilà pour la partie électronique, maintenant on va s’intéresser à la partie programmation.

La première étape est d’installer SQL Lite en tapant la commande suivante :

apt-get install sqlite3

Ensuite dans mon répertoire /programmation, je vais créer une base de données et une table de nom ‘salon’ en tapant les commandes suivantes :

sqlite3 meteo.db

CREATE TABLE salon (timestamp DATETIME, temperature NUMERIC);

.exit

Ma table ‘salon’ contiendra 2 champs, la date et la température.

Ensuite on va créer un fichier Python de nom ‘salon.py’ dans le dossier /programmation qui aura le contenu suivant :

#!/usr/bin/env python
import glob
import time
from datetime import datetime
import sqlite3
base_dir = ‘/sys/bus/w1/devices/’
device_folder = glob.glob(base_dir + ’10*’)[0]
device_file = device_folder + ‘/w1_slave’

def read_temp_raw():
    f = open(device_file, ‘r’)
    lines = f.readlines()
    f.close()
    return lines

def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != ‘YES’:
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find(‘t=’)
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        temp_c = round(temp_c,1)
        return temp_c

def log_temperature():
    conn=sqlite3.connect(‘/programmation/meteo.db’)
    temperature = read_temp()
    date = datetime.now().strftime(‘%Y-%m-%d %H:%M:%S’)
    curs = conn.cursor()
    curs.execute( »’INSERT INTO salon(timestamp, temperature)
            VALUES(:timestamp, :temperature) »’,
            {‘timestamp’:date, ‘temperature’:temperature})
    conn.commit()
    conn.close()
 
log_temperature()

Le programme récupère la température en testant si la communication est OK avec le capteur et enregistre la date et la température dans la table ‘salon’.

Ce script Python sera exécuté toutes les 15 minutes en éditant la ‘crontab’ en tapant la commande ‘crontab –e’ et en ajoutant la ligne suivante :

image

Voilà pour la partie enregistrement de la température dans la base de données.

Maintenant on va voir comment traiter ces informations afin de créer les graphes et les afficher dans une page WEB.

La première étape est de créer un répertoire de nom ‘meteotemp’ dans /programmation; ce dossier contiendra les fichiers temporaires pour le traitement.

Ensuite je vais créer un fichier de nom ‘traite-salon.py’ dont voici le contenu :

#!/usr/bin/env python
from datetime import datetime
import sqlite3
import os

def get_data(interval):
    db = sqlite3.connect(‘/programmation/meteo.db’)
    cursor = db.cursor()
    cursor.execute("SELECT * FROM salon WHERE timestamp > datetime(‘now’,’-%s day’)" % interval)
    rows = cursor.fetchall()
    db.close()
    if interval == 1:
        filename = ‘/programmation/meteotemp/salon-jour’
    elif interval == 7:
        filename = ‘/programmation/meteotemp/salon-semaine’
    elif interval == 31:
        filename = ‘/programmation/meteotemp/salon-mensuel’
    elif interval == 365:
        filename = ‘/programmation/meteotemp/salon-annuel’
    file_salon = open(filename, ‘w’)
    for row in rows:
        print >> file_salon,row
    file_salon.close()
    file_salon_temp = open(filename, ‘r’)
    file_salon = open(filename + ‘.dat’, ‘w’)
    lignes = file_salon_temp.readlines()
    for ligne in lignes:
        lignefinale = ligne.replace("(u’","")
        lignefinale = lignefinale.replace("’","")
        lignefinale = lignefinale.replace(")","")
        file_salon.write(lignefinale)
    file_salon.close()

def create_gnuplot(interval):
    gnuplot_file = open(‘/programmation/meteotemp/gnuplot.tmp’, ‘w’)
    gnuplot_file.write(‘reset’+’\n’)
    gnuplot_file.write(‘set datafile separator ","’+’\n’)
    gnuplot_file.write(‘set term png’+’\n’)
    gnuplot_file.write(‘set xdata time’+’\n’)
    gnuplot_file.write(‘set timefmt "%Y-%m-%d %H:%M:%S"’+’\n’)
    gnuplot_file.write(‘set format x "%b %d %H:%M"’+’\n’)
    gnuplot_file.write(‘set xtics rotate by -45’+’\n’)
    gnuplot_file.write(‘set xlabel " "’+’\n’)
    gnuplot_file.write(‘set ylabel "Temperature(C)"’+’\n’)
    gnuplot_file.write(‘set ytics nomirror’+’\n’)
    gnuplot_file.write(‘set key left’+’\n’)
    if interval == 1:
        gnuplot_file.write(‘set output "/var/www/salon_jour.png"’+’\n’)
        gnuplot_file.write(‘plot "/programmation/meteotemp/salon-jour.dat" using 1:2 lt rgb "blue" title "Temperature sur 24h" with lines axes x1y1’+’\n’)
        gnuplot_file.close()
        os.system(‘rm /var/www/salon_jour.png’)
        os.system(‘mv /programmation/meteotemp/gnuplot.tmp /programmation/meteotemp/gnuplot-jour.plt’)
        os.system(‘gnuplot /programmation/meteotemp/gnuplot-jour.plt’)

    if interval == 7:
        gnuplot_file.write(‘set output "/var/www/salon_semaine.png"’+’\n’)
        gnuplot_file.write(‘plot "/programmation/meteotemp/salon-semaine.dat" using 1:2 lt rgb "blue" title "Temperature sur 1 semaine" with lines axes x1y1’+’\n’)
        gnuplot_file.close()
        os.system(‘rm /var/www/salon_semaine.png’)
        os.system(‘mv /programmation/meteotemp/gnuplot.tmp /programmation/meteotemp/gnuplot-semaine.plt’)
        os.system(‘gnuplot /programmation/meteotemp/gnuplot-semaine.plt’)
    if interval == 31:
        gnuplot_file.write(‘set output "/var/www/salon_mois.png"’+’\n’)
        gnuplot_file.write(‘plot "/programmation/meteotemp/salon-mensuel.dat" using 1:2 lt rgb "blue" title "Temperature sur 1 mois" with lines axes x1y1’+’\n’)
        gnuplot_file.close()
        os.system(‘rm /var/www/salon_mois.png’)
        os.system(‘mv /programmation/meteotemp/gnuplot.tmp /programmation/meteotemp/gnuplot-mois.plt’)
        os.system(‘gnuplot /programmation/meteotemp/gnuplot-mois.plt’)   
    if interval == 365:
        gnuplot_file.write(‘set output "/var/www/salon_annee.png"’+’\n’)
        gnuplot_file.write(‘plot "/programmation/meteotemp/salon-annuel.dat" using 1:2 lt rgb "blue" title "Temperature sur 1 an" with lines axes x1y1’+’\n’)
        gnuplot_file.close()
        os.system(‘rm /var/www/salon_annee.png’)
        os.system(‘mv /programmation/meteotemp/gnuplot.tmp /programmation/meteotemp/gnuplot-annee.plt’)
        os.system(‘gnuplot /programmation/meteotemp/gnuplot-annee.plt’)
       
if os.listdir("/programmation/meteotemp"):
    for filename in os.listdir("/programmation/meteotemp"):
        os.remove(("/programmation/meteotemp") + "/" + filename)
get_data(1)
get_data(7)
get_data(31)
get_data(365)
create_gnuplot(1)
create_gnuplot(7)
create_gnuplot(31)
create_gnuplot(365)

Le programme génère 4 fichiers temporaires qui contiennent les données (dates et températures) sur un jour, une semaine, un mois et une année. Ensuite on crée 4 fichiers de réponse pour l’utilisation de Gnuplot. Ensuite Gnuplot génère 4 fichiers images qui sont stockés dans notre serveur WEB /var/www.

Ensuite j’ai un fichier de nom ‘meteo.php’ dans /var/www qui va permettre d’afficher les graphes dont voici une partie qui concerne l’affichage des graphes :

<div class="contenu">
     <center><h1>Station M&eacute;t&eacute;o</h1></center>
     <p>
      Temp&eacute;rature du salon :<br />
      <center><table border="1"><tr><td><img src="salon_jour.png" width=230 /></td><td>
      <img src="salon_semaine.png" width=230 /></td><td>
      <img src="salon_mois.png" width=230 /></td><td>
      <img src="salon_annee.png" width=230 /></tr></table></center>
      </p>
</div>

Ce script Python sera exécuté toutes les 30 minutes en éditant la ‘crontab’ en tapant la commande ‘crontab –e’ et en ajoutant la ligne suivante :

image

Et voilà le résultat :

image

Publicités
Catégories :applications, Matériel, Raspberry Étiquettes : , , , ,
  1. CHEYROU Robert
    28/04/2016 à 10:51

    bonjour,

    Je voulais vous remercier pour cet excellent article dont je me suis largement inspiré pour la mise en ligne des données de ma station météo, avec en particulier l’utilsation de gnuplot.

    bonne journée

  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :