{"id":2861,"date":"2022-02-02T16:29:00","date_gmt":"2022-02-02T15:29:00","guid":{"rendered":"https:\/\/domo.rem81.com\/?p=1502"},"modified":"2025-04-10T18:59:53","modified_gmt":"2025-04-10T16:59:53","slug":"ha-gestion-piscine-1-filtration-avec-appdaemon-2","status":"publish","type":"post","link":"https:\/\/domo.rem81.com\/index.php\/2022\/02\/02\/ha-gestion-piscine-1-filtration-avec-appdaemon-2\/","title":{"rendered":"HA-Gestion de la Filtration d&rsquo;une Piscine avec AppDaemon"},"content":{"rendered":"\n\n\n\n<h1 class=\"wp-block-heading\">Update du 22 Mars 2025<\/h1>\n\n\n\n<p><strong>Cet article est devenu dans ma configuration, obsol\u00e8te, il ne sera plus maintenu et restera dans cette version.<\/strong><\/p>\n\n\n\n<p><strong>En effet, j\u2019utilise depuis l\u00e9t\u00e9 2024, j&rsquo;utilise une version tout int\u00e9gr\u00e9e dans ESpHome, je vous invite \u00e0 la d\u00e9couvrir dans cet <\/strong><a href=\"https:\/\/domo.rem81.com\/index.php\/2025\/03\/21\/ha-gestion-complete-dune-piscine-avec-esp32-et-esphome\/\" data-type=\"link\" data-id=\"https:\/\/domo.rem81.com\/index.php\/2025\/03\/21\/ha-gestion-complete-dune-piscine-avec-esp32-et-esphome\/\"><strong>article<\/strong>.<\/a><\/p>\n\n\n\n<p>Bien \u00e9videmment, cette version reste fonctionnelle et vous pouvez tr\u00e8s bien l\u2019utiliser comme d\u00e9crit dans cet article.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Intro<\/h1>\n\n\n\n<p>Dans un article <a href=\"https:\/\/domo.rem81.com\/index.php\/2021\/01\/20\/home-assistant-gestion-piscine-filtration-poolpump\/\" target=\"_blank\" rel=\"noreferrer noopener\">pr\u00e9c\u00e9dent<\/a>, je d\u00e9taillais la m\u00e9thode utilis\u00e9e permettant de calculer le temps de filtration de la piscine, bas\u00e9e sur le module HACS \u00ab\u00a0Pool Pump Manager\u00a0\u00bb, qui fonctionne tr\u00e8s bien mais bien trop fig\u00e9 \u00e0 mon gout. En effet nous ne pouvons pas, par exemple,  modifier la r\u00e9partition du temps de filtration autour de l&rsquo;heure pivot fig\u00e9e sur 1\/3 avant et 2\/3 apr\u00e8s, param\u00e9trer l&rsquo;heure pivot,  changer de m\u00e9thode de calcul du temps bas\u00e9e uniquement sur l&rsquo;abaque Abacus, choisir un mode hiver.<\/p>\n\n\n\n<p>Je vous invite quand m\u00eame \u00e0 le parcourir, tout n&rsquo;est pas \u00e0 jeter.<\/p>\n\n\n\n<p>Pour toutes ces raisons, et ayant r\u00e9cemment d\u00e9couvert l&rsquo;addon \u00ab\u00a0AppDaemon\u00a0\u00bb, voir <a href=\"https:\/\/domo.rem81.com\/index.php\/2022\/05\/31\/ha-addon-appdaemon-programme-python-2\/\" target=\"_blank\" rel=\"noreferrer noopener\">mon article<\/a> sur ce sujet  , je me suis lanc\u00e9 dans un d\u00e9veloppement personnel de la gestion du temps de filtration en Python.<\/p>\n\n\n\n<p>Je n&rsquo;ai pas la pr\u00e9tention de me d\u00e9clarer \u00ab\u00a0expert\u00a0\u00bb en programmation et en python. C&rsquo;est en fouillant sur le net que j&rsquo;ai pu arriver \u00e0 mes fins et aboutir \u00e0 un fonctionnement satisfaisant. Il est \u00e9vident que ce programme sans pr\u00e9tention est largement perfectible. Tous les axes d&rsquo;am\u00e9lioration ou d&rsquo;optimisation du code seront les bienvenus en commentaire.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Mises \u00e0 Jour:<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Du 30\/08\/2024:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ajout de \u00ab\u00a0Une autre carte\u00a0\u00bb.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Du 02\/06\/2023:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Modification dans la m\u00e9morisation de la temp\u00e9rature sur changement d&rsquo;\u00e9tat de la pompe: remplacement de \u00ab\u00a0new_state\u00a0\u00bb par \u00ab\u00a0new\u00a0\u00bb.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Du 14\/09\/2022:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Affichage des heures \u00ab\u00a0d\u00e9but\u00a0\u00bb, \u00ab\u00a0fin\u00a0\u00bb au format hh:mm.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Du 27\/08\/2022:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Refonte et simplification du mode de calcul de la temporisation de circulation eau.<\/li>\n\n\n\n<li>La modification de la temporisation est prise en compte sans besoin de r\u00e9initialiser.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Du 30\/05\/2022:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ajout de la dur\u00e9e de filtration en heure (d\u00e9cimale). Il faut cr\u00e9er une entit\u00e9 \u00a0\u00bb input_number.duree_filtration_ete\u00a0\u00bb puis modifier les fichiers  \u00ab\u00a0filtration_piscine.yaml (ligne 29)\u00a0\u00bb et \u00ab\u00a0filtration_piscine.py (ligne 218)\u00a0\u00bb<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Du 24\/02\/2022:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ajout d&rsquo;une entit\u00e9 Arr\u00eat_Forc\u00e9: Si = On cette entit\u00e9 force la pompe \u00e0 l\u2019arr\u00eat quelque soit le mode. Dans mon cas je m&rsquo;en sert pour d\u00e9lester la consommation.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Du 17\/02\/2022:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ajout niveau de journalisation<\/li>\n\n\n\n<li>Ajout H_Pivot dans l&rsquo;affichage tranche horaire \u00ab\u00a0\u00e9t\u00e9\u00a0\u00bb<\/li>\n\n\n\n<li>Ajout tempo (\u00ab\u00a0tempo_eau\u00a0\u00bb) de prise en compte de la temp\u00e9rature apr\u00e8s demarrage de la pompe: Dans le cas d&rsquo;une mesure de temp\u00e9rature en ligne, cette temporisation permet de brasser l&rsquo;eau du bassin avant de prendre en compte sa temp\u00e9rature. Avant la fin de la tempo, la mesure prise en compte dans le calcul est celle de la veille (m\u00e9moris\u00e9e dans \u00ab\u00a0mem_temp\u00a0\u00bb) . Ce temps peut \u00eatre mis \u00e0 0 si la prise de mesure est effectu\u00e9e directement dans l&rsquo;eau du bassin, quoique brasser l&rsquo;eau quelques minutes avant de commencer&nbsp;le prise en compte de la T\u00b0 permet de m\u00e9lange les eaux de surface et de fond.<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Pr\u00e9 requis<\/h1>\n\n\n\n<p class=\"has-text-align-left\">Mes fichiers \u00ab\u00a0.yaml\u00a0\u00bb sont regroup\u00e9s dans un dossier \u00ab\u00a0config\/packages\u00a0\u00bb. J&rsquo;utilise la directive <a href=\"https:\/\/www.home-assistant.io\/docs\/configuration\/splitting_configuration\/\" data-type=\"URL\" data-id=\"https:\/\/www.home-assistant.io\/docs\/configuration\/splitting_configuration\/\">\u00ab\u00a0!include_dir_named<\/a> packages\u00a0\u00bb dans mon \u00ab\u00a0configuration.yaml\u00a0\u00bb tr\u00e8s pratique pour organiser son HA.<\/p>\n\n\n\n<p>Ci apr\u00e8s un extrait du \u00ab\u00a0configuration. yaml\u00a0\u00bb dont la version \u00e0 jour est disponible <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/remycrochon\/home-assistant\/blob\/master\/configuration.yaml\" target=\"_blank\">ici<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nhomeassistant:\n  name: Crochon\n  latitude: !secret latitude\n  longitude: !secret longitude\n  unit_system: metric\n  packages: !include_dir_named packages\n  external_url: !secret external-url\n  internal_url: !secret internal-url<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Cahier des charges<\/h1>\n\n\n\n<p>Mon cahier des charges est le suivant:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Traitement des 4 modes de fonctionnement:\n<ul class=\"wp-block-list\">\n<li>\u00c9t\u00e9: Temps de calcul fonction de la temp\u00e9rature de l&rsquo;eau<\/li>\n\n\n\n<li>Hiver: temps de filtration bas\u00e9 sur une heure de d\u00e9part et une dur\u00e9e<\/li>\n\n\n\n<li>Ma F: Force la pompe en marche<\/li>\n\n\n\n<li>At F: Force la pompe \u00e0 l\u2019arr\u00eat<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>En mode \u00c9t\u00e9:\n<ul class=\"wp-block-list\">\n<li>choix du mod\u00e8le de calcul du temps de filtration:\n<ul class=\"wp-block-list\">\n<li>Mode abaque Abacus<\/li>\n\n\n\n<li>Mode classique: Temp\u00e9rature divis\u00e9e par 2<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>R\u00e9partition du temps de filtration autour de l&rsquo;heure Pivot: 50% avant et 50% apr\u00e8s.<\/li>\n\n\n\n<li>Possibilit\u00e9 de choisir son heure pivot entre 11:00 et 14:00 (but\u00e9es modifiables dans l\u2019application)<\/li>\n\n\n\n<li>Possibilit\u00e9 de minorer ou majorer par un coefficient le temps de filtration (entre 60 et 140%: c&rsquo;est un choix personnel bas\u00e9 sur mon retour d&rsquo;exp\u00e9rience)<\/li>\n\n\n\n<li>Limiter l&rsquo;heure de fin \u00e0 23:59:59.<\/li>\n\n\n\n<li>Temporisation de prise en compte de la temp\u00e9rature apr\u00e8s demarrage de la pompe<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>For\u00e7age \u00e0 l\u2019arr\u00eat de la pompe quelque soit le mode de fonctionnement<\/li>\n\n\n\n<li>Affichage de la plage de filtration dans HA<\/li>\n\n\n\n<li>Enfin, avoir la main mise totale sur le programme, ma\u00eetriser les modifications et l&rsquo;am\u00e9liorer \u00e0 ma convenance.<\/li>\n<\/ul>\n\n\n\n<p>L&rsquo;heure pivot repr\u00e9sente selon moi le z\u00e9nith du soleil, elle sert de de r\u00e9f\u00e9rence horaire dans ma programmation.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Abaque du mode Abacus<\/h1>\n\n\n\n<p>Le temps filtration est calcul\u00e9 suivant la courbe bleue avec un coefficient de 100%, la rouge avec un coefficient de 60% et la verte avec un coefficient de 140%. Cette formule, utilis\u00e9e par Pool Pump Manager et le pluging Jeedom a \u00e9t\u00e9 r\u00e9cup\u00e9r\u00e9e dans <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/scadinot\/pool\" target=\"_blank\"> https:\/\/github.com\/scadinot\/pool<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"729\" height=\"463\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2021\/03\/filtration_courbe.png\" alt=\"\" class=\"wp-image-145\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2021\/03\/filtration_courbe.png 729w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2021\/03\/filtration_courbe-300x191.png 300w\" sizes=\"auto, (max-width: 729px) 100vw, 729px\" \/><figcaption class=\"wp-element-caption\">La courbe bleue repr\u00e9sente la valeur 100%, la courbe verte 140% et la courbe rouge 60%.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>D\u00e9claration des entit\u00e9s<\/strong><\/h2>\n\n\n\n<p>Les entit\u00e9s HA utilis\u00e9es dans ce fichier doivent avoir \u00e9t\u00e9 au pr\u00e9alable d\u00e9clar\u00e9es dans HA. Dans mon cas, elle sont regroup\u00e9es dans un fichier \u00ab\u00a0piscine.yaml\u00a0\u00bb.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>####################################################\n#                                                  #\n#                   PISCINE                        #\n#                                                  #\n####################################################\n\nutility_meter:\n# usage jour  \n  energy_pisc_usage_daily:\n    source: sensor.pzem_pisc_energy\n    cycle: daily\n    tariffs:\n      - hp\n      - hc\n# usage semaine\n  energy_pisc_usage_weekly:\n    source: sensor.pzem_pisc_energy\n    cycle: weekly\n    tariffs:\n      - hp\n      - hc\n# usage mois\n  energy_pisc_usage_monthly:\n    source: sensor.pzem_pisc_energy\n    cycle: monthly\n    tariffs:\n      - hp\n      - hc\n#usage an\n  energy_pisc_usage_yearly:\n    source: sensor.pzem_pisc_energy\n    cycle: yearly\n    tariffs:\n      - hp\n      - hc\ninput_number:\n  # utilis\u00e9 pour simuler la temp\u00e9rature de l'eau pendant les tests\n  temp_piscine:\n    name: Temp Eau Simul\n    min: -2\n    max: 35\n    unit_of_measurement: \u00b0C\n    icon: mdi:thermometer\n\n# temperature de l'eau avant arret ppe\n  mem_temp_piscine:\n    name: Temp Eau avant arret\n    min: -5\n    max: 50\n    unit_of_measurement: \u00b0C\n    step: 0.1\n    icon: mdi:thermometer\n    mode: box\n\n# temperature de l'eau avant arret ppe\n  test_mem_temp_piscine:\n    name: Temp Eau avant arret Test\n    min: -5\n    max: 50\n    unit_of_measurement: \u00b0C\n    step: 0.1\n    icon: mdi:thermometer\n    mode: box\n\n# tempo avant prise en compte de la temp\u00e9rature de l'eau suite \u00e0 demarrage marche pompe\n  tempo_circulation_eau:\n    name: Tempo Circulation Eau\n    min: 0\n    max: 3600\n    unit_of_measurement: s\n    step: 0.1\n    icon: mdi:timer\n    mode: box\n\n# temps utilisation cartouche chlore\n  temps_cartouche_chlore:\n    name: Temps cartouche Chlore\n    min: 0\n    max: 3600\n    unit_of_measurement: h\n    step: 0.1\n    icon: mdi:clock\n    mode: box\n\n# Seuil 1 inferieur temperature Hors gel\n  hors_gel_inf_seuil1:\n    name: Temp Inf Hors-Gel Seuil 1\n    min: -5\n    max: 0\n    unit_of_measurement: \u00b0C\n    icon: mdi:thermometer\n# Seuil 2 inferieur temperature Hors gel\n  hors_gel_inf_seuil2:\n    name: Temp Inf Hors-Gel Seuil 2\n    min: -10\n    max: 0\n    unit_of_measurement: \u00b0C\n    icon: mdi:thermometer\n\n# Dur\u00e9e de filtration max en hiver\n  duree_filtration_max_mode_hiver:\n    name: Dur\u00e9e filtration en Hiver\n    min: 0\n    max: 15\n    unit_of_measurement: h\n    step: 0.1\n    icon: mdi:clock\n    mode: box\n\n# Dur\u00e9e de filtration en \u00e9t\u00e9 calcul\u00e9e par appdaemon\n  duree_filtration_ete:\n    name: Dur\u00e9e filtration en Ete\n    min: 0\n    max: 24\n    unit_of_measurement: h\n    step: 0.1\n    icon: mdi:clock\n    mode: box\n\n# Dur\u00e9e de filtration max en hiver\n  filtration_coeff_abaque:\n    name: Coeff filtration Piscine Abaque\n    min: 60\n    max: 140\n    unit_of_measurement: \"%\"\n    step: 1.0\n    icon: mdi:percent\n    mode: box\n\ninput_datetime:\n  heure_pivot_pisc:\n    name: Heure Pivot\n    has_date: false\n    has_time: true\n\n  heure_ouv_volet_pisc:\n    name: Heure Ouv Volet Auto\n    has_date: false\n    has_time: true\n\n  heure_ferm_volet_pisc:\n    name: Heure Ferm Volet Auto\n    has_date: false\n    has_time: true\n\n  heure_ma_pump_pisc_hiv:\n    name: Heure Ma Pompe Pisc Hiv\n    has_date: false\n    has_time: true\n\ninput_boolean:\n  # Force la Ppe de filtration \u00e0 l'arret\n  piscine_arret_force:\n    name: Piscine Arret Forc\u00e9\n    icon: mdi:head-snowflake\n\n  # EV appoint Piscine en mode automatique\n  ev_eau_piscine:\n    name: Ev Piscine\n    icon: mdi:water\n  \n  # Volet Piscine en mode automatique\n  volet_piscine_auto:\n    name: Volet Piscine (Auto=1)\n    icon: mdi:garage\n\n  #cde eclairage piscine\n  eclairage_piscine:\n    name: Eclairage piscine\n    icon: mdi:car-light-high\n\n  # Calcul du hors gel- M\u00e9moire de mise en hors gel\n  hors_gel_valid:\n    name: Valid Hors Gel Piscine (si=1)\n    icon: mdi:snowflake-alert\n\n  # Calcul du temps de filtration selon Abaque Abacus sinon mode classique\n  calcul_mode_abaque:\n    name: Cacul mode Abaque (si=1)\n    icon: mdi:chart-bar\n\n# selection du mode de fonctionnement de la filtration\ninput_select:\n\n  mode_fonctionnement_piscine:\n    name: Mode Fonct Piscine\n    options:\n      - \"Ete\"\n      - \"Hiver\"\n      - \"Ma F\"\n      - \"At F\"\n    icon: mdi:pool\n# sert aux tests AppDaemon\n  mode_fonctionnement_piscine_test:\n    name: Mode Fonct Piscine\n    options:\n      - \"Ete\"\n      - \"Hiver\"\n      - \"Ma F\"\n      - \"At F\"\n    icon: mdi:pool\n############################  Input text    \ninput_text:\n  # Affiche la periode de Filtration\n  piscine_periode_filtration:   \n    name: Periode Filtration\n  test_piscine_periode_filtration:   \n    name: Test Periode Filtration\n  \n############################  Sensor\nsensor:\n  # Affichage du temps de fonctionnement de la pompe ce jour\n  - platform: history_stats\n    name: Ma Ppe Piscine Jour\n    entity_id: binary_sensor.ppe_piscine_en_marche\n    state: \"on\"\n    type: time\n    start: \"{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}\"\n    end: \"{{ now() }}\"\n\n  # Affichage du temps de fonctionnement de l'\u00e9lectrovanne appoint d'eau ce jour\n  - platform: history_stats\n    name: Ev Eau tps ouverture jour\n    entity_id: switch.ev_eau\n    state: \"on\"\n    type: time\n    start: \"{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}\"\n    end: \"{{ now() }}\"\n    \n  # Affichage du temps de fonctionnement de l'\u00e9lectrovanne appoint d'eau sur 7 jours\n  - platform: history_stats\n    name: Ev eau sur 7j\n    entity_id: switch.ev_eau\n    state: 'on'\n    type: time\n    end: \"{{ now().replace(hour=0, minute=0, second=0) }}\"\n    duration:\n      days: 7\n    \ntemplate:\n  - sensor:\n    - name: \"Heure pivot Soleil\"\n      unique_id: \"heure_pivot_soleil\"\n      state: &gt;\n        {{ as_timestamp(state_attr(\"sun.sun\", \"next_noon\")) | timestamp_custom('%H %M')}}\n      icon: mdi:weather-sunset\n#{{ as_timestamp(states.sun.sun.attributes.next_noon) | timestamp_custom(' %H %M')}}\n\n    - name: \"Energie Piscine Jour\"\n      unique_id: \"energy_pisc_daily\" \n      state: &gt;-\n        {% set p = states('sensor.energy_pisc_usage_daily_hp') | float(default=0) | round(2) %}\n        {% set o = states('sensor.energy_pisc_usage_daily_hc') | float(default=0) | round(2) %}\n        {{ (o + p) | round(2) }}\n      unit_of_measurement: \"kWh\"\n      device_class: \"energy\"\n      state_class: \"total\"  \n\n    - name: \"energy_pisc_weekly\"\n      state: &gt;-\n        {% set p = states('sensor.energy_pisc_usage_weekly_hp') | float(default=0) | round(2) %}\n        {% set o = states('sensor.energy_pisc_usage_weekly_hc') | float(default=0) | round(2) %}\n        {{ (o + p) | round(2) }}\n      unit_of_measurement: \"kWh\"\n      device_class: \"energy\"\n      state_class: \"total\"  \n\n    - name: \"energy_pisc_monthly\"\n      state: &gt;-\n        {% set p = states('sensor.energy_pisc_usage_monthly_hp') | float(default=0) | round(2) %}\n        {% set o = states('sensor.energy_pisc_usage_monthly_hc') | float(default=0) | round(2) %}\n        {{ (o + p) | round(2) }}\n      unit_of_measurement: \"kWh\"\n      device_class: \"energy\"\n      state_class: \"total\"  \n\n    - name: \"energy_pisc_yearly\"\n      state: &gt;-\n        {% set p = states('sensor.energy_pisc_usage_yearly_hp') | float(default=0) | round(2) %}\n        {% set o = states('sensor.energy_pisc_usage_yearly_hc') | float(default=0) | round(2) %}\n        {{ (o + p) | round(2) }}\n      unit_of_measurement: \"kWh\"\n      device_class: \"energy\"\n      state_class: \"total\"  \n\n  - binary_sensor:\n    # Si la puissance electrique est superieure \u00e0 500w, on considere que la pompe est en fonctionnement\n    # ou tester le switch de la ppe de filtration si pas de mesure de puissance\n    # {{ is_state('switch.ppe_filtration', 'on') }}\n    - name: \"ppe_piscine_en_marche\"\n      state: &gt;-\n        {{states.sensor.pzem_pisc_puissance.state | float(default=0) &gt; 500}} \n\n\n# Commande du volet roulant via un Cover\ncover:\n  - platform: template\n    covers:\n      volet_piscine:\n        device_class: garage\n        friendly_name: \"Piscine\"\n        value_template: &gt;-\n          {% if is_state('binary_sensor.volet_piscine_ferme', 'on') %}\n            closed\n          {% else %}\n            open\n          {% endif %}        \n        open_cover:\n          - service: script.volet_piscine_ouverture\n        close_cover:\n          - service: script.volet_piscine_fermeture   \n        stop_cover:\n          service: script.volet_piscine_stop\n        icon_template: &gt;-\n          {% if is_state('binary_sensor.volet_piscine_ferme', 'on') %}\n            mdi:garage\n          {% else %} \n            mdi:garage-open\n          {% endif %}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Addon Appdaemon<\/h2>\n\n\n\n<p>Cet Addon, pour ceux qui ne connaissent pas, permet d&rsquo;\u00e9crire des programmes en Python tr\u00e8s \u00e9labor\u00e9s, je d\u00e9crit son installation dans <a href=\"https:\/\/domo.rem81.com\/index.php\/2022\/05\/31\/ha-addon-appdaemon-programme-python-2\/\">cet article.<\/a><\/p>\n\n\n\n<p>Vous trouverez ci apr\u00e8s les fichiers \u00ab\u00a0.yaml\u00a0\u00bb et \u00ab\u00a0.py\u00a0\u00bb \u00e0 installer dans \u00ab\u00a0votre AppDaemon.\u00a0\u00bb<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Code de \u00ab\u00a0filtration_piscine.yaml\u00a0\u00bb<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># Version du 02\/06\/2023\nPiscine:\n  class: FiltrationPiscine\n  module: filtration_piscine\n# Capteurs\n  temperature_eau: sensor.temp_piscine\n# Selection du mode fonctionnement de la filtration\n  mode_de_fonctionnement: input_select.mode_fonctionnement_piscine\n# Heure pivot autour de laquelle le temps de filtration est r\u00e9parti (50\/50)\n  h_pivot: input_datetime.heure_pivot_pisc\n# Heure de d\u00e9but de filtration en hiver\n  h_debut_hiver: input_datetime.heure_ma_pump_pisc_hiv\n# Dur\u00e9e de la filtration en hiver\n  duree_hiver: input_number.duree_filtration_max_mode_hiver\n# Coefficient du temps de filtration entre 60 et 140%\n  coef: input_number.filtration_coeff_abaque\n# Validation de mode de calcul avec Abaque sinon c'est la m\u00e9thode classique (T\u00b0\/2)\n  mode_calcul: input_boolean.calcul_mode_abaque\n# Temps circulation de l'eau avant prise en compte mesure temp\u00e9rature\n# dans le cas o\u00f9 la mesure de temp\u00e9rature de l'eau se trouve sur le circuit de pompage\n  tempo_eau: input_number.tempo_circulation_eau\n# Memoire de la temperature de l'eau avant arret\n  mem_temp: input_number.mem_temp_piscine\n# Arret forc\u00e9 filtration- Bloque la filtration si = on\n  #arret_force: input_boolean.piscine_arret_force # \u00e0 utiliser par d\u00e9faut\n  arret_force: input_boolean.mem_delestage\n# Ajout\u00e9 le 30 mai 2022\n  # Dur\u00e9e de la filtration en ete\n  duree_filtration_ete: input_number.duree_filtration_ete\n\n# Actionneurs\n  # Switch de commande de la pompe\n  cde_pompe: switch.ppe_filtration\n  # Affichage dans HA des heures de filtration\n  periode_filtration: input_text.piscine_periode_filtration\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Code  de \u00ab\u00a0filtration_piscine.py\u00a0\u00bb<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># Version du 02\/06\/2023 -&gt; Modif sur la m\u00e9morisation de la T\u00b0 piscine (new_state_&gt;new) L63\/64\n\nimport hassapi as hass\nimport datetime\nfrom datetime import timedelta\nimport time\n\n# Variables globales\n# Saisir ici les memes modes que dans HA \nTAB_MODE = &#091;\"Ete\", \"Hiver\", \"At F\", \"Ma F\"]\n# Niveau de JOURNALISATION (log): 0=rien ou 1 =info ou 2=debug \nJOURNAL=2\n# RAZ du flag fin_tempo\nFIN_TEMPO = 0\n\n# Fonction de calcul du temps de filtration selon Abaque Abacus \ndef duree_abaque(Temperature_eau):\n    #Advanced calculation method using an abacus.\n    #D = a*T^3 + b*T^2 + c*T +d\n    #T est for\u00e7\u00e9 a 10\u00b0C minimum\n    #Formule d\u00e9couverte dans: https:\/\/github.com\/scadinot\/pool\n    #Filtration en heures\n    temperature_min: float = max(float(Temperature_eau), 10)\n    duree = (\n            0.00335 * temperature_min ** 3\n            - 0.14953 * temperature_min ** 2\n            + 2.43489 * temperature_min\n            - 10.72859\n    )\n    return duree\n\n# Fonction de calcul du temps de filtration \"Classique\" \ndef duree_classique(Temperature_eau):\n    #Methode classique temperature \/ 2\n    temperature_min: float = max(float(Temperature_eau), 10)\n    duree = temperature_min \/ 2\n    return duree\n\n# Fonction de Convertion Int en heure \"HH:MM:SS\"\ndef en_heure(t):\n    h = int(t)\n    # On retire les heures pour ne garder que les minutes.\n    t = (t - h) * 60 # 0.24 * 60 = temps_restant en minutes.\n    m = int(t)\n    # On retire les minutes pour ne garder que les secondes.\n    t = (t - m) * 60\n    s = int(t)\n    return \"{:02d}:{:02d}:{:02d}\".format(h, m, s)\n\n########## Programme principal ###################\nclass FiltrationPiscine(hass.Hass): \n    def initialize(self):\n        global JOURNAL, DUREE_TEMPO, FIN_TEMPO\n        message_notification= \"Initialisation AppDaemon Filtration Piscine.\"\n        self.notification(message_notification,0)\n        self.log(message_notification, log=\"error_log\")\n        self.notification(\"Journal Notif niveau:\"+str(JOURNAL),0)\n        self.listen_state(self.change_temp,self.args&#091;\"temperature_eau\"])\n        self.listen_state(self.change_mode,self.args&#091;\"mode_de_fonctionnement\"])\n        self.listen_state(self.change_coef,self.args&#091;\"coef\"])\n        self.listen_state(self.ecretage_h_pivot,self.args&#091;\"h_pivot\"])\n        self.listen_state(self.change_mode_calcul,self.args&#091;\"mode_calcul\"])\n        self.listen_state(self.raz_temporisation_mesure_temp,self.args&#091;\"cde_pompe\"],new=\"off\")\n        self.listen_state(self.fin_temporisation_mesure_temp,self.args&#091;\"cde_pompe\"],new=\"on\", duration=float(self.get_state(self.args&#091;\"tempo_eau\"])))        \n        self.listen_state(self.change_arret_force,self.args&#091;\"arret_force\"])\n        self.run_every(self.touteslesxminutes, \"now\", 5 * 60)\n        self.listen_state(self.change_tempo_circulation_eau,self.args&#091;\"tempo_eau\"])\n        #         \n        # initialisation de la temporisation avant recopie temperature\n        FIN_TEMPO = 0\n        # Arret de la pompe sur initalisation\n        self.turn_off(self.args&#091;\"cde_pompe\"])\n\n# Appel\u00e9 sur changement de temperature\n    def change_temp(self, entity, attribute, old, new, kwargs):\n        global JOURNAL\n        if new!= \"unavailable\":\n            self.notification('Appel traitement changement Temp.',2)\n            self.traitement(kwargs)\n\n# Appel\u00e9 sur changement de mode de fonctionnement\n    def change_mode(self, entity, attribute, old, new, kwargs):\n        global JOURNAL, FIN_TEMPO\n        FIN_TEMPO = 0\n        self.notification('Appel traitement changement Mode.',2)\n        self.traitement(kwargs)\n\n# Appel\u00e9 sur changement de coefficient\n    def change_coef(self, entity, attribute, old, new, kwargs):\n        global JOURNAL\n        self.notification('Appel traitement changement Coef.',2)\n        self.traitement(kwargs)\n\n# Appel\u00e9 sur changement de mode de calcul\n    def change_mode_calcul(self, entity, attribute, old, new, kwargs):\n        global JOURNAL\n        self.notification('Appel traitement changement mode de calcul.',2)\n        self.traitement(kwargs)\n\n# Appel\u00e9 sur changement arret forc\u00e9\n    def change_arret_force(self, entity, attribute, old, new, kwargs):\n        global JOURNAL\n        self.notification('Appel traitement sur arret force.',2)\n        self.traitement(kwargs)\n\n# Appel\u00e9 sur changement d'\u00e9tat de la pompe de filtrage de ON \u00e0 OFF\n    def raz_temporisation_mesure_temp(self, entity, attribute, old, new, kwargs):\n        global JOURNAL, FIN_TEMPO\n        FIN_TEMPO = 0\n        self.notification('Remise a zero temporisation circulation temp.',2)\n        self.notification(\"Flag fin tempo= \"+str(FIN_TEMPO),2)\n        #self.traitement(kwargs)\n\n# Appel\u00e9 sur fin temporisation suite \u00e0 demarrage de la pompe\n    def fin_temporisation_mesure_temp(self, entity, attribute, old, new, kwargs):\n        global JOURNAL, FIN_TEMPO \n        FIN_TEMPO = 1\n        self.notification('Fin temporisation circulation eau.',2)\n        self.notification(\"Flag fin tempo= \"+str(FIN_TEMPO),2)\n        #self.traitement(kwargs)\n\n# Ecretage Heure pivot entre h_pivot_min et h_pivot_max\n    def ecretage_h_pivot(self, entity, attribute, old, new, kwargs):\n        h_pivot= new\n        h_pivot_max=\"14:00:00\"\n        h_pivot_min=\"11:00:00\"\n        if h_pivot&gt;h_pivot_max:\n            self.set_state(self.args&#091;\"h_pivot\"], state = h_pivot_max)\n        if h_pivot&lt;h_pivot_min:\n            self.set_state(self.args&#091;\"h_pivot\"], state = h_pivot_min)\n        self.traitement(kwargs)\n\n# Appel\u00e9 toutes les x minutes\n    def touteslesxminutes(self, kwargs):\n        global JOURNAL\n        self.notification('Appel traitement toutes les x mn.',2)\n        self.traitement(kwargs)\n\n# Appel\u00e9 sur changement temporisation circulation eau\n    def change_tempo_circulation_eau(self, entity, attribute, old, new, kwargs):\n        global JOURNAL, FIN_TEMPO\n        FIN_TEMPO = 0\n        self.notification('Appel changement tempo circulation eau.',2)\n        self.notification(\"Flag fin tempo= \"+str(FIN_TEMPO),2)\n        self.initialize()\n\n# Routine du traitement principal\n    def traitement(self, kwargs):\n        global JOURNAL, FIN_TEMPO\n        h_locale=time.strftime('%H:%M:%S', time.localtime())\n        Mesure_temperature_eau = float(self.get_state(self.args&#091;\"temperature_eau\"]))\n        Mem_temperature_eau = float(self.get_state(self.args&#091;\"mem_temp\"]))\n        mode_de_fonctionnement = self.get_state(self.args&#091;\"mode_de_fonctionnement\"])\n        arret_force = self.get_state(self.args&#091;\"arret_force\"])\n        pompe = self.args&#091;\"cde_pompe\"]\n        pivot= self.get_state(self.args&#091;\"h_pivot\"])\n        coef=float(self.get_state(self.args&#091;\"coef\"]))\/100\n        mode_calcul= self.get_state(self.args&#091;\"mode_calcul\"])\n        periode_filtration=self.args&#091;\"periode_filtration\"]\n\n        # Flag FIN_TEMPO\n        self.notification(\"Flag fin tempo= \"+str(FIN_TEMPO),2)\n        # Temporisation avant prise en compte de la mesure de la temperature\n        self.notification(\"Duree tempo recirculation= \"+str(float(self.get_state(self.args&#091;\"tempo_eau\"]))),2)\n        # sinon on travaille avec la memoire de la \n        # temperature avant arret de la pompe\n        # m\u00e9morise la temp\u00e9rature eau de la veille.\n        if FIN_TEMPO == 1:\n            Temperature_eau=Mesure_temperature_eau\n            self.set_value(self.args&#091;\"mem_temp\"], Mesure_temperature_eau)\n        else:\n            Temperature_eau=Mem_temperature_eau\n\n        #  Mode Ete\n        if mode_de_fonctionnement == TAB_MODE&#091;0]:\n\n            if mode_calcul == \"on\": # Calcul selon Abaque\n                temps_filtration = (duree_abaque(Temperature_eau)) * coef\n                nb_h_avant = en_heure(float(temps_filtration \/ 2))\n                nb_h_apres = en_heure(float(temps_filtration \/ 2))\n                # nb_h_avant = en_heure(float(temps_filtration \/ 3)) R\u00e9partition 1\/3-2\/3\n                # nb_h_apres = en_heure(float(temps_filtration \/ 3*2))\n                nb_h_total = en_heure(float(temps_filtration))\n                self.notification(\"Duree Filtration Mode Abaque: \"+ str(temps_filtration)&#091;:6]+\" h\",2)\n            \n            else: # Calcul selon m\u00e9thode classique\n                temps_filtration = (duree_classique(Temperature_eau))*coef\n                nb_h_avant = en_heure(float(temps_filtration \/ 2))\n                nb_h_apres = en_heure(float(temps_filtration \/ 2))\n                nb_h_total = en_heure(float(temps_filtration))\n                self.notification(\"Duree Filtration Mode Classique: \"+ str(temps_filtration)&#091;:6]+\" h\",2)\n\n            # Calcul des heures de d\u00e9but et fin filtration en fontion\n            # du temps de filtration avant et apres l'heure pivot\n            # Adapte l'heure de d\u00e9but de filtration \u00e0 l'heure actuelle\n            # Limitation de la fin de filtration \u00e0 23:59:59\n            h_maintenant = timedelta(hours=int(h_locale&#091;:2]), minutes=int(h_locale&#091;3:5]), seconds=int(h_locale&#091;6:8]))\n            h_pivot = timedelta(hours=int(pivot&#091;:2]), minutes=int(pivot&#091;3:5]))\n            h_avant_t = timedelta(hours=int(nb_h_avant&#091;:2]), minutes=int(nb_h_avant&#091;3:5]), seconds=int(nb_h_avant&#091;6:8]))\n            h_apres_t = timedelta(hours=int(nb_h_apres&#091;:2]), minutes=int(nb_h_apres&#091;3:5]), seconds=int(nb_h_apres&#091;6:8]))\n            h_total_t = timedelta(hours=int(nb_h_total&#091;:2]), minutes=int(nb_h_total&#091;3:5]), seconds=int(nb_h_total&#091;6:8]))\n            h_max_t = timedelta(hours=23, minutes=59, seconds=59)\n\n            h_debut = h_pivot - h_avant_t\n            h_fin= h_pivot + h_apres_t\n\n#            if h_debut&lt;h_maintenant:\n#                h_debut=h_maintenant\n#                h_fin=h_maintenant+h_total_t\n#                h_fin= min(h_fin,h_max_t)\n            h_fin= min(h_fin,h_max_t)\n            message_notification= \"Nb h_avant_t: \"+str(h_avant_t)+\"\/Nb h_apres_t: \"+str(h_apres_t)+\"\/Nb h_total_t: \"+str(h_total_t)\n            self.notification(message_notification,1)\n            message_notification=\"h_debut: \"+str(h_debut)+\"\/h_pivot: \"+str(h_pivot)+\"\/h_fin: \"+str(h_fin) \n            self.notification(message_notification,1)\n            # Affichage plage horaire\n            affichage_texte =f\"{str(h_debut).zfill(8)&#091;:5]}\/{str(h_pivot).zfill(8)&#091;:5]}\/{str(h_fin).zfill(8)&#091;:5]}\"\n            self.set_textvalue(periode_filtration,affichage_texte)\n            # Ajout\u00e9 le 30 mai 2022\n            self.set_value(\"input_number.duree_filtration_ete\",round(temps_filtration,2))\n            # fin ajout\n            # Marche pompe si dans plage horaire sinon Arret\n            if self.now_is_between(str(h_debut),str(h_fin)):\n                ma_ppe=1\n            else:\n                ma_ppe=0\n\n# Notifications de debug\n            message_notification=\"Mode de fonctionnement: \"+mode_de_fonctionnement\n            self.notification(message_notification,2)\n            message_notification=\" Temp Eau= \"+str(Temperature_eau)\n            self.notification(message_notification,2)\n            message_notification=\"h_pivot= \"+str(pivot)\n            self.notification(message_notification,2)\n            message_notification=\"coef= \"+str(coef)\n            self.notification(message_notification,2)\n\n        #  Mode hiver Heure de D\u00e9but + Une dur\u00e9e en h \n        elif mode_de_fonctionnement == TAB_MODE&#091;1]:\n            h_debut_h= self.get_state(self.args&#091;\"h_debut_hiver\"])\n            duree= self.get_state(self.args&#091;\"duree_hiver\"])\n            duree_h=en_heure(float(duree))\n            h_debut_t = timedelta(hours=int(h_debut_h&#091;:2]), minutes=int(h_debut_h&#091;3:5]), seconds=int(h_debut_h&#091;6:8]))\n            duree_t = timedelta(hours=int(duree_h&#091;:2]), minutes=int(duree_h&#091;3:5]))\n            h_fin_f = h_debut_t + duree_t\n            # Affichage plage horaire\n            affichage_texte =f\"{str(h_debut_h).zfill(8)&#091;:5]}\/{str(h_fin_f).zfill(8)&#091;:5]}\"\n            self.set_textvalue(periode_filtration,affichage_texte)\n\n            message_notification=\"h_debut_h\"+str(h_debut_h)+\"-Duree H:\"+str(duree_h)+\"-H fin:\"+str(h_fin_f)\n            self.notification(message_notification,2)\n            # Marche pompe si dans plage horaire sinon Arret\n            if self.now_is_between(str(h_debut_h),str(h_fin_f)):\n                ma_ppe=1\n            else:\n                ma_ppe=0\n\n        # Mode Arret Forc\u00e9\n        elif mode_de_fonctionnement == TAB_MODE&#091;2]:\n            ma_ppe=0\n            text_affichage = \"At manuel\"\n            self.set_textvalue(periode_filtration,text_affichage)\n\n        # Mode Marche Forc\u00e9e\n        elif mode_de_fonctionnement == TAB_MODE&#091;3]:\n            ma_ppe=1\n            text_affichage = \"Ma manuel\"\n            self.set_textvalue(periode_filtration,text_affichage)\n            \n        # Mode Inconnu: revoir le contenu de Input_select.mode_de_fonctionnement\n        else:\n            message_notification=\"Mode de fonctionnement Piscine Inconnu: \"+mode_de_fonctionnement\n            self.notification(message_notification,0)\n\n        # Calcul sortie commande pompe filtration\n        # Arret pompe sur arret forc\u00e9\n        if arret_force==\"on\":\n            self.turn_off(pompe) \n            self.notification(\"Att sur Delestage\",1)\n            text_affichage = \"At delestage\"\n            self.set_textvalue(periode_filtration,text_affichage)\n        else:\n            if ma_ppe==1:\n                self.turn_on(pompe)\n                self.notification(\"Ma Pompe\",1)\n            else:\n                self.turn_off(pompe)\n                self.notification(\"Arret Pompe\",1)\n\n\n    # Fonction Notification\n    # message =  Texte \u00e0 afficher\n    # niveau = niveau de journalisation 0,1,2\n    def notification(self,message,niveau):\n        global JOURNAL\n        heure = str(self.time())&#091;:8]\n        if niveau &lt;= JOURNAL:\n            message_notification= format(heure)+\": \"+ message\n            self.log(message_notification, log=\"piscine_log\")\n            #self.call_service('notify\/telegram', message=message_notification)\n            #self.call_service('persistent_notification\/create', message=message_notification)<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Interfaces<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Interface simplifi\u00e9e<\/h2>\n\n\n\n<p>Le minimum syndical vous permettant d&rsquo;effectuer des essais.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"380\" height=\"648\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/05\/image-5-1.png\" alt=\"\" class=\"wp-image-2051\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/05\/image-5-1.png 380w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/05\/image-5-1-176x300.png 176w\" sizes=\"auto, (max-width: 380px) 100vw, 380px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>type: entities\nentities:\n  - entity: input_select.mode_fonctionnement_piscine\n  - entity: input_number.temp_piscine\n  - entity: input_datetime.heure_pivot_pisc\n  - entity: switch.test_ppe_piscine\n  - entity: input_number.filtration_coeff_abaque\n  - entity: input_boolean.calcul_mode_abaque\n  - entity: input_datetime.heure_ma_pump_pisc_hiv\n  - entity: input_number.duree_filtration_max_mode_hiver\n  - entity: input_text.piscine_periode_filtration\n  - entity: input_number.duree_filtration_ete\n  - entity: switch.ppe_filtration\n  - entity: binary_sensor.ppe_piscine_en_marche\n  - entity: sensor.ma_ppe_piscine_jour\n  - entity: sensor.tdeg_eau_piscine\n  - entity: sensor.temp_piscine<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Une Autre Carte!<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"364\" height=\"692\" src=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/02\/image-23.png\" alt=\"\" class=\"wp-image-3218\" srcset=\"https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/02\/image-23.png 364w, https:\/\/domo.rem81.com\/wp-content\/uploads\/2022\/02\/image-23-158x300.png 158w\" sizes=\"auto, (max-width: 364px) 100vw, 364px\" \/><\/figure>\n\n\n\n<p>Il faut installer \u00ab\u00a0pool-monitor-card\u00a0\u00bb et \u00ab\u00a0mini-graph-card\u00a0\u00bb avec HACS<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type: vertical-stack\ncards:\n  - show_state: true\n    show_name: true\n    camera_view: auto\n    type: picture-entity\n    entity: sensor.vp2_temp_out\n    name: T\u00b0 Ext\n    image: \/local\/images\/piscine4.png\n    aspect_ratio: 3\/4\n  - type: custom:pool-monitor-card\n    temperature: input_number.mem_temp_piscine\n    temperature_setpoint: 30\n    temperature_step: 3\n    ph: sensor.ph_piscine_ph\n    ph_setpoint: 7.2\n    ph_step: 0.2\n    free_chlorine: sensor.my_sampling_point_pl_chlorine_free\n    free_chlorine_setpoint: 2\n    free_chlorine_step: 1\n    total_chlorine: sensor.my_sampling_point_pl_chlorine_total\n    total_chlorine_setpoint: 3\n    total_chlorine_step: 1\n    cya: sensor.my_sampling_point_pl_cyanuric_acid\n    cya_setpoint: 37.5\n    cya_step: 12.5\n    alkalinity: sensor.my_sampling_point_pl_alkalinity\n    alkalinity_setpoint: 90\n    alkalinity_step: 30\n    pressure: sensor.pression_filtre\n    pressure_unit: bar\n    pressure_setpoint: 0.85\n    pressure_step: 0.2\n    compact: false\n    language: fr\n  - square: false\n    columns: 2\n    type: grid\n    cards:\n      - type: custom:mini-graph-card\n        entities:\n          - entity: sensor.compteur_energie_piscine_jour_hp_hc\n        name: Conso Piscine 7j\n        hours_to_show: 168\n        aggregate_func: max\n        group_by: date\n        show:\n          graph: bar\n        icon: mdi:flash\n      - type: custom:mini-graph-card\n        name: Pu Pompe\n        entities:\n          - entity: sensor.pzem_pisc_puissance\n            name: Pu Pompe\n            color: '#FFBF00'\n        hours_to_show: 12\n  - type: custom:mini-graph-card\n    entities:\n      - entity: sensor.ph_piscine_ph\n        unit: pH\n        color: '#4e91d8'\n        name: pH Mesur\u00e9\n      - entity: sensor.ph_stat_median\n        color: '#FFFF00'\n        name: pH median\n    height: 250\n    hours_to_show: 24\n    line_width: 2\n    name: pH\n    points_per_hour: 2\n    view_layout:\n      position: main\nview_layout:\n  position: sidebar\n<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Et Pool_pump-Manager?<\/h1>\n\n\n\n<p>Et bien si vous aviez suivi mon article <a href=\"https:\/\/domo.rem81.com\/index.php\/2021\/01\/20\/home-assistant-gestion-piscine-filtration-poolpump\/\" data-type=\"link\" data-id=\"https:\/\/domo.rem81.com\/index.php\/2021\/01\/20\/home-assistant-gestion-piscine-filtration-poolpump\/\">https:\/\/domo.rem81.com\/home-assistant-gestion-piscine-filtration-poolpump\/<\/a> et migr\u00e9 vers ce mode de gestion du temps de filtration avc AppDaemon, vous pouvez supprimer:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>le HACS Pool_Pump_Manager<\/li>\n\n\n\n<li>Les automatimes \u00ab\u00a0\u00ab&nbsp;calcul fonctionnement pompe&nbsp;\u00bb et \u00ab&nbsp;m\u00e9morisation temp\u00e9rature avant arret&nbsp;\u00bb<\/li>\n\n\n\n<li>Prendre la derni\u00e8re version de l&rsquo;automatisme \u00ab\u00a0hors_gel\u00a0\u00bb<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p>Cet article va surement \u00e9volu\u00e9 dans le temps, il reste quelques am\u00e9liorations ou \u00e9volutions \u00e0 apporter. <\/p>\n\n\n\n<p>N&rsquo;h\u00e9sitez pas \u00e0 me laisser en commentaire, des critiques n\u00e9gatives ou positives constructrices sur le sujet.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Liste des publications en lien avec cet article:<\/h1>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Filtration avec <a href=\"https:\/\/domo.rem81.com\/index.php\/2025\/03\/21\/ha-gestion-complete-dune-piscine-avec-esp32-et-esphome\/\" data-type=\"link\" data-id=\"https:\/\/domo.rem81.com\/index.php\/2025\/03\/21\/ha-gestion-complete-dune-piscine-avec-esp32-et-esphome\/\" target=\"_blank\" rel=\"noreferrer noopener\">ESPHome et ESP32<\/a><\/li>\n\n\n\n<li>Filtration avec \u00ab\u00a0<a href=\"https:\/\/domo.rem81.com\/index.php\/2022\/02\/02\/ha-gestion-piscine-1-filtration-avec-appdaemon-2\/\" target=\"_blank\" rel=\"noreferrer noopener\">AppDaemon\u00a0\u00bb<\/a><\/li>\n\n\n\n<li>Filtration avec \u00ab\u00a0<a href=\"https:\/\/domo.rem81.com\/index.php\/2021\/01\/20\/home-assistant-gestion-piscine-filtration-poolpump\/\" target=\"_blank\" rel=\"noreferrer noopener\">Pool Pump Manager<\/a>\u00ab\u00a0<\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2021\/02\/24\/home-assistant-gestion-piscine-2_mesure-de-puissance-electrique\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mesure de puissance \u00e9lectrique<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2021\/04\/02\/home-assistant-gestion-piscine-1_mise-a-niveau-automatique\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mise \u00e0 niveau automatique<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2021\/05\/11\/home-assistant-gestion-piscine-4_mesure-ph\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mesure du pH<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2021\/08\/14\/ha-gestion-piscine-5_regulation-du-ph\/\" target=\"_blank\" rel=\"noreferrer noopener\">R\u00e9gulation du Ph<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2021\/11\/30\/ha-gestion-piscine-6_mode-hors-gel\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mise Hors Gel<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2022\/05\/13\/ha-gestion-piscine-7_mesure-de-pression\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mesure de pression<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2025\/04\/04\/ha-mesurer-la-consommation-deau-de-ma-piscine-avec-un-esp8266-et-esphome\/\" data-type=\"link\" data-id=\"https:\/\/domo.rem81.com\/index.php\/2025\/04\/04\/ha-mesurer-la-consommation-deau-de-ma-piscine-avec-un-esp8266-et-esphome\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mesure consommation d&rsquo;eau<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2025\/04\/11\/ha-panneau-de-commande-pour-piscine-avec-un-esp32-openhasp-et-home-assistant\/\" data-type=\"link\" data-id=\"https:\/\/domo.rem81.com\/index.php\/2025\/04\/11\/ha-panneau-de-commande-pour-piscine-avec-un-esp32-openhasp-et-home-assistant\/\" target=\"_blank\" rel=\"noreferrer noopener\">Panneau de contr\u00f4le avec un ESP32<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/domo.rem81.com\/index.php\/2025\/04\/13\/ha-analyse-de-leau-de-piscine-avec-le-poollab-2-0-et-integration-dans-home-assistant\/\" data-type=\"link\" data-id=\"https:\/\/domo.rem81.com\/index.php\/2025\/04\/13\/ha-analyse-de-leau-de-piscine-avec-le-poollab-2-0-et-integration-dans-home-assistant\/\" target=\"_blank\" rel=\"noreferrer noopener\">Analyse de l&rsquo;eau avec PoolLAB2.0<\/a><\/li>\n<\/ol>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Update du 22 Mars 2025 Cet article est devenu dans ma configuration, obsol\u00e8te, il ne sera plus maintenu et restera dans cette version. En effet, j\u2019utilise depuis l\u00e9t\u00e9 2024, j&rsquo;utilise &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[8,33],"class_list":["post-2861","post","type-post","status-publish","format-standard","hentry","category-homeassistant","tag-appdaemon","tag-piscine"],"_links":{"self":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/2861","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/comments?post=2861"}],"version-history":[{"count":18,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/2861\/revisions"}],"predecessor-version":[{"id":3657,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/2861\/revisions\/3657"}],"wp:attachment":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/media?parent=2861"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/categories?post=2861"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/tags?post=2861"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}