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 …

  • Laurent

    Bonjour,

    Très intéressant ton poste. Je suis intéressé par ce système pour compter la consommation d’eau. Mais si je met le compteur dans la maison je n’aurai pas la consommation global (J’ai un jardin). Je suis donc obligé de le mettre dehors juste après le compteur. Qu’elle tu as utilisé et connais tu les températures de fonctionnement ?

  • Bonjour,
    Les températures vont de +0 à +125°C ce qui semble suffisant comme plage d’utilisation pour un jardin ;o)

  • Thibaud

    Bonjour, jusqu’à quelle distance pourrait on tirer la sonde de manière à garder le raspberry à l’intérieur?

    • Bonsoir Thibaud,

      Le câble fait deux mètres de long.
      Mais vous pourrez trouvez toutes les infos sur le produit à cette adresse, avec une promo qui se termine le 28 février :o)

      http://www.domotiks.fr/shop/fr/34_gioanola

    • Assez loin je pense, plus la section du clable sera grosse, plus la résistance sera faible … De quelle distance aurais tu besoins ?

  • Sfl

    Est il possible a ton avis de remplacer le compteur d’eau par un debitmetre du style http://shop.mchobby.be/senseur-divers/98-debimetre-plastique-1-2.html

    Cela me semble equivalent non ? une sortie a impulsion

    • Je suppose oui, n’importe quel compteur a impulsion va faire l’affaire 🙂

  • Chris

    Top tuto, merci beaucoup… Mais pourquoi utiliser une carte PiFace ? Le Raspberry n’est-il pas capable de faire ce suivi sans carte d’extension ? Quels seraient alors les changemenst dans les lignes de codes ? Merci d’avance pour toute aide car je débute et je patauge bcp ^^

    • C’est peut-etre faisable dans PiFace, mais pour ce qui est de l’électronique, je préfères toujours mettre une séparation entre la commande et la logique. d’autant que l’avantage ici, c’est que la résistance de pull-up est intégré au circuit, sinon il faut rajouter cette partie en plus.

      • remy

        Tu aurais pu le brancher direct sur le GPIO. Le GPIO3 à une resistance pull-up intégré.

  • Chris

    personne ?

  • Chris

    merci, pas de soucis j’ai compris la nécessité d’utiliser la carte Piface. Par contre je ne dispose pas d’Eedomus.
    Y aurait-il un autre moyen de consulter les données récoltées par Internet ? Merci encore pour ce tuto… cdl

  • farfadet

    Bonjour,

    Je suis très intéressé par l utilisation de votre solution de compteur d eau avec la carte piface et le compteur a impulsion. J ai mis en oeuvre la solution avec un interrupteur en lieu et place du compteur pour faire mes premiers test et valider avant le déplacement de l ensemble dans le sous sol mais mes premiers test ne sont pas très concluant car j ai l impression qu il a du mal prendre les impulsions. Votre solution est-elle en production chez vous et avez vous des écarts entre elle compteur réel et les impulsions.

    Merci
    Francis

    • Bonjour Francis,

      C’est en production chez moi depuis plusieurs mois, et cela marche plutôt bien. J’ai très peu d’écarts entre le compteur physique et le comptage PiFace.

      Cdt,

      Sébastien

      • farfadet

        Bonjour,

        Merci pour la réponse, je pense que cela vient de l’impulsion générer par le BP comparé à celui du compteur qui ne doit pas être aussi propre. Je vais commander un compteur en espérant que cela fonctionne aussi bien que chez toi 🙂

        En terme de décalage tu as quel pourcentage environ ?

        Cdt,
        Francis

  • fabric24

    Bonjour
    voici un lien que je viens de trouver qui pourrait permettre de ne pas rajouter un compteur (pour la consommation générale)
    c’est avec un capteur effet hall à mettre contre le compteur

    http://www.instructables.com/id/Monitoring-residential-water-usage-by-reading-muni/?ALLSTEPS
    http://www.instructables.com/id/Save-The-World-One-Drop-At-A-Time-Part-2-Monitorin/

  • meufeu

    bonjour,

    la carte piface est elle indispensable dans ce cas précis ?

  • fle

    Bonjour,

    Merci pour ce tuto très précis.

    Quelles adaptations du code dois je réaliser si je n’utilise pas de PiFace ?

    Merci d’avance.

    cdt,

    Franck

  • Guillaume Cousin

    Bonjour,

    Ce tuto commence à dater mais est toujours d’actualité… Je viens d’investir dans une PiFace Digital 2 pour mettre en place cette solution car pour le moment j’utilise la partie contact sec des modules Fibaro FGK-101 mais ce n’est pas suffisamment fiable, de la conso se perd lorsque le débit est trop élevé.
    J’aurai au total 3 compteurs d’eau, un sur l’alimentation générale (impulsion tous les 0,25L), un sur l’eau chaude (impulsion tous les 1L) et un sur l’arrosage du jardin (impulsion tous les 1L) , arrosage jardin et alimentation générale auront aussi une ZOOZ Z-WAVE PLUS VALVE CONTROL ZAC03 donc fini les dégâts des eaux et la corvée d’arrosage (et d’oubli de fermeture des vannes…).

    Bref, je ne suis pas un pro en programmation (encore moins en Python) donc j’aimerais comprendre un peu le code afin de pouvoir le modifier et l’utiliser. Dans le principe pas de problème, mais ça manque en peu de détail dans les commentaires :

    – chaque impulsion se retrouve bien en BDD ? je veux dire tu écris toutes les 5 minutes en BDD mais je ne vois pas où se trouve ce critère dans le code et je préférerais écrire toutes les minutes pour ma part.
    – tu utilises un timestamp dans ta BDD mais c’est limité à la seconde, j’opterai donc plutôt pour un datetime(2) (est-ce compatible avec ton code ?) ceci car j’aurai 4 fois plus d’impulsion sur mon compteur de l’alimentation générale et aussi à quel endroit(s) je dois spécifier ce critère de 0,25L ?
    – Comme j’ai 3 compteurs, je préférerais ne lancer qu’un seul script (plus propre je pense), comment le modifier pour prendre en compte les 3 contacts sec ?

    Merci d’avance de ton aide et encore merci pour ce partage initial !!!