Plugin Piscine : le blueprint pour HA (gestion de la filtration)

Oui c’est ça. J’ai récupéré la formule utilisée par le plugin piscine de jeedom

2 « J'aime »

Super ! Merci pour ce travail et pour les nombreuses réponses aux questions des utilisateurs. L’installation en mode hivernage fonctionne parfaitement. Mise à l’épreuve pour les autres modes dans les prochains mois dès que la température de l’eau sera baignade.

1 « J'aime »

Je pense que c’est bon en hiver quand tu n’as pas besoin de filtrer des heures. Par contre, en été, un journée maussade avec un pic du soleil a 18h par ex, avec une heure pivot a 18h, tu vas te retrouver a filtrer entre 12h et 2h du mat, pas super quand t’as des panneaux solaires.
Pour ma part, en hiver, l’heure pivot est basé sur le pic de production solaire (Solcast forecast), en été sur l’heure du zenith du soleil (autours des 14h sur bordeaux)

1 « J'aime »

Question @Mikail.
Est ce qu’il est(serait) possible de prendre en compte le volume de la piscine et le débit de la pompe pour le calcul du temps de filtration ?
Merci

La pompe (+filtre a sable) doit etre dimensionné selon le volume de la psicine (+ d’autres parametres type longueur des tuyaux, perte de charge, forme de la piscine, diametre des tuyau). Donc, si la pompe est bien dimensionnée, le mode de filtration courbe doit repondre au besoin.

2 « J'aime »

Bonjour
Comment modifier le temps de filtration en mode hivernage pour le passer de 3h à 1h30? Merci d’avance

Bonsoir,
En mode file editor (/homeassistant/blueprints/automation/mbo18/gestion_piscine_advanced.yaml)
lignes 243-247 il y a la formule de calcul du temps de filtration en mode hivernage. Je pense que c’est là qu’il faut faire la modification.

1 « J'aime »

Bonjour
donc voila mon soucis, je pense que mon blueprint ne doit pas focntionner,

ma pompe se met en route tout le temps selon l’heure programme soit de 0h a 5h pourtant la temperature et en dessous de celle mise pour l hivernage…


voila ce que j’ai

merci de votre aide

voici une partie de mon fichier blueprint,« homeassistant/blueprints/automation/mbo18/gestion_piscine_advanced.yaml »

il me semble vide, normal??

merci

j’ai ceci comme erreur??

il faut que tu cliques sur ajouter une section, lui donner un titre (exemple : Paramètres)
dans la nouvelle section cliquer sur ajouter une carte, choisir « entités » (avec un S)
Ne pas donner de titre, et choisir chacune des entité à afficher.

@Makai
Merci, Merci, Merci…

C’était MA crainte principale en basculant de Jeedom vers HA.
Le plugin Pisicine de Jeedom était vraiment top et simple de prise en main…

je commence à bien rentrer dans HA, avec ses avantages et ses inconviénients ; et ton blueprint est vraiment top.

Merci pour la doc, merci pour le temps passé à répondre sur ce forum, Merci

Bonjour,
depuis le 25 février ce bleuprint ne fonctionne plus chez moi.
Ma configuration est la suivante:

  • Core2025.3.3
  • Supervisor2025.03.3
  • Operating System15.0
  • Interface utilisateur20250306.0
    je ne sais pas par où commencer. Tout fonctionnait correctement jusque là

Merci

voici une version mise à jour qui rétabli toutes les fonctions:

blueprint:
  name: "Gestion filtration piscine (avancé)"
  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 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: "Relance 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
          selector:
            entity:
              filter:
                domain: input_select
              multiple: false
        ajustement:
          name: "Coefficient d'ajustement du temps de filtration"
          description: "Influe à la baisse ou à la hausse le temps de filtration"
          selector:
            entity:
              filter:
                domain: input_number
              multiple: false

    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"
          selector:
            entity:
              filter:
                domain: sensor
                device_class: timestamp
              multiple: false
        duree_coupure:
          name: "Durée de coupure de la filtration"
          description: "Définit une pause dans la filtration autour de l'heure pivot"
          selector:
            entity:
              filter:
                domain: input_number
              multiple: false

    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"
          selector:
            entity:
              filter:
                domain: sensor
                device_class: timestamp
              multiple: false
        duree_coupure_hiver:
          name: "Durée de coupure de la filtration"
          description: "Définit une pause dans la filtration autour de l'heure pivot"
          selector:
            entity:
              filter:
                domain: input_number
              multiple: false
        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_p: !input heure_pivot
  heure_pivot: "{{ states(heure_p) | as_timestamp | timestamp_custom('%H:%M:%S') }}"
  heure_p_h: !input heure_hivernage
  heure_pivot_hiver: "{{ states(heure_p_h) | as_timestamp | timestamp_custom('%H:%M:%S') }}"
  temp_passage_hiver: !input temp_passage_hiver

  duree_de_filtration_courbe: >-
    {% set temp = max(states(temp_piscine)|float(10), 10) %}
    {% set a = 0.00335 * states(coef)|float / 100 %}
    {% set b = -0.14953 * states(coef)|float / 100 %}
    {% set c = 2.43489 * states(coef)|float / 100 %}
    {% set d = -10.72859 * states(coef)|float / 100 %}
    {% set hours = (a * temp**3) + (b * temp**2) + (c * temp) + d %}
    {{ min((hours * 60)|round(0), 1440) }}

  duree_de_filtration_hivernage: >-
    {% set temp = states(temp_piscine)|float(10) %}
    {% if activation_hors_gel == 'Activé' and temp <= temp_hors_gel %}
      1440
    {% elif temp < 10 %}
      240
    {% else %}
      {{ ((temp / 3) * 60)|round(0) }}
    {% endif %}

  duree_de_filtration_automatique: >-
    {% set temp = states(temp_piscine)|float(10) %}
    {% if activation_hors_gel == 'Activé' and temp <= temp_hors_gel %}
      1440
    {% elif temp < 10 %}
      240
    {% elif temp < temp_passage_hiver %}
      {{ ((temp / 3) * 60)|round(0) }}
    {% else %}
      {% set a = 0.00335 * states(coef)|float / 100 %}
      {% set b = -0.14953 * states(coef)|float / 100 %}
      {% set c = 2.43489 * states(coef)|float / 100 %}
      {% set d = -10.72859 * states(coef)|float / 100 %}
      {% set hours = (a * temp**3) + (b * temp**2) + (c * temp) + d %}
      {{ min((hours * 60)|round(0), 1440) }}
    {% endif %}

triggers:
  - trigger: time
    at: !input heure_debut_filtration_1_piscine
    id: "1"
  - trigger: time
    at: !input heure_fin_filtration_1_piscine
    id: "2"
  - trigger: time
    at: !input heure_debut_filtration_2_piscine
    id: "3"
  - trigger: time
    at: !input heure_fin_filtration_2_piscine
    id: "4"
  - trigger: state
    entity_id: !input bouton_reset
    id: "5"
  - trigger: state
    entity_id: !input mode_filtration
    id: "6"

action:
  - if:
      - or:
          - condition: trigger
            id: "4"
          - condition: trigger
            id: "5"
          - condition: trigger
            id: "6"
    then:
      - choose:
          - conditions:
              - condition: state
                entity_id: !input mode_filtration
                state: "Courbe"
            sequence:
              - action: input_number.set_value
                target:
                  entity_id: !input duree_filtration
                data:
                  value: "{{ duree_de_filtration_courbe }}"
              - action: 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=states(duree_coupure)|int/2) %}
                    {{ time if time >= today_at("00:00:00") else today_at("00:01:00") }}
              - action: input_datetime.set_datetime
                target:
                  entity_id: !input heure_fin_filtration_1_piscine
                data:
                  datetime: "{{ today_at(heure_pivot) - timedelta(minutes=states(duree_coupure)|int/2) }}"
              - action: input_datetime.set_datetime
                target:
                  entity_id: !input heure_debut_filtration_2_piscine
                data:
                  datetime: "{{ today_at(heure_pivot) + timedelta(minutes=states(duree_coupure)|int/2) }}"
              - action: 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=states(duree_coupure)|int/2) %}
                    {{ time if time <= today_at("23:59:00") else today_at("23:59:00") }}

          - conditions:
              - condition: state
                entity_id: !input mode_filtration
                state: "Automatique"
            sequence:
              - action: input_number.set_value
                target:
                  entity_id: !input duree_filtration
                data:
                  value: "{{ duree_de_filtration_automatique }}"
              - action: input_datetime.set_datetime
                target:
                  entity_id: !input heure_debut_filtration_1_piscine
                data:
                  datetime: >-
                    {% set time = today_at(heure_pivot if states(temp_piscine)|float >= temp_passage_hiver else heure_pivot_hiver) - timedelta(minutes=duree_de_filtration_automatique/2) - timedelta(minutes=states(duree_coupure if states(temp_piscine)|float >= temp_passage_hiver else duree_coupure_hiver)|int/2) %}
                    {{ time if time >= today_at("00:00:00") and duree_de_filtration_automatique != 1440 else today_at("00:01:00") }}
              - action: input_datetime.set_datetime
                target:
                  entity_id: !input heure_fin_filtration_1_piscine
                data:
                  datetime: "{{ today_at(heure_pivot if states(temp_piscine)|float >= temp_passage_hiver else heure_pivot_hiver) - timedelta(minutes=states(duree_coupure if states(temp_piscine)|float >= temp_passage_hiver else duree_coupure_hiver)|int/2) }}"
              - action: input_datetime.set_datetime
                target:
                  entity_id: !input heure_debut_filtration_2_piscine
                data:
                  datetime: "{{ today_at(heure_pivot if states(temp_piscine)|float >= temp_passage_hiver else heure_pivot_hiver) + timedelta(minutes=states(duree_coupure if states(temp_piscine)|float >= temp_passage_hiver else duree_coupure_hiver)|int/2) }}"
              - action: input_datetime.set_datetime
                target:
                  entity_id: !input heure_fin_filtration_2_piscine
                data:
                  datetime: >-
                    {% set time = today_at(heure_pivot if states(temp_piscine)|float >= temp_passage_hiver else heure_pivot_hiver) + timedelta(minutes=duree_de_filtration_automatique/2) + timedelta(minutes=states(duree_coupure if states(temp_piscine)|float >= temp_passage_hiver else duree_coupure_hiver)|int/2) %}
                    {{ time if time <= today_at("23:59:00") and duree_de_filtration_automatique != 1440 else today_at("23:59:00") }}

          - conditions:
              - condition: state
                entity_id: !input mode_filtration
                state: "Hivernage"
            sequence:
              - action: input_number.set_value
                target:
                  entity_id: !input duree_filtration
                data:
                  value: "{{ duree_de_filtration_hivernage }}"
              - action: 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=states(duree_coupure_hiver)|int/2) %}
                    {{ time if time >= today_at("00:00:00") and duree_de_filtration_automatique != 1440 else today_at("00:01:00") }}
              - action: input_datetime.set_datetime
                target:
                  entity_id: !input heure_fin_filtration_1_piscine
                data:
                  datetime: "{{ today_at(heure_pivot_hiver) - timedelta(minutes=states(duree_coupure_hiver)|int/2) }}"
              - action: input_datetime.set_datetime
                target:
                  entity_id: !input heure_debut_filtration_2_piscine
                data:
                  datetime: "{{ today_at(heure_pivot_hiver) + timedelta(minutes=states(duree_coupure_hiver)|int/2) }}"
              - action: 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=states(duree_coupure_hiver)|int/2) %}
                    {{ time if time <= today_at("23:59:00") and duree_de_filtration_automatique != 1440 else today_at("23:59:00") }}

          - conditions:
              - condition: state
                entity_id: !input mode_filtration
                state: "Forcé"
            sequence:
              - action: input_number.set_value
                target:
                  entity_id: !input duree_filtration
                data:
                  value: 1440
              - action: 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"
              - action: homeassistant.turn_on
                target:
                  entity_id: !input switch_pompe

          - conditions:
              - condition: state
                entity_id: !input mode_filtration
                state: "Inactif"
            sequence:
              - action: input_number.set_value
                target:
                  entity_id: !input duree_filtration
                data:
                  value: 0
              - action: 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"
              - action: homeassistant.turn_off
                target:
                  entity_id: !input switch_pompe

  - if:
      - "{{ states(mode_filtration) not in ['Forcé', 'Inactif'] }}"
    then:
      - choose:
          - conditions:
              - condition: trigger
                id: "1"
            sequence:
              - action: homeassistant.turn_on
                target:
                  entity_id: !input switch_pompe
          - conditions:
              - condition: trigger
                id: "3"
              - "{{ states(duree_coupure)|int > 0 }}"
            sequence:
              - action: homeassistant.turn_on
                target:
                  entity_id: !input switch_pompe
          - conditions:
              - condition: trigger
                id: "2"
              - "{{ states(duree_coupure)|int > 0 }}"
            sequence:
              - action: homeassistant.turn_off
                target:
                  entity_id: !input switch_pompe
          - conditions:
              - condition: trigger
                id: "4"
            sequence:
              - action: homeassistant.turn_off
                target:
                  entity_id: !input switch_pompe

bonjour

chez moi ça fonctionne toujours pas mais bon…

comment afficher le dashbord correctement??

merci

Bonjour,

Fonctionnement tout à fait satisfaisant du blueprint simplifié chez moi.
J’ai modifié la formule de calcul de la courbe (Je n’utilise que le fonctionnement « Courbe ») pour tenir compte du fonctionnement de mon bassin et de mon électrolyseur datant de 1996.
J’ai notamment calmé la forme exponentielle de la formule qui filtrait trop longtemps au dessus de 28°C.
En tout cas, chapeau pour le travail et merci encore !

Bonjour,

Vous devriez supprimer tout ce que vous avez fait et suivre le 1er post à nouveau. Ce blueprint fonctionne bien chez moi depuis un moment maintenant

Bonjour,

Je vais analyser les différences pour voir ce que vous avez modifié. J’utilise ce blueprint depuis un moment (dans la dernière version) sans avoir rien modifié et j’utilise la dernière version de HA (la bêta en cours en fait)

J’ai vérifié, je ne vois pas ce qui change ?
A part avoir supprimé les commentaires et quelques variables, remplacé « service: » par « action: » et avoir changé les if/else pour les mettre en inline, il n’y a rien qui expliquerait que ça ne fonctionnait plus avant.

Bonjour,

Je viens d’implémenter le blueprint et ça a l’air de fonctionner.
Petit bémol; lorsqu’on passe de Forcé ou Inactif à un autre mode, la pompe reste dans l’état précédent même si on est « en » ou « hors » période de filtration.
Peux tu améliorer le blueprint pour effectuer ces vérifications et mettre automatiquement la pompe dans l’état de fonctionnement attendu ?

En tous cas merci pour ce partage.

Bonsoir @Rantanplan .
J’ai le même problème. Je le gère en passant de marche forcée à Inactif, puis en revenant ensuite sur Automatique.
Sinon, SUPER blueprint qui simplifie énormément la gestion de la filtration. Merci @Makai