[Article] Gestion de sa consommation d'eau

Voilà, je t’ai mis le code de mon ESP.
J’ai enlevé la partie gestion de mon adoucisseur pour ne laisser que la partie comptage eau froide et les sensor facultatif (wifi, restart, durée,etc…)

Dis-moi, si c’est bon, mais je ne pourrais te répondre que ce soir tard ou demain.

# ESPHOME ESP1 WATER
# Date: 24072024_V1
esphome:
  name: "esphome-esp1-water"

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: !secret api_key

ota:
  - platform: esphome  
    password: !secret ota_password 

# Enable Web server (optional).
web_server:
  port: 80
  auth:
    username: !secret auth_login
    password: !secret auth_password
    
#############################
#          Wifi             #
#############################

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # ...
  manual_ip:
    # Set this to the IP of the ESP
    static_ip: !secret ip_esp1
    # Set this to the IP address of the router. Often ends with .1
    gateway: !secret ip_gateway
    # The subnet of the network. 255.255.255.0 works for most home networks.
    subnet: 255.255.255.0

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: !secret ap_ssid_esp1  
    password: !secret ap_password 
    
######################################################
# Les Lignes 1 à 50 sont à adapter a ta configuration
######################################################

captive_portal:

############################
# Device Specific Config   #
############################

# Name device mask
substitutions:
  name: Compteur
  friendly_name2: "Compteur EF"
  friendly_name5: "ESP Compteur EF"
  
globals:
    
  - id: ef_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 comptage impulsion eau froide
binary_sensor:

##############
# EAU FROIDE #
##############

  - platform: gpio
    pin:
      number: GPIO32
      allow_other_uses: true
      mode: INPUT_PULLUP
      inverted: True
    filters:
      - delayed_on: 50ms
      - delayed_off: 50ms 
    name: "${friendly_name2} counter state"
    id: ef_counter_state

    on_press:
      then:

        - lambda: |-
            // increment le compteur EF puis publish mqtt
            id(ef_pulse_counter) += 1;
            id(ef_counter_pulse).publish_state(id(ef_pulse_counter));
            id(ef_counter_l).publish_state(id(ef_pulse_counter)/1);
            id(ef_counter_m3).publish_state(id(ef_pulse_counter)/1000);

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

#####################################################
#                       sensor                      #
#####################################################
sensor:
#####################################################
#                  EAU FROIDE                       #
#       Débit d'eau instantané (0 après 10s)        #
#  Ne pas utiliser pour comptage (comptage erroné)  #
#####################################################

  - platform: pulse_meter
    name: "${friendly_name2} pulse"
    id: pulse_id_ef
    pin:
      number: GPIO32
      allow_other_uses: true
      inverted: true
      mode:
        input: true
        pullup: true
    internal_filter: 100ms    
    icon: mdi:water
    timeout: 100s
    unit_of_measurement: 'l/mn'
    filters:
      - multiply: 1

# Comptage impulsion  
  - platform: template
    name: "${friendly_name2} counter pulse"
    id: ef_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 litres 
  - platform: template
    name: "${friendly_name2} counter l"
    id: ef_counter_l
    unit_of_measurement: 'L'
    accuracy_decimals: 0  # Précision en entiers
    state_class: total_increasing    
    device_class: water

# Comptage m³ (utilisé pour le compteur services HA)
  - platform: template
    name: "${friendly_name2} counter m3"
    id: ef_counter_m3
    unit_of_measurement: 'm³'
    accuracy_decimals: 3  # Précision en entiers
    state_class: total_increasing
    device_class: water    

###########################################
#     Sensors with general information    #
###########################################

## Signal Wifi
  - platform: wifi_signal
    name: ${friendly_name5} Wifi signal
    update_interval: 10min

## ESP Durée fonctionnement    
  - platform: uptime
    name: ${friendly_name5} uptime
    update_interval: 10min
    id: esp1_uptime_sec 
    

###########################################    
#               SWITCH                    #
########################################### 
switch:

## reboot esp            
  - platform: restart
    name: ${friendly_name5} restart   

 
###########################################
#               Text Sensor               #
###########################################
# Transformation des secondes en jours
text_sensor:
  - platform: template
    name: ${friendly_name5} Allumé depuis (j)
    lambda: |-
      int seconds = (id(esp1_uptime_sec).state);
      int days = seconds / (24 * 3600);
      seconds = seconds % (24 * 3600); 
      int hours = seconds / 3600;
      seconds = seconds % 3600;
      int minutes = seconds /  60;
      seconds = seconds % 60;
      return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
    icon: mdi:clock-start
    update_interval: 30min  

# Info Wifi IP
  - platform: wifi_info
    ip_address:
      name: "${friendly_name5} IP"
      update_interval: 60min
#####################################
#                 END               #
#####################################

Merci c’est sympa de ta part, je teste ça
EDIT
C’est bon ça passe merci

1 « J'aime »

Encore merci pour ton code, cela fonctionne très bien. Le seul problème maintenant, c’est le redémarrage intempestif de mon ESP32 qui fait que je perds parfois une minute parfois plusieurs heures de données pourtant ma box est à 4m de l’esp. Je ne comprends pas pourquoi j’ai ces déconnexions. Y aurait moyen de l’empécher de redémarrer quand l’esp perd la connexion wifi ?

C’est bizarre, je n’ai pas de redémarrage, même si ESP perd le wifi.
En tous cas pas constaté.

Vérifie ton cablage, vérifier les serrages des fils, ton alimentation est peut être en cause.

Tu as peut être utiliser des gpio qui peuvent provoquer des redémarrages ou plantage (sous réserve)

GPIO 32 comme toi et GRND. Alim de 2A. Câblage ok et fils bien serrés. Je ne vois pas ce qui déconne. Je vais essayer de passer sur ESP ethernet pour régler le problème de connexion

Tu as essayé de changer d’alim ?

Si tu utilise une alimentation avec un connecteur type USB, tu as peut être un mauvais contact.

Ou un bloc alimentation défectueux qui n’est pas stable en tension.

Bonjour,
Je ne me suis pas connecté depuis un moment au forum HACF.
Après avoir installé 4 panneaux solaires je me suis intéressé à ma consommation et production électrique, puis à ma consommation de gaz (gazpar). Je découvre aujourd’hui 24 octobre 2024 ce fil de discussion sur la consommation d’eau. Est-ce que l’article d’Argonaute est à jour avec notamment les indications de Pascal ? Où peut-on se procurer, en ce moment, le compteur Granola 1/4l ? J’ai commandé l’ESP32 chez AZ-Delivery. Pour la pose du compteur il faut que j’en parle à mon plombier !!

Merci de ce lien. Je viens de commander (ce 24/10 voir mon message 128) un des derniers.
Y a plus qu’à !!

Je ne sais pas mais je n’ai plus eu de coupure depuis 3 j donc on va voir

Salut,
Pour information, suite aux retours d’un certain nombre de personnes et après différents tests, j’ai mis à jour l’article : le calcul de la consommation utilisant un pulse_meter a été remplacé par la proposition de code de @pascal_ha. Un incrément est directement fait dans le code à chaque impulsion détectée.
Merci à lui pour cette proposition pertinente, qui éviter des décomptes fantômes en cas de faibles débits.

1 « J'aime »

Bonjour @Argonaute
Merci de la modification de ton article. Comme mon plombier n’est pas encore passé pour installer le compteur Gioanola mais comme j’ai déjà créé mon esp-eau sur un esp32 et qu’il est connecté au wifi, est-ce qu’il suffit que j’édite mon esp-eau et que je remplace le code existant par le nouveau code ?? Rien d’autre à modifier ?
J’ai aussi sur un autre esp32 créé un esp-puits pour mesurer la production d’eau venant de mon puits et qui est GRATUITE. Le « compteur » est à effet hall qui lui, en principe, mesure 1L par impulsion, donc j’en tiendrai compte dans le code.
J’ai fait imprimer 3D deux boitiers un bleu pour l’esp-eau et un gris pour l’esp-puits.
Je te tiens au courant quand l’installation de ces 2 esp sera faite.

Merci @Argonaute

Mais je précise que le code n’est pas de moi, je l’ai trouvé je ne sais plus ou…et je ne sais plus de qui :disappointed:
J’ai juste extrait la partie du code qu’il me fallait et adapté a mon besoin.

1 « J'aime »

Oui, tu peux juste copier-coller. Les variables générées sont les mêmes.
J’ai rajouté dans l’article une petite mention précisant ce qu’il faut modifier pour un compteur avec 1 pulse / litre.
Tu seras donc beta testeur de l’article modifié (bon j’ai testé chez moi avant…) :sunglasses:

Bonjour Argonaute, excellente gestion de l’eau !
N’ayant pas encore reçu le compteur idoine, je fais les tests avec un micro-switch manipulé qui me remonte bien 0.25l par impulsion.
Toutes les valeurs remontent correctement, j’ai bien dans HA (affiché dans une fenêtre dédiée) toutes les valeurs tel que décrit dans l’article.
Par contre je bute sur le point « détecter les fuites importantes ».
J’ai tenté de copier le code indiqué pour créer le sensor dans configuration.yaml, sans succès, je ne retrouve pas ce sensor.
Et je ne trouve pas d’autre fichier yaml où insérer ce code …
En farfouillant un peu, j’ai trouvé qu’on pouvait maintenant créer dans HA un sensor type history_stats par le menu Paramètres~Entrées~Créer une entrée~type HistoryStats.
Ceci ouvre une fenêtre dans laquelle indiquer tous les paramètres repris dans le code donné.
Mais je ne trouve toujours pas le sensor demandé.
J’ai contrôlé les formules qui sont correctes et donnent bien un délai de 1 heure.

Lorsque j’interroge Paramètres~Entrées, je vois bien le sensor mais avec une erreur: (!) en début de ligne.
Je peux envoyer un printscreen de l’écran si nécessaire.

Voilà, là je sèche, le sensor n’est pas créé …
Bon, ce n’est pas d’une importance capitale, mais ce serait bien si je pouvais résoudre ce souci et surtout trouver le pourquoi …

Par avance merci de l’aide.

Je viens de créer un sensor History stats avec UI et je retrouve bien le sensor.

Comment as tu créer ton sensor ?

1 « J'aime »

Bonjour et merci de ta réponse.
J’ai crée mon sensor de la même manière que toi via la même fenêtre.
Par contre, j’ai mis des underscores dans le nom.

Comment obtiens-tu la fenêtre de contrôle de l’état du sensor ; je ne connais pas celle que tu affiches ?
Cordialement.

Pas bien compris ta question.
Mais pour afficher j’ai simplement une carte entité qui m’affiche le %.

C’est peut être ton problème, créer un nouveau sensor sans les "

Bonjour @YvMa57 mais aussi @Argonaute et @pascal_ha qui suivent ce sujet.
J’ai deux esp32 esp-eau sur compteur Gioanola et esp-puits sur compteur effet hall
mais mon plombier n’étant toujours pas passé je fais mes essais ainsi :

  • sur esp-eau avec un magnet de frigo sur le capteur destiné à être enfilé sur le compteur
  • sur esp-puits en soufflant fort dans le « compteur »
    J’ai créé ceci dans le configuration.yaml sous sensor:
# Ratio d'usage de l'eau sur la dernière heure
- platform: 'history_stats'
  name: 'Ratio usage eau froide'
  unique_id: 'eau_froide_ratio_usage'
  entity_id: binary_sensor.eau_froide_tirage_actif
  state: 'on'
  type: ratio
  start: "{{ now() - timedelta(hours=1) }}"
  end: "{{ now() }}"
# Ratio d'usage de l'eau du puits sur la dernière heure
- platform: 'history_stats'
  name: 'Ratio usage eau du puits'
  unique_id: 'eau_puits_ratio_usage'
  entity_id: binary_sensor.eau_puits_tirage_actif
  state: 'on'
  type: ratio
  start: "{{ now() - timedelta(hours=1) }}"
  end: "{{ now() }}"

Et la copie d’écran de la partie « eau » de mon lovelace. Je n’ai mis que 4 tirages dans la carte Logbook au lieu de 50. Le -114L pour l’eau froide vient de « consommation eau froide annuel » que j’ai supprimé et recréé en « eau froide annuel »

2 « J'aime »

Bon ben voilà; tout fonctionne.
En fait je n’allais pas voir au bon endroit pour vérifier le présence du sensor !
Et il est bien crée, et fonctionne.
Désolé de vous avoir dérangé pour mon étourderie et merci de vos réactions.
Amicalement
N/B le compteur est arrivé ce matin, plus qu’à trouver un plombier car je n’ai pas l’outillage pour.

1 « J'aime »