Last active
April 3, 2025 18:58
-
-
Save mbo18/decd3fed5d7dec5a19358cdddf778986 to your computer and use it in GitHub Desktop.
Blueprint de gestion de la filtration de la piscine
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
blueprint: | |
name: "Gestion filtration piscine" | |
description: "Gestion automatique de la filtration/pompe de la piscine" | |
domain: automation | |
homeassistant: | |
min_version: 2024.6.0 | |
input: | |
temperature_piscine: | |
name: "Capteur de température de la piscine" | |
description: "La température permet de calculer la durée de filtration" | |
selector: | |
entity: | |
filter: | |
domain: sensor | |
device_class: temperature | |
multiple: false | |
switch_pompe: | |
name: "Entité de contrôle de la pompe" | |
description: "Pour pouvoir allumer et éteindre la pompe selon les heures calculées de début et fin de filtration" | |
selector: | |
entity: | |
filter: | |
domain: | |
- switch | |
- light | |
multiple: false | |
bouton_reset: | |
name: "Bouton de reset du temps de filtration" | |
description: "Permet de (re)lancer le calcul de la durée et des horaires de filtration" | |
selector: | |
entity: | |
filter: | |
domain: input_button | |
multiple: false | |
parametres_generaux: | |
name: "Paramètres généraux" | |
icon: mdi:cog | |
input: | |
mode_filtration: | |
name: "Mode de filtration de la piscine" | |
description: > | |
Courbe : Calcul de la durée selon une courbe en fonction de la température de la piscine | |
Hivernage : Fait marcher la pompe 3h par jour si la température de l'eau est inférieure ou égale 10°C, 24h si la température est en dessous de la température hors gel et le mode hors gel est activé. Au dessus de 10°C, le temps de filtration est égal à la température de l'eau divisée par 3. | |
Automatique : Combine le mode Courbe et le mode Hivernage afin de ne pas avoir à changer de mode au cours de l'année. Le mode hivernage s'active dès que l'eau passe en dessous de la température configurée | |
Forcé : Force le fonctionnement de la pompe | |
Inactif : Coupe la pompe et la gestion de la filtration | |
default: "Automatique" | |
selector: | |
select: | |
options: | |
- "Courbe" | |
- "Hivernage" | |
- "Automatique" | |
- "Forcé" | |
- "Inactif" | |
ajustement: | |
name: "Coefficient d'ajustement du temps de filtration" | |
description: "Permet d'influer à la baisse ou à la hausse le temps de filtration pour l'adapter à vos besoins" | |
default: 100 | |
selector: | |
number: | |
min: 30 | |
max: 170 | |
step: 5 | |
unit_of_measurement: "%" | |
parametres_mode_courbe: | |
name: "Paramètres du mode Courbe" | |
icon: mdi:refresh-auto | |
input: | |
heure_pivot: | |
name: "Heure pivot de filtration" | |
description: "Heure autour de laquelle les horaires de filtration sont calculés" | |
default: "12:00:00" | |
selector: | |
time: | |
duree_coupure: | |
name: "Durée de coupure de la filtration" | |
description: "Permet de définir une pause dans la filtration autour de l'heure pivot" | |
default: 0 | |
selector: | |
number: | |
min: 0 | |
max: 960 | |
step: 2 | |
unit_of_measurement: min | |
mode: slider | |
parametres_mode_hiver: | |
name: "Paramètres du mode Hivernage" | |
icon: mdi:snowflake | |
input: | |
heure_hivernage: | |
name: "Heure pivot de filtration en hivernage" | |
description: "Heure autour de laquelle les horaires de filtration sont calculés en hivernage" | |
default: "05:00:00" | |
selector: | |
time: | |
duree_coupure_hiver: | |
name: "Durée de coupure de la filtration" | |
description: "Permet de définir une pause dans la filtration autour de l'heure pivot" | |
default: 0 | |
selector: | |
number: | |
min: 0 | |
max: 960 | |
step: 2 | |
unit_of_measurement: min | |
mode: slider | |
activation_hors_gel: | |
name: "Mode hors gel" | |
description: "En mode hors gel, la filtration est permanente si la température de la piscine est en dessous de la température hors gel" | |
default: "Activé" | |
selector: | |
select: | |
options: | |
- "Activé" | |
- "Désactivé" | |
temperature_hors_gel: | |
name: "Température hors gel" | |
description: "En dessous de cette température la filtration est permanente" | |
default: 1 | |
selector: | |
number: | |
min: -5 | |
max: 5 | |
step: 1 | |
unit_of_measurement: °C | |
mode: slider | |
parametres_mode_automatique: | |
name: "Paramètres du mode Automatique" | |
icon: mdi:refresh-auto | |
input: | |
temp_passage_hiver: | |
name: "Température de déclenchement du mode Hivernage" | |
description: "En dessous de cette température, activation du mode Hivernage" | |
default: 15 | |
selector: | |
number: | |
min: 0 | |
max: 20 | |
step: 1 | |
unit_of_measurement: °C | |
mode: slider | |
entites_pour_calcul: | |
name: "Entités pour stocker les données du calcul" | |
icon: mdi:database | |
input: | |
duree_filtration: | |
name: "Durée de filtration de la piscine" | |
selector: | |
entity: | |
filter: | |
domain: input_number | |
multiple: false | |
heure_debut_filtration_1_piscine: | |
name: "Heure début 1ère période de filtration" | |
selector: | |
entity: | |
filter: | |
domain: input_datetime | |
multiple: false | |
heure_fin_filtration_1_piscine: | |
name: "Heure fin 1ère période de filtration" | |
selector: | |
entity: | |
filter: | |
domain: input_datetime | |
multiple: false | |
heure_debut_filtration_2_piscine: | |
name: "Heure début 2ième période de filtration" | |
selector: | |
entity: | |
filter: | |
domain: input_datetime | |
multiple: false | |
heure_fin_filtration_2_piscine: | |
name: "Heure fin 2ième période de filtration" | |
selector: | |
entity: | |
filter: | |
domain: input_datetime | |
multiple: false | |
mode: single | |
max_exceeded: silent | |
variables: | |
temp_piscine: !input temperature_piscine | |
mode_filtration: !input mode_filtration | |
coef: !input ajustement | |
activation_hors_gel: !input activation_hors_gel | |
temp_hors_gel: !input temperature_hors_gel | |
duree_coupure: !input duree_coupure | |
duree_coupure_hiver: !input duree_coupure_hiver | |
heure_pivot: !input heure_pivot | |
heure_pivot_hiver: !input heure_hivernage | |
temp_passage_hiver: !input temp_passage_hiver | |
duree_de_filtration_courbe: >- | |
{# Pour assurer un temps minimum de filtration la temperature de calcul est forcée a 10°C #} | |
{% set temp = max(states(temp_piscine)|float(10), 10) %} | |
{# y = (0.00335 * temperature^3) + (-0.14953 * temperature^2) + (2.43489 * temperature) -10.72859 #} | |
{% set a = 0.00335 * coef / 100 %} | |
{% set b = -0.14953 * coef / 100 %} | |
{% set c = 2.43489 * coef / 100 %} | |
{% set d = -10.72859 * coef / 100 %} | |
{% set hours = (a * temp**3) + (b * temp**2) + (c * temp) + d %} | |
{% set minutes = (hours * 60)|round(0) %} | |
{{ min(minutes, 1440) }} | |
duree_de_filtration_hivernage: >- | |
{% set temp = states(temp_piscine)|float(10) %} | |
{% set min_duree = 240 %} | |
{% set max_duree = 1440 %} | |
{% if activation_hors_gel == 'Activé' and temp <= temp_hors_gel %} | |
{{ max_duree }} | |
{% elif temp < 10 %} | |
{{ min_duree }} | |
{% else %} | |
{{ ((temp / 3) * 60)|round(0) }} | |
{% endif %} | |
duree_de_filtration_automatique: >- | |
{% set temp = states(temp_piscine)|float(10) %} | |
{% set min_duree = 240 %} | |
{% set max_duree = 1440 %} | |
{% if activation_hors_gel == 'Activé' and temp <= temp_hors_gel %} | |
{{ max_duree }} | |
{% elif temp < 10 %} | |
{{ min_duree }} | |
{% elif temp < temp_passage_hiver %} | |
{{ ((temp / 3) * 60)|round(0) }} | |
{% else %} | |
{% set a = 0.00335 * coef / 100 %} | |
{% set b = -0.14953 * coef / 100 %} | |
{% set c = 2.43489 * coef / 100 %} | |
{% set d = -10.72859 * coef / 100 %} | |
{% set hours = (a * temp**3) + (b * temp**2) + (c * temp) + d %} | |
{% set minutes = (hours * 60)|round(0) %} | |
{{ min(minutes, 1440) }} | |
{% endif %} | |
trigger: | |
- platform: time | |
at: !input heure_debut_filtration_1_piscine | |
id: "1" | |
- platform: time | |
at: !input heure_fin_filtration_1_piscine | |
id: "2" | |
- platform: time | |
at: !input heure_debut_filtration_2_piscine | |
id: "3" | |
- platform: time | |
at: !input heure_fin_filtration_2_piscine | |
id: "4" | |
- platform: state | |
entity_id: !input bouton_reset | |
id: "5" | |
action: | |
# Calcul des heures de début et fin des périodes | |
- if: | |
- or: | |
- condition: trigger # Si fin de la 2nd période | |
id: "4" | |
- condition: trigger # Si reset | |
id: "5" | |
then: | |
- choose: | |
# mode Courbe | |
- conditions: | |
- "{{ mode_filtration == 'Courbe' }}" | |
sequence: | |
- service: input_number.set_value | |
target: | |
entity_id: !input duree_filtration | |
data: | |
value: "{{ duree_de_filtration_courbe }}" | |
- service: input_datetime.set_datetime | |
target: | |
entity_id: !input heure_debut_filtration_1_piscine | |
data: | |
datetime: >- | |
{% set time = today_at(heure_pivot) - timedelta(minutes=duree_de_filtration_courbe/2) - timedelta(minutes=duree_coupure/2) %} | |
{% if time < today_at("00:00:00") %} | |
{{ today_at("00:01:00") }} | |
{% else %} | |
{{ time }} | |
{% endif %} | |
- service: input_datetime.set_datetime | |
target: | |
entity_id: !input heure_fin_filtration_1_piscine | |
data: | |
datetime: "{{ today_at(heure_pivot) - timedelta(minutes=duree_coupure/2) }}" | |
- service: input_datetime.set_datetime | |
target: | |
entity_id: !input heure_debut_filtration_2_piscine | |
data: | |
datetime: "{{ today_at(heure_pivot) + timedelta(minutes=duree_coupure/2) }}" | |
- service: input_datetime.set_datetime | |
target: | |
entity_id: !input heure_fin_filtration_2_piscine | |
data: | |
datetime: >- | |
{% set time = today_at(heure_pivot) + timedelta(minutes=duree_de_filtration_courbe/2) + timedelta(minutes=duree_coupure/2) %} | |
{% if time > today_at("23:59:00") %} | |
{{ today_at("23:59:00") }} | |
{% else %} | |
{{ time }} | |
{% endif %} | |
# mode Automatique | |
- conditions: | |
- "{{ mode_filtration == 'Automatique' }}" | |
sequence: | |
- service: input_number.set_value | |
target: | |
entity_id: !input duree_filtration | |
data: | |
value: "{{ duree_de_filtration_automatique }}" | |
- service: input_datetime.set_datetime | |
target: | |
entity_id: !input heure_debut_filtration_1_piscine | |
data: | |
datetime: >- | |
{% if states(temp_piscine)|float >= temp_passage_hiver %} | |
{% set time = today_at(heure_pivot) - timedelta(minutes=duree_de_filtration_automatique/2) - timedelta(minutes=duree_coupure/2) %} | |
{% else %} | |
{% set time = today_at(heure_pivot_hiver) - timedelta(minutes=duree_de_filtration_automatique/2) - timedelta(minutes=duree_coupure_hiver/2) %} | |
{% endif %} | |
{% if time < today_at("00:00:00") or duree_de_filtration_automatique == 1440 %} | |
{{ today_at("00:01:00") }} | |
{% else %} | |
{{ time }} | |
{% endif %} | |
- service: input_datetime.set_datetime | |
target: | |
entity_id: !input heure_fin_filtration_1_piscine | |
data: | |
datetime: >- | |
{% if states(temp_piscine)|float >= temp_passage_hiver %} | |
{{ today_at(heure_pivot) - timedelta(minutes=duree_coupure/2) }} | |
{% else %} | |
{{ today_at(heure_pivot_hiver) - timedelta(minutes=duree_coupure_hiver/2) }} | |
{% endif %} | |
- service: input_datetime.set_datetime | |
target: | |
entity_id: !input heure_debut_filtration_2_piscine | |
data: | |
datetime: >- | |
{% if states(temp_piscine)|float >= temp_passage_hiver %} | |
{{ today_at(heure_pivot) + timedelta(minutes=duree_coupure/2) }} | |
{% else %} | |
{{ today_at(heure_pivot_hiver) + timedelta(minutes=duree_coupure_hiver/2) }} | |
{% endif %} | |
- service: input_datetime.set_datetime | |
target: | |
entity_id: !input heure_fin_filtration_2_piscine | |
data: | |
datetime: >- | |
{% if states(temp_piscine)|float >= temp_passage_hiver %} | |
{% set time = today_at(heure_pivot) + timedelta(minutes=duree_de_filtration_automatique/2) + timedelta(minutes=duree_coupure/2) %} | |
{% else %} | |
{% set time = today_at(heure_pivot_hiver) + timedelta(minutes=duree_de_filtration_automatique/2) + timedelta(minutes=duree_coupure_hiver/2) %} | |
{% endif %} | |
{% if time > today_at("23:59:00") or duree_de_filtration_automatique == 1440 %} | |
{{ today_at("23:59:00") }} | |
{% else %} | |
{{ time }} | |
{% endif %} | |
# mode Hivernage | |
- conditions: | |
- "{{ mode_filtration == 'Hivernage' }}" | |
sequence: | |
- service: input_number.set_value | |
target: | |
entity_id: !input duree_filtration | |
data: | |
value: "{{ duree_de_filtration_hivernage }}" | |
- service: input_datetime.set_datetime | |
target: | |
entity_id: !input heure_debut_filtration_1_piscine | |
data: | |
datetime: >- | |
{% set time = today_at(heure_pivot_hiver) - timedelta(minutes=duree_de_filtration_hivernage/2) - timedelta(minutes=duree_coupure_hiver/2) %} | |
{% if time < today_at("00:00:00") or duree_de_filtration_automatique == 1440 %} | |
{{ today_at("00:01:00") }} | |
{% else %} | |
{{ time }} | |
{% endif %} | |
- service: input_datetime.set_datetime | |
target: | |
entity_id: !input heure_fin_filtration_1_piscine | |
data: | |
datetime: "{{ today_at(heure_pivot_hiver) - timedelta(minutes=duree_coupure_hiver/2) }}" | |
- service: input_datetime.set_datetime | |
target: | |
entity_id: !input heure_debut_filtration_2_piscine | |
data: | |
datetime: "{{ today_at(heure_pivot_hiver) + timedelta(minutes=duree_coupure_hiver/2) }}" | |
- service: input_datetime.set_datetime | |
target: | |
entity_id: !input heure_fin_filtration_2_piscine | |
data: | |
datetime: >- | |
{% set time = today_at(heure_pivot_hiver) + timedelta(minutes=duree_de_filtration_hivernage/2) + timedelta(minutes=duree_coupure_hiver/2) %} | |
{% if time > today_at("23:59:00") or duree_de_filtration_automatique == 1440 %} | |
{{ today_at("23:59:00") }} | |
{% else %} | |
{{ time }} | |
{% endif %} | |
# mode Forcé | |
- conditions: | |
- "{{ mode_filtration == 'Forcé' }}" | |
sequence: | |
- service: input_number.set_value | |
target: | |
entity_id: !input duree_filtration | |
data: | |
value: 1440 | |
- service: input_datetime.set_datetime | |
target: | |
entity_id: | |
- !input heure_debut_filtration_1_piscine | |
- !input heure_fin_filtration_1_piscine | |
- !input heure_debut_filtration_2_piscine | |
- !input heure_fin_filtration_2_piscine | |
data: | |
time: "00:00:00" | |
- service: homeassistant.turn_on | |
target: | |
entity_id: !input switch_pompe | |
# mode Inactif | |
- conditions: | |
- "{{ mode_filtration == 'Inactif' }}" | |
sequence: | |
- service: input_number.set_value | |
target: | |
entity_id: !input duree_filtration | |
data: | |
value: 0 | |
- service: input_datetime.set_datetime | |
target: | |
entity_id: | |
- !input heure_debut_filtration_1_piscine | |
- !input heure_fin_filtration_1_piscine | |
- !input heure_debut_filtration_2_piscine | |
- !input heure_fin_filtration_2_piscine | |
data: | |
time: "00:00:00" | |
- service: homeassistant.turn_off | |
target: | |
entity_id: !input switch_pompe | |
- if: | |
- "{{ mode_filtration not in ['Forcé', 'Inactif'] }}" | |
then: | |
- choose: | |
# Demarrage de la pompe en debut de periode | |
- conditions: | |
- condition: trigger | |
id: "1" | |
sequence: | |
- service: homeassistant.turn_on | |
target: | |
entity_id: !input switch_pompe | |
- conditions: | |
- condition: trigger | |
id: "3" | |
- "{{ duree_coupure > 0 }}" | |
sequence: | |
- service: homeassistant.turn_on | |
target: | |
entity_id: !input switch_pompe | |
# Arrêt de la pompe en fin de periode | |
- conditions: | |
- condition: trigger | |
id: "2" | |
- "{{ duree_coupure > 0 }}" | |
sequence: | |
- service: homeassistant.turn_off | |
target: | |
entity_id: !input switch_pompe | |
- conditions: | |
- condition: trigger | |
id: "4" | |
sequence: | |
- service: homeassistant.turn_off | |
target: | |
entity_id: !input switch_pompe |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment