Domotiser adoucisseur Fleck 5600 SXT avec ESP32

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éré un switch contact pour l’information de régénération.

  • Pour Alimentation, je vais récupérer 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 ça fonctionne, je verrai 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.

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.

Bonjour à tous

Voilà 2 ans que j’ai démarré ce projet et voici la solution finale retenue pour la domotisation de mon adoucisseur (Fleck 5600SXT) et relever des compteurs d’eau, gestion des alarmes.

Celle-ci est basée sur un esp32 qui gère :

le schéma :

########################
Le code pour ESP 32wroom:
########################

  • Le code ESP32 sera à adapter a vos besoins
    (Notamment pour fixer les IP et vos identifiants)
code ESP32 Gestion adoucisseur
# 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:  "Esphome-Web-xxxxxx" #!secret ap_ssid_esp1  
    password: !secret ap_password 
  #  password: !secret ap_password_esp1

captive_portal:

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

# Name device mask
substitutions:
  name: adoucisseur
  friendly_name: "Fleck"
  friendly_name1: "Sensor EF"
  friendly_name2: "Compteur EF"
  friendly_name3: "Sensor EA"
  friendly_name4: "Compteur EA"
  friendly_name5: "ESP WATER"  

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

  - id: ea_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 et adoucie
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_name1} 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);

###############
# EAU ADOUCIE #
###############

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

    on_press:
      then:
        - lambda: |-
            // increment le compteur EA puis publish mqtt
            id(ea_pulse_counter) += 1;
            id(ea_counter_pulse).publish_state(id(ea_pulse_counter));
            id(ea_counter_l).publish_state(id(ea_pulse_counter)/1);
            id(ea_counter_m3).publish_state(id(ea_pulse_counter)/1000);

###########################
##                  ADOUCISSEUR            ##  
###########################

# Définition du bouton physique Cycle adoucisseur
  - platform: gpio
    name: ${friendly_name} cycle adoucisseur
    pin:
      number: GPIO14
      mode: INPUT_PULLUP
      inverted: True
# commande de la led Cycle
    on_press:
      then:
        - output.turn_on: cycle_led_output       
    on_release:
      then:
        - output.turn_off: cycle_led_output
        
# Définition du bouton physique fuite rejet
  - platform: gpio
    name: ${friendly_name} debit rejet adoucisseur
    pin:
      number: GPIO13
      mode: INPUT_PULLUP
      inverted: True
# commande de la led Fuite
    on_press:
      then:
        - output.turn_on: fuite_led_output 
    on_release:
      then:
        - output.turn_off: fuite_led_output 

# Définition alarme trop plein adoucisseur
  - platform: gpio
    name: ${friendly_name} trop plein adoucisseur
    pin:
      number: GPIO26
      mode: INPUT_PULLUP
      inverted: True


##  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_name1} 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    

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

  - platform: pulse_meter
    name: "${friendly_name3} pulse"
    id: pulse_id_ea
    pin:
      number: GPIO33
      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_name4} counter pulse"
    id: ea_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_name4} counter l"
    id: ea_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_name4} counter m3"
    id: ea_counter_m3
    unit_of_measurement: 'm³'
    accuracy_decimals: 3  # Précision en entiers
    state_class: total_increasing
    device_class: water    

###########################
#             Sensors DHT and ADC         #
###########################

# DHT 22 (AM2301)
#  - platform: dht
#    pin: GPIO5
#    model: DHT22
#    temperature:
#      name: ${friendly_name} temperature DHT
#      id: temperature DHT
#      accuracy_decimals: 1
#    humidity:
#      name: ${friendly_name} humidity DHT
#      id: humidity DHT
#      accuracy_decimals: 1
#    update_interval: 120s

# ADC Detection xxxxx
#  - platform: adc
#    pin: GPIO17
#    name: ${friendly_name} ADC detection xxxxx
#    id: adc_detection_xxxxx    
#    update_interval: 60s
#    filters:
#      - multiply: 100.00


#############################
#     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   

 
#####################
#               LIGHT                     #
#####################
# cycle et fuite ( D18 et D19)
#light:

# Light Cycle LED
  - platform: output #binary
    name: ${friendly_name} cycle led
    output: cycle_led_output
# Light Fuite LED  
  - platform: output #binary
    name: ${friendly_name} fuite led
    output: fuite_led_output  

#######################
#                  OUTPUT                  #
#######################
## Sortie Leds GPIO 18 & 19
output:

# LED Cycle adoucisseur
  - id: cycle_led_output
    platform: gpio
    pin: GPIO18
# LED Fuite adoucisseur
  - id: fuite_led_output
    platform: gpio
    pin: GPIO19

######################
#               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               #
##################
  • Code à ajouter dans la section Sensor de ESP32 pour detection niveau de sel :
Code HC-SR04 Detection de sel
########################
#   Capteur HC-SR04    #
# Detection niveau sel # 
########################

  - platform: ultrasonic
    trigger_pin: GPIO22
    echo_pin: GPIO23
    name: ${friendly_name} Capteur niveau sel
    update_interval: 60s
    timeout: 1m
    unit_of_measurement: m
    accuracy_decimals: 2
    filters:
      filter_out: nan

############################
Le dashboard : (m.a.j: 31/10/2024)
############################

Résumé code dashboard (m.a.j: 31/10/2024)
square: false
type: grid
cards:
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        entity: binary_sensor.fleck_cycle_adoucisseur
        icon: >-
          {% if is_state(entity, 'on') and
          is_state('timer.adoucisseur_minuteur_cycle', 'active') %}
            mdi:sync
          {% elif is_state(entity, 'on') and
          is_state('timer.adoucisseur_minuteur_cycle', 'idle') %}
            mdi:sync-alert  
          {% elif is_state(entity, 'off') %}  
            mdi:water-check       
          {% endif %}
        icon_color: >-
          {% if is_state(entity, 'on') and
          is_state('timer.adoucisseur_minuteur_cycle', 'active') %}
            cyan
          {% elif is_state(entity, 'on') and
          is_state('timer.adoucisseur_minuteur_cycle', 'idle') %}
            red  
          {% elif is_state(entity, 'off') %}  
            blue       
          {% endif %}    
        primary: ADOUCISSEUR
        secondary: >-
          {% if is_state(entity, 'off') and
          is_state('binary_sensor.fleck_debit_rejet_adoucisseur', 'on') %}
            Fuite Rejet adoucisseur
          {% elif is_state(entity, 'on') and
          is_state('timer.adoucisseur_minuteur_cycle', 'idle') %}
            Fuite vanne bloquée 
          {% elif is_state(entity, 'on') and
          is_state('timer.adoucisseur_minuteur_cycle', 'active') %}
            Régéneration  
          {% elif is_state(entity, 'off') %}  
            Service       
          {% endif %}
        layout: vertical
        tap_action:
          action: none
        hold_action:
          action: none
        double_tap_action:
          action: none
      - type: custom:mushroom-template-card
        entity: binary_sensor.fleck_debit_rejet_adoucisseur
        icon: >
          {% if is_state(entity, 'on') and
          is_state('binary_sensor.fleck_cycle_adoucisseur', 'off') %}
            mdi:sync-alert
          {% elif is_state(entity, 'on') and
          is_state('timer.adoucisseur_minuteur_cycle', 'idle') %}
            mdi:sync-alert
          {% elif is_state(entity, 'on') and
          is_state('binary_sensor.fleck_cycle_adoucisseur', 'on') and
          is_state('timer.adoucisseur_minuteur_cycle', 'active') %}
            mdi:water-sync  
          {% elif is_state(entity, 'off') %}  
            mdi:water-off       
          {% endif %}
        icon_color: >-
          {% if is_state(entity, 'on') and
          is_state('binary_sensor.fleck_cycle_adoucisseur', 'off') %}
            red
          {% elif is_state(entity, 'on') and
          is_state('timer.adoucisseur_minuteur_cycle', 'idle') %}
            red
          {% elif is_state(entity, 'on') and
          is_state('binary_sensor.fleck_cycle_adoucisseur', 'on') and
          is_state('timer.adoucisseur_minuteur_cycle', 'active') %}
            orange  
          {% elif is_state(entity, 'off') %}  
            blue       
          {% endif %}   
        primary: REJET
        secondary: >-
          {% if is_state(entity, 'on') and
          is_state('binary_sensor.fleck_cycle_adoucisseur', 'off') %}
            fuite adoucisseur
          {% elif is_state(entity, 'on') and
          is_state('timer.adoucisseur_minuteur_cycle', 'idle') and
          is_state('binary_sensor.fleck_cycle_adoucisseur', 'on') %}
            Fuite Vanne Bloquée
          {% elif is_state(entity, 'on') and
          is_state('binary_sensor.fleck_cycle_adoucisseur', 'on') and
          is_state('timer.adoucisseur_minuteur_cycle', 'active') %}
            Rejet Egout  
          {% elif is_state(entity, 'off') %}  
            Pas de fuite         
          {% endif %} 
        layout: vertical
        tap_action:
          action: none
        hold_action:
          action: none
        double_tap_action:
          action: none
  - square: false
    type: grid
    cards:
      - type: custom:timer-bar-card
        entity: timer.detassage_timer
        name: BW
        invert: true
        bar_direction: rtl
        bar_width: 10%
        mushroom:
          layout: horizontal
          color: green
      - type: custom:timer-bar-card
        entity: timer.aspiration_timer
        name: ASP
        invert: true
        bar_direction: rtl
        bar_width: 10%
        mushroom:
          layout: horizontal
          color: green
    columns: 2
  - square: false
    type: grid
    cards:
      - type: custom:timer-bar-card
        entity: timer.rinsage_timer
        name: RR
        invert: true
        bar_direction: rtl
        bar_width: 10%
        mushroom:
          layout: horizontal
          color: green
      - type: custom:timer-bar-card
        entity: timer.renvoi_eau_timer
        name: RVE
        invert: true
        bar_direction: rtl
        bar_width: 10%
        mushroom:
          layout: horizontal
          color: cyan
    columns: 2
  - type: custom:timer-bar-card
    entity: timer.adoucisseur_minuteur_cycle
    name: Adoucisseur Minuteur Cycle
    invert: true
    bar_direction: rtl
    bar_width: 30%
    mushroom:
      layout: horizontal
      color: blue
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        icon: mdi:counter
        icon_color: orange
        primary: Volume Restant
        secondary: |2
            {{ states('counter.compteur_ad_volume') }} Litre(s)
        layout: horizontal
        tap_action:
          action: none
        hold_action:
          action: more-info
        double_tap_action:
          action: none
        entity: counter.compteur_ad_volume
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        icon: mdi:dishwasher-alert
        icon_color: green
        primary: Debut Cycle
        secondary: |
          {{ states('sensor.debut_cycle_adoucisseur_template') }} 
        layout: horizontal
        tap_action:
          action: none
        hold_action:
          action: more-info
        double_tap_action:
          action: none
        entity: sensor.debut_cycle_adoucisseur_template
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        icon: mdi:dishwasher-off
        icon_color: |-
          {% if is_state('binary_sensor.fleck_cycle_adoucisseur', 'on') %}
            grey
          {% elif is_state('binary_sensor.fleck_cycle_adoucisseur', 'off') %}  
            red       
          {% endif %}
        primary: Fin de Cycle
        secondary: |+
          {% if is_state('binary_sensor.fleck_cycle_adoucisseur', 'on') %}
            en cours
          {% elif is_state('binary_sensor.fleck_cycle_adoucisseur', 'off') %}  
            {{ states('sensor.fin_cycle_adoucisseur_template') }}        
          {% endif %}

        layout: horizontal
        tap_action:
          action: none
        hold_action:
          action: more-info
        double_tap_action:
          action: none
        entity: sensor.debut_cycle_adoucisseur_template
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        icon: mdi:timer-check
        icon_color: |-
          {% if is_state('binary_sensor.fleck_cycle_adoucisseur', 'on') %}
            grey
          {% elif is_state('binary_sensor.fleck_cycle_adoucisseur', 'off') %}  
            blue      
          {% endif %}
        primary: Durée Dernier Cycle
        secondary: |+
          {% if is_state('binary_sensor.fleck_cycle_adoucisseur', 'on') %}
            En cours
          {% elif is_state('binary_sensor.fleck_cycle_adoucisseur', 'off') %}  
            {{ states('sensor.duree_dernier_cycle_adoucisseur') }}      
          {% endif %}


        layout: horizontal
        tap_action:
          action: none
        hold_action:
          action: more-info
        double_tap_action:
          action: none
        entity: sensor.duree_dernier_cycle_adoucisseur
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        icon: mdi:counter
        icon_color: orange
        primary: Eau Régéneration
        secondary: |
          {% if is_state('binary_sensor.fleck_cycle_adoucisseur', 'on') %}
            En cours
          {% elif is_state('binary_sensor.fleck_cycle_adoucisseur', 'off') %}  
            {{ states('sensor.eau_totale_regeneration') }} Litre(s)     
          {% endif %}
        layout: horizontal
        tap_action:
          action: none
        hold_action:
          action: more-info
        double_tap_action:
          action: none
        entity: sensor.eau_totale_regeneration
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        icon: |-
          {% if is_state(entity, 'on') %}
            mdi:water-alert-outline  
          {% elif is_state(entity, 'off') %}  
            mdi:water-check-outline  
          {% endif %}
        icon_color: |-
          {% if is_state(entity, 'on') %}
            red  
          {% elif is_state(entity, 'off') %}  
            cyan 
          {% endif %}  
        primary: Adoucisseur Trop Plein
        secondary: |-
          {% if is_state(entity, 'on') %}
            Trop plein Debordement  
          {% elif is_state(entity, 'off') %}  
            Niveau Bac OK 
          {% endif %}
        layout: horizontal
        tap_action:
          action: none
        hold_action:
          action: more-info
        double_tap_action:
          action: none
        entity: binary_sensor.fleck_trop_plein_adoucisseur
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        icon: |-
          {% if is_state(entity, 'on') %}
            mdi:shaker-outline  
          {% elif is_state(entity, 'off') %}  
            mdi:shaker  
          {% endif %}
        icon_color: |-
          {% if is_state(entity, 'on') %}
            orange  
          {% elif is_state(entity, 'off') %}  
            green 
          {% endif %}  
        primary: Niveau Sel
        secondary: |-
          {% if is_state(entity, 'on') %}
            Sel à Remplir  
          {% elif is_state(entity, 'off') %}  
            Niveau Sel OK 
          {% endif %}  
        layout: horizontal
        tap_action:
          action: none
        hold_action:
          action: none
        double_tap_action:
          action: none
        entity: input_boolean.bac_sel_vide
        multiline_secondary: false
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        icon: mdi:arrow-expand-vertical
        icon_color: |-
          {% if (states('sensor.fleck_capteur_niveau_sel') <= '0.35') %}
              green
          {% elif (states('sensor.fleck_capteur_niveau_sel') <= '0.41') %}  
              orange
            {% else %}
              red
            {% endif %}
        primary: Niveau sel
        secondary: |2
            {{ states('sensor.fleck_capteur_niveau_sel') }} m
        layout: horizontal
        tap_action:
          action: none
        hold_action:
          action: more-info
        double_tap_action:
          action: none
        entity: sensor.fleck_capteur_niveau_sel
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        icon: mdi:counter
        icon_color: blue
        primary: E.A (L/Jour)
        secondary: |2
              {{ states('sensor.eau_adoucie_litres_jour_imp_cpt') }} Litre(s)     
        layout: horizontal
        tap_action:
          action: none
        hold_action:
          action: more-info
        double_tap_action:
          action: none
        entity: sensor.eau_adoucie_litres_jour_imp_cpt
      - type: custom:mushroom-template-card
        icon: mdi:counter
        icon_color: blue
        primary: Total E.A
        secondary: "   {{ states('sensor.ea_metres_cubes') }} M3     "
        layout: horizontal
        tap_action:
          action: none
        hold_action:
          action: more-info
        double_tap_action:
          action: none
        entity: sensor.eau_totale_regeneration
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        icon: mdi:wrench-clock
        icon_color: grey
        primary: Maintenance
        secondary: |+


        tap_action:
          action: none
        hold_action:
          action: more-info
        double_tap_action:
          action: none
        entity: input_boolean.adoucisseur_maintenance
      - type: custom:mushroom-template-card
        icon: mdi:counter
        icon_color: cyan
        primary: Total cycle
        secondary: |2+
             {{ states('counter.compteur_cycle_adoucisseur_total') }} 

        tap_action:
          action: none
        hold_action:
          action: more-info
        double_tap_action:
          action: none
        entity: counter.compteur_cycle_adoucisseur_total
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        icon: mdi:gesture-double-tap
        icon_color: grey
        primary: Reset sel
        secondary: |2+
             {{ states('counter.compteur_adoucisseur_sel') }} 

        tap_action:
          action: none
        hold_action:
          action: more-info
        double_tap_action:
          action: none
        entity: input_boolean.button_reset_compteur_sel_adoucisseur
      - type: custom:mushroom-template-card
        icon: mdi:gesture-double-tap
        icon_color: grey
        primary: reset Cycle
        secondary: "   {{ states('counter.compteur_cycle_adoucisseur') }} "
        tap_action:
          action: none
        hold_action:
          action: more-info
        double_tap_action:
          action: none
        entity: input_boolean.button_reset_compteur_cycle_adoucisseur
columns: 1
title: Adoucisseur F5625SXT

GESTION SOUS HOME ASSISTANT

##################
AUTOMATISME HA :
##################

Gestion des cycles
alias: Adoucisseur gestion des cycles
description: ""
trigger:
  - platform: state
    entity_id:
      - counter.compteur_debit_rejet
    to: "1"
    id: cpt rejet on 1
  - platform: state
    entity_id:
      - counter.compteur_debit_rejet
    to: "2"
    id: cpt rejet on 2
  - platform: state
    entity_id:
      - counter.compteur_debit_rejet
    to: "3"
    id: cpt rejet on 3
  - platform: state
    entity_id:
      - counter.compteur_debit_rejet_off
    to: "3"
    id: cpt rejet off 3
  - platform: state
    entity_id:
      - binary_sensor.fleck_cycle_adoucisseur
    from: "off"
    to: "on"
    id: Cycle AD ON
  - platform: state
    entity_id:
      - binary_sensor.fleck_cycle_adoucisseur
    from: "on"
    to: "off"
    id: Cycle AD OFF
condition: []
action:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - cpt rejet on 1
        sequence:
          - service: input_select.select_option
            target:
              entity_id: input_select.adoucisseur_liste
            data:
              option: Detassage
          - service: input_boolean.turn_on
            target:
              entity_id: input_boolean.cycle_dettasage
            data: {}
          - service: timer.start
            target:
              entity_id: timer.detassage_timer
            data: {}
          - service: notify.telegram_pascal_ha
            metadata: {}
            data:
              message: "♻ Adoucisseur :  Cycle Détassage "
      - conditions:
          - condition: trigger
            id:
              - cpt rejet on 2
        sequence:
          - service: input_select.select_option
            target:
              entity_id: input_select.adoucisseur_liste
            data:
              option: Aspiration
          - service: input_boolean.turn_off
            target:
              entity_id:
                - input_boolean.cycle_dettasage
            data: {}
          - service: timer.finish
            target:
              entity_id:
                - timer.detassage_timer
            data: {}
          - service: input_boolean.turn_on
            target:
              entity_id:
                - input_boolean.cycle_aspiration
            data: {}
          - service: timer.start
            target:
              entity_id:
                - timer.aspiration_timer
            data: {}
          - service: notify.telegram_pascal_ha
            metadata: {}
            data:
              message: "♻ Adoucisseur :  Cycle Aspiration"
      - conditions:
          - condition: trigger
            id:
              - cpt rejet on 3
        sequence:
          - service: input_select.select_option
            target:
              entity_id: input_select.adoucisseur_liste
            data:
              option: Rinsage
          - service: input_boolean.turn_off
            target:
              entity_id:
                - input_boolean.cycle_aspiration
            data: {}
          - service: timer.finish
            target:
              entity_id:
                - timer.aspiration_timer
            data: {}
          - service: input_boolean.turn_on
            target:
              entity_id:
                - input_boolean.cycle_rinsage
            data: {}
          - service: timer.start
            target:
              entity_id:
                - timer.rinsage_timer
            data: {}
          - service: notify.telegram_pascal_ha
            metadata: {}
            data:
              message: "♻ Adoucisseur :  Cycle Rinçage"
      - conditions:
          - condition: trigger
            id:
              - cpt rejet off 3
        sequence:
          - service: input_select.select_option
            target:
              entity_id: input_select.adoucisseur_liste
            data:
              option: Renvoi d'eau
          - service: input_boolean.turn_off
            target:
              entity_id:
                - input_boolean.cycle_rinsage
            data: {}
          - service: timer.finish
            target:
              entity_id:
                - timer.rinsage_timer
            data: {}
          - service: input_boolean.turn_on
            target:
              entity_id:
                - input_boolean.cycle_rve
            data: {}
          - service: timer.start
            target:
              entity_id:
                - timer.renvoi_eau_timer
            data: {}
          - service: notify.telegram_pascal_ha
            metadata: {}
            data:
              message: "♻ Adoucisseur :  Cycle Renvoi d’eau "
  - choose:
      - conditions:
          - condition: trigger
            id:
              - Cycle AD ON
        sequence:
          - service: input_boolean.turn_off
            target:
              entity_id:
                - input_boolean.cycle_service
            data: {}
          - service: timer.start
            target:
              entity_id:
                - timer.adoucisseur_minuteur_cycle
            data: {}
          - service: notify.telegram_pascal_ha
            metadata: {}
            data:
              message: "♻ Adoucisseur :  Régénération "
          - service: input_text.set_value
            target:
              entity_id: input_text.eau_regeneration_debut
            data:
              value: "{{ states('sensor.totalisateur_ef_m3')|float(0) }}"
      - conditions:
          - condition: trigger
            id:
              - Cycle AD OFF
        sequence:
          - service: input_select.select_option
            target:
              entity_id: input_select.adoucisseur_liste
            data:
              option: Service
          - service: input_boolean.turn_off
            target:
              entity_id:
                - input_boolean.cycle_dettasage
                - input_boolean.cycle_aspiration
                - input_boolean.cycle_rinsage
                - input_boolean.cycle_rve
            data: {}
          - service: timer.finish
            target:
              entity_id:
                - timer.detassage_timer
                - timer.aspiration_timer
                - timer.rinsage_timer
                - timer.renvoi_eau_timer
                - timer.adoucisseur_minuteur_cycle
            data: {}
          - service: timer.cancel
            target:
              entity_id:
                - timer.detassage_timer
                - timer.aspiration_timer
                - timer.rinsage_timer
                - timer.renvoi_eau_timer
            data: {}
          - service: input_boolean.turn_on
            target:
              entity_id:
                - input_boolean.cycle_service
            data: {}
          - service: notify.telegram_pascal_ha
            metadata: {}
            data:
              message: "♻ Adoucisseur :  Cycle Service"
          - service: input_text.set_value
            target:
              entity_id: input_text.eau_regeneration_fin
            data:
              value: >-
                {% set vol = (states('sensor.totalisateur_ef_m3')|float(0) -
                states('input_text.eau_regeneration_debut')|float(0)) * 1000 %}
                {%- if vol < 100 -%}
                  {{ vol | round(2) }}
                {%- else -%}
                  {{ vol | round(0) }}
                {%- endif -%}        
mode: single


Gestion compteur fuite rejet
alias: Adoucisseur gestion des compteurs
description: ""
trigger:
  - platform: state
    entity_id:
      - binary_sensor.fleck_debit_rejet_adoucisseur
    from: "off"
    to: "on"
    id: débit rejet ON
  - platform: state
    entity_id:
      - binary_sensor.fleck_debit_rejet_adoucisseur
    from: "on"
    to: "off"
    id: débit rejet OFF
  - platform: state
    entity_id:
      - binary_sensor.fleck_cycle_adoucisseur
    from: "on"
    to: "off"
    id: Cycle AD OFF
  - platform: state
    entity_id:
      - binary_sensor.fleck_cycle_adoucisseur
    from: "off"
    to: "on"
    id: Cycle AD ON
  - platform: state
    entity_id:
      - binary_sensor.sensor_ea_counter_state
    from: "off"
    to: "on"
    id: Compteur state EA
  - platform: numeric_state
    entity_id:
      - counter.compteur_ad_volume
    below: 20
    id: Compteur AD inferieur a 20
condition: []
action:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - débit rejet OFF
        sequence:
          - service: counter.increment
            data: {}
            target:
              entity_id: counter.compteur_debit_rejet_off
      - conditions:
          - condition: trigger
            id:
              - débit rejet ON
        sequence:
          - service: counter.increment
            target:
              entity_id: counter.compteur_debit_rejet
            data: {}
  - choose:
      - conditions:
          - condition: trigger
            id:
              - Compteur state EA
          - condition: state
            entity_id: binary_sensor.fleck_cycle_adoucisseur
            state: "off"
        sequence:
          - service: counter.decrement
            target:
              entity_id: counter.compteur_ad_volume
            data: {}
  - choose:
      - conditions:
          - condition: trigger
            id:
              - Cycle AD OFF
        sequence:
          - service: counter.reset
            target:
              entity_id:
                - counter.compteur_debit_rejet
                - counter.compteur_debit_rejet_off
                - counter.compteur_ad_volume
            data: {}
      - conditions:
          - condition: trigger
            id:
              - Cycle AD ON
          - condition: state
            entity_id: input_boolean.depannage_adoucisseur
            state: "off"
        sequence:
          - service: counter.increment
            target:
              entity_id:
                - counter.compteur_cycle_adoucisseur
                - counter.compteur_cycle_adoucisseur_total
                - counter.compteur_adoucisseur_sel
            data: {}
mode: single

Gestion niveau de sel
alias: Adoucisseur sel, maintenance, reset.
description: ""
trigger:
  - platform: state
    entity_id:
      - input_boolean.button_reset_compteur_sel_adoucisseur
    to: "on"
    id: Press reset sel
    from: "off"
  - platform: state
    entity_id:
      - input_boolean.button_reset_compteur_cycle_adoucisseur
    to: "on"
    id: Press reset minuteur cycle
    from: "off"
  - platform: numeric_state
    entity_id:
      - counter.compteur_adoucisseur_sel
    below: 1
    id: Cpt sel = 0
  - platform: numeric_state
    entity_id:
      - counter.compteur_adoucisseur_sel
    above: 9
    below: 11
    id: Cpt sel = 10
  - platform: numeric_state
    entity_id:
      - counter.compteur_adoucisseur_sel
    above: 24
    below: 26
    id: Cpt sel = 25
  - platform: numeric_state
    entity_id:
      - counter.compteur_adoucisseur_sel
    above: 29
    below: 31
    id: Cpt sel = 31
  - platform: numeric_state
    entity_id:
      - counter.compteur_cycle_adoucisseur
    above: 29
    below: 31
    id: Cpt cycle = 30
  - platform: numeric_state
    entity_id:
      - counter.compteur_cycle_adoucisseur
    above: 34
    below: 36
    id: Cpt cycle = 35
condition: []
action:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - Press reset sel
        sequence:
          - service: counter.reset
            target:
              entity_id: counter.compteur_adoucisseur_sel
            data: {}
      - conditions:
          - condition: trigger
            id:
              - Press reset minuteur cycle
        sequence:
          - service: timer.cancel
            target:
              entity_id: timer.adoucisseur_minuteur_cycle
            data: {}
  - choose:
      - conditions:
          - condition: trigger
            id:
              - Cpt sel = 0
        sequence:
          - service: input_boolean.turn_off
            target:
              entity_id:
                - input_boolean.bac_sel_vide
                - input_boolean.bac_sel_remplir
            data: {}
      - conditions:
          - condition: trigger
            id:
              - Cpt sel = 10
        sequence:
          - service: input_boolean.turn_on
            target:
              entity_id: input_boolean.bac_sel_remplir
            data: {}
      - conditions:
          - condition: trigger
            id:
              - Cpt sel = 25
        sequence:
          - service: input_boolean.turn_on
            target:
              entity_id: input_boolean.bac_sel_vide
            data: {}
      - conditions:
          - condition: trigger
            id:
              - Cpt sel = 31
        sequence:
          - service: counter.reset
            target:
              entity_id: counter.compteur_adoucisseur_sel
            data: {}
  - choose:
      - conditions:
          - condition: trigger
            id:
              - Cpt cycle = 30
        sequence:
          - service: input_boolean.turn_on
            target:
              entity_id: input_boolean.adoucisseur_maintenance
            data: {}
      - conditions:
          - condition: trigger
            id:
              - Cpt cycle = 35
        sequence:
          - service: counter.reset
            target:
              entity_id: counter.compteur_cycle_adoucisseur
            data: {}
mode: single

Gestion des Alarmes Adoucisseur
alias: Adoucisseur Gestion Alarmes
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - counter.compteur_ad_volume
    below: 20
    id: Compteur AD inferieur a 20
  - platform: state
    entity_id:
      - binary_sensor.fleck_cycle_adoucisseur
    from: "on"
    to: "off"
    id: Cycle AD ON-OFF
  - platform: state
    entity_id:
      - binary_sensor.fleck_cycle_adoucisseur
    id: Cycle AD OFF
    to: "off"
  - platform: numeric_state
    entity_id:
      - timer.adoucisseur_minuteur_cycle
    above: 95
    id: Temps cycle >95
  - platform: state
    entity_id:
      - input_boolean.bac_sel_vide
    to: "on"
    from: "off"
    id: Bac a sel vide
  - platform: state
    entity_id:
      - input_boolean.bac_sel_remplir
    to: "on"
    from: "off"
    id: Bac a remplir
  - platform: state
    entity_id:
      - input_boolean.adoucisseur_maintenance
    from: "off"
    to: "on"
    id: Maintenance AD
  - platform: state
    entity_id:
      - binary_sensor.fleck_trop_plein_adoucisseur
    to: "on"
    id: trop plein alarme active
    from: "off"
    for:
      hours: 0
      minutes: 1
      seconds: 0
  - platform: state
    entity_id:
      - binary_sensor.fleck_trop_plein_adoucisseur
    to: "off"
    id: trop plein alarme desactive
    from: "on"
    for:
      hours: 0
      minutes: 0
      seconds: 10
condition: []
action:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - Compteur AD inferieur a 20
        sequence:
          - metadata: {}
            data:
              message: "⚠️ Adoucisseur :  Fin de Capacité "
            action: notify.telegram_pascal_ha
    alias: Alarme Fin de capacité
  - alias: Alarme Fuite egout adoucisseur
    choose:
      - conditions:
          - condition: trigger
            id:
              - Cycle AD OFF
              - Cycle AD ON-OFF
          - condition: state
            entity_id: binary_sensor.fleck_debit_rejet_adoucisseur
            state: "on"
        sequence:
          - metadata: {}
            data:
              message: "⚠️ Adoucisseur :  Fuite Rejet Adoucisseur 🚨"
            action: notify.telegram_pascal_ha
  - alias: Alarme Vanne Bloqué / Fuite
    choose:
      - conditions:
          - condition: trigger
            id:
              - Temps cycle >95
        sequence:
          - if:
              - condition: and
                conditions:
                  - condition: state
                    entity_id: binary_sensor.fleck_cycle_adoucisseur
                    state: "on"
              - condition: state
                entity_id: binary_sensor.fleck_debit_rejet_adoucisseur
                state: "on"
            then:
              - metadata: {}
                data:
                  message: "⚠️ Adoucisseur : Vanne Bloqué, Fuite Rejet Adoucisseur 🚨"
                action: notify.telegram_pascal_ha
          - if:
              - condition: state
                entity_id: binary_sensor.fleck_cycle_adoucisseur
                state: "on"
              - condition: and
                conditions:
                  - condition: state
                    entity_id: binary_sensor.fleck_debit_rejet_adoucisseur
                    state: "off"
            then:
              - metadata: {}
                data:
                  message: "⚠️ Adoucisseur : Vanne Bloqué 🚨"
                action: notify.telegram_pascal_ha
  - choose:
      - conditions:
          - condition: trigger
            id:
              - Bac a sel vide
        sequence:
          - metadata: {}
            data:
              message: "⚠️ Adoucisseur : Bac vide !"
            action: notify.telegram_pascal_ha
      - conditions:
          - condition: trigger
            id:
              - Bac a remplir
        sequence:
          - metadata: {}
            data:
              message: "⚠️ Adoucisseur : Bac à remplir !"
            action: notify.telegram_pascal_ha
      - conditions:
          - condition: trigger
            id:
              - Maintenance AD
        sequence:
          - metadata: {}
            data:
              message: "🛠 Adoucisseur : Maintenance à faire !"
            action: notify.telegram_pascal_ha
    alias: Alarme Bac vide / Maintenance
  - alias: Fuite trop plein alarme
    choose:
      - conditions:
          - condition: trigger
            id:
              - trop plein alarme active
          - condition: state
            entity_id: input_boolean.trop_plein_adoucisseur
            state: "off"
        sequence:
          - metadata: {}
            data:
              message: 💧 Fuite trop plein adoucisseur 🚨
            action: notify.telegram_pascal_ha
          - delay:
              hours: 0
              minutes: 0
              seconds: 2
              milliseconds: 0
          - action: input_boolean.turn_on
            target:
              entity_id: input_boolean.trop_plein_adoucisseur
            data: {}
      - conditions:
          - condition: trigger
            id:
              - trop plein alarme desactive
        sequence:
          - action: input_boolean.turn_off
            target:
              entity_id: input_boolean.trop_plein_adoucisseur
            data: {}
mode: single


Reset des compteurs sel et cycle
alias: Reset Compteur sel et cycle Adoucisseur
description: |-
  Reset du compteur sel
  Reset du compteur cycle
trigger:
  - platform: state
    entity_id:
      - input_boolean.button_reset_compteur_sel_adoucisseur
    from: "off"
    to: "on"
    id: boutton reset compteur sel
  - platform: state
    entity_id:
      - input_boolean.button_reset_compteur_cycle_adoucisseur
    from: "off"
    to: "on"
    id: Boutton reset compteur cycle
condition: []
action:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - boutton reset compteur sel
        sequence:
          - service: counter.reset
            target:
              entity_id: counter.compteur_adoucisseur_sel
            data: {}
  - choose:
      - conditions:
          - condition: trigger
            id:
              - Boutton reset compteur cycle
        sequence:
          - service: counter.reset
            target:
              entity_id:
                - counter.compteur_cycle_adoucisseur
            data: {}
mode: single

Horodatage cycle adoucisseur
alias: horodatage cycle adoucisseur
description: |-
  Heure départ Cycle adoucisseur
  Heure fin de cycle adoucisseur
  Jour cycle adoucisseur
trigger:
  - platform: state
    entity_id:
      - binary_sensor.fleck_cycle_adoucisseur
    from: "off"
    to: "on"
    id: cycle adoucisseur active
  - platform: state
    entity_id:
      - binary_sensor.fleck_cycle_adoucisseur
    from: "on"
    to: "off"
    id: cycle adoucisseur desactive
condition: []
action:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - cycle adoucisseur active
        sequence:
          - data:
              datetime: "{{ now() }}"
            target:
              entity_id: input_datetime.heure_debut_cycle_adoucisseur
            action: input_datetime.set_datetime
          - data:
              datetime: "{{ now() }}"
            target:
              entity_id: input_datetime.jour_cycle_regeneration
            action: input_datetime.set_datetime
  - choose:
      - conditions:
          - condition: trigger
            id:
              - cycle adoucisseur desactive
        sequence: []
  - data:
      datetime: "{{ now() }}"
    target:
      entity_id: input_datetime.heure_fin_cycle_adoucisseur
    action: input_datetime.set_datetime
  - data:
      title: ⚠️ Adoucisseur :Fin de cycle 🧺
      message: >
        {%- set time =
        ((state_attr('automation.heure_arret_cycle_adoucisseur','last_triggered'))
        -
        (state_attr('automation.heure_depart_cycle_adoucisseur','last_triggered'))).seconds
        -%} {%- set minutes = ((time % 3600) / 60) | round | int -%} {%- set
        hours = ((time % 86400) / 3600) | int -%} {{ now().strftime("%d/%m/%Y")
        }} 

        🔄 debut de cycle : {{
        ((state_attr('automation.heure_depart_cycle_adoucisseur','last_triggered'))
        | as_local).strftime("%Hh%M") }} 

        🔃 Fin de cycle : {{
        (state_attr('automation.heure_arret_cycle_adoucisseur','last_triggered')|
        as_local).strftime("%Hh%M") }} 

        🕐 Durée du cycle {{ '{:01}h{:02}m'.format(hours, minutes) }} 
    action: notify.telegram_pascal_ha
mode: single

#####################
Liste des entrées à créer :
#####################

Entrée Timer (Minuteur) :

Entrée Compteur :

Entrée Calendrier (Date et/ou Heure) :

Entrée Logique (Interrupteur) :

  • input_boolean.cycle_detassage
  • input_boolean.cycle_aspiration
  • input_boolean.cycle_rinsage
  • input_boolean.cycle_service
  • input_boolean.cycle_rve
  • input_boolean.bac_sel_remplir
  • input_boolean.bac_sel_vide
  • input_boolean.adoucisseur_maintenance
  • input_boolean.depannage_adoucisseur
  • input_boolean.button_reset_compteur_cycle_adoucisseur
  • input_boolean.button_reset_compteur_sel_adoucisseur

Entrée Saisie Texte :

Pour que les automastimes fonctionnent, il faut créer les entrées ci dessus :

Les temps des timer Detassage,Aspiration,Rincage,renvoi d’eau,temps de cycles sont à regler en fonction du reglages de votre adoucisseur. Si il vous manque des informations pour les entrées. Dites le moi, je les rajouterai.

############################
Les Template (m.a.j : 15/08/2024) :
############################
A creer dans entrée / Template / modele de capteur

  • Duree dernier cycle adoucisseur :
Duree dernier cycle adoucisseur
{% if is_state('binary_sensor.fleck_cycle_adoucisseur', 'on') %}
        En cours
      {% else %}
        {% set var_debut_cycle_adoucisseur = as_timestamp(states('input_datetime.heure_debut_cycle_adoucisseur')) -%}
        {%- set var_fin_cycle_adoucisseur = as_timestamp(states('input_datetime.heure_fin_cycle_adoucisseur')) -%}
        {%- set var_duree_derniere_cycle_adoucisseur = as_datetime(var_fin_cycle_adoucisseur) - as_datetime(var_debut_cycle_adoucisseur) -%}
        {{ var_duree_derniere_cycle_adoucisseur }}
      {% endif %}
  • Eau totale regeneration :
Eau totale regeneration
{% if is_state('binary_sensor.fleck_cycle_adoucisseur', 'on') %}
        En cours
      {% else %}
          {% set eau_debut = states('input_text.eau_regeneration_debut') | float %}
          {% set eau_fin = states('input_text.eau_regeneration_fin') | float %}

          {{ ((eau_debut - eau_fin) *1 ) | round(0, default=0) }}      
      {% endif %}
  • Debut cycle adoucisseur template :
Debut cycle adoucisseur template
{%- set months = ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"] %}
        {%- set days = ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"]  %}
        {%- set days_short = ["Lun.", "Mar.", "Mer.", "Jeu.", "Ven.", "Sam.", "Dim."]  %}
        {%- set months_short = ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juill.", "août", "sept.", "oct.", "nov.", "déc."] %}
        {{ days_short[as_datetime(states('input_datetime.heure_debut_cycle_adoucisseur')).weekday()] + ' ' + as_datetime(states('input_datetime.heure_debut_cycle_adoucisseur')).day | string + ' ' + months_short[as_datetime(states('input_datetime.heure_debut_cycle_adoucisseur')).month-1] + ' ' + (as_datetime(states('input_datetime.heure_debut_cycle_adoucisseur'))).strftime("à %H:%M") }}
  • Fin cycle adoucisseur template :
Fin cycle adoucisseur template
{% if is_state('binary_sensor.fleck_cycle_adoucisseur', 'on') %}
        En cours
      {% else %}
        {%- set months = ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"] %}
        {%- set days = ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"]  %}
        {%- set days_short = ["Lun.", "Mar.", "Mer.", "Jeu.", "Ven.", "Sam.", "Dim."]  %}
        {%- set months_short = ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juill.", "août", "sept.", "oct.", "nov.", "déc."] %}
        {{ days_short[as_datetime(states('input_datetime.heure_fin_cycle_adoucisseur')).weekday()] + ' ' + as_datetime(states('input_datetime.heure_fin_cycle_adoucisseur')).day | string + ' ' + months_short[as_datetime(states('input_datetime.heure_fin_cycle_adoucisseur')).month-1] + ' ' + (as_datetime(states('input_datetime.heure_fin_cycle_adoucisseur'))).strftime("à %H:%M") }}
      {% endif %}

###########
Conclusion
###########
Si toutefois, il vous manque des informations (laisser un message)

Voila pour ce projet qui est en cours depuis plus de 2 ans , je suis partie sur diverse solution que j’ai modifié et améliorée au cours du temps.

Il me reste à améliorer la detection de niveau de sel avec capteur à Ultra son, Celle ci est en cours de realisation (partie ESP). La partie integration à HA n’est pas encore realisé.

Merci à tous ceux qui m’ont apporté leur aide.

Mise à jour 31_10_2024

3 « J'aime »

Mise à jour du projet (24 juillet 2024)

  • Ajout de la gestion sous HA
  • Ajout anti-débordement bac à Saumur
2 « J'aime »

Mise à jour du projet (15 aout 2024)

  • Ajout de la gestion horodatage sous HA
  • Début et fin de cycle / temps de régénération
  • Ajout des liens matériels

Mise à jour du projet (31 octobre 2024)

  • Ajout du detecteur de niveau de sel (HC-SR04)