L’été commence à pointer le bout de son nez, c’est le moment d’envisager la remise en marche de la piscine…

Après plusieurs essais et réflexions diverses sur comment automatiser la filtration (et le robot !), je suis arrivé à un compromis entre complexité d’implémentation et efficacité à l’usage.

Tout d’abord le matériel

Pour activer une pompe, il faut juste mettre en place un interrupteur qu’on prend soin de relier au télérupteur, normalement mis en place dans le boîtier électrique.

Libre à vous de mettre l’interrupteur de votre choix.

Pour ma part, j’ai installé un Sonoff Dual R2, seul modèle à l’époque disposant de 2 relais indépendants.

Et oui, quitte à installer un équipement intelligent, autant qu’il prenne le maximum de fonction :

  • activation de la pompe
  • activation du projecteur

Comme toujours, les modules Sonoff sont flashés avec un firmware alternatif (EspEASY, EspHome, Tasmota, ...), je parlerai ici de Tasmota que je connais bien.

Principe Général

J’ai décidé que la filtration serait en marche 3 fois sur 24h.

Pourquoi 3 plages ?
Parce-que :)

Plus sérieusement, pas vraiment de recommandations là-dessus mais je pars sur le principe d’avoir besoin de filtrer la journée, avec une pause le midi.
La nuit, la photosynthèse est inactive mais je laisse un moment de filtration pour continuer de répartir les produits dans le bassin (et passer l’eau dans le filtre à sable).

Le temps de filtration va dépendre de la température de l’eau du bassin.
C’est principalement cette valeur qui va varier tout au long de la saison.

Les systèmes vendus avec les piscines sont basés sur une horloge, sur laquelle on active les plages horaires (par 30min en général) de filtration.

On ne va pas réinventer la roue et faire un système basé sur un algorithme de malade pour choisir si c'est mieux de filtrer à 11h52 ou 15h28. Non, nous allons juste reprogrammer une horloge en fonction de critères prédéfinis.

Les explications initiales étant terminées, voici comment j’ai automatisé tout cela.

Configuration Tasmota

De ce côté rien de particulier à faire car nous allons utiliser la fonction Timers (https://tasmota.github.io/docs/Timers/) qui permet de configurer des plages horaires durant lesquelles les relais sont activés/désactivés.

Vous allez me dire que ce n’est finalement pas super automatisé cette affaire, mais c’est là qu’Home Assistant vient rendre tout ça « smart ».

La commande Timer<x> permet de faire une action sur un relais à une heure donnée.
Les paramètres configurables sont les suivants :

  • Enable : activation/désactivation du Timer
  • Time : l’heure du trigger
  • Days : liste de jour où le trigger est valide SMTWTFS
  • Repeat : 1 seule activation ou multiples
  • Output : l’ID du relais
  • Action : activation/désactivation

Exemple :
Timer1 {"Enable":1,"Time":"02:23","Window":0,"Days":"--TW--S","Repeat":1,"Output":1,"Action":1}

On a décidé d'avoir 3 plages horaires donc... 6 Timers (start et stop)

Dans la configuration présentée, le Sonoff est sur le topic home/tasmota/piscine-dual

Quelques commandes à passer sur Tasmota pour un comportement logique du relais (état des relais au boot, flag retain ou non sur les topics MQTT, configuration de l'heure, la timezone, summer-time et scan Wi-Fi régulier) :

SwitchRetain 0
PowerOnState 3
timestd 0 0 10 1 3 60
timedst 0 0 3 1 2 120
timezone 99
so56 on
so57 on

Configuration Home Assistant

Nous avons donc besoin de 6 Timers, et plus particulièrement 6 « heures »

  • 3 start
  • 3 stop

La configuration est la même pour tous les jours de la semaine (SMTWTFS dans le JSON envoyé à Tasmota)

On utilise donc des input_datetime

Input DateTime : 3 plages horaires

#### HASS ############################################################
#
# input_datetime section
#
#
######################################################################


#### Pool
#
# Filtration Piscine Plage 1 - Start
piscine_start_1:
  name: Filtration Nuit Start
  has_date: false
  has_time: true
# Filtration Piscine Plage 1 - Stop
piscine_stop_1:
  name: Filtration Nuit Stop
  has_date: false
  has_time: true
# Filtration Piscine Plage 2 - Start
piscine_start_2:
  name: Filtration Matin Start
  has_date: false
  has_time: true
# Filtration Piscine Plage 2 - Stop
piscine_stop_2:
  name: Filtration Matin Stop
  has_date: false
  has_time: true
# Filtration Piscine Plage 3 - Start
piscine_start_3:
  name: Filtration Aprem Start
  has_date: false
  has_time: true
# Filtration Piscine Plage 3 - Stop
piscine_stop_3:
  name: Filtration Aprem Stop
  has_date: false
  has_time: true
#

Automation : Configuration Horloge de l'interrupteur

######################################################################
#
# Reconfiguration Timer Sonoff Dual sur changement plages filtration
#   - Plage Matin
#   - Plage Aprem
#   - Plage Soir
#
- alias: '[POOL] [FILTRATION] ReConfiguration Horloge'
  id: abcdefgh-398e-4d1f-bcc3-ef9d8eef1fe1
  initial_state: true
  mode: single
  max_exceeded: silent
  trigger:
    - platform: state
      entity_id: input_datetime.piscine_start_1
    - platform: state
      entity_id: input_datetime.piscine_stop_1
    - platform: state
      entity_id: input_datetime.piscine_start_2
    - platform: state
      entity_id: input_datetime.piscine_stop_2
    - platform: state
      entity_id: input_datetime.piscine_start_3
    - platform: state
      entity_id: input_datetime.piscine_stop_3
  action:
    # Pause 5s
    - delay: 5  # seconds
    # Activation Timers
    - service: mqtt.publish
      data:
        topic: 'home/tasmota/piscine-dual/cmnd/timers'
        payload: on
        retain: false
    #### Piscine Filtration Plage Nuit:
    #   - Définition Plage 1 (nuit)
    #   - Input DateTime Plage 1
    #   - MQTT Pub cmnd Timer1 et Timer2
    # START
    - service: mqtt.publish
      data:
        topic: 'home/tasmota/piscine-dual/cmnd/Timer1'
        payload_template: '{"Enable":1,"Time":"{{ states.input_datetime.piscine_start_1.state }}","Window":0,"Days":"SMTWTFS","Repeat":1,"Output":1,"Action":1}'
        retain: false
    # STOP
    - service: mqtt.publish
      data:
        topic: 'home/tasmota/piscine-dual/cmnd/Timer2'
        payload_template: '{"Enable":1,"Time":"{{ states.input_datetime.piscine_stop_1.state }}","Window":0,"Days":"SMTWTFS","Repeat":1,"Output":1,"Action":0}'
        retain: false
    #### Piscine Filtration Plage Matin:
    #    - Définition Plage 2 (matin)
    #    - Input DateTime Plage 2
    #    - MQTT Pub cmnd Timer3 et Timer4
    # START
    - service: mqtt.publish
      data:
        topic: 'home/tasmota/piscine-dual/cmnd/Timer3'
        payload_template: '{"Enable":1,"Time":"{{ states.input_datetime.piscine_start_2.state }}","Window":0,"Days":"SMTWTFS","Repeat":1,"Output":1,"Action":1}'
        retain: false
    # STOP
    - service: mqtt.publish
      data:
        topic: 'home/tasmota/piscine-dual/cmnd/Timer4'
        payload_template: '{"Enable":1,"Time":"{{ states.input_datetime.piscine_stop_2.state }}","Window":0,"Days":"SMTWTFS","Repeat":1,"Output":1,"Action":0}'
        retain: false
    #### Piscine Filtration Plage Aprem:
    #    - Définition Plage 3 (aprem)
    #    - Input DateTime Plage 3
    #    - MQTT Pub cmnd Timer5 et Timer6
    # START
    - service: mqtt.publish
      data:
        topic: 'home/tasmota/piscine-dual/cmnd/Timer5'
        payload_template: '{"Enable":1,"Time":"{{ states.input_datetime.piscine_start_3.state }}","Window":0,"Days":"SMTWTFS","Repeat":1,"Output":1,"Action":1}'
        retain: false
    # STOP
    - service: mqtt.publish
      data:
        topic: 'home/tasmota/piscine-dual/cmnd/Timer6'
        payload_template: '{"Enable":1,"Time":"{{ states.input_datetime.piscine_stop_3.state }}","Window":0,"Days":"SMTWTFS","Repeat":1,"Output":1,"Action":0}'
        retain: false
#

On est maintenant capable de faire varier la durée de filtration de la pompe de la piscine avec Home Assistant.

Pourquoi envoyer des plages horaires (Timers) plutôt qu’un simple Power ON ou Power OFF sur Tasmota ?
Tout simplement pour rendre « autonome » la filtration.

Si HA est DOWN, ou inaccessible, ou tout simplement si l'on a fait une erreur de configuration par ailleurs, l'interrupteur Tasmota fonctionne toujours sur la dernière conf envoyée.
La filtration sera toujours opérationnelle.

Home Assistant reprogramme l’horloge de Tasmota.
Tasmota fait fonctionner la pompe en fonction des données envoyées par HA.

Le step suivant : faire varier « automatiquement » les plages de filtration.
Libre à vous de définir de multiples plages horaires.
Dans notre exemple, on va en configurer 3 pour simplifier l’affichage.

On va avoir besoin ici d’ input_select : une liste déroulante avec nos différentes plages.

Input Select : mode de filtration

# Selecteur T° Piscine
filtration_piscine:
  name: 'Filtration Piscine'
  options:
    - 'All Night'
    - '25°C'
    - '28°C'

Ensuite nous avons notre seconde automation qui consiste à modifier les input_datetime en fonction de la sélection de l’input_select (en bonus, une notification sur l’application HA Android) :

Automation : programmation des Input DateTime

#
######################################################################
#
# Reconfiguration input_datetime from input_select
#
#### Piscine Programmation Filtration
#
- alias: '[POOL] [FILTRATION] Programmation'
  id: abcdefgh-b5a3-4910-ae77-025d32bf1301
  mode: single
  initial_state: true
  trigger:
    platform: state
    entity_id: input_select.filtration_piscine
  condition:
    - condition: template
      value_template: "{{ trigger.to_state.state != trigger.from_state.state }}"
  action:
    # Chooser
    - choose:
      #
      #### T° eau 25°C (8h)
      #    - Plage 1 (nuit)  : '01:00:00' - '02:00:00'
      #    - Plage 2 (matin) : '10:00:00' - '12:30:00'
      #    - Plage 3 (aprem) : '14:00:00' - '18:30:00'
      - conditions:
        - "{{ is_state('input_select.filtration_piscine', '25°C') }}"
        sequence:
          - service: input_datetime.set_datetime
            entity_id: input_datetime.piscine_start_1
            data:
              time: '01:00:00'
          - service: input_datetime.set_datetime
            entity_id: input_datetime.piscine_stop_1
            data:
              time: '02:00:00'
          - service: input_datetime.set_datetime
            entity_id: input_datetime.piscine_start_2
            data:
              time: '10:00:00'
          - service: input_datetime.set_datetime
            entity_id: input_datetime.piscine_stop_2
            data:
              time: '12:30:00'
          - service: input_datetime.set_datetime
            entity_id: input_datetime.piscine_start_3
            data:
              time: '14:00:00'
          - service: input_datetime.set_datetime
            entity_id: input_datetime.piscine_stop_3
            data:
              time: '18:30:00'
          # Notify Android App
          - service: notify.mobile_app_android-1
            data:
              title: "Piscine"
              message: "Reconfiguration Pompe : 8h"
              data:
                subject: "01:00-02:00 10:00-12:30 14:00-18:30"
                channel: "Pool"
                tag: "pool-prog"
      #
      #### T° eau 28°C (10h)
      #    - Plage 1 (nuit)  : '01:00:00' - '02:00:00'
      #    - Plage 2 (matin) : '09:00:00' - '13:00:00'
      #    - Plage 3 (aprem) : '14:00:00' - '19:00:00'
      - conditions:
        - "{{ is_state('input_select.filtration_piscine', '28°C') }}"
        sequence:
          - service: input_datetime.set_datetime
            entity_id: input_datetime.piscine_start_1
            data:
              time: '01:00:00'
          - service: input_datetime.set_datetime
            entity_id: input_datetime.piscine_stop_1
            data:
              time: '02:00:00'
          - service: input_datetime.set_datetime
            entity_id: input_datetime.piscine_start_2
            data:
              time: '09:00:00'
          - service: input_datetime.set_datetime
            entity_id: input_datetime.piscine_stop_2
            data:
              time: '13:00:00'
          - service: input_datetime.set_datetime
            entity_id: input_datetime.piscine_start_3
            data:
              time: '14:00:00'
          - service: input_datetime.set_datetime
            entity_id: input_datetime.piscine_stop_3
            data:
              time: '19:00:00'
          # Notify Android App
          - service: notify.mobile_app_android-1
            data:
              title: "Piscine"
              message: "Reconfiguration Pompe : 10h"
              data:
                subject: "01:00-02:00 19:00-13:00 14:00-19:00"
                channel: Pool
                tag: "pool-prog"
      #
      #### Filtration All Night
      #    - Plage 1 (nuit)  : '22:30:00' - '06:30:00'
      #
      - conditions:
        - "{{ is_state('input_select.filtration_piscine', 'All Night') }}"
        sequence:
          - service: input_datetime.set_datetime
            entity_id: input_datetime.piscine_start_1
            data:
              time: '22:30:00'
          - service: input_datetime.set_datetime
            entity_id: input_datetime.piscine_stop_1
            data:
              time: '06:10:00'
          # Notify Android App
          - service: notify.mobile_app_android-1
            data:
              title: "Piscine"
              message: "Reconfiguration Pompe : all night"
              data:
                subject: "22:30-06:10"
                channel: Pool
                tag: "pool-prog"
      #
      #Etc. Etc..

Dashboard Lovelace

Un petit Dashboard pour afficher les infos et surveiller l'état de la pompe :

Conclusion et améliorations

Le step ultime (que je n’ai toujours pas implémenté) c’est de faire une dernière automation qui fait varier l’input_select en fonction de la température de l’eau.
Avec celle-ci, il n’y aura plus rien à toucher dans HA tout le long de l'année.

La T° de l’eau ferait varier l’input_select qui modifie les input_datetime qui envoient les nouvelles plages horaires à Tasmota.

Simple !

Voici comment automatiser de manière relativement simple et pas trop complexe la filtration d’une piscine.

Enjoy !