[Article] Gestion ZEN de sa piscine avec iopool et Home Assistant

Bonjour,

Alors avec si peu d’informations difficile de t’aider.
Pour l’entité de temps de filtration écoulé, c’est une entité de calcul HA qui calcule le temps que ta pompe de filtration est On depuis aujourd’hui.
Vérifie que tu n’es pas fait d’erreurs par rapport à la doc et que tu ai mis la bonne entité qui correspond à ton switch (pompe de piscine)

Merci de ta réponse

J’ai vu que pour le boost l’entité était pas bonne j’ai changer ça fonctionne maintenant.

J’avais changer l’entité de mon contacteur de pompe et j’avais mit celle de la doc pour justement être tranquille.

j’ai controlé pour moi c’est ok je vois pas d’ou l’erreur peut venir

voici mon template

square: false
type: grid
cards:
  - type: custom:mushroom-title-card
    title: Piscine
    alignment: center
    title_tap_action:
      action: none
    subtitle_tap_action:
      action: none
  - type: custom:pool-monitor-card
    sensors:
      temperature:
        - entity: sensor.temperature_iopool_pool
      ph:
        - entity: sensor.ph_iopool_pool
      orp:
        - entity: sensor.orp_iopool_pool
    show_labels: true
    language: fr
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-entity-card
        entity: sensor.iopool
      - type: custom:mushroom-entity-card
        entity: binary_sensor.required_actions_iopool_pool
        name: Actions Requises
        icon_color: red
  - type: custom:mushroom-entity-card
    entity: switch.pool_switch
    icon_color: green
    icon: mdi:pump
    secondary_info: last-changed
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-select-card
        entity: input_select.pool_mode
        fill_container: true
        name: Mode de Filtration
      - type: custom:mushroom-select-card
        entity: input_select.pool_boost_selector
        name: Boost
        fill_container: false
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        primary: Temps Filtration
        secondary: >
          {% if states('sensor.iopool_filtration_time_recommandation') !=
          states(entity) %}
            {{ (states(entity)|int * 60)|timestamp_custom('%H:%M', false) }} (iopool: {{ (states('sensor.iopool_filtration_time_recommandation')|int * 60)|timestamp_custom('%H:%M', false) }} )
          {% else %}
            {{ (states(entity)|int * 60)|timestamp_custom('%H:%M', false) }}
          {% endif %}
        icon: mdi:clock-check-outline
        icon_color: blue
        multiline_secondary: true
        fill_container: false
        tap_action:
          action: more-info
        hold_action:
          action: none
        double_tap_action:
          action: none
        entity: sensor.pool_elapsed_filtration_duration
      - type: custom:mushroom-template-card
        primary: Filtration effectuée
        secondary: "{{ timedelta(hours=states(entity) | float(0)) }}"
        icon: mdi:chart-line
        entity: sensor.temps_de_filtration_ecoule
        fill_container: true
        icon_color: blue
        tap_action:
          action: more-info
        hold_action:
          action: more-info
        double_tap_action:
          action: more-info
        multiline_secondary: false
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        primary: Horaires de filtration
        secondary: >
          {{ "- Slot 1 : " +
          states('input_datetime.pool_start_slot1').split(':')[:-1] | join(':')
          + " / " +  states('input_datetime.pool_stop_slot1').split(':')[:-1] |
          join(':')}}

          {{ "- Slot 2 : " +
          states('input_datetime.pool_start_slot2').split(':')[:-1] | join(':')
          + " / " +  states('input_datetime.pool_stop_slot2').split(':')[:-1] |
          join(':')}}
        icon: mdi:clock
        icon_color: blue
        multiline_secondary: true
        fill_container: false
        tap_action:
          action: none
        hold_action:
          action: none
        double_tap_action:
          action: none
        layout: vertical
columns: 1

et mon app.yaml

iopoolPumpManager:    
    module: iopool_pump_manager
    class: iopoolPumpManager
    use_dictionary_unpacking: true
    log: iopoolPumpManager
    config:
      pump_switch: switch.pool_switch
      filtration_mode: input_select.pool_mode
      filtration_summer:
        recommanded_duration: sensor.recommanded_filtration_iopool_pool
        elapsed_today: sensor.pool_elapsed_filtration_duration
        min_duration: 240
        max_duration: 480
        slots:
          slot1:
            name: "Morning filtration"
            start: 10:00:00
            duration_percent: 25
          slot2:
            name: "Hot hours Filtrations"
            start: 12:00:00
            duration_percent: 75
      filtration_winter:
        name: "Winter filtration"
        duration: 01:30:00
        start: 02:00:00
      boost:
        selector: input_select.pool_boost_selector
        timer: timer.pool_boost

merci

C’est pas la carte le problème.
Quels sont les entités qui ne fonctionne pas et fourni les templates de ces entités

Bonjour,
Depuis quelque temps (suite MaJ, manip?!) j’ai un décalage dans les démarrages de mes cycles. Ils sont programmés a 10 et 19h et il démarre a 11h51 et 20:51

iopoolPumpManager:
  module: iopool_pump_manager
  class: iopoolPumpManager
  use_dictionary_unpacking: true
  log: iopoolPumpManager
  log_level: DEBUG
  config:
    pump_switch: switch.exterieur_sonoff_1
    filtration_mode: input_select.pool_mode
    filtration_summer:
      recommanded_duration: sensor.recommanded_filtration_iopool_pool
      elapsed_today: sensor.pool_elapsed_filtration_duration
      min_duration: 150
      max_duration: 480
      slots:
        slot1:
          name: "Morning filtration"
          start: 10:00:00
          duration_percent: 80
        slot2:
          name: "Hot hours Filtrations"
          start: 19:00:00
          duration_percent: 20
    filtration_winter:
      name: "Winter filtration"
      duration: 01:30:00
      start: 09:00:00
    boost:
      selector: input_select.pool_boost_selector
      timer: timer.pool_boost

Une idée ?

C’est cette entité qui ne marche pas car elle n’existe pas apparament

entity: sensor.temps_de_filtration_ecoule

Bonjour,

Tu es certain que AppDaemon est à l’heure ? Avec la bonne Timezone ?

Elle est pas censé s’appeller comme ça dans ma doc : appdaemon-iopoolpumpmanager/docs/iopoolPumpManager_entities.md at main · mguyard/appdaemon-iopoolpumpmanager · GitHub

C’est dans la doc sensor. pool_elapsed_filtration_duration

Et comme la doc l’indique c’est une entité à créer

Je vais bien relire à tête reposée
Merci je vous tien au courant

1 « J'aime »

@mguyard Bonjour, en regardant les projets disponible pour la gestion d’une piscine j’ai lu votre article. Je n’ai pas encore acheté le produit (on ne peut pas cumuler votre code avec la promo actuelle, dommage🥲) mais j’ai vu que vous étiez sur le point de sortir un custom component.

Une personne a sortie une version. Je vous mets le lien GitHub - Trustmania/homeassistant-iopool: Integration of the iopool into HomeAssistant

Cela peut vous servir.

Bonne journée.

Merci de l’info.
Je suis en train de finaliser les tests de l’intégration. Ça en fera deux et laissera ainsi le choix aux gens :+1:

1 « J'aime »

Certain, non. Je n’ai rien touché et ça fonctionné avant. Comment vérifier cela?
ma timezone de appdameon est bien sur Paris

  time_zone: Europe/Paris

Et quand je me connecte sur Appadameon, l’heure correspond

Il y a plusieurs bugs de temps dans AppDaemon déclaré sur leur github.
Dont une qui est résolu en 4.5.11.

Je pense qu’il faudrait regarder de ce côté car j’ai pas fait de mise à jour depuis un moment et j’ai pas le problème.
Et le code ne fait que demander à AppDaemon de déclencher quelque chose à une heure précise.

1 « J'aime »

Bonjour à tous,

icon

Je vous informe de la sortie de la solution simplifié pour gérer votre piscine avec iopool.
Plus besoin de rentrer dans du YAML ni dans AppDaemon, juste une intégration iopool.

:point_right: 🏊 Nouvelle intégration Home Assistant : iopool pour la gestion de piscine!

Cette intégration à pour rôle de venir remplacer l’application iopool-pumpmanager à terme.

4 « J'aime »

Salut @mguyard

J’ai fait des mises à jour aujourd’hui et je me retrouve avec une erreur dans la card :

Je ne comprends pas ce qui a pu provoquer cela, as-tu une idée ?

Bonne journée

Bonjour,

Une mise à jour de quoi ?

Système et Core. Possible de AppDaemon aussi il me semble.

Difficile a dire comme ca. Tu as toujours bien l’entité sensor.pool_pump_calculated_duration ?
L’application dans appdaemon ne retourne pas d’erreurs ?

Pfff je croyais que oui mais je l’ai confondue avec la « elapsed ». J’au redémarré AppDaemon et je vois qu’il reboote en boucle :

Je vais creuser…

On dirait un problème avec le module « hello » :thinking:

2025-07-12 15:37:51.718314 WARNING AppDaemon: ------------------------------------------------------------
2025-07-12 15:37:51.718932 WARNING AppDaemon: Unexpected error during run()
2025-07-12 15:37:51.729285 WARNING AppDaemon: ------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/appdaemon/app_management.py", line 1115, in safe_import
    await self.import_module(module_name)
  File "/usr/lib/python3.12/site-packages/appdaemon/utils.py", line 536, in wrapper
    return await run_in_executor(self, func, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/appdaemon/utils.py", line 561, in run_in_executor
    return await future
           ^^^^^^^^^^^^
  File "/usr/lib/python3.12/concurrent/futures/thread.py", line 59, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/appdaemon/app_management.py", line 719, in import_module
    raise exc
  File "/usr/lib/python3.12/site-packages/appdaemon/app_management.py", line 711, in import_module
    importlib.import_module(module_name)
  File "/usr/lib/python3.12/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1324, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'hello'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/appdaemon/exceptions.py", line 158, in wrapper
    return await func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/appdaemon/app_management.py", line 1126, in safe_import
    raise ade.FailedImport(module_name, self.AD.app_dir) from e
appdaemon.exceptions.FailedImport: Failed to import 'hello'