Domotisation adoucisseur (alarme fuite)

Mon problème

Bonjour

Je voudrais pouvoir contrôler l’absence de fuite sur mon adoucisseur.
Je voudrais donc installer des débitmètre à turbine pour vérifier l’eau utilisé, mais surtout pouvoir effectuer un contrôle d’absence de fuite.

schema adoucisseur

Principe de fonctionnement :
Après avoir utiliser sa capacité en eau adoucie, l’adoucisseur passe en cycle de régénération.

  • lors de ce cycle le micro switch régénération (3) s’enclenche jusqu’à la fin du cycle complet

  • La durée d’un cycle est d’environ 90 minutes

  • pendant ce cycle de l’eau s’écoule par le rejet et traverse le compteur à turbine (2)

  • Je voudrais donc vérifier qu’il n’y a pas d’eau qui traverse le compteur (2) si l’adoucisseur n’est pas en régénération.
    et donc recevoir une alerte si le compteur tourne.

  • Je voudrais aussi totaliser le nombre de déclenchement de régénération (cycle) (3) afin de recevoir une alerte pour remplir le bac à sel tous les X cycles.

  • Je voudrais que 90 minutes après un déclenchement de cycle de régénération (3), vérifier que l’eau ne coule plus par le compteur (2) et recevoir une alerte si c’est pas le cas.

le compteur a turbine serait de ce type :
https://fr.aliexpress.com/item/4001114496369.html?gatewayAdapt=glo2fra&spm=a2g0o.cart.0.0.46973c00dvGKUI&mp=1

le switch de régénération est un simple contact sec inverseur.

Je sollicite votre aide, votre expérience, ou votre avis pour mener a bien ce projet
Mes questions sont les suivantes :

  • Qu’elle type de matériel je dois utiliser pour pouvoir réaliser un tel montage ?
    (j’ai vu que certains ont utilisé des ESPhome pour domotiser leur adoucisseur, mais je dois bien avouer que je n’y connais rien.)

  • Pensez vous que ce soit réalisable pour un débutant ?

  • Ceci est il intégrable à Home Assistant ?

Merci par avance a tous ceux qui m’apporteront leur aide, ou qui auront pris le temps de me lire. :grin:

Ma configuration


System Health

version core-2022.3.5
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.9.9
os_name Linux
os_version 5.10.92-v8
arch aarch64
timezone Europe/Paris
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 4742
Installed Version 1.23.0
Stage running
Available Repositories 1080
Downloaded Repositories 41
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 7.5
update_channel stable
supervisor_version supervisor-2022.03.5
docker_version 20.10.9
disk_total 219.4 GB
disk_used 18.1 GB
healthy true
supported true
board rpi4-64
supervisor_api ok
version_api ok
installed_addons Terminal & SSH (9.3.0), Samba share (9.5.1), File editor (5.3.3), Duck DNS (1.14.0), Mosquitto broker (6.0.1), MariaDB (2.4.0), NGINX Home Assistant SSL proxy (3.1.1), Nginx Proxy Manager (0.11.0), Simple Scheduler (0.40), Check Home Assistant configuration (3.10.0), Node-RED (11.1.0), Studio Code Server (4.1.0), Plex Media Server (2.8.0)
Lovelace
dashboards 2
resources 33
views 17
mode storage
Xiaomi MIoT
logged_in true
can_reach_micloud_server ok
accounts_count 1
account_devices_count 1
added_devices 1
___

hello
pour ma part je mesure ma conso heure par heure
compteur avec reset.
de 2h à 4h (chez moi on dort hi )
ma conso doit être égale à 0.
si <> il y a fuite
notification sms free (fuite eau)
bye

Le problème, c’est que l’adoucisseur se nettoie automatiquement au bout d’un certain volume d’eau consommé, et donc le cycle de nettoyage peut être n’importe quel jour (entre les 7 à 10jours ), mais toujours à partir 2H et jusqu’à 4H maxi.
Donc le contrôle d’absence de fuite ne doit se faire que en dehors de cet horaire.

Mon Projet avance…un peu

  • Je viens de recevoir le capteur de passage pour mettre sur la vidange de l’adoucisseur
    https://fr.aliexpress.com/item/4000933130112.html?gatewayAdapt=glo2fra&spm=a2g0o.order_list.0.0.21ef5e5bhqgJOI

  • J’ai récupérer un switch contact pour l’information de régénération.

  • Pour Alimentation je vais récuperer le 24V sur l’alimentation de l’adoucisseur

  • Je voulais partie sur ESP… mais comme je n’y connais rien, je me suis plutôt tourné vers un shelly Uni (en attente de réception). Une fois que j’aurai testé et si sa fonctionne, je verrais avec les experts de HACF pour faire installation avec un ESP.

Voila ou en est ce projet,
J’ai installé le shelly uni, le switch et le capteur de débit sur un banc d’essai avant de le mettre en place sur adoucisseur.
Le câblage des différent élément est le suivant :

Dans HA j’ai crée quelques automatismes qui sont :

  • Si switch cycle à l’arrêt (OFF) et contact de débit rejet (ON) pendant + 30 secondes alors Notification et fermeture électrovanne eau
  • Si contact de débit rejet (ON) pendant plus de 80 minutes alors notification et fermeture électrovanne eau
  • Si switch cycle en marche (ON) pendant plus de 80 minutes alors notification et fermeture électrovanne eau

Maintenant je voudrais ajouter quelques options. C’est la que j’ai besoin de votre aide car je ne sais pas trop comment faire

  • Comptabiliser le nombre de cycle et garder un historique (édit: J’ai trouvé pour le compteur…)

  • Avoir la date du dernier cycle (édit: J’ai trouvé pour la date…)

Bouton pour afficher l’état de adoucisseur

Carte bouton Cycle : (le bouton change d’apparence en fonction de l’état)
cycle offcycle oncycle alerte

code bouton cycle
type: custom:button-card
entity: binary_sensor.switch_cycle_input
aspect_ratio: 5/2
show_state: false
show_last_changed: true
styles:
  card:
    - background-color: white
    - border-radius: 10%
    - filter: opacity(100%)
    - padding: 2px
    - text-transform: null
    - font-size: 12px
state:
  - value: 'on'
    icon: |
      [[[
       if (states['timer.adoucisseur_minuteur_cycle'].state == 'active')
         return 'mdi:sync-circle'; return 'mdi:sync-alert'   
      ]]]
    name: |
      [[[
        if (states['timer.adoucisseur_minuteur_cycle'].state == 'active')
         return 'Régénration'; return 'Defaut cycle'
       ]]] 
    styles:
      card:
        - background-color: white
        - border: |
            [[[
             if (states['timer.adoucisseur_minuteur_cycle'].state == 'active')
               return '2px solid var(--google-grenn)'; return '2px solid var(--google-red)'   
             ]]]
        - color: red
      icon:
        - color: |
            [[[
             if (states['timer.adoucisseur_minuteur_cycle'].state == 'active')
               return 'green'; return 'red'   
             ]]]
      name:
        - color: black
  - value: 'off'
    icon: mdi:water-sync
    name: En Service
    styles:
      card:
        - background-color: white
        - border: 2px solid var(--google-grey)
        - color: grey
      icon:
        - color: grey
      name:
        - color: black

Carte bouton rejet: (le bouton change d’apparence en fonction de l’état)
rejet_1rejet_2rejet_3

Code bouton rejet
type: custom:button-card
entity: binary_sensor.debit_rejet_input
aspect_ratio: 5/2
show_state: false
show_last_changed: true
styles:
  card:
    - background-color: white
    - border-radius: 10%
    - filter: opacity(100%)
    - padding: 2px
    - text-transform: null
    - font-size: 12px
state:
  - value: 'on'
    icon: |
      [[[
       if (states['binary_sensor.switch_cycle_input'].state == 'off')
         return 'mdi:water-alert'; if (states['timer.adoucisseur_minuteur_cycle'].state == 'idle')
         return 'mdi:water-alert'; return 'mdi:water'   
      ]]]
    name: |
      [[[
       if (states['binary_sensor.switch_cycle_input'].state == 'off')
         return 'Fuite Adoucisseur'; if (states['timer.adoucisseur_minuteur_cycle'].state == 'idle')
         return 'Fuite Adoucisseur '; return 'Regeneration'   
      ]]]
    styles:
      card:
        - background-color: white
        - border: |
            [[[
             if (states['binary_sensor.switch_cycle_input'].state == 'off')
               return '2px solid var(--google-red)'; if (states['timer.adoucisseur_minuteur_cycle'].state == 'idle')
               return '2px solid var(--google-red)'; return '2px solid var(--google-green)'   
             ]]]
        - color: red
      icon:
        - color: |
            [[[
             if (states['binary_sensor.switch_cycle_input'].state == 'off')
               return 'red'; if (states['timer.adoucisseur_minuteur_cycle'].state == 'idle')
               return 'red'; return 'green'   
             ]]]
      name:
        - color: black
  - value: 'off'
    icon: mdi:water-check
    name: Pas de Fuite
    styles:
      card:
        - background-color: white
        - border: 2px solid var(--google-grey)
        - color: grey
      icon:
        - color: grey
      name:
        - color: black

Carte Gestion Adoucisseur

La partie Suivi des phases de cycle n’est pas opérationnel :face_with_head_bandage:

Je viens de finir la partie suivi des phases de cycle à l’aide d’automatisme :exploding_head:.

Ce qui me donne une carte de ce type

Bon après cette période d’essai j’ai du modifier un peu le système.

En effet certaine impureté (micro bille) venait bloquer le détecteur de fuite.
J’ai donc du mettre un filtre tamis devant pour le protéger

La carte finale a aussi un peu évolué :
AD

Bonjour a tous

J’ai domotiser mon adoucisseur, il y a quelque temps avec un Shelly uni ou je récupère la position service de l’appareil et les fuites au rejet de mon adoucisseur. Sa fonctionne plutôt bien (sauf que le shelly perd sa connexion au réseau de temps en temps).

J’ai donc décider de basculer sur un ESP32, car je veux regrouper mes deux contact cycle et fuite et y joindre un capteur a effet hall (compteur eau adoucie) et une sonde de température. (et peut être de récupérer le comptage de mon adoucisseur fleck)

Je débute sur ESPHome et esp32. Je ne suis ni electronicien, ni devellopeur donc c’est pas facile et je galère un peu…beaucoup…passionnément… :sweat_smile:

pour m’aider je me suis inspiré de ce projet :
https://forum.hacf.fr/t/connecter-un-adoucisseur-deau-et-recuperation-info-debitmetre/4870 et de quelques autres sur le forum.

**Pour le schema : **

le capteur à effet hall est branché sur GPIO23 et le 3,3V
la sonde de température est branché sur GPIO35 et le 3,3V

le premier Micro Switch (GPIO14) sert pour mon adoucisseur a m’indiquer la position service. une Led Jaune (GPIO18 ) indiquera que l’appareil est en nettoyage
le second micro switch (GPIO13) servira pour indiquer une fuite au rejet. Une Led Rouge (GPIO19) indiquera qu’il y a un écoulement d’eau au rejet

Je ne suis pas électronicien, donc les valeurs de résistances sont celle que j’avais de disponnible. (je n’ai que des 10Kohm ou des 330 ohm)

J’ai fait un premier essais pour la détection de fuite OK
Position de régénération et la température c’est OK.
Pour le compteur sa ne fonctionne pas…probablement le capteur qui est HS suite a une erreur de branchement.

Pour le code ESP :

Résumé
esphome:
  name: "esphome-esp1-water"

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
#  password: !secret api_password

ota:
#  password: !secret ota_password

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 gateway_esp1
    # 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  
    password: !secret ap_password  

captive_portal:


# Example configuration entry


time:
  #- platform: sntp
  #  id: my_time
    
  - platform: homeassistant
    id: homeassistant_time  
    
    on_time:
      - seconds: 57
        minutes: 59
        hours: 23
        then:  
          - sensor.template.publish:
              id: esp1_template_water_veille
              state: !lambda return id(esp1_daily_water).state;

# reboot              
switch:
  - platform: restart
    name: "Esp1_restart"       


# sensor

# Mesure Temperature eau
sensor:  
  - platform: adc
    pin: GPIO35
    name: "esp1_water_temperature_raw_volts"
    id: esp1_water_temperature_raw_volts
    update_interval: 15s
    accuracy_decimals: 5
    attenuation: auto

  - platform: resistance
    sensor: esp1_water_temperature_raw_volts
    configuration: DOWNSTREAM
    resistor: 50kOhm
    reference_voltage: 3.3V
    name: "esp1_water_temperature_resistance_sensor"
    id: esp1_water_temperature_resistance_sensor

  - platform: ntc
    sensor: esp1_water_temperature_resistance_sensor
    calibration:
      b_constant: 3950
      reference_temperature: 25°C
      reference_resistance: 10kOhm
#    calibration:
#        - 200.720kOhm -> 6.0°C
#        - 57.094kOhm -> 22.0°C  
#        - 28.766kOhm -> 37.0°C
#    unit_of_measurement: "°C" 
#    accuracy_decimals: 2
    name: "esp1_water_temperature_ntc"
    id: esp1_water_temperature_ntc

# Mesure de pression non utilisé

#  - platform: adc
#    pin: A0
#    name: "esp1 - water_pression"
#    update_interval: 10s
#    unit_of_measurement: "bar"
#    icon: mdi:gauge
#    accuracy_decimals: 3
#    filters:
#    - sliding_window_moving_average:
#        window_size: 7
#        send_every: 1
#    - lambda: return ((x - 0.1)*1.333333*10);
    #- lambda: return ((x - 0.1)*1.49993*10);


# Definition du flow meter (en cours de test)

# pulse meter Jybi89    
#  - platform: pulse_counter
#    id: water_flow_meter
#    pin: GPIO22
#    name: "debit_chaude_water_flow_meter"    
#    update_interval: 1s
#    icon: mdi:water
#    filters:
#     - lambda: return (x / 5.48);
#    unit_of_measurement: "l"

# Pulse meter Aliexpress    
  - platform: pulse_meter
    pin: GPIO23
    name: "esp1_water_litres_par_min"
    id: esp1_water_flow_meter
    unit_of_measurement: "L/min"
    timeout: 10s
    filters:
      - multiply: 0.001818

# Consommation eau du jour
  - platform: total_daily_energy
    name: "esp1_water_conso_du_jour"
    power_id: esp1_water_flow_meter  
    unit_of_measurement: "l"
    accuracy_decimals: 2
    id: esp1_daily_water

# Consommation eau de la veille
  - platform: template
    name: "esp1_water_conso_veille"
    id: esp1_template_water_veille
    unit_of_measurement: "l"
    accuracy_decimals: 2
    icon: mdi:water
    update_interval: 10s
    


# capteur numerique

# Signal Wifi
  - platform: wifi_signal
    name: "esp1_wifi_puissance"
    update_interval: 10s

# ESP Durée fonctionnement    
  - platform: uptime
    name: "esp1_uptime"
    update_interval: 10s
    id: esp1_uptime_sec

# Status ESP connexion   
binary_sensor:
  - platform: status
    name: "esp1_status"

# Flow meter     
  - platform: template
    name: "esp1_water_instantanée"
    id: esp1_template_isflowing
    lambda: |-
     if (id(esp1_water_flow_meter).state > 0) {
       // Water flowing
       return true;
     } else {
       // Water not flowing
       return false;
     } 
     
# Définition du bouton physique Cycle adoucisseur
  - platform: gpio
    name: "esp1_cycle_adoucisseur"
    pin:
      number: GPIO14
      mode: INPUT_PULLUP
      inverted: True
# commande de la led Jaune
    on_press:
      then:
        - output.turn_on: esp1_cycle_led_jaune_output
         
    on_release:
      then:
        - output.turn_off: esp1_cycle_led_jaune_output
        

# Définition du bouton physique fuite rejet
  - platform: gpio
    name: "esp1_debit_rejet_adoucisseur"
    pin:
      number: GPIO13
      mode: INPUT_PULLUP
      inverted: True
# commande de la led rouge
    on_press:
      then:
        - output.turn_on: esp1_fuite_led_rouge_output 
    on_release:
      then:
        - output.turn_off: esp1_fuite_led_rouge_output  


# Leds  cycle et fuite (D18 et D19)
# Switch test led
light:
  - platform: binary
    name: "esp1_cycle_led_jaune_switch"
    output: esp1_cycle_led_jaune_output
  
  - platform: binary
    name: "esp1_fuite_led_rouge_switch"
    output: esp1_fuite_led_rouge_output  

# Sortie Leds GPIO 18 & 19
output:
  - id: esp1_cycle_led_jaune_output
    platform: gpio
    pin: GPIO18

  - id: esp1_fuite_led_rouge_output
    platform: gpio
    pin: GPIO19


# Transformation des secondes en jours
text_sensor:
  - platform: template
    name: "esp1 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: 60s   
    

La carte Home Assistant :

Ce qu’il reste a faire :

  • Faire fonctionner le capteur a effet hall compteur eau de ville et le placer sur arrivée d’eau.
  • Raccorder le capteur a effet hall compteur eau adoucie sur ESP (en attente des résistances et des connecteurs)
  • Faire la gestion des compteurs
  • intégrer un relais pour piloter une vanne de coupure