[Article] Gestion de sa consommation d'eau

Un nouvel article est publié sur le portail HACF. Nous vous proposons de connecter votre compteur d’eau et d’exploiter ses données : maîtrise des coûts, identification des sources de consommation, détection des fuites, etc
Bonne lecture, n’hésitez pas à commenter ou poser vos questions.

9 « J'aime »

Bonjour @Argonaute

Je me suis inspirée de ton article pour améliorer le suivi de consommation de mon réseau d’eau

Mais je voudrais faire les actions suivante, mais je ne trouve pas comment faire (cela n’est peut etre pas possible.

  1. pour remettre le compteur à zéro :
    Comment faire pour re-initialiser le compteur de consommation annuelle ?

  2. pour lui donner une valeur de départ:
    Comment faire pour donner une valeur prédéfini au départ pour le compteur consommation annuelle ?

Merci pour ton aide

Salut @pascal_ha

Si tu as suivi l’article, tu as créé un compteur de services:
image

Et dans « cycle de remise à zéro du compteur », tu choisis Annuel.

Tu vas dans services et tu utilises utility_meter.calibrate en choisissant ton compteur :

2 « J'aime »

merci @Giga77

J’ai bien trouvé pour calibré ou remettre à zéro le compteur.

Par contre lors de la création du compteur de service, j’ai choisi options Cycle « annuel » , comment modifier cette option ? faut il supprimer le compteur et le recréer, ou la modification est possible sans le supprimer.

Je crains qu’il ne faille le détruire et recréer. Il n’y a pas dans les options de l’entité compteur la fréquence.

1 « J'aime »

Ok merci @Argonaute

Je me doutais de la réponse.
C’est un peu dommage de devoir supprimer, pour recréer.

Ca me semble logique de ne pas pouvoir modifier. Si tu pouvais modifier le cycle, comment ferais-tu pour distinguer les données avant/après modification ? Le compteur n’aurait plus aucun sens.
Ce que tu peux faire, ce sont plusieurs compteurs avec différents cycles.

1 « J'aime »

bonjour

J’ai utilisé le tuto de @Argonaute pour faire le relevé de mes consommations d’eau.
Mais j’ai un souci dans le comptage, comme ci il y avait des impulsions fantôme avec le pulse meter. (je tiens a préciser que j’ai le même phénomène sur 3 compteur différent.

J’ai raccordé mes compteur de cette manière :

J’ai utilisé ce code pour ESP :

code ESP
# Débit d'eau instantané (0 après 10s)
  - platform: pulse_meter
    name: "${friendly_name1} pulse"
    id: pulse_id_ecs
    pin:
      number: GPIO32
      inverted: true
      mode:
        input: true
        pullup: true
    internal_filter: 300ms    
    icon: mdi:water
    timeout: 10s
    unit_of_measurement: 'l/mn'
    filters:
      - multiply: 1
# Consommation Totale d'Eau depuis démarrage
    total:
      name: "Consommation eau chaude"
      icon: mdi:water
      device_class: water   
      state_class: total_increasing
      unit_of_measurement: 'm³'
      accuracy_decimals: 3
      filters:
        - multiply: 0.001

voici un exemple du décalage sur 4 jours :

Avez vous ce problème ?

J’ai lu dans un article qu’on peux mettre une résistance pour éviter ce phénomène, Si quelqu’un as déjà fait et peut me dire comment je dois mettre la résistance. (si je peux éviter de grille l’ ESP)

Merci pour votre aide

J’ai constaté une légère différence aussi sur une longue période mais moins de 1%.
Une résistance pour un contact sec ne me semble pas indispensable, car les GPIO ont cette résistance en interne. Mais strictement aucun risque a brancher 10k comme indiqué sur ton lien (entre gpio 25 utilisé et un pin +5v de l’ESP donc). Je ne peux essayer étant en voyage, n’hésite pas a tester et faire un retour.

Autrement pour éviter les rebonds, tu peux tenter d’augmenter le paramètre internal_filter (50 ms proposé mais peut-être trop faible)

Bonjour

pour ma part j’ai une dérive beaucoup plus importante que 1% ce serai plutôt 10 à 15% (peut être due au fait que le compteur soit 1L/impulsion)

Ayant 3 compteurs voila ce que j’ai fait :

  • compteur eau chaude : pose de la résistance et internal filter réglé à 100ms
  • compteur eau froide général : réglage internal filter à 100ms
  • Compteur eau adoucie : réglage inchangé

Je vais patienter pour voir ce que cela donne.

1 « J'aime »

Salut

Alors en essai depuis environ 3 jours, le résultat est toujours mitigé.
Que ce soit avec la résistance 10Kohm ou sans j’ai toujours un écart,
d’environ 10% pour EF et EA et beaucoup plus pour le compteur ECS mais je sais pas vraiment la raison…

la première rangée de compteur est avec le pulse-meter
la deuxième rangée de compteur est avec les impulsions

esp compteur decalage

J’ai essayé de changer de GPIO sur ECS le 25, sur EF le 32 et EA 33
J’utilise deux ESP le 1er pour ECS et un second pour EF et EA

J’ai donc modifié ma programmation ESP, pour utiliser le mode pulse-meter pour le débit instantanée et j’utilise le mode impulsion pour le comptage.
J’ai supprimé la résistance qui ne m’apportait rien

voici le code utilisé : (si sa peut servir à d’autres)

Édit: 21/12/2023 mise a jour code suivant Esphome 2023.12.1

Résumé
# Name device mask
substitutions:
  name: compteur_ecs
  friendly_name: "Compteur ecs"
  friendly_name1: "Sensor ECS"
  friendly_name2: "Compteur ECS"

globals:
    
  - id: ecs_pulse_counter
    type: float #Le counter n'est pas integer car il sert aussi pour la division m3
    initial_value: "0" 

#################
# Binary Sensor #
#################
binary_sensor:

  - platform: gpio
    pin:
      number: GPIO25
      allow_other_uses: true   #ajout depuis ESPhome2023.12.1
      mode: INPUT_PULLUP
      inverted: True
    filters:
      - delayed_on: 100ms
      - delayed_off: 100ms 
    name: "${friendly_name1} counter state"
    id: ecs_counter_state
    on_press:
      then:
        - lambda: |-
            // increment le compteur ECS puis publish mqtt
            id(ecs_pulse_counter) += 1;
            id(ecs_counter_pulse).publish_state(id(ecs_pulse_counter));
            id(ecs_counter_l).publish_state(id(ecs_pulse_counter)/1);
            id(ecs_counter_m3).publish_state(id(ecs_pulse_counter)/1000);

##########
# sensor #
##########
sensor:

# Débit d'eau instantané (0 après 10s)
  - platform: pulse_meter
    name: "${friendly_name1} pulse"
    id: pulse_id_ecs
    pin:
      number: GPIO25
      allow_other_uses: true   #ajout depuis ESPhome2023.12.1
      inverted: true
      mode:
        input: true
        pullup: true
    internal_filter: 500ms    
    icon: mdi:water
    timeout: 300s
    unit_of_measurement: 'L/mn'
    filters:
      - multiply: 1

#############################
#   Comptage en mode impulsion 
# ###########################

# Comptage impulsions
  - platform: template
    name: "${friendly_name2} counter pulse"
    id: ecs_counter_pulse
    unit_of_measurement: ''
    accuracy_decimals: 0  # Précision en entiers
    icon: "mdi:counter"
    #update_interval: 5s  # Mise à jour sur changement de valeur

 
# Comptage en litres 
  - platform: template
    name: "${friendly_name2} counter l"
    id: ecs_counter_l
    unit_of_measurement: 'L'
    accuracy_decimals: 0  # Précision en entiers
    state_class: total_increasing    
    device_class: water

# Comptage en m³
  - platform: template
    name: "${friendly_name2} counter m3"
    id: ecs_counter_m3
    unit_of_measurement: 'm³'
    accuracy_decimals: 3  # Précision en entiers
    state_class: total_increasing
    device_class: water    

Merci pour ton retour.
Ce n’est pas encourageant ça. Es tu plus précis avec le pulse_counter ? De combien?
Tu ne mets pas ce qui devrait être les vrais valeurs.

Autrement vu pour la résistance, ce qui ne m’étonne pas vraiment. Il y a déja ce type de résistance en interne.

Une autre piste serait d’essayer de mettre le compteur sur le 5v et plus GND (et modifier le code en conséquence).

Pour cerner le pb, il faudrait rajouter une led qui s’allume a chaque impulsion. La question est de savoir si c’est un rebond ou une impulsion intempestive.

Il faut aussi essayer d’éloigner les fils d’alimentation et du compteur. Il peut y avoir de l’induction.

Je suis en voyage et ne peux faire de tests a court terme. Compliqué aussi pour moi n’ayant pas ces forts écarts.

La bonne valeur c’est le compteur du bas.
A chaque impulsion sa compte, et je n’ai pas de rebond.

C’est un peu plus précis, mais il y a malgré tous un décalage.

Je vais voir pour essayer de faire un montage.
Mais la led je la met sur une sortie de esp avec un code, ou faut faire autrement ?

Les esp pour EF et EA sont a 1m des compteurs, je ne pense pas qu’il y ai induction

J’ai pas bien compris, tu aurais un schéma ?

Il n’y a rien d’urgent, je ne peux regarder que le weekend.

1 « J'aime »

Pour le branchement au 5v et pas GND, il suffit de mettre le fil actuellement sur GND sur 5V.

Dans le code, il fait supprimer inverted = true.

Ton lien parlant de la résistance présente d’ailleurs les 2 branchements.

Pour la LED, je ferai des tests à mon retour. Il faut mettre la LED sur un GPIO libre avec une résistance de 220 ohms en série, écrire du code en utilisant un binary_sensor pour capter les impulsions, et un output pour piloter la led.

Pour cette partie je pense que c’est bon, j’ai posé une led avec une résistance 330 ohms (j’avais que cela de dispo). sa fonctionne sa s’allume bien a chaque impulsion

Code esp
binary_sensor:

  - platform: gpio
    pin:
      number: GPIO25
      mode: INPUT_PULLUP
      inverted: True
    filters:
      - delayed_on: 100ms
      - delayed_off: 100ms 
    name: "${friendly_name1} counter state"
    id: ecs_counter_state

    on_press:
      then: 
        - lambda: |-
            // increment le compteur ECS puis publish mqtt
            id(ecs_pulse_counter) += 1;
            id(ecs_counter_pulse).publish_state(id(ecs_pulse_counter));
            id(ecs_counter_l).publish_state(id(ecs_pulse_counter)/1);
            id(ecs_counter_m3).publish_state(id(ecs_pulse_counter)/1000);
        - output.turn_on: ecs_impulsion_led_output
#        - delay: 0.5s
#        - output.turn_off: ecs_impulsion_led_output 
    on_release:
      then:
        - output.turn_off: ecs_impulsion_led_output                    

##  Status ESP connexion   
  - platform: status
    name: ${friendly_name} status  

##########
# OUTPUT #
##########
## Sortie Leds GPIO 21 
output:
#  - id: impulsion ecs cpt_led_output

# LED Impulsion Compteur EF
  - id: ecs_impulsion_led_output
    platform: gpio
    pin: GPIO21 

Si j’ai bien compris je branche en pulldown.(pas encore fait)

Mais si Je câble en mode pulldown, sans utiliser de résistance je dois pas mettre sur 3,3V ?
(il me semblait avoir lu qu’il faut pas dépasser les 3,3v sur les esp.)

(EN 5V Avec la résistance 10 kohms en pullup, j’ai pas vu de différence pour moi elle sert a rien, puisque ESP le gère en interne)

je pensais qu’il fallait remplacer

mode:
        input: true
        pullup: true

par

mode:
        input: true
        pulldown: true

J’ai pas vraiment compris à quoi sert inverted.

Excellent pour la led. Et rajouter un compteur est une bonne idée. Je suis curieux de ton retour.

Autrement, ma compréhension est que inverted = true inverse le lien entre les tensions et états en entrée.
Après vérification pulldown et pullup active ou non les résistances internes de tirages (celle que tu voulais rajouter).

https://eepower.com/resistor-guide/resistor-applications/pull-up-resistor-pull-down-resistor/#:~:text=Pull-up%20Resistor%20Definition,absence%20of%20an%20input%20signal.

Donc sauf erreur tu as raison, il faut activer la résistance pulldown si on envoie une tension sur le GPIO. Je pensais qu’un inverted = true en pulldown était équivalent a un inverted = false en pullup, et j’ai un gros doute du coup. Je n’ai pas testé, et si quelqu’un a la réponse…

Oups oui, désolé pour l’erreur, c’est bien en 3.3v sur les entrées des GPIO, et pas 5v bien sûr.

Je suis pas expert en esp32, mais voilà ce que je crois avoir compris :

Pour un montage direct (sans ajout de résistance) en pulldown faut 3,3V.

Dans le cas où on alimente en 5v, il faut ajouter la résistance en 10 kohms pour faire chuter la tension, comme sur le schéma ( enfin c’est ce que je crois avoir compris)

Pour le inverted, pour moi c’est un mystère :thinking:.

Autre point important :
Sur mon compteur ECS (n’étant pas raccordé actuellement) je simulé l’impulsion avec un micro Switch.
Ce n’est pas une bonne méthode, car le micro Switch engendre de nombreuse impulsion fantôme (rebond).
J’ai donc raccordé le contact ILS sur esp et utilisé un aimant pour les essais.
C’est beaucoup beaucoup mieux !

Malgré tous le comptage en utilisant pulse-meter ou pulse-counter a tendance à dériver un peu je dirais entre 2 et 5%.

En utilisant le comptage impulsion (binary sensor) je n’ai quasi pas de différence <1%.

J’ai donc opté pour le comptage (totalisateur) le binary sensor associé avec un utility meter (compteur service)sur HA.

Pour le débit instantané j’utilise le pulse meter (notamment pour avoir la détection de fuite lente)

1 « J'aime »

Merci. Ton retour indique que ce serait le pulse_meter qui aurait un pb (donc probablement une config pas optimale) et qu’il n’y a pas d’impulsions fantômes physiques sur le compteur autre que d’éventuels rebonds.
Je vais creuser cela… Pas de raison que le pulse_meter ne marche pas.

Tu as fait des tests en pulldown ?

Il fonctionne, mais sa compte pas juste…sur une semaine j’ai un écart de 110 litres sur une consommation réel de 700 litres environ

Non pas pour le moment, je vais essayer de le faire ce week end.

Par contre je sais toujours pas si je dois modifier le inverted dans le code si je passe en pulldown. Ou simplement modifier le pullup en pulldown ? (si je pouvais eviter de griller ESP, car je dois mettre le compteur en place ce week …)

Ben, si le pulse_meter ne compte pas juste, on peut pas dire qu’il marche :crazy_face:

Pour inverted, aucun risque de griller car ça inverse juste un état logique. J’essaierai de mettre a false ou supprimer la ligne car au final inverser n’a pas forcément de sens.