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 :
- Micro switch cycle adoucisseur
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) :
- timer.adoucisseur_minuteur_cycle
- timer.aspiration_timer
- timer.detassage_timer
- timer.rinsage_timer
- timer.renvoi_eau_timer
Entrée Compteur :
- counter.compteur_cycle_adoucisseur
- counter.compteur_adoucisseur_sel
- counter.compteur_debit_rejet
- counter.compteur_debit_rejet_off
- counter.compteur_cycle_adoucisseur_total
- counter.compteur_ad_volume
Entrée Calendrier (Date et/ou Heure) :
- input_datetime.heure_fin_cycle_adoucisseur
- input_datetime.heure_debut_cycle_adoucisseur
- input_datetime.jour_cycle_regeneration
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 :
- input_text.eau_regeneration_debut
- input_text.eau_regeneration_fin
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