Une solution complète de récupération des données Eau, Gaz et Electricite

tu peux nous montrer comment est fait ton sensor ?

Je n’utilise pas pulse metter et autre bidule car il a un comportement bizarre (j’ai peut être mal fait)

En testant esphome, et les différente possibilité qu’il y a en général, j’ai preferé faire mon propre compteur accumulateur. Je n’ai pas de problème avec le gazpar quiest impulsionnel. Si je pars sur ce principe, c’est aussi dans le but d’y ajouter une query mqtt pour récuperer la dernieère valeur envoyée vers « HA ». Comme ça en cas de reboot, mon compteur ne commence pas à 0.

Essaye ce genre de code pour voir si le problème est identique au tiens.

esphome:
  name: wdesphome-gazpar
  #friendly_name: gazpar
  on_loop:
    then:
      - lambda: |-
          id(loops_counter) += 1;
          id(increment_and_toggle).execute();

esp32:
  board: esp32dev
  framework:
    type: arduino

globals:
  - id: loops_counter
    type: int
    initial_value: "0"
  - id: loops_delay_gazpar_red_led
    type: int
    initial_value: "0"    
  - id: gazpar_pulse_counter
    type: float #Le counter n'est pas integer car il sert aussi pour la division kWh et m3
    initial_value: "0" 

switch:
- platform: gpio
  pin: GPIO32
  id: gpio_led_Red_gazpar


binary_sensor:
  - platform: gpio
    pin: 34
    name: "gazpar_counter_state"
    on_press:
      then:
        - lambda: |-
            // allume la led apres impulsion gazpar (pour un delay)
            id(loops_delay_gazpar_red_led) = 10;
            id(gpio_led_Red_gazpar).turn_on();
            // increment le compteur gazpar puis publish mqtt
            id(gazpar_pulse_counter) += 1;
            id(gazpar_counter_pulse).publish_state(id(gazpar_pulse_counter));
            id(gazpar_counter_kwh).publish_state(id(gazpar_pulse_counter)/10);
            id(gazpar_counter_m3).publish_state(id(gazpar_pulse_counter)/100);


sensor:
  - platform: template
    name: "gazpar_counter_pulse"
    id: gazpar_counter_pulse
    unit_of_measurement: 'dal'
    accuracy_decimals: 0  # Précision en entiers
    icon: "mdi:counter"
    #update_interval: 5s  # Mise à jour sur changement de valeur
  - platform: template
    name: "gazpar_counter_kwh"
    id: gazpar_counter_kwh
    unit_of_measurement: 'kWh'
    accuracy_decimals: 3  # Précision en entiers
    icon: "mdi:counter"    
  - platform: template
    name: "gazpar_counter_m3"
    id: gazpar_counter_m3
    unit_of_measurement: 'm3'
    accuracy_decimals: 3  # Précision en entiers


script:      
  - id: increment_and_toggle
    then:
      - lambda:  |-

          // clignotement de la led loop (visualisation de la charge CPU par exemple)
          if (id(loops_counter) >= id(Led_loop_white_xs).state) {
            id(loops_counter) = 0;
            id(Led_loop_white_io).toggle();
          }
          // delay pour la led gazpar (s'allume après impulsion pendant un nombre défni de loop)
          if (id(loops_delay_gazpar_red_led) > 0) {
            id(loops_delay_gazpar_red_led) -=1;
          } else {
            id(gpio_led_Red_gazpar).turn_off();
          }

Comme cela :

C’est un capteur Reed, il doit y avoir un aimant sur la roue noir de compteur.

A+

Salut et merci beaucoup, c’est exactement ce que je cherchais, car le pulse_meter permet de mesurer des fréquences très élevées (et donc des parasites). Je ne suis pas sûr que le filtre qu’il propose soit efficace, je suis monté à 300 ms et toujours le problème.

Je teste ce soir et vous redis.

A+

J’ai le même que je dois installer.

Pas trop compliqué à installer j’avais un gros flexible entre le filtre et l’adoucisseur du coups peu de plomberie, ça tombe bien je ne suis pas un plombier dans l’âme.

Salut,

Alors le code proposé par Oles67 fonctionne bien mieux, j’ai bien une correspondance au litre près entre les index du compteur physique et mes comptes de pulse.

Par contre j’ai mis un filtre à 300 ms en monté et en descente du pulse pour éviter les parasites.

A+

Salut

Peux tu partager ton code, car j’utilise aussi un compteur avec ILS, et je suis pas 100% satisfait du résultat.

J’aimerais le comparer avec le mien, pour voir si le résultat est meilleur.

J’ai bien vu le code de oles67, mais je m’y perd.

Merci par avance.

Salut,

J’ai un peu simplifié le code le Oles67 en fait moi aussi je me suis perdu, alors j’ai repris el principe en n’utilisant pas de boucle.

Bon d’accord j’utilise des delay et c’est mal, mais a mon niveau cela semble fonctionner.

Dans l’esp32 j’ai ce code qui remonte vers HA deux compteurs en litres et en m3.

Je ne met que des extraits car je suis en développement et il y toujours les deux versions qui tournent, j’attend un peu pour faire le ménage et enlever l’inutile.

Sensor

  - platform: template
    name: "eau_counter_pulse"
    id: eau_counter_pulse
    unit_of_measurement: 'L'
    accuracy_decimals: 0  # Précision en entiers
    icon: "mdi:counter"

  - platform: template
    name: "eau_counter_m3"  # J'ai gardé les m3 mais je n'utilise pas en fait
    id: eau_counter_m3
    unit_of_measurement: 'm3'
    accuracy_decimals: 3  # Précision en entiers
    icon: "mdi:counter" 

...

binary_sensor:

  - platform: gpio
    filters:
      - delayed_on_off: 300ms    
     pin: 
      number: GPIO25
      mode:
       input: true
       pulldown: true
    name: "Capteur Inductif eau"  # j'ai gardé le nom de départ mais il n'est pas inductif
    device_class: window 
# Report Consommation eau vers Led rouge et verte  et incrémentation du compteur
    on_press:
      then:
       - switch.turn_on: pulseledrouge
       - delay: 0.2s
       - switch.turn_off: pulseledrouge
       - switch.turn_on: pulseledverte
       - delay: 0.2s
       - switch.turn_off: pulseledverte       
       - lambda: |-
            id(eau_pulse_counter) += 1;            
            id(eau_counter_pulse).publish_state(id(eau_pulse_counter));
            id(eau_counter_m3).publish_state(id(eau_pulse_counter)/1000);


...


# J'ai deux led qui font chenillard quand il y a un pulse qui passe.
# Led rouge pulse eau

switch

  - platform: gpio
    pin: 17 
    id: pulseledrouge


# Led verte pulse eau

  - platform: gpio
    pin: 19 
    id: pulseledverte

Dans mon configuration.yaml j’ai cette déclaration des compteurs horaires, jour, hebdo et mois que j’aime bien.


utility_meter:
  eau_horaire_1:
    source: sensor.adoucisseur_eau_counter_pulse
    cycle: hourly
    
  eau_jour_1:
    source: sensor.adoucisseur_eau_counter_pulse
    cycle: daily
    
  eau_semaine_1:
    source: sensor.adoucisseur_eau_counter_pulse
    cycle: weekly
    
  eau_mensuel_1:
    source: sensor.adoucisseur_eau_counter_pulse
    cycle: monthly    

Ca permet d’avoir ça en affichage simplement.

image

On voit qu’aujourd’hui je n’ai que 14 litres d’écart entre la version de départ (celle de Pbranly première ligne) et la nouvelle version (Celle inspirés d’Oles67 deuxième ligne), hier par contre plus de 1500 litres d’écart. Je pense vraiment que le filtre ne marcha pas dans le pulse_meter.

Depuis 36 heures que ca tourne la nouvelle version est totalement raccord avec le compteur mécanique.

1 « J'aime »

Ok merci, je vais essayer de voir cela.

bonjour @Oles67

Je ne suis pas un expert en programmation Esphome, j’ai donc besoin de tes lumières.
Peux tu m’expliquer à quoi sert ce code :

  on_loop:
    then:
      - lambda: |-
          id(loops_counter) += 1;
          id(increment_and_toggle).execute();

Et ce script :

script:      
  - id: increment_and_toggle
    then:
      - lambda:  |-

          // clignotement de la led loop (visualisation de la charge CPU par exemple)
          if (id(loops_counter) >= id(Led_loop_white_xs).state) {
            id(loops_counter) = 0;
            id(Led_loop_white_io).toggle();
          }
          // delay pour la led gazpar (s'allume après impulsion pendant un nombre défni de loop)
          if (id(loops_delay_gazpar_red_led) > 0) {
            id(loops_delay_gazpar_red_led) -=1;
          } else {
            id(gpio_led_Red_gazpar).turn_off();
          }

Si tu connais la programmation Arduino, il y a 2 fonctions de base
Setup()
Loop()

La première on peut comparer à l’initialisation
Pour la 2e, c’est la boucle perpétuelle.

Concernant mon code, la première partie on_loop, c’est exécuté at quand boucle loop()
Dans cette partie incrémenter une variable et j’exécute le script

Le script est donc exécuté et l’incrementation est testé. Si la valeur atteint 50, alors on bascule l’état de la led loop.
Ça permet de visualiser la charge CPU. Parfois le clignotement ralenti, ça signifie que ça coince quelque part.

Merci pour ta réponse.

Je ne connais pas la programmation arduino, ni les autres d’ailleurs :laughing: (ce n’est pas du tout mon domaine)

Mais si j’ai bien compris, le script sert a vérifier la charge du CPU.
Mais pour le comptage sa change quoi, quel est le but ?

Non, étant donnée que ce type de board n’est pas suffisamment sofistiqué pour avoir une vraie gestion comme le gestionnaire des tâches windows, je lui dit de compter +1 à chaque boucle. En temps normal, ça correspond à environ 0,5 seconde…
Je peux changer la valeur 50 pour plus ou moins.

Si tout se passe bien, la led s’allume, puis 50 boucles et s’éteint 50 boucle puis se rallume pendant 50 boucles etc.
Visuellement, tu vois si ça ralenti. Le plus souvent un problème de performance wifi ou avec le brocker mqtt.

bonsoir,
Je monitore mon arrivé d’eau sanitaire avec un compteur : GIOANOLA COMPTEUR D’EAU CHAUDE ET FROIDE À IMPULSION - 3/4P 1 IMP/LITRE
gioanola-compteur-d-eau-chaude-a-impulsion-3-4-1-imp-litre
et un esp32 dans lequel j’ai configurer un pulse_counter qui me permet de récupérer les infos de débit, des m3 et des litres consommés. Ce système fonctionne parfaitement.

Depuis quelques semaine, j’ai installé un compteur standard et un capteur :

61jktYIFA3L.SX385
sur l’arrivée de mon chauffe-eau. Ce compteur est monté entre le ballon et le groupe. pour monitorer ma consommation d’eau chaude, j’ai installé un capteur : modèle LJ18A3-8-Z/BX-5V.

Ce capteur est relié au même esp32 que le compteur sur l’arrivée d’eau mais sur un pin différent bien évidemment et il est utilisé avec un pulse_meter comme indiqué en début du sujet.

Et c’est là que le bas blesse car ce n’est absolument pas fonctionnel. J’ai des variations de 150 à 200 litres en quelques minutes. des consommations de 15 M3 en quelques heures et des fois en largement moins de temps.
Bref c’est totalement inexploitable. J’ai testé différentes valeurs pour l’internal_filter (de 10ms à 500ms) mais rien n’y fait. ca continue à comptabiliser des litres et des M3 fantômes à tout bout de champs

Je désespère car je n’arrive pas à trouver de solution.

Si vous avez réussi à avoir quelques chose de fonctionnel, je suis preneur de vos retours.

Pour info, sur l’ESP32 en question, mon compteur Gioanola est entre le GND et le pin 27. Le capteur pour l’eau chaude est entre le 5V, Le GND et le pin 17. Par ailleurs 2 sondes dallas sont reliées pour la température de l’eau froide entre le 5V, le GND et le pin 26 et pour l’eau chaude entre le 5V, le GND et le pin 16. (Il est à noter que ces sondes dallas ont été installé ce jour et donc n’ont eut aucune incidence sur le soucis rencontré pour le capteur d’eau chaude.

Ci dessous mon code pour les 2 compteurs. L’internal_filter est à 4 secondes car c’est le temps moins 1 secondes que le voyant du capteur es allumé.
L’internal_filter_mode est en test pour voir si les impulsions sont bien ignorées si elle sont interrompue avant le temps défini.

#############################################################################
###                CONSOMMATION EAU SANITAIRE ((((TOTAL))))               ###
#############################################################################
# Consommation instantanée en Litres/minutes--------------------------------
  - platform: pulse_counter
    id: Debit_eau_global
    name: "Debit eau global"
    pin:
      number: GPIO27
      inverted: true
      mode:
        input: true
        pullup: true
    icon: mdi:water
    unit_of_measurement: 'L/mn'
    update_interval: 1s
    filters:
      - multiply: 1 # multiplié par 1 car 1 impulsion par litre (donnée par le compteur)
      - timeout:
          timeout: 2s
          value: 0
# Total usage du jour en M3-------------------------------------------------
    total:
      id: eau_totale
      name: "Eau totale"
      icon: mdi:water
      state_class: total_increasing
      unit_of_measurement: "M³"
      accuracy_decimals: 3
      filters:
        - multiply: 0.001 # divisé par 1000 pour obtenir des m3

#---------------------------------------------------------------------------
# Total usage eau chaude du jour en litres----------------------------------
  - platform: template
    id: eau_du_jour
    name: "Eau du jour"
    device_class: water
    unit_of_measurement: 'L'
    accuracy_decimals: 0 
    state_class: total_increasing
    lambda: |-
      return id(eau_totale).state * 1000;
    # impulsion multiplié par 1000 pour obtenir des litres
    update_interval: 1s


#############################################################################
###                   CONSOMMATION EAU CHAUDE SANITAIRE                   ###
#############################################################################
# Consommation instantanée en Litres/minutes---------------------------------
  - platform: pulse_meter
    id: Debit_eau_chaude
    name: "Debit eau chaude"
    pin: 
      number: GPIO17
      mode: INPUT_PULLUP 
    unit_of_measurement: "l/mn"
    icon: mdi:water-sync
    internal_filter: 4s # Temps pour un demi tour de roue du compteur
    internal_filter_mode: pulse # En essais pour l'heure
    filters:
      - timeout:
          timeout: 4s
          value: 0
# Total usage eau chaude du jour en M3---------------------------------------
    total:
      id: eau_chaude_totale
      name: "Eau chaude totale"
      icon: mdi:water
      device_class: water   
      unit_of_measurement: 'M³'
      accuracy_decimals: 3
      filters:
        - multiply: 0.001 # divisé par 1000 pour obtenir des m3      
             
#---------------------------------------------------------------------------
# Total usage eau chaude du jour en litres-----------------------------------
  - platform: template
    id: eau_chaude_du_jour  
    name: "Eau chaude du jour"
    device_class: water
    unit_of_measurement: "L"
    accuracy_decimals: 0 
    state_class: total_increasing
    lambda: |-
      return id(eau_chaude_totale).state * 1000; 
    # impulsion multiplié par 1000 pour obtenir des litres
    update_interval: 1s

Dans l’attente merci à vous
Martipit

1 « J'aime »

Bonjour
Ton capteur voit quel élément ? As tu essayé de le mettre d’abord devant rien et voir ce qui se passe puis devant un élément métallique et voir ce qui se passe .
Le but est de tester ton système dans les 2 états statiques
Après tu testes en faisant passer un élément métallique devant ( j’utilisais tout simplement une paire de ciseaux !
Si tout ça se passe bien, c’est un problème software. Mais d’abord vérifie le niveau hardware)
Philippe

salut,

Le capteur fonctionne car un objet métallique déclenche bien la led rouge qui se trouve sur le dessus par contre, je n’ai pas regardé comment ils se comporte lorsque l’on fait passer cet objet ni regardé l’incrémentation dans esphome qui se produit en statique et au passe de l’objet. Je test ça et je te done les résultats.

Merci à toi.

Super
De mon côté je ne suis plus en esp mais le détecteur « alimente » un bouton IKEA zigbee.
Ça fonctionne très bien sauf lorsque je suis absent …… après quelques jours le compteur commence à compter quelques (faux) litres par jour.
Je n’ai pas encore pris le temps de comprendre pourquoi .
Phil

je vais faire les tests mais si non concluant, je reprends un compteur Gioanola là, au moins avec mon esp, ca fonctionne super et pas de faux litres ni rien même après plusieurs jours.

Bonjour à tous,

J’ai bien suivi le post et ma consommation d’eau est remontée, j’ai juste pas le même yaml mais ça c’est pas le sujet du post.

Premièrement, si vous avez le même compteur que @Pbranly (cf le premier post) j’ai trouvé sur Le Bon Coin quelqu’un qui m’a imprimé la pièce est c’est parfait (Lien pièce de fixation compteur : https ://www.thingiverse.com/thing:5418699)

Ensuite, j’ai un ESP8266(LiLon NodeMCU V3) que j’alimente directement via l’USB. J’ai donc du modifier le cable de mon capteur en la branchant sur VU et G (cf image entouré en bleu)

Je n’y connais pas grand chose en ESP, mais je lis souvent qu’il faut l’alimenter en 3,3V, etc… du coup est-ce que je dois faire des modifications dans mon installation ?

Si je branchais sur VIN, il ne se passait rien. Si je branchais sur 3,3 la LED du capteur s’allumait mais ne détectait rien.

Merci à vous,