Une solution domotique pour suivre sa consommation d’eau avec un compteur de la SWDE.

Classé dans : Capteur, Jeedom | 17

En Belgique, avec le fournisseur SWDE, c’est le compteur DHV2000 (de la société DH Metering) qui a été installé chez moi. C’est dommage, vraiment, que la SWDE installe ce genre de compteurs. Elle aurait pu proposer, plutôt, un compteur sur lequel on peut venir facilement brancher un capteur à effet hall. Mais elle ne l’a pas fait et, en outre, elle n’offre pas non plus la possibilité qu’on change de compteur pour en avoir un disposant de cette possibilité (même moyennant paiement). Il faut donc faire avec et chercher à contourner le problème.

La première idée que j’avais eue, pour mesurer ma consommation d’eau, était un détournement du capteur infrarouge TRCT5000. La tentative essayait de compter le nombre de tour que faisait le demi-disque métallique (un tour correspondant à une consommation d’un litre) à l’aide d’impulsions infrarouges. L’essai n’avait pas été concluant, comme je l’expliquais dans l’article.

La seconde idée a alors été d’utiliser un capteur inductif LJ18A3 afin, toujours, d’essayer de compter le nombre de tour du demi-disque métallique. Avec ce type de capteur, on recevoit une impulsion lorsqu’une cible conductrice ou magnétiquement perméable (disque d’acier, par exemple) s’approche de la bobine du capteur.

Je suis donc parti sur l’achat d’un capteur inductif LJ18A3. Ce genre de capteur, il y en a plusieurs. Je conseille de partir vers un LJ18A3-8 car cela permet de détecter une cible conductrice jusqu’à 8mm. C’est plus prudent que les modèles LJ18A3-4 qui ne détecte qu’à 4mm de profondeur, ce qui est un peu juste pour détecter le demi-disque métallique placé à quelque millimètre derrière le plexiglas protecteur du compteur. Ensuite, il faut choisir un capteur qui correspond à la tension de travail souhaitée. Comptant utiliser ce capteur avec un NodeMCU (ESP8266) pouvant délivrer 5V ou 3,3V aux capteurs, j’ai naturellement choisi un capteur fonctionnant en 5V (3,3V aurait été encore mieux mais je n’en ai pas trouvé). Cette fois, cela a fonctionné. Voici donc, pour une trentaine d’euro, une belle solution qui permet de suivre sa consommation d’eau dans Jeedom.

A noter que, deux ans plus tard, je suis parti sur une troisième solution. Le principe de ce troisième capteur est simple et repose sur le module ESP32-CAM c’est-à-dire un micro-contrôleur intégrant une caméra vidéo et une carte microSD. L’ESP32-CAM photographie régulièrement le compteur d’eau et effectue une reconnaissance de caractères pour déterminer les index de consommation: https://www.objetsconnectes.be/2023/03/31/seconde-solution-pour-suivre-sa-consommation-deau-swde-ou-autre/

L’installation du firmware ESP Easy

J’avais déjà expliqué, dans unarticle précédent, comment installer le firmware ESP Easy sur le NodeMCU et comment configurer ce NodeMCU. Je vous renvoie donc vers cet article pour les premières étapes et je suppose, maintenant, qu’une version Mega a été installée et est opérationnelle.

Etape 5: Branchement du capteur LJ18A3 et du NodeMCU

Pour suivre, il convient de connecter physiquement le capteur LJ18A3, ce que je fais comme toujours avec des câbles Elegoo.

Il faut relier le NodeMCU avec les PINs du capteur inductif LJ18A3. Le schéma de branchement, très simple, est lisible sur le capteur lui-même.

capteur-inductif-LJ18A3-cablage

Il y a donc trois câbles à connecter:

  • le câble brun doit recevoir 5V et est donc relié à la PIN VIN du NodeMCU
  • le câble bleu est la masse et est donc relié à la PIN GND du NodeMCU
  • le câble noir est celui qui fournit les impulsions. On branche ce câble sur une des PINs GPIO du NodeMCU. J’ai choisi D5 (GPIO14).

Le câblage donne donc ceci :

NodeMCU 5V -> LJ18A3 Brun

NodeMCU Gnd -> LJ18A3 Bleu

NodeMCU D5 -> LJ18A3 Noir

Attention toutefois : il est déconseillé de brancher 5V sur les PIN du NodeMCU, ce dernier travaillant avec 3,3V. Il faut passer par une résistance ou bien un réducteur de tension. Ayant lu certains dirent que le NodeMCU supporterait quand même le 5V, précisant bien “à vos risques et périls”, j’ai tenté ma chance. Il faut dire aussi que le risque est limité vu le faible coût des composants. Après quelques semaines, cela tient toujours !

Etape 6: Configuration du LJ18A3 dans le NodeMCU

1. Dans le navigateur internet à l’URL du NodeMCU, cliquer sur “Devices” et appuyer sur “Add”

2. Dans la série de capteurs, choisir le capteur “Generic – Pulse counter” et cliquer sur le bouton “Submit”.

3. Sur l’écran de configuration, les paramètres sont les suivants :

  • Choisir un nom
  • Cocher “Enabled”
  • GPIO -> Pulse : choisir la pin “GPIO-14 (D5)”
  • Debounce Time (mSec): il s’agit de la période de temps pendant laquelle le capteur ne doit pas envoyer d’impulsions après avoir détecté le demi-disque métallique. Une valeur souvent utilisée est 100 msec. Le demi-disque métallique du compteur tournant peu rapidement, j’ai choisi la valeur de 200 msec par sécurité
  • Counter Type : Choisir Delta/Total/Time afin d’avoir les impulsions détectées, le temps écoulé depuis l’impulsion précédente et le nombre total d’impulsion. Un message d’avertissement indique que le “Total Count” n’est pas persistant. Cela signifie qu’en cas de coupure de courant, le compteur se remet à zéro. Il faut donc stocker le total des impulsions autre part (dans Jeedom par exemple). 
  • Mode Type: FALLING. Pour ce paramètre, les modes de détection possibles sont expliqués dans la documentation de ESP Easy:

LOW = count when signal go from not low to low (0.8+V to 0.8-V)

CHANGE = count on signal being changed, low to high (0.8-V to 2.4+V) or high to low (2.4+V to 0.8-V)

RISING = count if signal is rising, from low to not low (0.8-V to 0.8+V)

FALLING = count if signal is falling, from high to not high (2.4+V to 2.4-V)

  • En bas à droite, je vous conseille de mettre 0 pour “Decimals” puisque des fractions d’impulsions n’ont aucun sens. 
  • Cliquer sur le bouton “Submit” en bas de l’écran pour sauver le tout.

LJ18A3 - Configuration Device 1 dans NodeMCU

LJ18A3 - Configuration Device 2 dans NodeMCU

Etape 7: On termine

Maintenant la configuration est terminée, on peut lire le nombre de litres (de pulsations) détectées par le capteur © dans l’interface web. Ici, en vert à droite, on lit la valeur 34 (litres).

LJ18A3 - ESPEasy - Nombre pulsations

Un étalonnage rapide a montré que les pulsations détectées étaient bien alignées sur la variation de l’index du compteur DHV2000 de la SWDE.

L’installation physique du capteur

Pour l’installation physique, c’est un peu la bricole. Chacun fait comme il peut. Personnellement, j’ai retrouvé une petite pince (qui sert à fixer au plafond les tuyaux alpex pour le chauffage) et je l’ai boulonnée sur une tige métallique. Cette tige métallique est fixée au compteur par un simple colson bien serré. Le capteur LJ18A3 est livré avec deux grands écrous. En serrant un peu, les deux écrous viennent serrer la pince/fixation d’alpex.

capteur-inductif-LJ18A3- fixation

Pour le positionnement, j’ai placé le capteur LJ18A3 de telle façon qu’il ne couvre pas totalement l’emplacement où tourne le demi-disque métallique. Il faut en effet qu’il puisse détecter à la fois la présence du disque et à la fois l’absence du disque.

capteur-inductif-LJ18A3- positionnement

La remontée des mesures dans Jeedom

C’est le plugin Jeedom ESPeasy, gratuit, qui va gérer la remontée des mesures des capteurs dans Jeedom. J’avais déjà expliqué comment installer ce plugin dans cet article et je vous renvoie donc à celui-ci pour les premières étapes.

Après avoir installé le plugin, on se connecte via un navigateur internet au module NodeMCU pour le configurer. On clique cette fois sur “Controllers” et puis sur “Add”.

EspEasy Controleurs 1

Les valeurs à introduire sont :

  • Generic HTTP
  • Controlleur IP : l’adresse IP de Jeedom (qui est aussi celle que l’on peut lire dans “IP Controleur à saisir dans ESPeasy (onglet config)” sur la page de configuration du plugin Jeedom ESPEasy)
  • Controlleur Port : 8121 (qui est aussi le numéro que l’on peut lire dans “Port Controleur à saisir dans ESPeasy (onglet config)” sur la page de configuration du plugin Jeedom ESPEasy)
  • Controlleur Publish (plus bas dans l’écran): device=%sysname%&taskid=%id%&cmd=%valname%&value=%value% (qui est aussi ce qu’on voit sur la page du plugin)
  • Cocher la case “Enabled”

EspEasy Controleurs Config 21

EspEasy Controleurs Config 3

Pour terminer, il ne faut pas oublier de cliquer à nouveau sur “Devices”, de cocher la case “Send to Controlleur”, de choisir un intervalle de temps entre deux envois de données (ici 5 secondes) et de cliquer sur le bouton “Submit” pour sauver les changements. Si vous avez plusieurs NodeMCU / capteurs, il faut indiquer un IDX différent pour chacun.

LJ18A3 - Data Acquisition

Vous pouvez maintenant retourner dans Jeedom : Plugins / Protocole Domotique / ESPeasy

Jeedom Inclusion dans le plugin ESP Easy

Cliquer sur le bouton “+ Inclusion”. Un équipement, correspondant au capteur, devrait apparaitre. Par défaut c’est souvent le nom “Esp Easy”, nom que j’ai changé en Compteur_EAU.

LJ18A3 - ESPEasy - Equipements

Il faut configurer cet équipement en cliquant dessus, en lui donnant un nom, en cochant “Activer” et “Visible”. De façon optionnelle, on peut lui attribuer une pièce (via Objet parent). On peut aussi choisir “Compteur” comme “Catégorie de l’espeasy”.

LJ18A3- Configuration dans Jeedom

Au niveau des commandes, on retrouve les trois commandes que l’on avait déjà dans le NodeMCU: Count, Time et le Total que j’ai renommé “Consommation_Eau”. Pour avoir un historique dans Jeedom et de beaux graphiques, il est conseillé de cliquer sur “Historiser” pour la commande Total (renommée en “Consommation_Eau”)

LJ18A3 - Commandes dans Jeedom

Si on se rend dans le Dashboard de Jeedom, on voit l’équipement Compteur_EAU et les informations de consommation, à savoir 36 litres d’eau consommée depuis le dernier reset du capteur inductif LJ18A3.

LJ18A3 - Dashboard consommation eau dans Jeedom

Si on clique sur le 36 litres, on a alors accès au graphique de consommation d’eau :

LJ18A3 - Graphique

C’est standard dans Jeedom et, sur ce graphique, on peut changer beaucoup de paramètres. Par exemple, on peut cocher “Variation” et “Escalier” et on a alors une vue de la consommation, en litre, par période (et non plus la somme cumulée des consommations comme avant).

LJ18A3 - Graphique variation et escalier

Calculer la consommation jour par jour

Ce qui est sympa, c’est d’avoir la consommation jour par jour. Pour ce faire, j’utilise le plugin “Virtuel”. Ce plugin permet de créer des équipements virtuels.

Plugin - Virtuel

On commence donc par créer un équipement (virtuel) dans le plugin. Afin d’avoir des données à jour, on choisit une “Auto-actualisation (cron)” d’une minute (ce qu’on définit en cliquant sur le petit point d’interrogation à droite)

Plugin Virtuel - Cron

Dans l’onglet “Commandes”, on crée trois infos virtuelles :

  • Consommation Jour qui contient une formule pour calculer la consommation depuis minuit, soit la consommation du jour. Cette formule est :  MaxBetween(#[Cave Garage][Compteur_EAU][Conmmation_Eau]#,today 00:00:01, now) – MinBetween(#[Cave Garage][Compteur_EAU][Conmmation_Eau]#,today 00:00:01, now)
  • Consommation Hier qui affiche la consommation de la veille. La formule est: Variable(Compteur_Eau_litres). Cette consommation de la veille est calculée une fois par jour par un scénario qui tourne à minuit et une minute (voir ci-dessous). Le résultat du calcul est stocké dans la variable (à créer au préalable) Comteur_Eau_litres
  • Total impulsions qui reprend simplement les données brutes des impulsions mesurées par le capteur (c’est-à-dire un compteur qui a été remis à zéro lorsqu’on a coupé le courant la dernière fois et qui s’est incrémenté de une unité à chaque litre consommé)

Plugin Virtuel - Commandes

Pour le calcul de la consommation de la veille, un scenario tourne à minuit et une minute. Il enregistre simplement le résultat de ce calcul dans une variable Jeedom appelée “Compteur_Eau_litres”: MaxBetween(#[Cave Garage][Compteur_EAU][Conmmation_Eau]#,yesterday 00:00:01, now) – MinBetween(#[Cave Garage][Compteur_EAU][Conmmation_Eau]#,yesterday 00:00:01, now). 

Plugin Virtuel - Scenario

Le résultat, dans le Dashboard, donne ceci :

Virtuel de consommation d'eau

La gestion de la coupure de courant

Ce qui est un peu ennuyant, avec ce capteur, c’est que le nombre total d’impulsions tombe à zéro en cas de coupure de courant. Il n’y a en effet pas de persistance au niveau du capteur. Et donc, le jour où le courant est coupé (volontairement ou pas), les calculs Jeedom ci-dessus ne seront plus bons puisque la fonction MinBetween renverra zéro. Sur une journée, ce n’est pas grave. Mais cela perturbe le calcul de la consommation mensuelle ou annuelle.

Afin de corriger ce problème, je me suis plongé dans le code via une fonction personnalisée afin de récupérer toutes les mesures et afin de calculer toutes les variations positives du nombre d’impulsion. Voici donc une solution “maison”, n’ayant pas trouvé de solution sur internet.

1. Télécharger le plugin JeeXplorer. Ce dernier permet de naviguer dans les fichiers Jeedom et il va permettre d’écrire la nouvelle fonction de calcul

Jeedom-Plugin-JeeXplorer

2. Dans JeeXplorer, naviguer dans html / data / php et éditer le fichier user.function.class.php. Ce fichier a été spécialement créé afin d’accueillir les fonctions que chacun aurait envie de développer.

Jeedom-Compteur-Eau-user-function-class-php

3. Juste en-dessous de la ligne “class userFunction {“, coller cette fonction 

   public static function CalculateWaterConsumption($_cmd_id, $_startTime, $_endTime) {
$cmd = cmd::byId(trim(str_replace(‘#’, ”, $_cmd_id)));
if (!is_object($cmd) || $cmd->getIsHistorized() == 0) {
return ‘Not an object or not historized’;
}
$_cmd_id = trim(str_replace(‘#’, ”, $_cmd_id));
        $_startTime = date(‘Y-m-d H:i:s’, strtotime(scenarioExpression::setTags($_startTime)));
$_endTime = date(‘Y-m-d H:i:s’, strtotime(scenarioExpression::setTags($_endTime)));
 
        $values = array(
          ‘cmd_id’ => $_cmd_id,
          ‘startTime’ => $_startTime,
          ‘endTime’ => $_endTime,
        );
        $sql = ‘SELECT value, datetime
                  FROM (
                      SELECT *
                      FROM history
                      WHERE cmd_id=:cmd_id
                      AND `datetime`>=:startTime
                      AND `datetime`<=:endTime
                      UNION ALL
                      SELECT *
                      FROM historyArch
                      WHERE cmd_id=:cmd_id
                      AND `datetime`>=:startTime
                      AND `datetime`<=:endTime
                      ) as dt
                      ORDER BY `datetime` ASC’;
        $result = DB::Prepare($sql, $values, DB::FETCH_TYPE_ALL);
        if (!is_array($result)) {
          $result = array();
        }
      
        $i = 0;
      $conso = 0;
        foreach ($result as $key => &$value) {
          if ($i == 0) {
          $valuebefore = $value[‘value’];
          }
          if ($value[‘value’] >= $valuebefore) {
          $conso += $value[‘value’] – $valuebefore;
       $valuebefore = $value[‘value’];
 
          } 
          else {
            // parfois, pour une raison illogique, des données erronnées arrivent en retard. Donc, si la chute en consommation est mininime,
            // je considère que c’est une donnée erronée et je n’en tiens pas compte. Si la chute est de plus de 10l, je suppose que c’est
            // une coupure de courant et j’en tiens compte
            if ($valuebefore – $value[‘value’] > 10) {
              $conso += $value[‘value’];
              $valuebefore = $value[‘value’];
            } 
 
          }
          $i++;
        }        
        return $conso;
}
 

Cette fonction se comprend facilement. Il y a juste une petite astuce pour ne pas tenir compte des fausses mesures. Parfois, des mesures plus petites que les précédentes se présentent dans la série et ce n’est pas du à une coupure de courant, comme on le voit ici (5109 apparaissant entre deux 5110). Il ne faut pas tenir compte des ces mesures erronées (qui sont étonnamment fréquentes). J’ai donc estimé que, en dessous d’une baisse de 10l, ce n’est pas du à une coupure de courant mais à une fausse mesure. Libre à chacun d’adapter cette constante.

Jeedom-Compteur-Eau-incoherence-données

4. Reprendre la logique du paragraphe précédent : dans un scénario qui tourne une fois par jour (un peu après minuit), calculer la consommation de la veille en appelant la fonction CalculateWaterConsumption(#[Cave Garage][Compteur_EAU][Conmmation_Eau]#, Today – 1days, Today – 0days) et en sauvant cette valeur dans une variable Jeedom (variable à créer dans Outil / Variables dans Jeedom)

Jeedom-Compteur-Eau-Scenario

5. Au niveau du virtuel, créer une info virtuelle et afficher le contenu de cette variable.

Jeedom-Compteur-Eau-Virtuel

Pour être complet : une autre solution possible

Il existe d’autres options pour suivre la consommation de ce genre de compteur. J’ai contacté le fabriquant afin de savoir comment récupérer la pulsation par litre du compteur et la réponse, de la société GP Electronics (qui assure la partie commerciale de la société DH Metering) fût :

Notre compteur DHV2000/2001 donne une impulsion par litre d’eau.

Pour récupérer ces impulsions on peut mettre un émetteur d’impulsions sur notre compteur. Voir documentation s.v.p.

Voici les différentes possibilités :

En effet, il y a 3 versions de notre DH2IND/DH2REED ;

– Système avec 7 fils ( inductive + reed )

– Système avec 5 fils ( inductive )

– Système avec sortie M-bus

Module DH2REED :

Spécifications : DH2REED avec 7 fils. Système inductive + reed ( contact sec ).

Code de commande : DH.DH2REED

Prix unitaire : 51,00 €

Remise : reste à discuter, dépend des quantités.

Délai : normalement en stock.

Module DH2IND :

Spécifications : DH2IND avec 5 fils. Système inductive.

Code de commande : DH.DH2IND-5W

Prix unitaire : 43,00 €

Remise : reste à discuter, dépend des quantités.

Délai : normalement en stock.

Module DH2MBUS :

Spécifications : DH2MBUS avec 2 fils. Système protocol M-bus.

Code de commande : DH.DH2MBUS

Prix unitaire : 62,00 €

Remise : reste à discuter, dépend des quantités.

Délai : normalement en stock.

Frais supplémentaires :

Enlèvement par vos soins chez GP electronics : 10,00 € frais dossier et facturation.

Livraison à votre domicile : 30,00 €

DH2IND - Description

Ce qui m’avait freiné, avec ce capteur, c’est surtout son prix, auquel il fallait encore ajouter 10 euros de frais de dossier et 30 euros de frais de livraison. L’autre chose qui m’avait ennuyée, c’est que ce capteur est alimenté par batterie (interne). Il ne faut pas l’alimenter et le boitier est IP68. Mais il n’y a pas moyen de remplacer cette batterie interne. Après dix ans environ, vous devrez donc jeter votre capteur et en acheter un nouveau.

Pour ceux qui seraient tenté par l’aventure, voici quelques renseignement obtenus chez le vendeur. Ces éléments devraient (je parle au conditionnel car je n’ai pas réalisé l’essai par moi-même) permettre d’utiliser ce capteur avec un NodeMCU :

  • La base de fonctionnement du capteur est un système inductif. Le capteur est prévu spécifiquement pour le compteur et vient se fixer dessus (pas besoin donc de bricoler quelque chose)

Installation manual DH2IND

  • La sortie de ce capteur est un transistor à collecteur ouvert et l’alimentation externe de ce transistor doit se faire avec une tension entre 3V et 30 Vdc. La tension des impulsions, sur le fil jaune, dépend donc de la tension fournie en entrée au transistor. On peut alors très bien travailler avec 3,3V, ce qui est la tension de travail des pins d’un modeMCU (ESP8266). A chaque tour du disque métallique, on reçoit alors une impulsion de 3,3V sur le fil jaune.

DH2IND - spécifications techniques

  • Le capteur fonctionne sur base du flanc montant (positif) et c’est donc cette configuration qu’il faut régler dans le firmware espeasy du NodeMCU.

Conclusions

Après l’échec de l’utilisation du capteur infrarouge TRCT5000, le capteur LJ18A3 fonctionne à merveille pour le suivi de consommation d’eau. Outre le simple suivi de consommation, de nombreuses autres possibilités existent. Par exemple, on peut écrire un scénario Jeedom qui enverrait des alertes quand une consommation de plus de X litres est détectée sur une courte période. En réglant bien la valeur de X, on a ainsi un système de surveillance pour détecter les fuites.

Pour une trentaine d’euros, on aurait tort de s’en priver.