Domotiser adoucisseur Fleck 5600 SXT avec ESP32

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
{% 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
{% 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
{%- 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
{% 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)

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

Mise à jour 31_10_2024

5 « J'aime »