Domotiser son compteur d’eau

Domotiser son compteur d’eau

Bonjour à tous !

Choses promise chose due, un petit article pour partager avec vous la mise en place d’une compteur d’eau a impulsion et la récupération des valeurs dans notre box domotique (en l’occurrence l’eedomus).

geek

Attention, une fois n’est pas coutume, la mise en œuvre chez vous d’un système similaire nécessite une bonne connaissance technique en particulier autours du monde Linux (Raspberry Pi en l’occurrence).

Pour les moins technophiles d’entre nous, Il existe des moyens plus simple pour remonter sa consumation d’eau. vous retrouverez un très bon tutoriel sur le blog de planète domotique. Mais cette solution ne permet pas de mettre en place des règles car l’Eedomus n’intègre pas (encore ?) une fonction compteur qui permettrait d’obtenir le nombre d’impulsion depuis le début de la journée.

1. Préparation du matériel

Avant de commencer, liston le matériel dont nous allons avoir besoin :

♦ D’un Raspberry PI & D’une carte fille PiFace:

L’on ne présente plus le Raspberry, c’est une petite boite avec un linux embarqué :

Raspberry Pi

La carte PiFace permet d’ajouter des connecteurs Entrés / Sortie au Raspberry :

PiFace

A noter que j’aurai tout aussi bien pu choisir un Arduino, mais l’avantage du Raspberry PI est qu’il possède nativement un port Ethernet et qu’il est très facile de lui rajouter un dongle wifi pour assurer la communication avec le réseau.

Le montage est assez simple, il suffit d’emboiter  la carte PiFace avec le raspberry.

Un petit boitier pour englober le tout sera du plus belle effet. J’ai choisi ce modèle qui est prévu pour la carte PiFace.

Boitier PiFace

Un peu de colle forte sera nécessaire si vous voulez utiliser les petits morceaux de plastique transparent qui servent à visualiser l’état des diodes au travers du boitier.

♦ D’un Compteur d’eau a impulsion :

Dans mon cas j’ai utilisé le capteur suivant :

Compteur d'eau

Pas besoin d’un compteur eau chaude, puisque je l’ai branché en amont au niveau de l’arriver d’eau de mon ballon d’eau chaude.

Il existe aussi un compteur compatible Zwave, je ne l’ai pas testé personnellement. La solution vous reviendra un peu plus cher mais cela surement beaucoup plus simple a utiliser, a vous de choisir 🙂 L’avantage de la carte PiFace est de pouvoir être utilisée pour d’autres réalisation à venir.

2. Préparation du logiciel

Préparation du Raspberry Pi :

Il existe déjà beaucoup de tutoriels très bien fait pour préparer la carte SD du Raspberry PI, je vous laisse regarder l’article de Cédric (ici) ou sur le wiki elinux (ici).
Lors de la configuration initiale, vous devez activer quelques option pour activer le PiFace (source) :

Dans la partie raspi-config (sudo raspi-config) Allez dans  « Advanced Options » puis »SPI » et sélectionnez « yes »

Enfin installer la librairie python du PiFace :

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install python{,3}-pifacedigitalio
$ sudo apt-get install python-mysqldb

Dans le répertoire vous trouverez quelques exemples de code pour vérifier que tout fonctionne (source) :

python3 /usr/share/doc/python3-pifacedigitalio/examples/blink.py

En lançant cette fonction, la diode devrait se mettre a clignoter.

Nous aurons besoin d’une base MySQL, et de quoi héberger un simple code PHP :

J’ai choisi d’utiliser un autre Raspberry (oui oui j’en ai déjà 4 chez moi ^^) pour héberger la base MySQL et la page PHP qui ira lire cette base. Vous pouvez très bien tout mettre sur le même Raspberry PI, ou bien utiliser un Nas Synology. A vous de voir !

Créez dès à présent votre base MySQL :

Elle se compose de 2 tables et d’une vue. La première table permet de stocker la liste des devices, la seconde la liste des enregistrements.
Une vue en MySQL est en quelque sorte une manière de présenter différemment les informations d’autres tables. Ici elle permet de faire la somme de tous les enregistrements d’une journée (autrement dit la consommation de la journée).

--
-- Base de données: `timelogger`
--
-- --------------------------------------------------------
--
-- Structure de la table `Devices`
--
CREATE TABLE IF NOT EXISTS `Devices` (
  `dID` int(5) NOT NULL AUTO_INCREMENT,
  `Name` varchar(50) NOT NULL,
  PRIMARY KEY (`dID`),
  UNIQUE KEY `dID` (`dID`)
);
-- --------------------------------------------------------
--
-- Structure de la table `logger`
--
CREATE TABLE IF NOT EXISTS `logger` (
  `measure_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `dID` tinyint(4) NOT NULL,
  `value` decimal(10,0) NOT NULL,
  `unit` enum('L','W','°C','W/h','%') NOT NULL
);
-- --------------------------------------------------------
--
-- Structure de la vue `SumByDay`
--
CREATE VIEW `SumByDay` AS (select date_format(`logger`.`measure_time`,'%Y%m%d') AS `measure_time`,
                                  `logger`.`dID` AS `dID`,
                                   sum(`logger`.`value`) AS `SUM` from `logger`
                                   Group by date_format(`logger`.`measure_time`,'%Y%m%d'),`logger`.`dID`);
-- --------------------------------------------------------

Je vous propose une structure que j’ai voulu générique pour pouvoir ajouter d’autres types de capteurs demain, vous pouvez bien sur l’adapter a loisir.

3. Installation matérielle

Première chose installer le compteur à impulsion, Ici cela dépendra de la configuration de votre circuit d’eau. Le compteur est livré avec des adaptateurs … dans mon cas, j’ai eu besoin de compléter avec des adaptateurs trouvable dans tous les magasins de bricolage. Les tailles sont standardisées, vous n’aurez pas de surprise (Astuce: prenez avec vous les adaptateurs pour allez en magasin, sinon vous risquer de devoir y retourner plusieurs fois : le nombre de références dans ces rayons est souvent énorme et la probabilité de se tromper si l’on fait ca « a l’oeil » est quasi certaine, croyez mon expérience :p)

Compteur d'eau 1

Une fois que c’est chose faite, il faut clipser la sonde a son emplacement  et nous sommes prêt.

Compteur d'eau 2

Bon, c’est bien beau tout cela, maintenant il reste donc a raccorder notre compteur avec le Piface :

PiFace 1

L’un des fils doit être connecter a l’entrer 0V (ici en noir) : et l’autre a l’entré que vous voulez (ici la numéro 7) :

PiFace 2

4. Configuration Logicielle

Pour alimenter la base MySQL, j’ai donc écris un petit script en python qui compte chaque impulsion et qui met à jour la base SQL toutes les 5 minutes.

C’est mon premier script en python, alors c’est surement assez sale comme code, s’il y’a des pros du python … n’hésitez pas, mon code est sur GitHub.
Vous devrez adapter les informations de connexion à la base SQL.

#!/usr/bin/env python

import pifacedigitalio
import MySQLdb
from threading import Timer

water = 0

def createwaterrecord(value):
    global water

    try :
       db = MySQLdb.connect(host="rsp03",
                         user="timelogger",
			 passwd="timelogger",
                         db = "timelogger" )

       sql = """INSERT INTO logger (dID,
             value, unit)
             VALUES ('1', %(value)d, 'L') ON DUPLICATE KEY UPDATE value=value+%(value)d;""" % {"value": value}
       cursor = db.cursor()
       cursor.execute(sql)
       db.commit()
       db.close()
    except:
      water += value
      #db.rollback()

def waterAdd(event):
    global water
    water += 1

def PrintWater():
    global water
    oldwater = water
    water = 0
    print ("watercounter =  {0}.".format(oldwater))
    createwaterrecord(oldwater)
    t = Timer(60.0, PrintWater)
    t.start()

if __name__ == "__main__":
    #pifacedigitalio.init()
    #pifacedigitalio.digital_write_pullup(7,1)

    pifacedigital = pifacedigitalio.PiFaceDigital()
    listener = pifacedigitalio.InputEventListener(chip=pifacedigital)
    listener.register(7, pifacedigitalio.IODIR_ON, waterAdd)
    listener.register(0, pifacedigitalio.IODIR_ON, waterAdd)
    listener.activate()
    print "Start counting"
    t = Timer(2.0, PrintWater)
    t.start()

Voila, maintenant il faut faire en sorte que le programme se lance au démarrage du Raspberry, et vérifier que tout marche.
Pour cela il faut créer un .sh qui va piloter les actions que nous pouvons faire. Vous pouvez récupérer le mien directement sur GitHub, il n’y aura que le chemin vers votre script a changer.
déposer le dans le répertoire « /etc/init.d » et donner lui les droits d’exécution :

sudo cd /etc/init.d
sudo wget https://raw.github.com/AntorFr/watercounter/master/watercounter.sh
sudo chmod +x /etc/init.d/watercounter.sh
sudo update-rc.d watercounter.sh defaults

Vous pouvez utiliser les commandes suivantes pour démarrer ou arrêter le module.

sudo /etc/init.d/watercounter.sh start
sudo /etc/init.d/watercounter.sh stop

A ce point nous avons donc un module qui alimente une base MySQL avec les valeurs de notre compteur.

Le petit script PHP ci-dessous permet de produire un fichier XML que votre Eedomus ira lire pour afficher la valeur :
Vous devez adapter les informations de connexion a la base MySQL.

<?php
$db = mysql_connect('rsp03', 'timelogger', '');
mysql_select_db('timelogger',$db) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
$sql = 'SELECT dID, SUM FROM SumByDay WHERE measure_time = '.date("Ymd").' AND dID = 1';
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());

header ("Content-Type:text/xml");
print '<!--?xml version="1.0"?-->'.PHP_EOL;
print "<water_consos>".PHP_EOL;
print " ".PHP_EOL;
while ($data = mysql_fetch_assoc($req)) {
	print "	<conso_id".$data['did'].">".PHP_EOL;
	print "		"."Compteur eau chaude"."".PHP_EOL;
        print "		".$data['SUM']."".PHP_EOL;
	print "	".PHP_EOL;
}
print " ".PHP_EOL;
print "".PHP_EOL;

?>

5. Configuration de l’Eedomus

Dans l’eedomus il ne reste plus qu’a créer une sonde qui aille chercher a fréquence régulière notre page PHP pour récupérer la valeur.

Eedomus - Capteur HTTP

Configurer l’url et le chemin XPATH « /water_consos/consos/conso_id1/value »Eedomus - Compteur d'eau

Et voila 🙂 nous avons un beau device qui donne la consommation. L’on peut bien sur rajouter des règles pour détecter si la consommation augmente alors que vous n’êtes pas la.

Eedomus - Compteur d'eau 2

Dans mon cas, je l’utilise pour désactiver le mode heure creuse si la consommation est supérieur à 50% de la capacité du chauffe-eau histoire de ne pas se retrouver avec de l’eau froide le jour ou vous avez des invités par exemple.

Pour allez plus loin

Maintenant que nous connaissons la consommation en eau chaude, il faut trouver un moyen de rendre le tout ludique pour réduire la facture (d’eau et d’électricité). Je planche actuellement sur un petit module a base d’un arduino pour afficher la consommation dans la salle de bain avec des afficheurs 7 segments (Vishay en l’occurence) Peut-etre bien l’objet d’un prochaine article 🙂 nous verrons …