Home Assistant-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 ce premier 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 mesure de pH à base d’arduino
  • la mise à niveau automatique du niveau d’eau
  • la mesure de pression du filtre à sable

J’ai également en prévision de réalisation:

  • 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. 

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.

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’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:

1-Intégration dans HACS,

Choisir la branche « Dev » du module.

2-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.

3-la déclaration d’entités

J’ai regroupé l’ensemble des entités associées à la piscine dans un fichier pool.yaml, voir ci-dessous:

input_number:
# utilisé pour simuler la température de l'eau pendant les tests  
  temp_piscine:
    name: Temp Eau Simul
    min: -2
    max: 35
    unit_of_measurement: °C

# selection du mode de fonctionnement de la filtration
input_select:
  pool_pump_mode:
    name: Pool Pump mode
    options:
      - 'Auto'
      - 'On'
      - 'Off'
    initial: 'Auto'
    icon: mdi:pool

binary_sensor:
# Si la puissance électrique est supérieure à 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"

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() }}'

# mesure de la température de l'eau, permet de basculer facilement en mode simulation
# en commentant ou de-commentant les value_template ci-dessous
  - platform: template
    sensors:
      pool_water_temperature:
        friendly_name: 'sensor.pool_water_temperature'
        value_template: "{{ states('sensor.temp_piscine')|float|round(1) }}"  # mesure de la temperature de l'eau
#        value_template: "{{ states('input_number.temp_piscine')|float|round(1) }}" # Simulation avec input_number
        icon_template: mdi:oil-temperature
        unit_of_measurement: 'ºC'
# Affichage de l'heure pivot, c'est l'heure autour de laquelle le temps de fonctionnement est réparti
  - platform: template
    sensors:
      heure_pivot_piscine:
        friendly_name: 'heure_pivot_piscine'
        value_template: '{{ as_timestamp(strptime(state_attr("sun.sun", "next_noon"), "")) | timestamp_custom("%H:%M") }}'
        icon_template: mdi:calendar-clock

# Sensors Modbus
# Mesure la température de l'eau (sonde pt100)
# A adapter à votre configuration
  - platform: modbus
    scan_interval: 60
    registers:
      - name: temp_piscine
        hub: wago_piscine
        unit_of_measurement: °C
        slave: 1
        register: 0
        register_type: input
        scale: 0.1
        precision: 1

# commande des sorties relais du module WAGO
# A adapter à votre configuration
switch:
# Switchs Modbus Piscine
  - platform: modbus
    scan_interval: 10
    coils:
      - name: pool_pump_switch
        hub: wago_piscine
        slave: 1
        coil: 12288
     

Fonctionnement:

Le choix du mode fonctionnement s’effectue avec le input select pool_pump_mode:
On: marche forcée de la pompe. Déclenche sur changement d’état l’automatisation « Pool Pump On » et le service:

service: homeassistant.turn_on
data: {}
entity_id: switch.pool_pump_switch


Off: arret forcé de la pompe. Déclenche sur changement d’état l’automatisation « Pool Pump Off » et le service

service: homeassistant.turn_off
data: {}
entity_id: switch.pool_pump_switch


Auto: fonctionnement basé sur la température de l’eau selon la courbe Abacus décrite ci-dessus. Toutes les 5 mn, l’automatisation « Piscine Check pool Pump » appelle le service « 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 pouvez constater qu’à l’heure de démarrage calculée, la pompe démarre puis s’arrête quelques instants plus tard pour redémarrer ensuite. C’est dû, dans mon cas, au fait que la sonde de T° de l’eau est située dans un local, et qu’il faut quelques minutes de pompage pour mesurer la T° de l’eau du bassin, surtout l’hiver où l’écart de T° entre l’intérieur et l’extérieur est important.

Le temps de fonctionnement est également recalculé sur:

  • Evolution de la température de l’eau
  • Changement du mode de fonctionnement

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.

La puissance me permet de déterminer si la pompe tourne ou pas. Si la puissance est supérieure à 500W alors pompe en marche.

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 permet de mesurer le temps de fonctionnement de la pompe (sur la journée dans mon cas)

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() }}'

Automatisations

Il y a quatre automatisations à intégrer dans votre HA:

Bien entendu, les id sont à adapter à votre configuration.

  • Pool Pump On: force la marche pompe
- id: '1611514566689'
  alias: Pool Pump On
  description: ''
  trigger:
  - platform: state
    entity_id: input_select.pool_pump_mode
    to: 'On'
  condition: []
  action:
  - service: homeassistant.turn_on
    data: {}
    entity_id: switch.pool_pump_switch
  mode: single
  • Pool Pump Off: force l’arret pompe
- id: '1611514631258'
  alias: Pool Pump Off
  description: ''
  trigger:
  - platform: state
    entity_id: input_select.pool_pump_mode
    to: 'Off'
  condition: []
  action:
  - service: homeassistant.turn_off
    data: {}
    entity_id: switch.pool_pump_switch
  mode: single
  • Piscine Check pool Pump: appelle service « pool_check » toutes les 5 minutes (modifiable).
- id: '1611568349133'
  alias: Piscine Check pool Pump
  description: ''
  trigger:
  - platform: time_pattern
    minutes: /5
  condition: []
  action:
  - service: pool_pump.check
  mode: single
  • Piscine Check Pool Pump On event: appelle le service « pool_check » si:
    • changement de mode
    • changement de température de l’eau
    • changement d’état de « input_boolean.pool_water_level_critical »- (condition supplémentaire d’arrêt de la pompe que je n’utilise pas à ce jour).
- id: '1611515162753'
  alias: Piscine Check Pool Pump On event
  description: ''
  trigger:
  - platform: homeassistant
    event: start
  - platform: state
    entity_id: sensor.pool_water_temperature
  - platform: state
    entity_id: input_select.pool_pump_mode
  - platform: state
    entity_id: input_boolean.pool_water_level_critical
  condition: []
  action:
  - service: pool_pump.check
  mode: single

Panneau de commande

Je vous propose, pour information, une copie d’écran ainsi que le code associé, de mon panneau de contrôle, libre à vous de l’adapter. Certaines fonctionnalités seront décrites ultérieurement (pression, pH, Appoint eau, etc..).

entities:
  - entity: input_select.pool_pump_mode
    name: Mode de Fonctionnement
  - entities:
      - entity: sensor.pression_piscine_p
        name: Pression
      - entity: sensor.ph_piscine_ph
        name: pH
      - entity: sensor.pool_water_temperature
        name: Eau
      - entity: sensor.vp2_temp_out
        name: Ext
    entity: input_boolean.ouverture_volet_piscine
    icon: 'mdi:chart-bell-curve'
    name: Mesures
    show_state: false
    type: 'custom:multiple-entity-row'
  - entities:
      - entity: pool_pump.next_run_schedule
        name: 'A venir '
      - entity: sensor.heure_pivot_piscine
        name: Heure pivot
    entity: pool_pump.next_run_schedule
    icon: 'mdi:clock'
    name: Tranche horaire
    show_state: false
    type: 'custom:multiple-entity-row'
  - entities:
      - entity: sensor.pool_pump_running_today
        name: Fonct. Jour
      - entity: binary_sensor.pool_pump_running
        name: Etat
    entity: sensor.pool_pump_running_today
    icon: 'mdi:pump'
    name: Pompe Filtration
    show_state: false
    type: 'custom:multiple-entity-row'
  - entities:
      - entity: sensor.pzem_pisc_puissance
        name: Puissance
      - entity: sensor.pzem_pisc_courant
        name: Intensité
    entity: sensor.pzem_pisc_puissance
    icon: 'mdi:flash'
    name: Conso Elec
    show_state: false
    type: 'custom:multiple-entity-row'
  - entities:
      - entity: input_boolean.hors_gel
        name: Hors Gel si actif
    entity: input_boolean.hors_gel
    icon: 'mdi:snowflake-alert'
    name: Hors Gel
    show_state: false
    type: 'custom:multiple-entity-row'
  - entities:
      - entity: cover.volet_piscine
        name: Volet
    entity: cover.volet_piscine
    icon: 'mdi:window-shutter'
    name: Volet piscine
    show_state: false
    type: 'custom:multiple-entity-row'
  - entities:
      - entity: sensor.ev_eau_tps_ouverture_jour
        name: Fonct. jour
      - entity: switch.cde_ev_eau
        name: Cde EV
      - entity: binary_sensor.tp_plein_lsh
        name: Niv H
      - entity: binary_sensor.tp_plein_lsl
        name: Niv B
    entity: input_boolean.ouverture_volet_piscine
    icon: 'mdi:water'
    name: Appoint Eau
    show_state: false
    type: 'custom:multiple-entity-row'
  - entities:
      - label: Filtration
        type: section
      - entity: input_boolean.swimming_season
      - entity: input_number.run_pool_pump_hours_swimming_season
      - entity: input_number.run_pool_pump_hours_off_season
      - label: Commutateurs
        type: section
      - entity: input_boolean.ppe_piscine
        name: Pompe Filtration
      - entity: cover.volet_piscine
        name: Couverture flottante
      - entity: input_boolean.eclairage_piscine
        name: Eclairage
      - entity: switch.cde_traitement
        name: Cde Traitement
      - entity: input_boolean.hors_gel
        name: Hors Gel si Actif
      - entity: input_boolean.ev_eau_piscine
        name: EV Eau appoint en auto si actif
    show_state: false
    head:
      label: PARAMETRES & COMMUTATEURS
      type: section
    padding: 0
    type: 'custom:fold-entity-row'
  - entities:
      - entity: switch.pool_pump_switch
        name: Relais Pompe Filtre
      - entity: switch.cde_traitement
        name: Relais Traitement
      - entity: switch.cde_volet_ouverture
        name: Relais Ouverture Volet
      - entity: switch.cde_volet_fermeture
        name: Relais fermeture Volet
      - entity: switch.cde_eclairage
        name: Relais Eclairage
      - entity: switch.cde_ev_eau
        name: EV Eau
    show_state: false
    head:
      label: COMMANDES DIRECTES
      type: section
    padding: 0
    type: 'custom:fold-entity-row'
style: |
  ha-card {
    border: solid 2px var(--primary-color);
  }
show_header_toggle: false
title: Piscine
type: entities
type: vertical-stack
cards:
  - title: <- 3 jours
    entities:
      - entity: binary_sensor.pool_pump_running
        name: Ppe
      - entity: switch.cde_ev_eau
        name: Ev Eau
    type: history-graph
    hours_to_show: 72
    refresh_interval: 0
  - type: 'custom:mini-graph-card'
    color_thresholds:
      - color: '#039BE5'
        value: 0
      - color: '#0da035'
        value: 5
      - color: '#e0b400'
        value: 10
      - color: '#e45e65'
        value: 20
    show:
      extrema: true
      icon: true
      labels: true
      name: true
      state: true
    hour24: true
    line_width: 2
    points_per_hour: 60
    hours_to_show: 72
    entities:
      - entity: sensor.pool_water_temperature
    name: Temperature Eau 3 J
  - type: 'custom:mini-graph-card'
    color_thresholds:
      - color: '#039BE5'
        value: 0
      - color: '#0da035'
        value: 5
      - color: '#e0b400'
        value: 10
      - color: '#e45e65'
        value: 20
    show:
      extrema: true
      icon: true
      labels: true
      name: true
      state: true
    hour24: true
    line_width: 2
    points_per_hour: 60
    hours_to_show: 72
    entities:
      - entity: sensor.ph_piscine_ph
    name: pH Eau 3 J

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, si il y a de la demande, je publierai la suite de mes réalisations comme décrit en introduction.

18 réflexions sur “Home Assistant-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.