HA-Gestion piscine-1_Filtration

Heureux possesseur d’une piscine depuis de nombreuses années, je constate au quotidien que le poste dépense consommation électrique prend une part importante dans le budget de fonctionnement. L’optimisation du temps de filtration est donc primordial, et cela bien évidemment tout en respectant la qualité de l’eau de baignade.

Dans cet article, je partage mon expérience sur la gestion du temps de pompage.

Liste des publications en lien avec cet article:

  1. Filtration
  2. Mesure de puissance électrique
  3. Mise à niveau automatique
  4. Mesure du pH
  5. Régulation du Ph
  6. Mise Hors Gel

La mise en oeuvre nécessite un minimum de connaissances sur les fondamentaux de HA. 

Remarque: Mes fichiers « .yaml » sont regroupés dans un dossier « config/packages ». J’utilise la directive « !include_dir_named packages » très pratique pour organiser son HA.

Avant la migration de mon système domotique de Jeedom vers HA, je pilotais la pompe de filtration avec Jeedom et le plugin « Pool » de scadinot.controle

Une fois sur HA, j’ai cherché le moyen de remplacer le plugin par des fonctions similaires sur HA. Apres plusieurs tests de plugin et autres programmations sans succès, je me suis arrêté sur le HACS « Pool pump Manager » développé par « oncleben31« .

Ce composant a été développé sur la base de celui de « exxamalte » avec quelques améliorations dont la principale est la prise en compte de la température de l’eau dans le calcul de la durée de filtration.

L’intégration du module dans HA, simplifiée par l’utilisation de HACS, est très bien décrite dans la documentation, elle se décompose ainsi:

Intégration dans HACS,

Choisir la branche « Dev » du module.

Déclaration du module « pool_pump »

et des trois variables indispensables au fonctionnement du module dans configuration.yaml:

pool_pump:
  switch_entity_id: switch.pool_pump_switch
  pool_pump_mode_entity_id: input_select.pool_pump_mode
  pool_temperature_entity_id: sensor.pool_water_temperature
  • avec:
    • switch_entity_id: nom de l’entité de pilotage de la pompe
    • pool_pump_mode_entity_id: nom de l’entité permettant de selectionner le mode de fonctionnement de la pompe
    • pool_temperature_entity_id: nom de l’entité de la mesure de temperature de l’eau

Le module nécessite la mesure de la température de l’eau et le pilotage de la pompe de filtration, personnellement j’utilise un automate WAGO série 750 communiquant en Modbus, équipé d’une carte d’entrées pt100, d’une carte d’entrées digitales et d’une carte de sortie relais.

Bien entendu, cet automate peut être remplacé par n’importe quel dispositif compatible HA, remplissant les mêmes fonctionnalités. Un ESP32 équipé d’une sonde ds18b20  et d’un module de sortie relais sous ESPHOME peut très bien convenir.

En retour le module calcule deux entités:

  • pool_pump.next_run_schedule: L’heure de début et fin de la filtration en deux fois, avant et après l’heure pivot.
  • pool_pump.total_daily_filtering_duration: le temps de filtration théorique sur la journée.

La déclaration d’entités

Les entités associées à la piscine sont regroupées dans un fichier piscine.yaml.

Modes de Fonctionnement

J’utilise 4 modes de fonctionnement sélectionnable par « input_select.mode_fonctionnement_piscine »:

  • Ete: Temps de fonctionnement calculé en fonction de la température de l’eau
  • Hiver: Filtration en fonction d’une de début et d’une durée maximum de filtration
  • Ma F: Marche forcée de la pompe
  • At F: Arrêt forcé de la pompe

En fonction du mode sélectionné, l’automatisation déclenche les actions requises (force le « input_select.pool_pump_mode » et déclenche le service « pool_pump.check »).

Au lancement, HA exécute une fois le service « pool_pump.check » afin d’éviter d’avoir des valeurs inconnues dans le temps et les horaires de filtrage.

Descriptif fonctionnel

Code de l’automatisation

- id: '1611515162753'
  alias: Piscine 1-Calcul fonctionnement Pompe Ete/Hiver
  description: Mode Ete/Hiver/Ma Forcée/At Forcé
  trigger:
  - platform: state
    entity_id: sensor.pool_water_temperature
    id: temp
  - platform: state
    entity_id: input_select.mode_fonctionnement_piscine
    id: mode
  - platform: state
    entity_id: input_boolean.piscine_arret_force
    id: at_forcé
  - platform: time_pattern
    minutes: /5
    id: 5min
  condition: []
  action:
  - choose:
    - conditions:
      - condition: and
        conditions:
        - condition: state
          entity_id: input_select.mode_fonctionnement_piscine
          state: Ete
        - condition: or
          conditions:
          - condition: trigger
            id: temp
          - condition: trigger
            id: at_forcé
          - condition: state
            entity_id: input_select.mode_fonctionnement_piscine
            state: Ete
      sequence:
      - service: input_select.select_option
        target:
          entity_id: input_select.pool_pump_mode
        data:
          option: Auto
    - conditions:
      - condition: state
        entity_id: input_select.mode_fonctionnement_piscine
        state: Hiver
      sequence:
      - choose:
        - conditions:
          - condition: time
            after: input_datetime.heure_ma_pump_pisc_hiv
          - condition: numeric_state
            entity_id: sensor.pool_pump_running_today
            below: input_number.duree_filtration_max_mode_hiver
          sequence:
          - service: input_select.select_option
            target:
              entity_id: input_select.pool_pump_mode
            data:
              option: 'On'
          - service: homeassistant.turn_on
            target:
              entity_id: switch.pool_pump_switch
        default:
        - service: input_select.select_option
          target:
            entity_id: input_select.pool_pump_mode
          data:
            option: 'Off'
        - service: homeassistant.turn_off
          target:
            entity_id: switch.pool_pump_switch
    - conditions:
      - condition: state
        entity_id: input_select.mode_fonctionnement_piscine
        state: Ma F
      sequence:
      - service: input_select.select_option
        target:
          entity_id: input_select.pool_pump_mode
        data:
          option: 'On'
      - service: homeassistant.turn_on
        target:
          entity_id: switch.pool_pump_switch
    - conditions:
      - condition: state
        entity_id: input_select.mode_fonctionnement_piscine
        state: At F
      sequence:
      - service: input_select.select_option
        target:
          entity_id: input_select.pool_pump_mode
        data:
          option: 'Off'
      - service: homeassistant.turn_off
        target:
          entity_id: switch.pool_pump_switch
    - conditions:
      - condition: trigger
        id: Start
      sequence: []
    default: []
  - service: pool_pump.check
  mode: single

Calcul du temps de filtration (Mode Automatique).

La durée de filtration est régit par la courbe bleue de AbacusFilteringDuration() également utilisée par le plugin Jeedom, c’est une des fonctionnalités du module Python « PyPoolPump » développé par oncleben31.

Voici le détail de la courbe de filtration, nous utilisons la courbe bleue représente la valeur 100%. La courbe verte 140% et la courbe rouge 60% ne sont pas utilisées dans notre cas, il n’y a pas dans cette version la possibilité de pondérer l’action de la température sur la durée.


L’automatisation principale appelle le « service: pool_pump.check », celui ci évalue l’heure de démarrage et l’heure d’arrêt de la pompe en fonction de:

  • l’heure actuelle
  • la température de l’eau
  • l’heure pivot:
    • Celle ci correspond à l’heure du midi solaire UTC (zenith) voir_doc . le temps de filtration est réparti 1/3 avant l’heure pivot et 2/3 après. J’ai déclaré le template « heure_pivot_piscine: » afin de le visualiser dans la carte Pool. Ce n’est pas indispensable mais c’est utile à la compréhension du fonctionnement .

NB: Vous pourrez constater quelques fois, qu’à l’heure de début filtration calculée, la pompe démarre puis s’arrête quelques instants plus tard pour redémarrer ensuite. C’est normal, à chaque changement de T° de l’eau ou toutes les 5 minutes, la durée est recalculée. Si la température a baissée, le système recalcule à la baisse le temps de filtration et donc l’heure de démarrage.

Le temps de fonctionnement est recalculé sur:

  • Le changement de la température de l’eau
  • Changement du mode de fonctionnement
  • Arret forcé mode auto
  • Toutes les 5 minutes
  • Au lancement de HA

Mesure de la température de l’eau

La sonde de mesure de température est située dans mon sous sol. Lorsque la filtration est arrêtée, la température mesurée évolue lentement vers celle du sous-sol qui l’été, est très inférieure à la température de l’eau. Le lendemain, le système se base sur une température inférieure à celle de l’eau donc recalcule un temps de filtration trop faible, démarre la pompe tard dans la matinée, ajuste le temps de filtration qui s’allonge au fur et à mesure que la température mesurée se rapproche de celle de l’eau, pour finir avec une filtration qui se terminera tard dans la nuit.

La solution est simple, HA mémorise la température de l’eau uniquement quand la pompe est en fonctionnement, il garde ainsi la température de l’eau avant l’arrêt de la pompe.

Un automatisme, recopie toutes les 15 minutes , si la pompe de filtration est en marche, la mesure de la température dans un input_number qui sert de mémoire. C’est cette mémoire qui servira au calcul du temps de filtration.

il faut ajouter ce code d’automatisation à ajouter dans votre fichier .yaml

- id: '1623911201023'
  alias: Piscine Mémorisation Température avant arrêt
  description: 'On fait tourner la pompe 15 mn avant prise en compte de la température '
  trigger:
  - platform: time_pattern
    minutes: /1
  condition:
  - condition: state
    entity_id: binary_sensor.pool_pump_running
    state: 'on'
    for: 00:15:00
  action:
  - service: input_number.set_value
    target:
      entity_id: input_number.mem_temp_piscine
    data_template:
      value: '{{ states(''sensor.temp_piscine'')|float }}'
  mode: single

Il faut modifier le sensor.pool_water_temperature comme suit:

  # mesure de la température de l'eau, permet de basculer facilement en mode simulation
  # en commentant ou decommentant les lignes ci-dessous
  - platform: template
    sensors:
      pool_water_temperature:
        friendly_name: "sensor.pool_water_temperature"
        value_template: "{{ states('input_number.mem_temp_piscine')|float|round(1) }}" # memoire temperature de l'eau avant arret pompe
        #        value_template: "{{ states('input_number.temp_piscine_ph')|float|round(1) }}" # Simulation avec input_numbe
        icon_template: mdi:oil-temperature
        unit_of_measurement: "ºC"

Indicateur de fonctionnement de la pompe

La consommation électrique de mon coffret piscine est monitorée par un PZEM004 couplé à un ESP8266-12F sous ESPHOME. Se reporter à l’article suivant « home-assistant-gestion-piscine-2_mesure-de-puissance-electrique »

Si la puissance absorbée par le coffret est supérieure à 500W, je considère que la pompe est en fonctionnement.

Le test permet de calculer un binary_sensor.pool_pump_running:

binary_sensor:
# Si la puissance electrique est superieure à 500w, on considère que la pompe est en fonctionnement
  - platform: template
    sensors:
      pool_pump_running:
        value_template: "{{ states.sensor.pzem_pisc_puissance.state | float > 500 }}"
        friendly_name: "Pompe Filtration en Ma"

Cette variable est importante car elle reflète la réalité de l’état de fonctionnement de la pompe, je l’utilise dans plusieurs automatisme comme la régulation de pH, calcul du temps de fonctionnement, etc..

Calcul du temps de fonctionnement de la pompe

sensor:
  # Affichage du temps de fonctionnement de la pompe ce jour
  - platform: history_stats
    name: Pool Pump running today
    entity_id: binary_sensor.pool_pump_running
    state: "on"
    type: time
    start: "{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}"
    end: "{{ now() }}"

Panneaux de commande

Je vous propose, pour information, une copie d’écran et les codes associés, de mes panneaux de contrôle, libre à vous de les adapter. Certaines fonctionnalités seront décrites ultérieurement (pression, pH, Appoint eau, Chlore, ORP, etc..).

Carte N°1

Récapitulatif des principales grandeurs numériques et des commandes importantes.

Lien vers le code source

Panneau N°2

Un résumé des périodes de fonctionnement

Lien vers le code source

Panneau N°3

Visualisation et accès à l’ensemble des paramètres.

lien vers le code source

Panneau N°4

Lien vers le code source

Notifications

Notification sur telegram de:

  • Début de filtration
  • Fin de filtration
  • Récapitulatif de fin de journée ave le temps de fonctionnement de la pompe, la consommation de la piscine en kW, le temps d’utilisation des cartouches de chlore.
- id: '1634222619535'
  alias: Piscine Notifications filtration
  description: Debut, Fin
  trigger:
  - platform: state
    entity_id: binary_sensor.pool_pump_running
    from: 'off'
    to: 'on'
    id: ma_ppe
  - platform: state
    entity_id: binary_sensor.pool_pump_running
    id: at_ppe
    from: 'on'
    to: 'off'
  - platform: time
    at: '23:59'
    id: minuit
  condition: []
  action:
  - choose:
    - conditions:
      - condition: trigger
        id: ma_ppe
      sequence:
      - service: notify.telegram
        data:
          message: '{{states("sensor.date_time") }}'
          title: Piscine Début Filtration
    - conditions:
      - condition: trigger
        id: at_ppe
      sequence:
      - service: notify.telegram
        data:
          message: '{{states("sensor.date_time") }}}'
          title: Piscine Fin de filtration
    - conditions:
      - condition: trigger
        id: minuit
      sequence:
      - service: notify.telegram
        data:
          message: 'Temps de filtration:  {{states.sensor.pool_pump_running_today.attributes.value}}{{-"\n"-}}Conso:
            {{states(''sensor.energy_pisc_daily'')}} kWh.{{-"\n"-}} Tps Utilisation
            cart. Chlore: {{states(''input_number.temps_cartouche_chlore'')}} h {{-"\n"-}}{{states("sensor.date_time")
            }}'
          title: Piscine Rapport Fin de journée
      - service: notify.log_piscine
        data:
          message: '{{states.sensor.pool_pump_running_today.attributes.value }},{{states(''sensor.energy_pisc_daily'')}}'
          title: Rapport jour piscine
    default: []
  mode: single

Conclusion

J’espère que cet article vous sera utile. C’est le premier d’une série dédiée à la gestion automatisée d’une piscine.
Je publierai la suite de mes réalisations listées en introduction lorsque leur fonctionnement aura été éprouvé.

18 Comments on “HA-Gestion piscine-1_Filtration”

  1. J’ai hâte de lire tes prochains articles notamment :
    – la mise à niveau automatique du niveau d’eau
    – la mesure de pression du filtre à sable

  2. Merci pour l’article et j’ai oublié de poser ma question dans mon commentaire précédent. Est’il possible de définir un horaire min et max de filtration chaque jour ? En gros je veux pas filtrer moins de 3h par jour mais pas plus de 14h par jour ?

    1. Bonjour Arnault
      Ces fonctionnalités sont incluses dans la version de exxamalte qui ne tient pas compte la T° de l’eau. Elles n’ont pas été reprises dans la version de oncleben31 (celle que j’utilise) qui elle tient compte de la T° de l’eau. A toi de choisir la version qui te convient le mieux. @+

  3. Bonjour,
    superbe arcticle. Je migre en ce moment petit à petit de Jeedom vers HA. J’avoue que je me casse un peu les dents, mais le résultat est on ne peut mieux !!

    J’utilisé aussi le plugin pool Jeedom. Je vais donc me servir de ce superbe article pour essayer j’arriver au même résultat que toi !!

  4. Bonjour,
    Bon je viens de tout paramétrer.
    Juste une chose, je n’arrive pas à afficher le temps de fonctionnement de la pompe,ni l’affichage de l’heure pivot. Je ne comprends pas.
    Pourriez vous m’aider ?

  5. Bonjour, désolé pour le retard et tu as surement trouvé depuis, mais voici ma réponse.
    Comme décrit au chapitre « Temps de fonctionnement », le temps de fonctionnement de la pompe nécessite un binary_sensor qui passe à « on » lorsque la puissance est supérieure à un seuil (500 w dans mon cas) et un sensor history_stats déclenché par ce binary_sensor.
    Cela nécessite bien entendu une mesure de puissance, si pas dispo tu peux prendre comme info l’état de la sortie de la pompe.
    Concernant l’heure pivot, comme décrit au chapitre « 3- la déclaration d’entités » , l’heure pivot est calculée avec l’attribut « next.noon » de « sun.sun ».
    Bon courage. Pour info j’ai publié un article sur la mesure de pH.

    1. Désolé aussi du retard. Oui j’ai trouvé c’était une mauvaise déclaration. J’ai tout testé avec une ampoule au lieu de ma pompe 😉 Ca à l’air de fonctionner…

      Je vais vérifier cela avec la piscine maintenant. Super je vais aller lire l’article !

    2. Bonjour,

      j’ai un « nouveau » problème. Tout fonctionné. Aujourd’hui je mets à jour Home assistant avec a dernière version et au reboot, j’ai une erreur Pump_pump – intégration et plus rien ne fonctionne. Je ne sais pas si cest la mise à jour qui a foiré, mais là je suis dans la mouise comme on dit…
      Pourriez-vous m’aiguiller svp ??

  6. En fait, en Mode ON ça force le fonctionnement, ça c’est ok.
    Par contre quand je passe en Auto, bin il se passe entre guillemet rien. Il ne me met pas en marche la pompe, mais surtout me met une erreur sur le next_run_schedule…Je comprends pas

  7. Bon j’ai avancé. Depuis la 2021.5, il faut modifier dans init.py sokar_noon en noon.

    J’ai un autre problème. La pompe s’arrête et redémarre toutes les 5mn….

    Une idée ??

  8. Question : vu que c’est à chaque fois que le service pool pump check est appelé que la pompe s’éteint et au tour suivant, se rallume, ça serait pas dû au fait que ma commande est impulsionnel sur ma pompe ?? Et que lui il renvoie un ordre de marche, mais que moi forcément ça permute ?

    1. Bonjour
      Le switch de la pompe est basé sur deux états stables:
      – ON: fonctionnement de la pompe
      – OFF: arrêt de la pompe
      Il faut adapter ton pilotage de la pompe a ce principe, mais tu l’as surement fait depuis!

Répondre à seb Annuler la réponse

Votre adresse de messagerie ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.