Projet domotique complet (fin)

Bonjour visiteur du soir ou du matin 🙂

Je dois depuis bien longtemps rédiger et publier mon petit projet domotique. Faute de temps et de courage, je me trouve toujours autre chose à faire.

Bon d’accord, je commence la rédac ce soir. Pour vous mettre l’eau à la bouche et avant de débuter cette série d’articles, j’aimerai vous montrer à quoi ressemble mon tableau de bord. La fin du projet en quelque sorte.

Et maintenant voilà qu’il nous parle de voiture…

Mais non pas de panique ! Il s’agit d’un point d’information qui permet en un seul coup d’œil, de connaitre tous les points qui me semble important dans la maison. Totalement inspiré du site magdiblog, brièvement décrit dans un précédent article, j’ai adapté le projet HOMEDASHSCREEN à mes besoins.

Voici le résultat:

DashBoard

Cette page web se trouve être la page par défaut de mon navigateur internet. Ainsi au premier coup d’oeil, je visualise l’heure, le flux rss (il s’agit du monde dans l’exemple), le nombre de visites du blog (okay jamais plus de 15 par jours).

Au centre, j’ai dessiné le plan de la maison avec les températures de toutes les pièces (rafraichissement toutes les 5 minutes). Les deux gauges à droite indiquent le niveau d’eau dans la cuve ainsi que la consommation électrique de la maison.

Lorsque le chauffage est en marche, sous le plan, apparait les zones de chauffe et enfin en bas à gauche sont listés les évènement d’un calendrier Google au format ical.

Merci encore aux utilisateurs du site magdiblog pour leur travail.

Hasta la vista 🙂

Supervision d’une cuve de recuperation d’eau

Bonjour à tous,

Dessin_cuveJ’aborde ici mon premier projet grandeur nature. Comme tout le monde, après avoir réussi à faire clignoter des diodes, il me fallait un véritable objectif pour mettre en pratique, grandeur nature, tout ce que j’avais eu l’occasion de tester.

Alors, l’année dernière à la sortie de l’hiver, je vérifie le volume d’eau contenu dans ma cuve enfouie de 2500 L.

Là, c’est le drame, il restait tout au plus 50 cm au fond. Me voilà partie en mode spéléo avec frontale et baladeuse à la recherche d’une fuite. Rien, nada 🙁

Je nettoie les filtres et guette la première averse, je suis enfin soulagé de voir que le niveau remonte. Il n’était pas question de rester aveugle et de se taper un démontage et levage de couvercle tous les 15 jours.

Il me faut l’aide de la technique ! En parcourant le NET, je découvre le Rasberry Pi et la communauté qui gravite autour.

Mon attention se porte particulièrement sur le blog d’Idelman.

Allez zou c’est parti, je bricole un truc en m’inspirant grandement du travail déjà fait histoire de ne par réinventer la roue.

Schéma de principe:

principeSchéma de raccordement des différents capteurs.

SchémaIdée de base :

Il me faut sur une petite page web permettant de visualiser:
– la hauteur d’eau,
– le volume estimé d’eau contenu,
– la température de l’eau,
– la température exterieure,
– la température de la boite de dérivation au cas où…

Elle doit également permettre de commander ma pompe de relevage et une prise de courant extérieure. Si l’interface vous dit quelque chose, c’est tout à fait normal. Elle est issue de la version qui précède le projet Yana-serveur d’Idelman.

mini_web

Pour visualiser les niveaux à partir du Web sans permettre un accès au serveur local, le raspberry de la cuve transmet toutes les 15 minutes, les graphiques sur ce site.

Eyesathome

On commence par où ?

une petite mise au point s’impose avant d’attaquer dans le dur….

Cette page n’est qu’un exemple de ce que j’ai mis en place chez moi. Les informations données ici n’ont pas d’autre but que d’aider ceux qui peuvent être intéressés par le sujet et remercier ceux qui m’ont inspirés.

Je vous rappelle les risques liés à la présence d’eau et du secteur (230 v).

Et enfin, dans la vie, je ne suis pas développeur, le code est brutal, peu adapté mais fonctionnel. J’ai depuis un peu progressé car j’ai une dizaine de capteurs de température dans toute la maison me permettant de gérer le chauffage mais ça c’est une autre histoire.

Le matos (liens donnés pour l’exemple):

Rasperry Pi (modèle B) installation classique avec OS raspbian,
– un capteur à ultrasons type HC-SR04,

hc– trois capteurs de température DS18B20,
– un module deux relais,

relais– une grosse boite de dérivation étanche pouvant contenir un module CPL + raspberry + un peu de bazar en plus :),
– une boite de dérivation 10*10 par exemple pouvant contenir le capteur à ultrasons,
– de la gaine thermo (pour faire le capteur de température immergé),
– des connecteurs RS232 pour raccorder les sondes de températures et le capteur HC-SR04.

rs232

Voici une image du rendu final

Db9Je ne reviens pas sur l’installation de l’os sur le raspberry, il existe une multitude de sites reprenant le sujet.

Les sondes de températures:

Elles utilisent le bus ONE WIRE en mode parasite comme indiqué sur ce site dont je recommande la lecture au passage. Vu le prix des sondes DS18B20 étanches, je vous invite à les faire vous même avec de la gaine thermo et votre fer à souder préféré comme indiqué ici.

sonde_eau

La sonde de profondeur:

Profondeur

Le capteur à ultrason type HC-SR04 se trouve dans une boite de dérivation percée aux dimensions des deux capteurs. Pour finaliser l’étanchéité, j’ai déposé un filet de silicone de salle de bains qui trainait au fond du garage. La boite est fixée sur un rail à placo qui repose sur le bord plastique de la cuve (en dessous de la réhausse). Les capteurs se trouvent à 18 cm de la hauteur maximum de l’eau.

Le réseau informatique:

J’ai testé les dongles wifi mais l’humidité ambiante finie par abîmer les connecteurs. J’ai opté pour un boitier CPLqui me restait. De toute façon, il faudra bien alimenter la pompe en 230 volts. L’adresse IP du lan est attribuée par un DHCP statique par l’intermédiaire de la box.

Au passage, j’attire votre ATTENTION sur les dangers du 230 V :

Si vous n’êtes pas à l’aise sur le sujet, je vous invite à prendre toutes les précautions qui s’imposent et en particulier,

COUPEZ LE COURANT avant toute intervention.

L’environnement où se trouve cette installation est plutôt humide, soyez prudent. Je décline toute responsabilité en cas d’accident.

Comment ça marche, ton affaire ?

Toutes les 5 minutes le script (capture.pl) collecte les températures des 3 sondes et les stock dans une base rrdtool. Puis toutes les 15 minutes, je transferts les images sur le site miroir en FTP.

Voici une vue du crontab qui tourne sur le serveur

# m h  dom mon dow   command
# Capture les temperatures par le bus 1-Wire
*/5 * * * * /home/super/programmes/temperatures/capture.pl

# Lance une copie des graphs sur le site de free toutes les 15 min
*/15 * * * * /home/super/programmes/syteme/copie_site.sh

# Lance les scripts lies a la hauteur d'eau et au volume
*/5 * * * * /home/super/programmes/profondeur/capa.py
*/6 * * * * /home/super/programmes/profondeur/capa.sh

# Lance les scripts de monitoring et graphiques
*/15 * * * * /usr/bin/python /home/super/programmes/temperatures/verif_tech.py
*/15 * * * * /usr/bin/python /home/super/programmes/temperatures/verif_cuve.py

Les scripts:

Les températures:

Comme indiqué plus haut, une base RRDTOOL nommée « temp_cuve.rrd » reçoit toutes les 5 minutes les valeurs des 3 sondes. Le script « creation_base_temp.sh » permet la création de la base RRDTOOL contenant les températures.

Comme vous pouvez le constatez dans les graphiques issus de cette base, les températures négatives ne s’affichent pas. Je modifierai cela plus tard.

rrdtool create temp_cuve.rrd --start N --step 300 \
DS:temp_eau:GAUGE:600:-5:20 \
DS:temp_ext:GAUGE:600:-25:45 \
DS:temp_tech:GAUGE:600:0:45 \
RRA:LAST:0.5:1:12 \
RRA:MAX:0.5:1:12 \
RRA:MIN:0.5:1:12 \
RRA:AVERAGE:0.5:1:12 \
RRA:AVERAGE:0.5:1:288 \
RRA:AVERAGE:0.5:12:168 \
RRA:AVERAGE:0.5:12:720 \
RRA:AVERAGE:0.5:288:365
creation_base_temp.sh

Cette base est alimentée toutes les 5 minutes par le script « capture.pl ». Il est en perl et j’avoue que l’année dernière je me suis contenté de l’adapter sans trop comprendre les rudiments du langage. Depuis, je me suis mis au python et ça va mieux 🙂

#!/usr/bin/perl
use LWP::UserAgent;

my $dir = '/home/super/programmes/temperatures/';
my $ua = new LWP::UserAgent;
$ua->timeout(120);
$modules = `cat /proc/modules`;

if ($modules =~ /w1_therm/ && $modules =~ /w1_gpio/)
{
#modules installed
}
else
{
$gpio = `sudo modprobe w1-gpio`;
$therm = `sudo modprobe w1-therm`;
}

# 1er capteur "eau"
$output = "";
$attempts = 0;
while ($output !~ /YES/g && $attempts < 5)
{
$output = `sudo cat /sys/bus/w1/devices/28-00000468dd1f/w1_slave 2>&1`;
if($output =~ /No such file or directory/)
{
print "Capteur cuve en panne.\n";
last;
}
elsif($output !~ /NO/g)
{
$output =~ /t=(\d+)/i;
$temp_eau = ($1 / 1000);
}

$attempts++;
}

# 2eme capteur "exterieur"
$output = "";
$attempts = 0;
while ($output !~ /YES/g && $attempts < 5)
{
$output = `sudo cat /sys/bus/w1/devices/28-00000468fd4a/w1_slave 2>&1`;
if($output =~ /No such file or directory/)
{
print "Capteur exterieur en panne.\n";
last;
}
elsif($output !~ /NO/g)
{
$output =~ /t=(\d+)/i;
$temp_ext = ($1 / 1000);
}

$attempts++;
}

# 3eme capteur "technique"
$output = "";
$attempts = 0;
while ($output !~ /YES/g && $attempts < 5)
{
$output = `sudo cat /sys/bus/w1/devices/28-0000049d7894/w1_slave 2>&1`;
if($output =~ /No such file or directory/)
{
print "Capteur technique en panne.\n";
last;
}
elsif($output !~ /NO/g)
{
$output =~ /t=(\d+)/i;
$temp_tech = ($1 / 1000);
$rrd = `/usr/bin/rrdtool update $dir/temp_cuve.rrd N:$temp_eau:$temp_ext:$temp_tech`;
}

$attempts++;
}

#print "Temperature eau: $temp_eau\n";
#print "Temperature exterieur: $temp_ext\n";
#print "Temperature boitier technique: $temp_tech\n";
Script de collecte des températures (capture.pl)

Bon c’est du brutal, y’a moyen de faire mieux !

Le script suivant lance la création des graphiques de températures à partir de la base rrdtool.Il est assez simple à personnaliser. On fixe au départ les répertoires sources, destination et les différentes couleurs. Cette partie du script (%.2lf) fixe le nombre de chiffres à afficher aprés la virgule.

#!/bin/bash
DIR="/home/super/programmes/temperatures"

# Pour le deplacement des fichiers img vers le repertoire du serveur web.
source='/home/super/programmes/temperatures/t_*.png'
destination='/var/www/cuve/img'
JOUR=$(date '+%d-%m-%Y %H-%M-%S')

# Affichage en degre C
TEMP_SCALE="Celsius"

#Choix des couleurs
TEMP_EAU_COUL="#000099" TEMP_TECH_COUL="#FF0000" TEMP_EXT_COUL="#993300"

#Titres  et informations
TITRE2="Suivi journalier" TITRE3="Suivi hebdomadaire" TITRE4="Suivi mensuel" TITRE5="Suivi annuel"

#Graphs heure multimesures
rrdtool graph $DIR/t_cuve_multi_4h.png --start -4h  --title="Vue globale sur 4 heures" --vertical-label=$TEMP_SCALE \
DEF:temp_eau=$DIR/temp_cuve.rrd:temp_eau:AVERAGE \
DEF:temp_ext=$DIR/temp_cuve.rrd:temp_ext:AVERAGE \
DEF:temp_tech=$DIR/temp_cuve.rrd:temp_tech:AVERAGE \
LINE1:temp_eau$TEMP_EAU_COUL:"Temperature de l'eau\n" \
LINE1:temp_ext$TEMP_EXT_COUL:"Temperature exterieure\n" \
LINE1:temp_tech$TEMP_TECH_COUL:"Temperature interne du boiter technique\n" \
COMMENT:" \n" \
GPRINT:temp_eau:LAST:"Mesure\: %.2lf" \
GPRINT:temp_eau:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_eau:MIN:"Mini\: %.2lf" \
GPRINT:temp_eau:MAX:"Maxi\: %.2lf\n" \
GPRINT:temp_ext:LAST:"Mesure\: %.2lf" \
GPRINT:temp_ext:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_ext:MIN:"Mini\: %.2lf" \
GPRINT:temp_ext:MAX:"Maxi\: %.2lf\n" \
GPRINT:temp_tech:LAST:"Mesure\: %.2lf" \
GPRINT:temp_tech:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_tech:MIN:"Mini\: %.2lf" \
GPRINT:temp_tech:MAX:"Maxi\: %.2lf\n" \
COMMENT:" \n" \
COMMENT:"Dernier releve $JOUR"

#Graphs par heure
rrdtool graph $DIR/t_eau_4h.png --start -4h  --title="Temperature eau sur 4 heures" --vertical-label=$TEMP_SCALE \
DEF:temp_eau=$DIR/temp_cuve.rrd:temp_eau:AVERAGE \
LINE1:temp_eau$TEMP_EAU_COUL:"Temperature de l'eau\n" \
GPRINT:temp_eau:LAST:"Mesure\: %.2lf" \
GPRINT:temp_eau:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_eau:MIN:"Mini\: %.2lf" \
GPRINT:temp_eau:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

rrdtool graph $DIR/t_ext_4h.png --start -4h --title="Temperature exterieure sur 4 heures" --vertical-label=$TEMP_SCALE \
DEF:temp_ext=$DIR/temp_cuve.rrd:temp_ext:AVERAGE \
LINE1:temp_ext$TEMP_EXT_COUL:"Temperature exterieure\n" \
GPRINT:temp_ext:LAST:"Mesure\: %.2lf" \
GPRINT:temp_ext:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_ext:MIN:"Mini\: %.2lf" \
GPRINT:temp_ext:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

rrdtool graph $DIR/t_tech_4h.png --start -4h --title="Temperature B.tech sur 4 heures" --vertical-label=$TEMP_SCALE \
DEF:temp_tech=$DIR/temp_cuve.rrd:temp_tech:AVERAGE \
LINE1:temp_tech$TEMP_TECH_COUL:"Temperature interne du boiter technique\n" \
GPRINT:temp_tech:LAST:"Mesure\: %.2lf" \
GPRINT:temp_tech:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_tech:MIN:"Mini\: %.2lf" \
GPRINT:temp_tech:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

#Graphs par jour
rrdtool graph $DIR/t_eau_24h.png --start -1d --title="Temperature eau sur 24 heures" --vertical-label=$TEMP_SCALE \
DEF:temp_eau=$DIR/temp_cuve.rrd:temp_eau:AVERAGE \
LINE1:temp_eau$TEMP_EAU_COUL:"Temperature de l'eau\n" \
GPRINT:temp_eau:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_eau:MIN:"Mini\: %.2lf" \
GPRINT:temp_eau:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

rrdtool graph $DIR/t_ext_24h.png --start -1d --title="Temperature exterieure sur 24 heures" --vertical-label=$TEMP_SCALE \
DEF:temp_ext=$DIR/temp_cuve.rrd:temp_ext:AVERAGE \
LINE1:temp_ext$TEMP_EXT_COUL:"Temperature exterieure\n" \
GPRINT:temp_ext:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_ext:MIN:"Mini\: %.2lf" \
GPRINT:temp_ext:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

rrdtool graph $DIR/t_tech_24h.png --start -1d --title="Temperature B.tech sur 24 heures" --vertical-label=$TEMP_SCALE \
DEF:temp_tech=$DIR/temp_cuve.rrd:temp_tech:AVERAGE \
LINE1:temp_tech$TEMP_TECH_COUL:"Temperature interne du boiter technique\n" \
GPRINT:temp_tech:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_tech:MIN:"Mini\: %.2lf" \
GPRINT:temp_tech:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

#Graphs par semaine
rrdtool graph $DIR/t_eau_1w.png --start -1w --title="Temperature eau sur 1 semaine" --vertical-label=$TEMP_SCALE \
DEF:temp_eau=$DIR/temp_cuve.rrd:temp_eau:AVERAGE \
LINE1:temp_eau$TEMP_EAU_COUL:"Temperature de l'eau\n" \
GPRINT:temp_eau:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_eau:MIN:"Mini\: %.2lf" \
GPRINT:temp_eau:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

rrdtool graph $DIR/t_ext_1w.png --start -1w --title="Temperature exterieure sur 1 semaine" --vertical-label=$TEMP_SCALE \
DEF:temp_ext=$DIR/temp_cuve.rrd:temp_ext:AVERAGE \
LINE1:temp_ext$TEMP_EXT_COUL:"Temperature exterieure\n" \
GPRINT:temp_ext:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_ext:MIN:"Mini\: %.2lf" \
GPRINT:temp_ext:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

rrdtool graph $DIR/t_tech_1w.png --start -1w --title="Temperature B.tech sur 1 semaine" --vertical-label=$TEMP_SCALE \
DEF:temp_tech=$DIR/temp_cuve.rrd:temp_tech:AVERAGE \
LINE1:temp_tech$TEMP_TECH_COUL:"Temperature interne du boiter technique\n" \
GPRINT:temp_tech:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_tech:MIN:"Mini\: %.2lf" \
GPRINT:temp_tech:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

#Graphs par mois
rrdtool graph $DIR/t_eau_1m.png --start -1m --title="Temperature eau sur 1 mois" --vertical-label=$TEMP_SCALE \
DEF:temp_eau=$DIR/temp_cuve.rrd:temp_eau:AVERAGE \
LINE1:temp_eau$TEMP_EAU_COUL:"Temperature de l'eau\n" \
GPRINT:temp_eau:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_eau:MIN:"Mini\: %.2lf" \
GPRINT:temp_eau:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

rrdtool graph $DIR/t_ext_1m.png --start -1m --title="Temperature exterieure sur 1 mois" --vertical-label=$TEMP_SCALE \
DEF:temp_ext=$DIR/temp_cuve.rrd:temp_ext:AVERAGE \
LINE1:temp_ext$TEMP_EXT_COUL:"Temperature exterieure\n" \
GPRINT:temp_ext:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_ext:MIN:"Mini\: %.2lf" \
GPRINT:temp_ext:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

rrdtool graph $DIR/t_tech_1m.png --start -1m --title="Temperature B.tech sur 1 mois" --vertical-label=$TEMP_SCALE \
DEF:temp_tech=$DIR/temp_cuve.rrd:temp_tech:AVERAGE \
LINE1:temp_tech$TEMP_TECH_COUL:"Temperature interne du boiter technique\n" \
GPRINT:temp_tech:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_tech:MIN:"Mini\: %.2lf" \
GPRINT:temp_tech:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

#Graphs 6 mois
rrdtool graph $DIR/t_eau_6m.png --start -25w --title="Temperature eau sur 6 mois" --vertical-label=$TEMP_SCALE \
DEF:temp_eau=$DIR/temp_cuve.rrd:temp_eau:AVERAGE \
LINE1:temp_eau$TEMP_EAU_COUL:"Temperature de l'eau\n" \
GPRINT:temp_eau:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_eau:MIN:"Mini\: %.2lf" \
GPRINT:temp_eau:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

rrdtool graph $DIR/t_ext_6m.png --start -25w --title="Temperature exterieure sur 6 mois" --vertical-label=$TEMP_SCALE \
DEF:temp_ext=$DIR/temp_cuve.rrd:temp_ext:AVERAGE \
LINE1:temp_ext$TEMP_EXT_COUL:"Temperature exterieure\n" \
GPRINT:temp_ext:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_ext:MIN:"Mini\: %.2lf" \
GPRINT:temp_ext:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

rrdtool graph $DIR/t_tech_6m.png --start -25w --title="Temperature B.tech sur 6 mois" --vertical-label=$TEMP_SCALE \
DEF:temp_tech=$DIR/temp_cuve.rrd:temp_tech:AVERAGE \
LINE1:temp_tech$TEMP_TECH_COUL:"Temperature interne du boiter technique\n" \
GPRINT:temp_tech:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_tech:MIN:"Mini\: %.2lf" \
GPRINT:temp_tech:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

#Graphs annuels
rrdtool graph $DIR/t_eau_1y.png --start -1y --title="Temperature eau sur 1 an" --vertical-label=$TEMP_SCALE \
DEF:temp_eau=$DIR/temp_cuve.rrd:temp_eau:AVERAGE \
LINE1:temp_eau$TEMP_EAU_COUL:"Temperature de l'eau\n" \
GPRINT:temp_eau:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_eau:MIN:"Mini\: %.2lf" \
GPRINT:temp_eau:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

rrdtool graph $DIR/t_ext_1y.png --start -1y --title="Temperature exterieure sur 1 an" --vertical-label=$TEMP_SCALE \
DEF:temp_ext=$DIR/temp_cuve.rrd:temp_ext:AVERAGE \
LINE1:temp_ext$TEMP_EXT_COUL:"Temperature exterieure\n" \
GPRINT:temp_ext:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_ext:MIN:"Mini\: %.2lf" \
GPRINT:temp_ext:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

rrdtool graph $DIR/t_tech_1y.png --start -1y --title="Temperature B.tech sur 1 an" --vertical-label=$TEMP_SCALE \
DEF:temp_tech=$DIR/temp_cuve.rrd:temp_tech:AVERAGE \
LINE1:temp_tech$TEMP_TECH_COUL:"Temperature interne du boiter technique\n" \
GPRINT:temp_tech:AVERAGE:"Moy\: %.2lf" \
GPRINT:temp_tech:MIN:"Mini\: %.2lf" \
GPRINT:temp_tech:MAX:"Maxi\: %.2lf" \
COMMENT:"Dernier releve $JOUR"

#Copie les graphs dans le repertoire du site local /var/www/cuve/img
#transfert.sh

#Transfert des donnees sur le serveur Web
chown www-data:www-data $source
sudo mv $source $destination
creation_graph.sh

Pour des raisons de sécurité, je ne voulais pas mettre mon raspberry pi directement sur le net. J’ai pris l’option de transférer les données (images) sur une pauvre page web consultable de partout. Le script pousse les images toutes les 15 minutes.

#! /bin/bash

######  Variables #############
TARGET_FTP="/var/www/cuve/img/ /img"
FTP="ftpperso.free.fr" LOGIN="#######" PASS="########"
MAIL="#######@free.fr" JOUR=$(date '+%d-%m-%Y %H-%M-%S')
#################################

# Balance les fichier sur le ftp free
lftp -e "open -u $LOGIN,$PASS $FTP; mirror -n -R $TARGET_FTP ;
bye";
# Message mail automatique
#echo "Mise a jour du site = ok" $JOUR | mail -s "Eyes At Home" $MAIL;
# Log de confirmation
#echo "Copie des fichiers et envoi de mail a "$JOUR >>/var/log/transfert.log;
copie_site.sh

La profondeur:

Le script se nomme capa.py. Il se lance en tâche planifiée toutes les 5 minutes. Comme pour les températures les données sont transmises à une base RRDTOOL. Le capteur doit être raccordé sur les pins 17 et 23 (que vous pouvez adapter à votre guise sous réserve de modifier les paramètres dans le script).

GPIO_TRIGGER = 17
GPIO_ECHO = 23

J’utilise encore une base rrdtool pour le stockage des données. La base créée se nomme capa_cuve.rrd.

rrdtool create capa_cuve.rrd --start N --step 300 \
DS:haut:GAUGE:600:1:130 \
DS:capa:GAUGE:600:0:2600 \
RRA:LAST:0.5:1:12 \
RRA:MAX:0.5:1:12 \
RRA:MIN:0.5:1:12 \
RRA:AVERAGE:0.5:1:12 \
RRA:LAST:0.5:1:288 \
RRA:MAX:0.5:1:288 \
RRA:MIN:0.5:1:288 \
RRA:AVERAGE:0.5:1:288 \
RRA:LAST:0.5:12:168 \
RRA:MAX:0.5:12:168 \
RRA:MIN:0.5:12:168 \
RRA:AVERAGE:0.5:12:168 \
RRA:LAST:0.5:12:720 \
RRA:MAX:0.5:12:720 \
RRA:MIN:0.5:12:720 \
RRA:AVERAGE:0.5:12:720 \
RRA:LAST:0.5:288:365 \
RRA:MAX:0.5:288:365 \
RRA:MIN:0.5:288:365 \
RRA:AVERAGE:0.5:288:365
creation_base.sh

Le script suivant a subi une modification. A l’origine, il est extrait d’ici |R|a|s|p|b|e|r|r|y|P|i|-|S|p|y|.|c|o|.|u|k| par Matt Hawkins. Repris par beaucoup d’entre nous, il offre un bon apprentissage de la sonde. Pour ma part, il me permet de déterminer la hauteur d’eau se trouvant dans la cuve et estimer son volume par calcul.
Je ne suis pas à 20 litres prés, l’estimation est suffisante.

#!/usr/bin/python
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#|R|a|s|p|b|e|r|r|y|P|i|-|S|p|y|.|c|o|.|u|k|
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#
# ultrasonic_1.py
# Measure distance using an ultrasonic module
#
# Author 1ere partie: Matt Hawkins
# Date   : 09/01/2013
# Author 2eme partie: Jose
# Date   : 10/05/2013

# Import required Python libraries
import time
import RPi.GPIO as GPIO
import rrdtool
import datetime

# Use BCM GPIO references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)

# Define GPIO to use on Pi
GPIO_TRIGGER = 17
GPIO_ECHO = 23

# Set pins as output and input
GPIO.setup(GPIO_TRIGGER,GPIO.OUT)  # Trigger
GPIO.setup(GPIO_ECHO,GPIO.IN)      # Echo

# Set trigger to False (Low)
GPIO.output(GPIO_TRIGGER, False)

# Allow module to settle
time.sleep(0.5)

# Send 10us pulse to trigger
GPIO.output(GPIO_TRIGGER, True)
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)
start = time.time()
while GPIO.input(GPIO_ECHO)==0:
start = time.time()

while GPIO.input(GPIO_ECHO)==1:
stop = time.time()

# Calculate pulse length
elapsed = stop-start

# Distance pulse travelled in that time is time
# multiplied by the speed of sound (cm/s)
distance = elapsed * 34300

# That was the distance there and back so halve the value
distance = distance / 2

# Mesure de la hauteur d'eau en faisant la différence entre la hauteur cuve pleine et le capteur 18 cm
fond=131.5
distance = fond - distance

# Fonction de calcul du volume théorique de la cuve
largeur=100
longueur=210

vol = largeur * longueur * distance
volume = vol / 1000

# Décoche les commentaires pour consulter les logs
print  "%.0f" % distance+" "+"%.0f" % volume

#Transfert dans la base rrdtool
database_file = "/home/super/programmes/profondeur/capa_cuve.rrd"
rrdtool.update(database_file, "N:%.2f" % distance+":%.0f" % volume)

# Reset GPIO settings
GPIO.cleanup()
capa.py

Quelques explications sur la mesure. Le script mesure le temps que met l’écho a revenir. J’ai pris le temps de mesurer la hauteur d’eau lorsque la cuve était pleine. Le capteur à ultrason se trouve dirigé vers la surface de l’eau et à une hauteur de 17 cm. Aprés la mesure, je retire la hauteur théorique pleine. Après un petit calcul de volume, j’estime la capacité en eau de la cuve.
On continue avec un script qui génère des graphiques.

#!/bin/bash
DIR="/home/super/programmes/profondeur"

# Pour le deplacement des fichiers img vers le repertoire du serveur web.
source='/home/super/programmes/profondeur/*_cuve_*.png'
destination='/var/www/cuve/img'
JOUR=$(date '+%d-%m-%Y %H-%M-%S')

# Affichage en degre C
ECHELLE="cm"
VOLUME="litres"

#Choix des couleurs
COUL_ECHELLE="#000099" COUL_VOLUME="#FF0000"

#Graphs par heure
rrdtool graph $DIR/h_cuve_4h.png --start -4h --title="Hauteur d'eau sur 4 heures" --vertical-label="cm"  \
DEF:haut=$DIR/capa_cuve.rrd:haut:AVERAGE \
LINE1:haut$COUL_ECHELLE:"Hauteur d'eau en $ECHELLE\n" \
GPRINT:haut:LAST:"Mesure\: %.0lf" \
GPRINT:haut:AVERAGE:"Moy\: %.0lf" \
GPRINT:haut:MIN:"Mini\: %.0lf" \
GPRINT:haut:MAX:"Maxi\: %.0lf" \
COMMENT:" \n" \
COMMENT:"Dernier releve $JOUR"

rrdtool graph $DIR/v_cuve_4h.png --start -4h --title="Volume sur 4 heures" --vertical-label="Litres" \
DEF:capa=$DIR/capa_cuve.rrd:capa:AVERAGE \
LINE1:capa$COUL_VOLUME:"Volume de la cuve en $VOLUME\n" \
GPRINT:capa:LAST:"Mesure\: %.0lf" \
GPRINT:capa:AVERAGE:"Moy\: %.0lf" \
GPRINT:capa:MIN:"Mini\: %.0lf" \
GPRINT:capa:MAX:"Maxi\: %.0lf" \
COMMENT:" \n" \
COMMENT:"Derniere estimation $JOUR"

#Graphs par jour
rrdtool graph $DIR/h_cuve_24h.png --start -1d --title="Hauteur d'eau sur 24 heures" --vertical-label="cm"  \
DEF:haut=$DIR/capa_cuve.rrd:haut:AVERAGE \
LINE1:haut$COUL_ECHELLE:"Hauteur d'eau en $ECHELLE\n" \
GPRINT:haut:AVERAGE:"Moy\: %.0lf" \
GPRINT:haut:MIN:"Mini\: %.0lf" \
GPRINT:haut:MAX:"Maxi\: %.0lf" \

rrdtool graph $DIR/v_cuve_24h.png --start -1d --title="Volume sur 24 heures" --vertical-label="Litres" \
DEF:capa=$DIR/capa_cuve.rrd:capa:AVERAGE \
LINE1:capa$COUL_VOLUME:"Volume de la cuve en $VOLUME\n" \
GPRINT:capa:AVERAGE:"Moy\: %.0lf" \
GPRINT:capa:MIN:"Mini\: %.0lf" \
GPRINT:capa:MAX:"Maxi\: %.0lf" \

#Graphs par semaine
rrdtool graph $DIR/h_cuve_1w.png --start -1w --title="Hauteur d'eau sur 1 semaine" --vertical-label="cm" \
DEF:haut=$DIR/capa_cuve.rrd:haut:AVERAGE \
LINE1:haut$COUL_ECHELLE:"Hauteur d'eau en $ECHELLE\n" \
GPRINT:haut:AVERAGE:"Moy\: %.0lf" \
GPRINT:haut:MIN:"Mini\: %.0lf" \
GPRINT:haut:MAX:"Maxi\: %.0lf" \

rrdtool graph $DIR/v_cuve_1w.png --start -1w --title="Volume sur 1 semaine" --vertical-label="Litres" \
DEF:capa=$DIR/capa_cuve.rrd:capa:AVERAGE \
LINE1:capa$COUL_VOLUME:"Volume de la cuve en $VOLUME\n" \
GPRINT:capa:AVERAGE:"Moy\: %.0lf" \
GPRINT:capa:MIN:"Mini\: %.0lf" \
GPRINT:capa:MAX:"Maxi\: %.0lf" \

#Graphs par mois
rrdtool graph $DIR/h_cuve_1m.png --start -1m  --title="Hauteur d'eau sur 1 mois" --vertical-label="cm" \
DEF:haut=$DIR/capa_cuve.rrd:haut:AVERAGE \
LINE1:haut$COUL_ECHELLE:"Hauteur d'eau en $ECHELLE\n" \
GPRINT:haut:AVERAGE:"Moy\: %.0lf" \
GPRINT:haut:MIN:"Mini\: %.0lf" \
GPRINT:haut:MAX:"Maxi\: %.0lf" \

rrdtool graph $DIR/v_cuve_1m.png --start -1m  --title="Volume sur 1 mois" --vertical-label="Litres" \
DEF:capa=$DIR/capa_cuve.rrd:capa:AVERAGE \
LINE1:capa$COUL_VOLUME:"Volume de la cuve en $VOLUME\n" \
GPRINT:capa:AVERAGE:"Moy\: %.0lf" \
GPRINT:capa:MIN:"Mini\: %.0lf" \
GPRINT:capa:MAX:"Maxi\: %.0lf" \

#Graphs pour 6 mois
rrdtool graph $DIR/h_cuve_6m.png --start -25w  --title="Hauteur d'eau sur 6 mois" --vertical-label="cm" \
DEF:haut=$DIR/capa_cuve.rrd:haut:AVERAGE \
LINE1:haut$COUL_ECHELLE:"Hauteur d'eau en $ECHELLE\n" \
GPRINT:haut:AVERAGE:"Moy\: %.0lf" \
GPRINT:haut:MIN:"Mini\: %.0lf" \
GPRINT:haut:MAX:"Maxi\: %.0lf" \

rrdtool graph $DIR/v_cuve_6m.png --start -25w  --title="Volume sur 6 mois" --vertical-label="Litres" \
DEF:capa=$DIR/capa_cuve.rrd:capa:AVERAGE \
LINE1:capa$COUL_VOLUME:"Volume de la cuve en $VOLUME\n" \
GPRINT:capa:AVERAGE:"Moy\: %.0lf" \
GPRINT:capa:MIN:"Mini\: %.0lf" \
GPRINT:capa:MAX:"Maxi\: %.0lf" \

#Graphs par an
rrdtool graph $DIR/h_cuve_1y.png --start -1y  --title="Hauteur d'eau sur 1 an" --vertical-label="cm" \
DEF:haut=$DIR/capa_cuve.rrd:haut:AVERAGE \
LINE1:haut$COUL_ECHELLE:"Hauteur d'eau en $ECHELLE\n" \
GPRINT:haut:AVERAGE:"Moy\: %.0lf" \
GPRINT:haut:MIN:"Mini\: %.0lf" \
GPRINT:haut:MAX:"Maxi\: %.0lf" \

rrdtool graph $DIR/v_cuve_1y.png --start -1y  --title="Volume sur 1 an" --vertical-label="Litres" \
DEF:capa=$DIR/capa_cuve.rrd:capa:AVERAGE \
LINE1:capa$COUL_VOLUME:"Volume de la cuve en $VOLUME\n" \
GPRINT:capa:AVERAGE:"Moy\: %.0lf" \
GPRINT:capa:MIN:"Mini\: %.0lf" \
GPRINT:capa:MAX:"Maxi\: %.0lf" \

#Transfert des données sur le serveur Web
chown www-data:www-data $source
sudo mv $source $destination
creation_graphs.sh

La page Web:

Basée sur le travail d’Idleman, la page de gestion est issue d’ici. Elle est tributaire de l’installation préalable d’un serveur apache ou autre. Si vous suivez les tutos d’Idleman depuis le début, cela ne devrait pas poser de problème. Bien entendu, vous pouvez installer votre serveur web préféré.

Une action sur le lien de page met en route la pompe de relevage ou la prise électrique qui sont commandées par l’intermédiaire de la carte aux deux relais. La page de configuration, vous permet de choisir les GPIO qui commanderont le ou les relais.

L’insertion des différents graphiques se fait par l’intermédiaire de balises <img> qui pointent sur le répertoire contenant les graphiques.

Et maintenant:

J’ai certainement oublié des choses ou je suis passé un peu vite sur certaines explications. Cette page et ces sous rubriques me permettent de garder en mémoire les scripts utilisés et les schémas. Vous l’avez certainement compris, ils ne sont pas tellement finalisés et doivent faire frissonner les puristes j’en suis conscient.

Bilan et évolutions:

Depuis un an, ce raspberry se trouve dans la cuve. Malgré l’environnement, il fonctionne très bien parfois mieux que celui que je maltraite sur mon bureau. 🙂

J’ai eu chaud à l’automne dernier car lors d’un violent orage, le trop plein de la cuve n’arrivait pas à tout absorber. C’est un peu normal car la totalité des eaux provenant de la toiture se déversent dedans. Je voyais le niveau d’eau monter et malgré la mise en route de la pompe immergée, l’eau à fini par noyer le capteur.
Après quelques jours de séchage, il a repris du service comme à la manœuvre.

Dans les évolutions futures, je pense remplacer le raspberry de la cuve par un arduino. Le fonctionnement serait sensiblement identique. Les deux appareils seraient raccordés par une liaison I2C car la liasion série est déjà utilisée sur un autre serveur qui collecte les données provenant du compteur EDF. Ceci me permettrait de récupérer un raspberry à brève échéance.

i2c_Bus

Le développement de mon nouveau projet est finalisé. Dés que j’aurai un peu de temps, je m’occuperai de sa rédaction et j’aurais le plaisir de vous retrouver ici.

 

Les sources:

Un grand merci à :

http://arduino103.blogspot.fr/
http://forum.pcinpact.com/topic/165594-raspberry-pi-fabriquons-des-trucs/
http://blog.idleman.fr/
http://www.manuel-esteban.com/
http://smhteam.info/blog/2011/11/15/faire-un-capteur-de-niveau-pour-une-cuve-deau/

Pleins d’autres sources ici

Avec une mention particulière au magasin en ligne http://shop.mchobby.be/fr/ qui grâce à ses traductions et à l’investissement personnel de son auteur nous font grandement progresser.

Welcome sur EyesAtHome.free.fr

Ce blog reprend en partie tout mes tests et essais avec le Raspberry pi, Android et Cie.

J’ai toujours un tas de feuilles de brouillon qui traînent et je ne prends jamais le temps de tout mettre au propre. Il était temps de rédiger quelques notes car au fur et à mesure que j’avance, il faut se rendre à l’évidence, c’est le bazar sur mon bureau.

En plus cela permet de partager avec tous les passionnés son expérience et rendre hommage à ceux qui nous évitent des heures de galère.

Bonne lecture

Vulcain