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. Ultérieurement, je vous ferai découvrir d’autres solutions techniques que j’ai mis en oeuvre comme:

  • le calcul du hors gel
  • le monitoring électrique du coffret piscine
  • la mise à niveau automatique du niveau d’eau
  • la mesure de pression du filtre à sable
  • la mesure de pH avec un ESP
  • la régulation du ph
  • l’automatisation de la couverture flottante

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.

la déclaration d’entités

J’ai regroupé l’ensemble des entités associées à la piscine dans un fichier piscine.yaml

Lien vers le code source

Fonctionnement:

J’utilise 4 modes fonctionnement sélectionnables par un input_select:

  • Automatique
  • On
  • Off
  • Hivernage

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
  • niveau bas piscine (inutilisé dans mon cas)
  • toutes les 5 minutes
  • au lancement de HA

Mesure de température

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"

Mode On

Dans ce mode la pompe de filtration est en marche forcée, l’automatisme force le switch de la pompe à on.

Mode Off

Dans ce mode la pompe de filtration est en arrêt forcé, l’automatisme force le switch de la pompe à off.

Mode Hivernage

La pompe fonctionne entre deux barrières horaires définies par deux input_datetime. L’hivers je la fait tourner 3 heures, c’est un hivernage actif.

Automatisme principal

J’ai regroupé les 4 modes de fonctionnement en un seul fichier d’automatisme articulé autour de la condition « choisir


- id: '1611515162753'
  alias: Piscine Calcul fonctionnement Pompe
  description: 'Mode Auto/On/Off/Hivernage '
  trigger:
  - platform: homeassistant
    event: start
    id: Start
  - platform: state
    entity_id: sensor.pool_water_temperature
    id: temp
  - platform: state
    entity_id: input_select.pool_pump_mode
    id: mode
  - platform: state
    entity_id: input_boolean.pool_water_level_critical
    id: lsll
  - platform: time_pattern
    minutes: /5
    id: 5min
  - platform: time
    at: input_datetime.heure_ma_pump_pisc_hiv
    id: mapompe
  - platform: time
    at: input_datetime.heure_at_pump_pisc_hiv
    id: atpompe
  condition: []
  action:
  - choose:
    - conditions:
      - condition: and
        conditions:
        - condition: state
          state: Auto
          entity_id: input_select.pool_pump_mode
        - condition: or
          conditions:
          - condition: trigger
            id: Start
          - condition: trigger
            id: temp
          - condition: trigger
            id: mode
          - condition: trigger
            id: lsll
          - condition: trigger
            id: 5min
      sequence:
      - service: pool_pump.check
    - conditions:
      - condition: state
        entity_id: input_select.pool_pump_mode
        state: 'On'
      sequence:
      - service: switch.turn_on
        target:
          entity_id: switch.pool_pump_switch
    - conditions:
      - condition: state
        entity_id: input_select.pool_pump_mode
        state: 'Off'
      sequence:
      - service: switch.turn_off
        target:
          entity_id: switch.pool_pump_switch
    - conditions:
      - condition: state
        entity_id: input_select.pool_pump_mode
        state: Hivernage
      - condition: trigger
        id: mapompe
      sequence:
      - service: switch.turn_on
        target:
          entity_id: switch.pool_pump_switch
    - conditions:
      - condition: state
        entity_id: input_select.pool_pump_mode
        state: Hivernage
      - condition: trigger
        id: atpompe
      sequence:
      - service: switch.turn_off
        target:
          entity_id: switch.pool_pump_switch
    default: []
  mode: single

Déclarations des entités

Les entités sont déclarées dans un fichier piscine.yaml

Lien vers le code source.

Affichage des périodes de filtration

l’entité « pool_pump.next_run_schedule » générée et calculée par le module permet d’afficher la période de filtration en cours, avant puis après l’heure pivot.

Temps de fonctionnement

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, la mesure du temps de fonctionnement, etc..

Panneaux de commande

Je vous propose, pour information, une copie d’écran ainsi que les code associés, de mes panneaux de contrôle, libre à vous de l’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és 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!

Laisser un commentaire

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.