[TUTO] - Gestion de sa piscine avec sonde iopool

Slt,
J’ai encore des questions…désolé.
Le temps de filtration m’indique 6h30 (recommandation iopool).
Mais si. Ous regardez les plage de filtrations on est bien au dessus des 6h30. Normal?
Autre chose,comment faites vous pour arrêter la pompe pour manipuler la vanne 5 voies(back wash)?Si je l’éteint manuellement elle se relance automatiquement.

Enfin y a t il un moyen de mettre à zéro le temps de filtration effectué?

Merci

Peut être que tu tombes dans un bug ou un cas que je gère pas.
Il faudrait que tu me donne ta conf de l’app app Darmon pour connaître les pourcentages et regarder pourquoi ça te donne une durée jusqu’au lendemain matin pour le slot2.

Il me faudrait l’ensemble des logs de la journée que tu as dans appdeamon (en debug)

Concernant l’arrêt de la pompe, je m’arrête simplement et il est impossible à AppDaemon de la redémarrer sauf lorsque c’est une heure de début de slot car c’est le seul moment où l’app lance la pompe

Hello,
ci-dessous le code de l’app et ma config appdaemon

2023-06-02 19:46:22.910604 INFO pool_pump_manager: Initialized
2023-06-02 19:46:22.919178 CRITICAL pool_pump_manager: Entity defined in 'pump_sensor_id' configuration don't exist. Please update your configuration !
2023-06-02 19:46:22.924212 INFO pool_pump_manager: Error in configuration. Stopping app waiting configuration correction
2023-06-02 19:46:22.927094 DEBUG pool_pump_manager: call_service: app/stop, {'app': 'pool_pump_manager', 'namespace': 'admin', '__name': 'pool_pump_manager'}
2023-06-02 20:22:45.660484 INFO pool_pump_manager: Initialized
2023-06-02 20:22:45.675961 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-02 20:22:45.737805 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-02 20:22:45.746759 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-02 20:22:45.751525 INFO pool_pump_manager: INIT - Pool is in mode Standard
2023-06-02 20:22:45.754449 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-02 20:22:45.758745 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-02 20:22:45.767421 DEBUG pool_pump_manager: Registering run_every starting 2023-06-03 06:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-02 20:22:45.776034 INFO pool_pump_manager: Generate a daily task at 06:00:00 for slot1 start
2023-06-02 20:22:45.779353 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-02 20:22:45.785738 DEBUG pool_pump_manager: Registering run_every starting 2023-06-03 14:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-02 20:22:45.794868 INFO pool_pump_manager: Generate a daily task at 14:00:00 for slot2 start
2023-06-02 20:22:45.797459 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-02 20:22:45.801771 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-02 20:22:45.804621 DEBUG pool_pump_manager: Registering run_at at 2023-06-02 00:00:00+02:00 for pool_pump_manager
2023-06-02 20:22:45.811483 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-02 20:22:45.816809 INFO pool_pump_manager: INIT - Based on slot1 end time in input_datetime.pool_stop_slot1, we create a task with handler 3515d0ff3796433296d22ab0d6f5dde1 at 00:00:00
2023-06-02 20:22:45.819558 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-02 20:22:45.824834 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-02 20:22:45.827736 DEBUG pool_pump_manager: Registering run_at at 2023-06-02 00:00:00+02:00 for pool_pump_manager
2023-06-02 20:22:45.834453 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-02 20:22:45.839907 INFO pool_pump_manager: INIT - Based on slot2 end time in input_datetime.pool_stop_slot2, we create a task with handler 5108a884a08547b489409f2ed6763c4e at 00:00:00
2023-06-02 20:22:45.845484 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot1, {'duration': 1, 'slot': 1} from pool_pump_manager
2023-06-02 20:22:45.851943 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot2, {'duration': 1, 'slot': 2} from pool_pump_manager
2023-06-02 20:22:45.857296 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_mode, {'duration': 1} from pool_pump_manager
2023-06-02 20:22:45.862473 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_boost, {} from pool_pump_manager
2023-06-02 20:22:45.866789 DEBUG pool_pump_manager: Calling listen_event for pool_pump_manager
2023-06-02 20:22:45.877247 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-03 00:00:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=1 message=Slot1 Automation 
2023-06-02 20:22:45.883115 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-03 00:00:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=2 message=Slot2 Automation 
2023-06-02 20:22:45.889134 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-03 06:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=1 
2023-06-02 20:22:45.894838 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-03 14:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=2 
2023-06-02 20:23:08.461818 INFO pool_pump_manager: Change in boost trigger detected : 1H (Old: Aucun)
2023-06-02 20:23:08.465355 DEBUG pool_pump_manager: call_service: timer/start, {'entity_id': 'timer.pool_boost', 'duration': '01:00:00'}
2023-06-02 20:23:08.475109 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-02 20:23:08.487456 INFO pool_pump_manager: Starting Pump - Boost 1H
2023-06-02 20:23:08.493244 DEBUG pool_pump_manager: call_service: homeassistant/turn_on, {'entity_id': 'switch.pool_switch'}
2023-06-02 20:23:10.450576 INFO pool_pump_manager: Change in boost trigger detected : 4H (Old: 1H)
2023-06-02 20:23:10.454372 DEBUG pool_pump_manager: call_service: timer/start, {'entity_id': 'timer.pool_boost', 'duration': '04:00:00'}
2023-06-02 20:23:10.462499 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-02 20:23:10.475733 INFO pool_pump_manager: Boost 4H - Pump is already On !
2023-06-02 20:23:19.325828 INFO pool_pump_manager: Change in boost trigger detected : Aucun (Old: 4H)
2023-06-02 20:23:19.328698 DEBUG pool_pump_manager: call_service: timer/cancel, {'entity_id': 'timer.pool_boost'}
2023-06-02 20:23:19.336617 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-02 20:23:19.341572 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-02 20:23:19.354854 INFO pool_pump_manager: As boost change from mode 4H to Aucun during normal filtration time, pump stopping is canceled
2023-06-02 20:37:15.427046 INFO pool_pump_manager: Change detected in input_datetime.pool_start_slot2 time - old value 14:00:00 / new value : 21:00:00
2023-06-02 20:37:15.431911 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-02 20:37:15.438597 DEBUG pool_pump_manager: Registering run_every starting 2023-06-02 21:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-02 20:37:15.448049 INFO pool_pump_manager: Generate a daily task at 21:00:00 for slot2 start
2023-06-02 20:37:15.454228 INFO pool_pump_manager: Generate a new task with handler 16c922577179496d9e4bcdf60385e653 for slot2 - at 21:00:00
2023-06-02 20:37:15.457874 DEBUG pool_pump_manager: Canceling timer with handle 21c1e3dc51644d778795a2b748752f68 for pool_pump_manager
2023-06-02 20:37:15.465596 DEBUG pool_pump_manager: New handler 16c922577179496d9e4bcdf60385e653 stored for slot2
2023-06-02 20:37:19.684072 INFO pool_pump_manager: Change detected in input_datetime.pool_start_slot2 time - old value 21:00:00 / new value : 20:00:00
2023-06-02 20:37:19.688176 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-02 20:37:19.694505 DEBUG pool_pump_manager: Registering run_every starting 2023-06-03 20:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-02 20:37:19.703801 INFO pool_pump_manager: Generate a daily task at 20:00:00 for slot2 start
2023-06-02 20:37:19.710036 INFO pool_pump_manager: Generate a new task with handler 04a94eb75dce4f828763a9b18eedfddc for slot2 - at 20:00:00
2023-06-02 20:37:19.713448 DEBUG pool_pump_manager: Canceling timer with handle 16c922577179496d9e4bcdf60385e653 for pool_pump_manager
2023-06-02 20:37:19.720724 DEBUG pool_pump_manager: New handler 04a94eb75dce4f828763a9b18eedfddc stored for slot2
2023-06-02 20:37:23.048443 INFO pool_pump_manager: Change detected in input_datetime.pool_start_slot2 time - old value 20:00:00 / new value : 20:38:00
2023-06-02 20:37:23.052945 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-02 20:37:23.059125 DEBUG pool_pump_manager: Registering run_every starting 2023-06-02 20:38:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-02 20:37:23.069843 INFO pool_pump_manager: Generate a daily task at 20:38:00 for slot2 start
2023-06-02 20:37:23.076507 INFO pool_pump_manager: Generate a new task with handler a326d716435f487a9fbba7fa0f9f2a98 for slot2 - at 20:38:00
2023-06-02 20:37:23.080660 DEBUG pool_pump_manager: Canceling timer with handle 04a94eb75dce4f828763a9b18eedfddc for pool_pump_manager
2023-06-02 20:37:23.089165 DEBUG pool_pump_manager: New handler a326d716435f487a9fbba7fa0f9f2a98 stored for slot2
2023-06-02 20:38:00.016106 DEBUG pool_pump_manager: get state: sensor.temps_de_filtration_ecoule, {} from pool_pump_manager
2023-06-02 20:38:00.019242 DEBUG pool_pump_manager: get state: sensor.recommandation_duree_de_filtration_sonde_piscine, {} from pool_pump_manager
2023-06-02 20:38:00.023388 DEBUG pool_pump_manager: call_service: input_number/set_value, {'value': 390, 'entity_id': 'input_number.filtration_duration_calculated'}
2023-06-02 20:38:00.031814 DEBUG pool_pump_manager: get state: sensor.recommandation_duree_de_filtration_sonde_piscine, {} from pool_pump_manager
2023-06-02 20:38:00.042907 INFO pool_pump_manager: Based on configuration, filtration duration is 390 minutes (iopool recommandation is 390 minutes)
2023-06-02 20:38:00.050738 INFO pool_pump_manager: Slot2 - Elapsed time of filtration : 12 minutes / Remaining time : 378 minutes
2023-06-02 20:38:00.054799 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-02 20:38:00.059522 DEBUG pool_pump_manager: set state: input_datetime.pool_stop_slot2, {'state': '02:56:00'} from pool_pump_manager
2023-06-02 20:38:00.914059 INFO pool_pump_manager: Slot2 Filtration times - Start : 20:38:00 / End : 02:56:00
2023-06-02 20:38:00.917636 DEBUG pool_pump_manager: Checking timer with handle 5108a884a08547b489409f2ed6763c4e for pool_pump_manager
2023-06-02 20:38:00.920671 DEBUG pool_pump_manager: Canceling timer with handle 5108a884a08547b489409f2ed6763c4e for pool_pump_manager
2023-06-02 20:38:00.928820 INFO pool_pump_manager: Cancel existing timer for slot2 with handler 5108a884a08547b489409f2ed6763c4e
2023-06-02 20:38:00.932998 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-02 20:38:00.941382 INFO pool_pump_manager: Starting Pump - Pump starting for slot 2
2023-06-02 20:38:00.946228 DEBUG pool_pump_manager: call_service: homeassistant/turn_on, {'entity_id': 'switch.pool_switch'}
2023-06-02 20:38:00.956446 DEBUG pool_pump_manager: Registering run_at at 2023-06-02 02:56:00+02:00 for pool_pump_manager
2023-06-02 20:38:00.967737 INFO pool_pump_manager: Create new timer for slot2 with handler 28c303d367534f688ee3f56a695dcc7b
2023-06-03 00:00:00.024175 DEBUG pool_pump_manager: get state: timer.pool_boost, {} from pool_pump_manager
2023-06-03 00:00:00.028487 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-03 00:00:00.034364 INFO pool_pump_manager: Stopping Pump - Slot1 Automation
2023-06-03 00:00:00.040732 DEBUG pool_pump_manager: call_service: homeassistant/turn_off, {'entity_id': 'switch.pool_switch'}
2023-06-03 02:56:00.026505 DEBUG pool_pump_manager: get state: timer.pool_boost, {} from pool_pump_manager
2023-06-03 02:56:00.029458 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-03 02:56:00.034716 INFO pool_pump_manager: Stopping Pump - Slot2 Automation
2023-06-03 02:56:00.038888 DEBUG pool_pump_manager: call_service: homeassistant/turn_off, {'entity_id': 'switch.pool_switch'}
2023-06-03 02:56:00.047113 DEBUG pool_pump_manager: get state: sensor.recommandation_duree_de_filtration_sonde_piscine, {} from pool_pump_manager
2023-06-03 02:56:00.054790 DEBUG pool_pump_manager: call_service: input_number/set_value, {'value': 390, 'entity_id': 'input_number.filtration_duration_calculated'}
2023-06-03 02:56:00.067146 DEBUG pool_pump_manager: get state: sensor.recommandation_duree_de_filtration_sonde_piscine, {} from pool_pump_manager
2023-06-03 02:56:00.086876 INFO pool_pump_manager: Based on configuration, filtration duration is 390 minutes (iopool recommandation is 390 minutes)
2023-06-03 02:56:00.092941 DEBUG pool_pump_manager: get state: sensor.temps_de_filtration_ecoule, {} from pool_pump_manager
2023-06-03 02:56:00.101478 DEBUG pool_pump_manager: get state: timer.pool_boost, {} from pool_pump_manager
2023-06-03 06:00:00.027302 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-03 06:00:00.033215 INFO pool_pump_manager: Pump starting for slot 1 - Pump is already On !
2023-06-03 06:00:00.036613 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 06:00:00.040136 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 06:00:00.043257 DEBUG pool_pump_manager: get state: sensor.recommandation_duree_de_filtration_sonde_piscine, {} from pool_pump_manager
2023-06-03 06:00:00.047086 DEBUG pool_pump_manager: call_service: input_number/set_value, {'value': 390, 'entity_id': 'input_number.filtration_duration_calculated'}
2023-06-03 06:00:00.055139 DEBUG pool_pump_manager: get state: sensor.recommandation_duree_de_filtration_sonde_piscine, {} from pool_pump_manager
2023-06-03 06:00:00.065087 INFO pool_pump_manager: Based on configuration, filtration duration is 390 minutes (iopool recommandation is 390 minutes)
2023-06-03 06:00:00.078474 DEBUG pool_pump_manager: Duration Between slots : 878 minutes / Filtration Duration : 156 (minutes)
2023-06-03 06:00:00.080914 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 06:00:00.084601 DEBUG pool_pump_manager: set state: input_datetime.pool_stop_slot1, {'state': '08:36:00'} from pool_pump_manager
2023-06-03 06:00:00.117766 INFO pool_pump_manager: Slot1 Filtration times - Start : 06:00:00 / End : 08:36:00
2023-06-03 06:00:00.121046 DEBUG pool_pump_manager: Checking timer with handle 3515d0ff3796433296d22ab0d6f5dde1 for pool_pump_manager
2023-06-03 06:00:00.123922 DEBUG pool_pump_manager: Registering run_at at 2023-06-03 08:36:00+02:00 for pool_pump_manager
2023-06-03 06:00:00.134572 INFO pool_pump_manager: Create new timer for slot1 with handler f22e862e85b84498acf160944e55ec7d
2023-06-03 08:36:00.016981 DEBUG pool_pump_manager: get state: timer.pool_boost, {} from pool_pump_manager
2023-06-03 08:36:00.019756 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-03 08:36:00.025062 INFO pool_pump_manager: Stopping Pump - Slot1 Automation
2023-06-03 08:36:00.030156 DEBUG pool_pump_manager: call_service: homeassistant/turn_off, {'entity_id': 'switch.pool_switch'}
2023-06-03 16:59:30.644989 INFO pool_pump_manager: New mode detected : Active (Old: Standard)
2023-06-03 16:59:30.649930 DEBUG pool_pump_manager: call_service: app/restart, {'app': 'pool_pump_manager', 'namespace': 'admin', '__name': 'pool_pump_manager'}
2023-06-03 16:59:30.691598 INFO pool_pump_manager: Initialized
2023-06-03 16:59:30.708694 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 16:59:30.712598 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 16:59:30.718761 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 16:59:30.724686 INFO pool_pump_manager: INIT - Pool is in mode Active
2023-06-03 16:59:30.727892 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 16:59:30.730827 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 16:59:30.739460 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 02:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 16:59:30.746373 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 04:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 16:59:30.752241 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_mode, {'duration': 1} from pool_pump_manager
2023-06-03 16:59:30.756463 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_boost, {} from pool_pump_manager
2023-06-03 16:59:30.759325 DEBUG pool_pump_manager: Calling listen_event for pool_pump_manager
2023-06-03 16:59:30.768142 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 02:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_start_filtration / kwargs : interval=86400 message=Active Winter 
2023-06-03 16:59:30.773597 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 04:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_stop_filtration / kwargs : interval=86400 message=Active Winter 
2023-06-03 16:59:33.287560 INFO pool_pump_manager: New mode detected : Standard (Old: Active)
2023-06-03 16:59:33.290513 DEBUG pool_pump_manager: call_service: app/restart, {'app': 'pool_pump_manager', 'namespace': 'admin', '__name': 'pool_pump_manager'}
2023-06-03 16:59:33.322892 INFO pool_pump_manager: Initialized
2023-06-03 16:59:33.332818 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 16:59:33.336106 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 16:59:33.341117 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 16:59:33.346050 INFO pool_pump_manager: INIT - Pool is in mode Standard
2023-06-03 16:59:33.349215 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 16:59:33.352536 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 16:59:33.357920 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 06:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 16:59:33.365708 INFO pool_pump_manager: Generate a daily task at 06:00:00 for slot1 start
2023-06-03 16:59:33.368660 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 16:59:33.373684 DEBUG pool_pump_manager: Registering run_every starting 2023-06-03 20:38:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 16:59:33.381612 INFO pool_pump_manager: Generate a daily task at 20:38:00 for slot2 start
2023-06-03 16:59:33.384209 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-03 16:59:33.389899 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-03 16:59:33.392843 DEBUG pool_pump_manager: Registering run_at at 2023-06-03 08:36:00+02:00 for pool_pump_manager
2023-06-03 16:59:33.397845 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-03 16:59:33.403510 INFO pool_pump_manager: INIT - Based on slot1 end time in input_datetime.pool_stop_slot1, we create a task with handler d917c994b10c4fe9ab7b191206ab4dcc at 08:36:00
2023-06-03 16:59:33.406184 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-03 16:59:33.408943 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-03 16:59:33.411722 DEBUG pool_pump_manager: Registering run_at at 2023-06-03 02:56:00+02:00 for pool_pump_manager
2023-06-03 16:59:33.418206 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-03 16:59:33.425770 INFO pool_pump_manager: INIT - Based on slot2 end time in input_datetime.pool_stop_slot2, we create a task with handler 74af97cbcf7f4a99bc16aa04e82f5c56 at 02:56:00
2023-06-03 16:59:33.429735 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot1, {'duration': 1, 'slot': 1} from pool_pump_manager
2023-06-03 16:59:33.433772 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot2, {'duration': 1, 'slot': 2} from pool_pump_manager
2023-06-03 16:59:33.438038 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_mode, {'duration': 1} from pool_pump_manager
2023-06-03 16:59:33.442163 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_boost, {} from pool_pump_manager
2023-06-03 16:59:33.445545 DEBUG pool_pump_manager: Calling listen_event for pool_pump_manager
2023-06-03 16:59:33.453846 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-03 20:38:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=2 
2023-06-03 16:59:33.460154 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 02:56:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=2 message=Slot2 Automation 
2023-06-03 16:59:33.466524 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 06:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=1 
2023-06-03 16:59:33.475364 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 08:36:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=1 message=Slot1 Automation 
2023-06-03 17:08:01.587926 INFO pool_pump_manager: New mode detected : Passive (Old: Standard)
2023-06-03 17:08:01.590715 DEBUG pool_pump_manager: call_service: app/restart, {'app': 'pool_pump_manager', 'namespace': 'admin', '__name': 'pool_pump_manager'}
2023-06-03 17:08:01.621998 INFO pool_pump_manager: Initialized
2023-06-03 17:08:01.633473 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 17:08:01.636735 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 17:08:01.640891 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 17:08:01.646137 INFO pool_pump_manager: INIT - Pool is in mode Passive
2023-06-03 17:08:01.649340 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 17:08:01.652185 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 17:08:01.655684 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_mode, {'duration': 1} from pool_pump_manager
2023-06-03 17:08:01.659949 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_boost, {} from pool_pump_manager
2023-06-03 17:08:01.662876 DEBUG pool_pump_manager: Calling listen_event for pool_pump_manager
2023-06-03 17:08:11.517916 INFO pool_pump_manager: New mode detected : Standard (Old: Passive)
2023-06-03 17:08:11.521115 DEBUG pool_pump_manager: call_service: app/restart, {'app': 'pool_pump_manager', 'namespace': 'admin', '__name': 'pool_pump_manager'}
2023-06-03 17:08:11.552844 INFO pool_pump_manager: Initialized
2023-06-03 17:08:11.562826 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 17:08:11.566181 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 17:08:11.571161 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 17:08:11.576200 INFO pool_pump_manager: INIT - Pool is in mode Standard
2023-06-03 17:08:11.579161 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 17:08:11.582089 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 17:08:11.587656 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 06:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 17:08:11.595230 INFO pool_pump_manager: Generate a daily task at 06:00:00 for slot1 start
2023-06-03 17:08:11.598156 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 17:08:11.603162 DEBUG pool_pump_manager: Registering run_every starting 2023-06-03 20:38:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 17:08:11.611938 INFO pool_pump_manager: Generate a daily task at 20:38:00 for slot2 start
2023-06-03 17:08:11.615304 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-03 17:08:11.619118 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-03 17:08:11.622079 DEBUG pool_pump_manager: Registering run_at at 2023-06-03 08:36:00+02:00 for pool_pump_manager
2023-06-03 17:08:11.627663 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-03 17:08:11.632985 INFO pool_pump_manager: INIT - Based on slot1 end time in input_datetime.pool_stop_slot1, we create a task with handler e249d4a37c524284a6faa5d20ef20e27 at 08:36:00
2023-06-03 17:08:11.635683 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-03 17:08:11.638809 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-03 17:08:11.641744 DEBUG pool_pump_manager: Registering run_at at 2023-06-03 02:56:00+02:00 for pool_pump_manager
2023-06-03 17:08:11.647326 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-03 17:08:11.652409 INFO pool_pump_manager: INIT - Based on slot2 end time in input_datetime.pool_stop_slot2, we create a task with handler 583cd3d346e646679973f29ce7dff9c0 at 02:56:00
2023-06-03 17:08:11.655957 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot1, {'duration': 1, 'slot': 1} from pool_pump_manager
2023-06-03 17:08:11.660693 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot2, {'duration': 1, 'slot': 2} from pool_pump_manager
2023-06-03 17:08:11.665339 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_mode, {'duration': 1} from pool_pump_manager
2023-06-03 17:08:11.669178 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_boost, {} from pool_pump_manager
2023-06-03 17:08:11.671759 DEBUG pool_pump_manager: Calling listen_event for pool_pump_manager
2023-06-03 17:08:11.680099 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-03 20:38:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=2 
2023-06-03 17:08:11.685434 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 02:56:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=2 message=Slot2 Automation 
2023-06-03 17:08:11.690799 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 06:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=1 
2023-06-03 17:08:11.695962 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 08:36:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=1 message=Slot1 Automation 
2023-06-03 17:13:00.159239 INFO pool_pump_manager: Change in boost trigger detected : 1H (Old: Aucun)
2023-06-03 17:13:00.162804 DEBUG pool_pump_manager: call_service: timer/start, {'entity_id': 'timer.pool_boost', 'duration': '01:00:00'}
2023-06-03 17:13:00.172844 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-03 17:13:00.182994 INFO pool_pump_manager: Boost 1H - Pump is already On !
2023-06-03 17:14:35.336449 INFO pool_pump_manager: Change in boost trigger detected : Aucun (Old: 1H)
2023-06-03 17:14:35.339869 DEBUG pool_pump_manager: call_service: timer/cancel, {'entity_id': 'timer.pool_boost'}
2023-06-03 17:14:35.346878 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 17:14:35.352455 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-03 17:14:35.358603 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 17:14:35.364891 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-03 17:14:35.377198 DEBUG pool_pump_manager: get state: timer.pool_boost, {} from pool_pump_manager
2023-06-03 17:14:35.383934 DEBUG pool_pump_manager: get state: input_select.pool_boost, {} from pool_pump_manager
2023-06-03 17:14:35.390725 INFO pool_pump_manager: Boost is in progress (Aucun). Pump stopping is canceled.
2023-06-03 17:14:35.397117 INFO pool_pump_manager: Boost mode change from 1H to Aucun. Stopping filtration
2023-06-03 17:15:46.060083 INFO pool_pump_manager: Change detected in input_datetime.pool_start_slot1 time - old value 06:00:00 / new value : 08:00:00
2023-06-03 17:15:46.063138 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 17:15:46.068065 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 08:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 17:15:46.076178 INFO pool_pump_manager: Generate a daily task at 08:00:00 for slot1 start
2023-06-03 17:15:46.082097 INFO pool_pump_manager: Generate a new task with handler 9032560281c64a749dbdf1560d4e0db8 for slot1 - at 08:00:00
2023-06-03 17:15:46.085368 DEBUG pool_pump_manager: Canceling timer with handle 1383ff7a03b84fb8858b50e2edf7d59d for pool_pump_manager
2023-06-03 17:15:46.092852 DEBUG pool_pump_manager: New handler 9032560281c64a749dbdf1560d4e0db8 stored for slot1
2023-06-03 17:15:58.726556 INFO pool_pump_manager: Change detected in input_datetime.pool_start_slot2 time - old value 20:38:00 / new value : 14:38:00
2023-06-03 17:15:58.729960 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 17:15:58.734723 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 14:38:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 17:15:58.742734 INFO pool_pump_manager: Generate a daily task at 14:38:00 for slot2 start
2023-06-03 17:15:58.747638 INFO pool_pump_manager: Generate a new task with handler 3348319c7d0542ae9adc604e7d9767de for slot2 - at 14:38:00
2023-06-03 17:15:58.750486 DEBUG pool_pump_manager: Canceling timer with handle a362543537384ce7990f1c88df477704 for pool_pump_manager
2023-06-03 17:15:58.756059 DEBUG pool_pump_manager: New handler 3348319c7d0542ae9adc604e7d9767de stored for slot2
2023-06-03 17:16:00.705292 INFO pool_pump_manager: Change detected in input_datetime.pool_start_slot2 time - old value 14:38:00 / new value : 14:00:00
2023-06-03 17:16:00.708603 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 17:16:00.713885 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 14:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 17:16:00.722838 INFO pool_pump_manager: Generate a daily task at 14:00:00 for slot2 start
2023-06-03 17:16:00.727747 INFO pool_pump_manager: Generate a new task with handler a32e5642b479418c863e1f23ce422bdf for slot2 - at 14:00:00
2023-06-03 17:16:00.730585 DEBUG pool_pump_manager: Canceling timer with handle 3348319c7d0542ae9adc604e7d9767de for pool_pump_manager
2023-06-03 17:16:00.736459 DEBUG pool_pump_manager: New handler a32e5642b479418c863e1f23ce422bdf stored for slot2
2023-06-03 17:25:15.869015 INFO pool_pump_manager: New mode detected : Passive (Old: Standard)
2023-06-03 17:25:15.872052 DEBUG pool_pump_manager: call_service: app/restart, {'app': 'pool_pump_manager', 'namespace': 'admin', '__name': 'pool_pump_manager'}
2023-06-03 17:25:15.927091 INFO pool_pump_manager: Initialized
2023-06-03 17:25:15.939181 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 17:25:15.942740 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 17:25:15.947006 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 17:25:15.951855 INFO pool_pump_manager: INIT - Pool is in mode Passive
2023-06-03 17:25:15.955525 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 17:25:15.960952 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 17:25:15.965836 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_mode, {'duration': 1} from pool_pump_manager
2023-06-03 17:25:15.972826 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_boost, {} from pool_pump_manager
2023-06-03 17:25:15.977205 DEBUG pool_pump_manager: Calling listen_event for pool_pump_manager
2023-06-03 17:25:54.777130 INFO pool_pump_manager: New mode detected : Standard (Old: Passive)
2023-06-03 17:25:54.779700 DEBUG pool_pump_manager: call_service: app/restart, {'app': 'pool_pump_manager', 'namespace': 'admin', '__name': 'pool_pump_manager'}
2023-06-03 17:25:54.809784 INFO pool_pump_manager: Initialized
2023-06-03 17:25:54.820322 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 17:25:54.823732 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 17:25:54.828170 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 17:25:54.833014 INFO pool_pump_manager: INIT - Pool is in mode Standard
2023-06-03 17:25:54.836217 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 17:25:54.839388 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 17:25:54.844929 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 08:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 17:25:54.851935 INFO pool_pump_manager: Generate a daily task at 08:00:00 for slot1 start
2023-06-03 17:25:54.854704 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 17:25:54.859927 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 14:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 17:25:54.868688 INFO pool_pump_manager: Generate a daily task at 14:00:00 for slot2 start
2023-06-03 17:25:54.871500 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-03 17:25:54.874235 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-03 17:25:54.877043 DEBUG pool_pump_manager: Registering run_at at 2023-06-03 08:36:00+02:00 for pool_pump_manager
2023-06-03 17:25:54.882375 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-03 17:25:54.888102 INFO pool_pump_manager: INIT - Based on slot1 end time in input_datetime.pool_stop_slot1, we create a task with handler 4fb4cef4249c4065a80483da0f34d50c at 08:36:00
2023-06-03 17:25:54.891188 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-03 17:25:54.894298 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-03 17:25:54.897187 DEBUG pool_pump_manager: Registering run_at at 2023-06-03 02:56:00+02:00 for pool_pump_manager
2023-06-03 17:25:54.902920 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-03 17:25:54.908506 INFO pool_pump_manager: INIT - Based on slot2 end time in input_datetime.pool_stop_slot2, we create a task with handler a56948be84df4ee2a91bf5f0b170606d at 02:56:00
2023-06-03 17:25:54.912443 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot1, {'duration': 1, 'slot': 1} from pool_pump_manager
2023-06-03 17:25:54.917428 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot2, {'duration': 1, 'slot': 2} from pool_pump_manager
2023-06-03 17:25:54.921751 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_mode, {'duration': 1} from pool_pump_manager
2023-06-03 17:25:54.926660 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_boost, {} from pool_pump_manager
2023-06-03 17:25:54.929590 DEBUG pool_pump_manager: Calling listen_event for pool_pump_manager
2023-06-03 17:25:54.937968 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 02:56:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=2 message=Slot2 Automation 
2023-06-03 17:25:54.943512 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 08:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=1 
2023-06-03 17:25:54.951824 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 08:36:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=1 message=Slot1 Automation 
2023-06-03 17:25:54.957432 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 14:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=2 
2023-06-03 17:42:17.967295 INFO pool_pump_manager: Initialized
2023-06-03 17:42:17.995815 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 17:42:18.101966 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 17:42:18.112069 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 17:42:18.123602 INFO pool_pump_manager: INIT - Pool is in mode Standard
2023-06-03 17:42:18.130538 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 17:42:18.136302 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 17:42:18.171972 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 08:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 17:42:18.188618 INFO pool_pump_manager: Generate a daily task at 08:00:00 for slot1 start
2023-06-03 17:42:18.194810 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 17:42:18.205943 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 14:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 17:42:18.224851 INFO pool_pump_manager: Generate a daily task at 14:00:00 for slot2 start
2023-06-03 17:42:18.231137 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-03 17:42:18.237216 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-03 17:42:18.243079 DEBUG pool_pump_manager: Registering run_at at 2023-06-03 08:36:00+02:00 for pool_pump_manager
2023-06-03 17:42:18.254727 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-03 17:42:18.270006 INFO pool_pump_manager: INIT - Based on slot1 end time in input_datetime.pool_stop_slot1, we create a task with handler c0c65dc126994ad28551e22e44e5ad03 at 08:36:00
2023-06-03 17:42:18.275558 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-03 17:42:18.281046 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-03 17:42:18.287633 DEBUG pool_pump_manager: Registering run_at at 2023-06-03 02:56:00+02:00 for pool_pump_manager
2023-06-03 17:42:18.299017 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-03 17:42:18.312121 INFO pool_pump_manager: INIT - Based on slot2 end time in input_datetime.pool_stop_slot2, we create a task with handler 9179e6a285824a04a07b405e31a8f034 at 02:56:00
2023-06-03 17:42:18.320251 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot1, {'duration': 1, 'slot': 1} from pool_pump_manager
2023-06-03 17:42:18.330007 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot2, {'duration': 1, 'slot': 2} from pool_pump_manager
2023-06-03 17:42:18.340067 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_mode, {'duration': 1} from pool_pump_manager
2023-06-03 17:42:18.349047 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_boost, {} from pool_pump_manager
2023-06-03 17:42:18.356034 DEBUG pool_pump_manager: Calling listen_event for pool_pump_manager
2023-06-03 17:42:18.377191 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 02:56:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=2 message=Slot2 Automation 
2023-06-03 17:42:18.390981 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 08:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=1 
2023-06-03 17:42:18.403965 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 08:36:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=1 message=Slot1 Automation 
2023-06-03 17:42:18.417130 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 14:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=2 
2023-06-03 19:19:02.555604 INFO pool_pump_manager: Change detected in input_datetime.pool_start_slot2 time - old value 14:00:00 / new value : 20:00:00
2023-06-03 19:19:02.561457 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 19:19:02.566727 DEBUG pool_pump_manager: Registering run_every starting 2023-06-03 20:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 19:19:02.574328 INFO pool_pump_manager: Generate a daily task at 20:00:00 for slot2 start
2023-06-03 19:19:02.578924 INFO pool_pump_manager: Generate a new task with handler 3cdc74a421264391a115b3cb926464c8 for slot2 - at 20:00:00
2023-06-03 19:19:02.581750 DEBUG pool_pump_manager: Canceling timer with handle 972e874c7c664daa87e4cd529f7fc80a for pool_pump_manager
2023-06-03 19:19:02.587349 DEBUG pool_pump_manager: New handler 3cdc74a421264391a115b3cb926464c8 stored for slot2
2023-06-03 20:00:00.019176 DEBUG pool_pump_manager: get state: sensor.temps_de_filtration_ecoule, {} from pool_pump_manager
2023-06-03 20:00:00.022524 DEBUG pool_pump_manager: get state: sensor.recommandation_duree_de_filtration_sonde_piscine, {} from pool_pump_manager
2023-06-03 20:00:00.025987 DEBUG pool_pump_manager: call_service: input_number/set_value, {'value': 390, 'entity_id': 'input_number.filtration_duration_calculated'}
2023-06-03 20:00:00.035369 DEBUG pool_pump_manager: get state: sensor.recommandation_duree_de_filtration_sonde_piscine, {} from pool_pump_manager
2023-06-03 20:00:00.050776 INFO pool_pump_manager: Based on configuration, filtration duration is 390 minutes (iopool recommandation is 390 minutes)
2023-06-03 20:00:00.060879 INFO pool_pump_manager: Slot2 - Elapsed time of filtration : 1200 minutes / Remaining time : -810 minutes
2023-06-03 20:00:00.067477 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 20:00:00.072127 DEBUG pool_pump_manager: set state: input_datetime.pool_stop_slot2, {'state': '06:30:00'} from pool_pump_manager
2023-06-03 20:00:00.105276 INFO pool_pump_manager: Slot2 Filtration times - Start : 20:00:00 / End : 06:30:00
2023-06-03 20:00:00.108286 DEBUG pool_pump_manager: Checking timer with handle 9179e6a285824a04a07b405e31a8f034 for pool_pump_manager
2023-06-03 20:00:00.111242 DEBUG pool_pump_manager: Canceling timer with handle 9179e6a285824a04a07b405e31a8f034 for pool_pump_manager
2023-06-03 20:00:00.119566 INFO pool_pump_manager: Cancel existing timer for slot2 with handler 9179e6a285824a04a07b405e31a8f034
2023-06-03 20:00:00.127822 INFO pool_pump_manager: There is no more filtration time left to do
2023-06-03 21:34:14.685004 INFO pool_pump_manager: New mode detected : Active (Old: Standard)
2023-06-03 21:34:14.688281 DEBUG pool_pump_manager: call_service: app/restart, {'app': 'pool_pump_manager', 'namespace': 'admin', '__name': 'pool_pump_manager'}
2023-06-03 21:34:14.723556 INFO pool_pump_manager: Initialized
2023-06-03 21:34:14.735159 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 21:34:14.738711 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 21:34:14.742832 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 21:34:14.747955 INFO pool_pump_manager: INIT - Pool is in mode Active
2023-06-03 21:34:14.751350 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 21:34:14.754684 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 21:34:14.760556 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 02:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 21:34:14.767238 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 04:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 21:34:14.772536 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_mode, {'duration': 1} from pool_pump_manager
2023-06-03 21:34:14.776369 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_boost, {} from pool_pump_manager
2023-06-03 21:34:14.779321 DEBUG pool_pump_manager: Calling listen_event for pool_pump_manager
2023-06-03 21:34:14.787579 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 02:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_start_filtration / kwargs : interval=86400 message=Active Winter 
2023-06-03 21:34:14.793648 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 04:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_stop_filtration / kwargs : interval=86400 message=Active Winter 
2023-06-03 21:35:09.126130 INFO pool_pump_manager: New mode detected : Standard (Old: Active)
2023-06-03 21:35:09.129059 DEBUG pool_pump_manager: call_service: app/restart, {'app': 'pool_pump_manager', 'namespace': 'admin', '__name': 'pool_pump_manager'}
2023-06-03 21:35:09.159501 INFO pool_pump_manager: Initialized
2023-06-03 21:35:09.169463 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 21:35:09.172762 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 21:35:09.178214 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 21:35:09.183755 INFO pool_pump_manager: INIT - Pool is in mode Standard
2023-06-03 21:35:09.187003 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-03 21:35:09.189932 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 21:35:09.194884 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 08:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 21:35:09.202237 INFO pool_pump_manager: Generate a daily task at 08:00:00 for slot1 start
2023-06-03 21:35:09.205206 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 21:35:09.210609 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 20:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-03 21:35:09.219674 INFO pool_pump_manager: Generate a daily task at 20:00:00 for slot2 start
2023-06-03 21:35:09.222313 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-03 21:35:09.225449 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-03 21:35:09.228486 DEBUG pool_pump_manager: Registering run_at at 2023-06-03 08:36:00+02:00 for pool_pump_manager
2023-06-03 21:35:09.234623 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-03 21:35:09.241128 INFO pool_pump_manager: INIT - Based on slot1 end time in input_datetime.pool_stop_slot1, we create a task with handler 180be82a443e45889840b66782093ba5 at 08:36:00
2023-06-03 21:35:09.243745 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-03 21:35:09.246530 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-03 21:35:09.249317 DEBUG pool_pump_manager: Registering run_at at 2023-06-03 06:30:00+02:00 for pool_pump_manager
2023-06-03 21:35:09.255536 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-03 21:35:09.264301 INFO pool_pump_manager: INIT - Based on slot2 end time in input_datetime.pool_stop_slot2, we create a task with handler 802e1f0c94c7464692fee6cccc366945 at 06:30:00
2023-06-03 21:35:09.267640 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot1, {'duration': 1, 'slot': 1} from pool_pump_manager
2023-06-03 21:35:09.272116 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot2, {'duration': 1, 'slot': 2} from pool_pump_manager
2023-06-03 21:35:09.276998 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_mode, {'duration': 1} from pool_pump_manager
2023-06-03 21:35:09.281496 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_boost, {} from pool_pump_manager
2023-06-03 21:35:09.284441 DEBUG pool_pump_manager: Calling listen_event for pool_pump_manager
2023-06-03 21:35:09.293430 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 06:30:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=2 message=Slot2 Automation 
2023-06-03 21:35:09.300063 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 08:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=1 
2023-06-03 21:35:09.305934 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 08:36:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=1 message=Slot1 Automation 
2023-06-03 21:35:09.311347 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 20:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=2 
2023-06-03 21:37:45.060825 INFO pool_pump_manager: Change in boost trigger detected : 1H (Old: Aucun)
2023-06-03 21:37:45.063918 DEBUG pool_pump_manager: call_service: timer/start, {'entity_id': 'timer.pool_boost', 'duration': '01:00:00'}
2023-06-03 21:37:45.072994 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-03 21:37:45.083221 INFO pool_pump_manager: Boost 1H - Pump is already On !
2023-06-03 22:37:45.027798 INFO pool_pump_manager: Boost Timer finish (timer.finished) with data: {'entity_id': 'timer.pool_boost', 'finished_at': '2023-06-03T20:37:45+00:00', 'metadata': {'origin': 'LOCAL', 'time_fired': '2023-06-03T20:37:45.001570+00:00', 'context': {'id': '01H21FNXD9B70RPM7RQ4P6SDN4', 'parent_id': None, 'user_id': None}}}
2023-06-03 22:37:45.031315 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 22:37:45.034839 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-03 22:37:45.039534 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 22:37:45.042506 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-03 22:37:45.047031 DEBUG pool_pump_manager: get state: input_select.pool_boost, {} from pool_pump_manager
2023-06-03 22:37:45.053199 INFO pool_pump_manager: As boost 1H end during normal filtration time, pump stopping is canceled
2023-06-03 22:37:45.056601 DEBUG pool_pump_manager: get state: input_select.pool_boost, {} from pool_pump_manager
2023-06-03 22:37:45.089754 DEBUG pool_pump_manager: call_service: input_select/select_option, {'option': 'Aucun', 'entity_id': 'input_select.pool_boost'}
2023-06-03 22:37:45.132793 INFO pool_pump_manager: Change in boost trigger detected : Aucun (Old: 1H)
2023-06-03 22:37:45.135307 DEBUG pool_pump_manager: call_service: timer/cancel, {'entity_id': 'timer.pool_boost'}
2023-06-03 22:37:45.142135 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-03 22:37:45.146068 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-03 22:37:45.156975 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-03 22:37:45.165520 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-03 22:37:45.177451 INFO pool_pump_manager: As boost change from mode 1H to Aucun during normal filtration time, pump stopping is canceled
2023-06-04 06:30:00.038085 DEBUG pool_pump_manager: get state: timer.pool_boost, {} from pool_pump_manager
2023-06-04 06:30:00.045632 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-04 06:30:00.056062 INFO pool_pump_manager: Stopping Pump - Slot2 Automation
2023-06-04 06:30:00.061729 DEBUG pool_pump_manager: call_service: homeassistant/turn_off, {'entity_id': 'switch.pool_switch'}
2023-06-04 06:30:00.073549 DEBUG pool_pump_manager: get state: sensor.recommandation_duree_de_filtration_sonde_piscine, {} from pool_pump_manager
2023-06-04 06:30:00.081760 DEBUG pool_pump_manager: call_service: input_number/set_value, {'value': 390, 'entity_id': 'input_number.filtration_duration_calculated'}
2023-06-04 06:30:00.093786 DEBUG pool_pump_manager: get state: sensor.recommandation_duree_de_filtration_sonde_piscine, {} from pool_pump_manager
2023-06-04 06:30:00.108995 INFO pool_pump_manager: Based on configuration, filtration duration is 390 minutes (iopool recommandation is 390 minutes)
2023-06-04 06:30:00.113857 DEBUG pool_pump_manager: get state: sensor.temps_de_filtration_ecoule, {} from pool_pump_manager
2023-06-04 06:30:00.118712 DEBUG pool_pump_manager: get state: timer.pool_boost, {} from pool_pump_manager
2023-06-04 07:29:06.180820 INFO pool_pump_manager: Initialized
2023-06-04 07:29:06.199149 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-04 07:29:06.263932 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-04 07:29:06.271037 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-04 07:29:06.277321 INFO pool_pump_manager: INIT - Pool is in mode Standard
2023-06-04 07:29:06.281982 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-04 07:29:06.285383 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-04 07:29:06.307902 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 08:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-04 07:29:06.318759 INFO pool_pump_manager: Generate a daily task at 08:00:00 for slot1 start
2023-06-04 07:29:06.322642 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-04 07:29:06.329101 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 20:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-04 07:29:06.338672 INFO pool_pump_manager: Generate a daily task at 20:00:00 for slot2 start
2023-06-04 07:29:06.341746 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-04 07:29:06.345711 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-04 07:29:06.349640 DEBUG pool_pump_manager: Registering run_at at 2023-06-04 08:36:00+02:00 for pool_pump_manager
2023-06-04 07:29:06.355943 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-04 07:29:06.362911 INFO pool_pump_manager: INIT - Based on slot1 end time in input_datetime.pool_stop_slot1, we create a task with handler bbb91a516cbc40438898026fec67013a at 08:36:00
2023-06-04 07:29:06.366094 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-04 07:29:06.370464 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-04 07:29:06.373584 DEBUG pool_pump_manager: Registering run_at at 2023-06-04 06:30:00+02:00 for pool_pump_manager
2023-06-04 07:29:06.381024 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-04 07:29:06.387515 INFO pool_pump_manager: INIT - Based on slot2 end time in input_datetime.pool_stop_slot2, we create a task with handler 4df37f29921d44f6a7402a2aa6988c58 at 06:30:00
2023-06-04 07:29:06.392820 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot1, {'duration': 1, 'slot': 1} from pool_pump_manager
2023-06-04 07:29:06.398302 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot2, {'duration': 1, 'slot': 2} from pool_pump_manager
2023-06-04 07:29:06.404808 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_mode, {'duration': 1} from pool_pump_manager
2023-06-04 07:29:06.411191 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_boost, {} from pool_pump_manager
2023-06-04 07:29:06.415648 DEBUG pool_pump_manager: Calling listen_event for pool_pump_manager
2023-06-04 07:29:06.427457 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 08:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=1 
2023-06-04 07:29:06.435670 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 08:36:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=1 message=Slot1 Automation 
2023-06-04 07:29:06.443529 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 20:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=2 
2023-06-04 07:29:06.451547 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-05 06:30:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=2 message=Slot2 Automation 
2023-06-04 08:00:00.066535 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-04 08:00:00.108399 INFO pool_pump_manager: Pump starting for slot 1 - Pump is already On !
2023-06-04 08:00:00.116529 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-04 08:00:00.121811 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-04 08:00:00.127194 DEBUG pool_pump_manager: get state: sensor.recommandation_duree_de_filtration_sonde_piscine, {} from pool_pump_manager
2023-06-04 08:00:00.132508 DEBUG pool_pump_manager: call_service: input_number/set_value, {'value': 390, 'entity_id': 'input_number.filtration_duration_calculated'}
2023-06-04 08:00:00.145020 DEBUG pool_pump_manager: get state: sensor.recommandation_duree_de_filtration_sonde_piscine, {} from pool_pump_manager
2023-06-04 08:00:00.155840 INFO pool_pump_manager: Based on configuration, filtration duration is 390 minutes (iopool recommandation is 390 minutes)
2023-06-04 08:00:00.168623 DEBUG pool_pump_manager: Duration Between slots : 720 minutes / Filtration Duration : 156 (minutes)
2023-06-04 08:00:00.172012 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-04 08:00:00.180975 DEBUG pool_pump_manager: set state: input_datetime.pool_stop_slot1, {'state': '10:36:00'} from pool_pump_manager
2023-06-04 08:00:00.215231 INFO pool_pump_manager: Slot1 Filtration times - Start : 08:00:00 / End : 10:36:00
2023-06-04 08:00:00.218972 DEBUG pool_pump_manager: Checking timer with handle bbb91a516cbc40438898026fec67013a for pool_pump_manager
2023-06-04 08:00:00.222213 DEBUG pool_pump_manager: Canceling timer with handle bbb91a516cbc40438898026fec67013a for pool_pump_manager
2023-06-04 08:00:00.229968 INFO pool_pump_manager: Cancel existing timer for slot1 with handler bbb91a516cbc40438898026fec67013a
2023-06-04 08:00:00.234107 DEBUG pool_pump_manager: Registering run_at at 2023-06-04 10:36:00+02:00 for pool_pump_manager
2023-06-04 08:00:00.247873 INFO pool_pump_manager: Create new timer for slot1 with handler 31274b71c5744bafa348e842e9f9e726
2023-06-04 08:11:08.651555 INFO pool_pump_manager: Initialized
2023-06-04 08:11:08.736317 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-04 08:11:08.746865 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-04 08:11:08.759226 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-04 08:11:08.774162 INFO pool_pump_manager: INIT - Pool is in mode Standard
2023-06-04 08:11:08.782455 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-04 08:11:08.790514 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-04 08:11:08.810681 DEBUG pool_pump_manager: Registering run_every starting 2023-06-05 08:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-04 08:11:08.837737 INFO pool_pump_manager: Generate a daily task at 08:00:00 for slot1 start
2023-06-04 08:11:08.843417 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-04 08:11:08.851959 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 20:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-04 08:11:08.866644 INFO pool_pump_manager: Generate a daily task at 20:00:00 for slot2 start
2023-06-04 08:11:08.871351 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-04 08:11:08.876191 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-04 08:11:08.880984 DEBUG pool_pump_manager: Registering run_at at 2023-06-04 10:36:00+02:00 for pool_pump_manager
2023-06-04 08:11:08.890228 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-04 08:11:08.910017 INFO pool_pump_manager: INIT - Based on slot1 end time in input_datetime.pool_stop_slot1, we create a task with handler a5691c6645b4425085d896a5c8d2f34c at 10:36:00
2023-06-04 08:11:08.917185 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-04 08:11:08.924304 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-04 08:11:08.931765 DEBUG pool_pump_manager: Registering run_at at 2023-06-04 06:30:00+02:00 for pool_pump_manager
2023-06-04 08:11:08.953752 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-04 08:11:08.971856 INFO pool_pump_manager: INIT - Based on slot2 end time in input_datetime.pool_stop_slot2, we create a task with handler 15f07948927e469099abd12cd1f05c79 at 06:30:00
2023-06-04 08:11:08.982311 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot1, {'duration': 1, 'slot': 1} from pool_pump_manager
2023-06-04 08:11:08.993539 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot2, {'duration': 1, 'slot': 2} from pool_pump_manager
2023-06-04 08:11:09.004817 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_mode, {'duration': 1} from pool_pump_manager
2023-06-04 08:11:09.019202 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_boost, {} from pool_pump_manager
2023-06-04 08:11:09.031991 DEBUG pool_pump_manager: Calling listen_event for pool_pump_manager
2023-06-04 08:11:09.060973 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 10:36:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=1 message=Slot1 Automation 
2023-06-04 08:11:09.076387 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 20:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=2 
2023-06-04 08:11:09.094807 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-05 06:30:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=2 message=Slot2 Automation 
2023-06-04 08:11:09.112005 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-05 08:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=1 
2023-06-04 09:26:50.827422 INFO pool_pump_manager: Initialized
2023-06-04 09:26:50.846192 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-04 09:26:50.915894 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-04 09:26:50.925501 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-04 09:26:50.933942 INFO pool_pump_manager: INIT - Pool is in mode Standard
2023-06-04 09:26:50.941031 DEBUG pool_pump_manager: get state: input_select.pool_mode, {} from pool_pump_manager
2023-06-04 09:26:50.945837 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-04 09:26:50.959935 DEBUG pool_pump_manager: Registering run_every starting 2023-06-05 08:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-04 09:26:50.972102 INFO pool_pump_manager: Generate a daily task at 08:00:00 for slot1 start
2023-06-04 09:26:50.977171 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-04 09:26:50.988134 DEBUG pool_pump_manager: Registering run_every starting 2023-06-04 20:00:00+02:00 in 86400s intervals for pool_pump_manager
2023-06-04 09:26:51.001465 INFO pool_pump_manager: Generate a daily task at 20:00:00 for slot2 start
2023-06-04 09:26:51.007126 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-04 09:26:51.012055 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-04 09:26:51.017596 DEBUG pool_pump_manager: Registering run_at at 2023-06-04 10:36:00+02:00 for pool_pump_manager
2023-06-04 09:26:51.028144 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-04 09:26:51.040270 INFO pool_pump_manager: INIT - Based on slot1 end time in input_datetime.pool_stop_slot1, we create a task with handler b4627f90d1f7480fbe94e364074a7b3f at 10:36:00
2023-06-04 09:26:51.046045 DEBUG pool_pump_manager: Checking timer with handle  for pool_pump_manager
2023-06-04 09:26:51.053479 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-04 09:26:51.058560 DEBUG pool_pump_manager: Registering run_at at 2023-06-04 06:30:00+02:00 for pool_pump_manager
2023-06-04 09:26:51.069978 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-04 09:26:51.082807 INFO pool_pump_manager: INIT - Based on slot2 end time in input_datetime.pool_stop_slot2, we create a task with handler 04fb923bd018439395092b81995b54d8 at 06:30:00
2023-06-04 09:26:51.089981 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot1, {'duration': 1, 'slot': 1} from pool_pump_manager
2023-06-04 09:26:51.096408 DEBUG pool_pump_manager: Calling listen_state for input_datetime.pool_start_slot2, {'duration': 1, 'slot': 2} from pool_pump_manager
2023-06-04 09:26:51.105848 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_mode, {'duration': 1} from pool_pump_manager
2023-06-04 09:26:51.113129 DEBUG pool_pump_manager: Calling listen_state for input_select.pool_boost, {} from pool_pump_manager
2023-06-04 09:26:51.116787 DEBUG pool_pump_manager: Calling listen_event for pool_pump_manager
2023-06-04 09:26:51.128025 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 10:36:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=1 message=Slot1 Automation 
2023-06-04 09:26:51.136242 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-04 20:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=2 
2023-06-04 09:26:51.144175 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-05 06:30:00 / repeat : False / interval : None / callback : callback_stop_filtration / kwargs : slot=2 message=Slot2 Automation 
2023-06-04 09:26:51.152585 DEBUG pool_pump_manager: Existing Handlers => Date : 2023-06-05 08:00:00 / repeat : True / interval : 1 day, 0:00:00 / callback : callback_slot_start / kwargs : interval=86400 slot=1 
2023-06-04 10:18:06.256940 INFO pool_pump_manager: Change in boost trigger detected : 1H (Old: Aucun)
2023-06-04 10:18:06.280305 DEBUG pool_pump_manager: call_service: timer/start, {'entity_id': 'timer.pool_boost', 'duration': '01:00:00'}
2023-06-04 10:18:06.304335 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-04 10:18:06.316962 INFO pool_pump_manager: Starting Pump - Boost 1H
2023-06-04 10:18:06.328212 DEBUG pool_pump_manager: call_service: homeassistant/turn_on, {'entity_id': 'switch.pool_switch'}
2023-06-04 10:18:16.686499 INFO pool_pump_manager: Change in boost trigger detected : 4H (Old: 1H)
2023-06-04 10:18:16.689240 DEBUG pool_pump_manager: call_service: timer/start, {'entity_id': 'timer.pool_boost', 'duration': '04:00:00'}
2023-06-04 10:18:16.696904 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-04 10:18:16.728549 INFO pool_pump_manager: Starting Pump - Boost 4H
2023-06-04 10:18:16.736349 DEBUG pool_pump_manager: call_service: homeassistant/turn_on, {'entity_id': 'switch.pool_switch'}
2023-06-04 10:28:50.019004 INFO pool_pump_manager: Change in boost trigger detected : 1H (Old: 4H)
2023-06-04 10:28:50.032785 DEBUG pool_pump_manager: call_service: timer/start, {'entity_id': 'timer.pool_boost', 'duration': '01:00:00'}
2023-06-04 10:28:50.043395 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-04 10:28:50.053313 INFO pool_pump_manager: Boost 1H - Pump is already On !
2023-06-04 10:29:21.900798 INFO pool_pump_manager: Change in boost trigger detected : Aucun (Old: 1H)
2023-06-04 10:29:21.904390 DEBUG pool_pump_manager: call_service: timer/cancel, {'entity_id': 'timer.pool_boost'}
2023-06-04 10:29:21.915477 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-04 10:29:21.922853 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-04 10:29:21.957810 INFO pool_pump_manager: As boost change from mode 1H to Aucun during normal filtration time, pump stopping is canceled
2023-06-04 10:30:32.711970 INFO pool_pump_manager: Change in boost trigger detected : 1H (Old: Aucun)
2023-06-04 10:30:32.716983 DEBUG pool_pump_manager: call_service: timer/start, {'entity_id': 'timer.pool_boost', 'duration': '01:00:00'}
2023-06-04 10:30:32.723824 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-04 10:30:32.734570 INFO pool_pump_manager: Boost 1H - Pump is already On !
2023-06-04 10:33:26.395501 INFO pool_pump_manager: Change in boost trigger detected : Aucun (Old: 1H)
2023-06-04 10:33:26.408109 DEBUG pool_pump_manager: call_service: timer/cancel, {'entity_id': 'timer.pool_boost'}
2023-06-04 10:33:26.415719 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-04 10:33:26.421441 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-04 10:33:26.438987 INFO pool_pump_manager: As boost change from mode 1H to Aucun during normal filtration time, pump stopping is canceled
2023-06-04 10:33:51.211535 INFO pool_pump_manager: Change in boost trigger detected : 1H (Old: Aucun)
2023-06-04 10:33:51.215903 DEBUG pool_pump_manager: call_service: timer/start, {'entity_id': 'timer.pool_boost', 'duration': '01:00:00'}
2023-06-04 10:33:51.225008 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-04 10:33:51.235432 INFO pool_pump_manager: Starting Pump - Boost 1H
2023-06-04 10:33:51.247084 DEBUG pool_pump_manager: call_service: homeassistant/turn_on, {'entity_id': 'switch.pool_switch'}
2023-06-04 10:36:00.021965 DEBUG pool_pump_manager: get state: timer.pool_boost, {} from pool_pump_manager
2023-06-04 10:36:00.026979 DEBUG pool_pump_manager: get state: input_select.pool_boost, {} from pool_pump_manager
2023-06-04 10:36:00.036975 INFO pool_pump_manager: Boost is in progress (1H). Pump stopping is canceled.
2023-06-04 10:41:09.288878 INFO pool_pump_manager: Change in boost trigger detected : Aucun (Old: 1H)
2023-06-04 10:41:09.293189 DEBUG pool_pump_manager: call_service: timer/cancel, {'entity_id': 'timer.pool_boost'}
2023-06-04 10:41:09.302979 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot1, {} from pool_pump_manager
2023-06-04 10:41:09.309191 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot1, {} from pool_pump_manager
2023-06-04 10:41:09.316052 DEBUG pool_pump_manager: get state: input_datetime.pool_start_slot2, {} from pool_pump_manager
2023-06-04 10:41:09.321782 DEBUG pool_pump_manager: get state: input_datetime.pool_stop_slot2, {} from pool_pump_manager
2023-06-04 10:41:09.336118 DEBUG pool_pump_manager: get state: timer.pool_boost, {} from pool_pump_manager
2023-06-04 10:41:09.342944 DEBUG pool_pump_manager: get state: input_select.pool_boost, {} from pool_pump_manager
2023-06-04 10:41:09.351196 INFO pool_pump_manager: Boost is in progress (Aucun). Pump stopping is canceled.
2023-06-04 10:41:09.358369 INFO pool_pump_manager: Boost mode change from 1H to Aucun. Stopping filtration
2023-06-04 10:42:01.580592 INFO pool_pump_manager: Change in boost trigger detected : 4H (Old: Aucun)
2023-06-04 10:42:01.584082 DEBUG pool_pump_manager: call_service: timer/start, {'entity_id': 'timer.pool_boost', 'duration': '04:00:00'}
2023-06-04 10:42:01.592307 DEBUG pool_pump_manager: get state: switch.pool_switch, {} from pool_pump_manager
2023-06-04 10:42:01.601780 INFO pool_pump_manager: Starting Pump - Boost 4H
2023-06-04 10:42:01.611485 DEBUG pool_pump_manager: call_service: homeassistant/turn_on, {'entity_id': 'switch.pool_switch'}

import hassapi as hass
import math
from datetime import datetime, timedelta, time
import humanize

"""
Describe here
"""

class pool_pump_manager(hass.Hass):

    # Initialize Class
    # ----------------
    def initialize(self):
        self.log("Initialized")
        # Verify app configuration conformity
        if (self._check_configuration() != True):
            self.log("Error in configuration. Stopping app waiting configuration correction")
            self.stop_app(self.name)
            raise RuntimeError("Invalid configuration. Please look critical events in logs")
        self.log("INIT - Pool is in mode %s", self.get_state(self.args['mode_sensor_id']))
        # Depending of mode in progress
        if self.get_state(self.args['mode_sensor_id']).lower() == "Standard".lower():
            # Create task for slots
            self.slot1_start_handler = self._generate_tasks(1, self.get_state(self.args['times'][0]['start_time_id']))
            self.slot2_start_handler = self._generate_tasks(2, self.get_state(self.args['times'][1]['start_time_id']))
            # Create end task SLOT1 if not exist - for security in case app is reload
            self.slot1_end_handler = ""
            if self.timer_running(self.slot1_end_handler) == False:
                self.slot1_end_handler = self.run_at(self.callback_stop_filtration, self.get_state(self.args['times'][0]['stop_time_id']), slot=1, message="Slot1 Automation")
                self.log("INIT - Based on slot1 end time in %s, we create a task with handler %s at %s", self.args['times'][0]['stop_time_id'], self.slot1_end_handler, self.get_state(self.args['times'][0]['stop_time_id']), level = "INFO")
            # Create end task SLOT2 if not exist - for security in case app is reload
            self.slot2_end_handler = ""
            if self.timer_running(self.slot2_end_handler) == False:
                self.slot2_end_handler = self.run_at(self.callback_stop_filtration, self.get_state(self.args['times'][1]['stop_time_id']), slot=2, message="Slot2 Automation")
                self.log("INIT - Based on slot2 end time in %s, we create a task with handler %s at %s", self.args['times'][1]['stop_time_id'], self.slot2_end_handler, self.get_state(self.args['times'][1]['stop_time_id']), level = "INFO")
            # Listen change on slot times
            self.listen_state(self.callback_change_start_slots, self.args['times'][0]['start_time_id'], duration=1, slot=1)
            self.listen_state(self.callback_change_start_slots, self.args['times'][1]['start_time_id'], duration=1, slot=2)
        elif self.get_state(self.args['mode_sensor_id']).lower() == "Active".lower():
            # Create the start task for active winter filtration
            self.run_daily(self.callback_start_filtration, self.args['winter'][0]['start_time'], message="Active Winter")
            # Create the end task for active winter filtration
            self.run_daily(self.callback_stop_filtration, (datetime.strptime(self.args['winter'][0]['start_time'], "%H:%M:%S") + timedelta(minutes=self.args['winter'][0]['duration_minutes'])).time(), message="Active Winter")
        # Listen change in mode sensor
        self.listen_state(self.callback_change_mode, self.args['mode_sensor_id'], duration=1)
        # Listen change in boost selector and timer
        self.listen_state(self.callback_boost_trigger, self.args['boost_selector_sensor_id'])
        self.listen_event(self.callback_boost_timer_finished, entity_id = self.args['boost_timer_sensor_id'], event = "timer.finished")
        # List all existing handler for this app
        self._list_all_handler()


    # Check if all app configuration is good. In case of error, we stopping app
    # -------------------------------------------------------------------------
    def _check_configuration(self) -> bool:
        if self.entity_exists(self.args['pump_sensor_id']) == False:
            self.log("Entity defined in 'pump_sensor_id' configuration don't exist. Please update your configuration !", level = "CRITICAL")
            return False
        if self.entity_exists(self.args['pool_filtration_duration_sensor_id']) == False:
            self.log("Entity defined in 'pool_filtration_duration_sensor_id' configuration don't exist. Please update your configuration !", level = "CRITICAL")
            return False
        if self.entity_exists(self.args['mode_sensor_id']) == False:
            self.log("Entity defined in 'mode_sensor_id' configuration don't exist. Please update your configuration !", level = "CRITICAL")
            return False
        if self.entity_exists(self.args['times'][0]['start_time_id']) == False:
            self.log("Entity defined in 'times.slot1.start_time_id' configuration don't exist. Please update your configuration !", level = "CRITICAL")
            return False
        if self.entity_exists(self.args['times'][1]['start_time_id']) == False:
            self.log("Entity defined in 'times.slot2.start_time_id' configuration don't exist. Please update your configuration !", level = "CRITICAL")
            return False
        if not math.isclose(self.args['times'][0]['duration_percent'] + self.args['times'][1]['duration_percent'], 1, rel_tol=0, abs_tol=0):
            self.log("Sum of all duration_percent in times configuration is not equal to 1. Please update your configuration !", level = "CRITICAL")
            return False
        if datetime.strptime(self.get_state(self.args['times'][0]['start_time_id']), "%H:%M:%S") >= datetime.strptime(self.get_state(self.args['times'][1]['start_time_id']), "%H:%M:%S"):
            self.log("Slot1 start time is before or equal to slot2 start time. Please update your configuration !", level = "CRITICAL")
            return False
        if self.entity_exists(self.args['pool_filtration_duration_storage']) == False:
            self.log("Entity defined in 'pool_filtration_duration_storage' configuration don't exist. Please update your configuration !", level = "CRITICAL")
            return False
        if 'pool_filtration_duration_min' in self.args and 'pool_filtration_duration_max' in self.args and self.args['pool_filtration_duration_min'] > self.args['pool_filtration_duration_max']:
            self.log("pool_filtration_duration_min (%i) cannot be higher than pool_filtration_duration_max (%i)", self.args['pool_filtration_duration_min'], self.args['pool_filtration_duration_max'], level = "CRITICAL")
            return False
        return True


    # Return Filtration Duration
    # --------------------------
    def _get_filtration_duration(self) -> int:
        filtration_duration = int(float(self.get_state(self.args['pool_filtration_duration_sensor_id'])))
        if 'pool_filtration_duration_min' in self.args and filtration_duration < self.args['pool_filtration_duration_min']:
            filtration_duration = self.args['pool_filtration_duration_min']
        if 'pool_filtration_duration_max' in self.args and filtration_duration > self.args['pool_filtration_duration_max']:
            filtration_duration = self.args['pool_filtration_duration_max']
        self.set_value(self.args['pool_filtration_duration_storage'], filtration_duration)
        self.log("Based on configuration, filtration duration is %i minutes (iopool recommandation is %i minutes)", filtration_duration, int(float(self.get_state(self.args['pool_filtration_duration_sensor_id']))), level = "INFO")
        return filtration_duration


    # Callback to restart app and force a new initialize when mode change
    # If mode is Standard or Active
    # With this, we trigger new tasks by cleaning all old tasks
    # -------------------------------------------------------------------
    def callback_change_mode(self, entity, attribute, old, new, **kwargs: dict) -> None:
        self.log("New mode detected : %s (Old: %s)", new, old, level = "INFO")
        self.restart_app(self.name)


    # Generate scheduled task
    # -----------------------
    def _generate_tasks(self, slot: int, time: str) -> dict:
        if slot == 1:
            slot_start_handler = self.run_daily(self.callback_slot_start, time, slot=slot)
        elif slot == 2:
            slot_start_handler = self.run_daily(self.callback_slot_start, time, slot=slot)
        self.log("Generate a daily task at %s for slot%i start", time, slot, level = "INFO")
        return slot_start_handler


    # Callback when one slot start
    # ----------------------------
    def callback_slot_start(self, **kwargs: dict) -> None:
        if kwargs['slot'] == 1:
            # Start filtration
            self.callback_start_filtration(message="Pump starting for slot {}".format(kwargs['slot']))
            # Calculate time delta between slot1 and slot2
            timedelta_minutes = int((datetime.strptime(self.get_state(self.args['times'][1]['start_time_id']), "%H:%M:%S") - datetime.strptime(self.get_state(self.args['times'][0]['start_time_id']), "%H:%M:%S")).total_seconds() / 60)
            # Calculate filtration duration based on configuration percent and iopool filtration time recommandation
            filtration_duration = self._get_filtration_duration() * float(self.args['times'][0]['duration_percent'])
            self.log("Duration Between slots : %s minutes / Filtration Duration : %s (minutes)", int(timedelta_minutes), int(filtration_duration), level = "DEBUG")
            # If time between slot1 and slot 2 is superior than filtration time
            if int(timedelta_minutes) > int(filtration_duration):
                start_time = datetime.strptime(self.get_state(self.args['times'][0]['start_time_id']), "%H:%M:%S")
                end_time = datetime.strftime(start_time + timedelta(minutes=filtration_duration), "%H:%M:%S")
                # Setting end time in a HA input_datetime for slot1
                self.set_state(self.args['times'][0]['stop_time_id'], state=end_time)
                self.log("Slot1 Filtration times - Start : %s / End : %s", start_time.time(), end_time, level = "INFO")
                # If an existing timer run for self.slot1_end_handler handler, we cancel it
                if self.timer_running(self.slot1_end_handler) == True:
                    self.cancel_timer(self.slot1_end_handler)
                    self.log("Cancel existing timer for slot1 with handler %s", self.slot1_end_handler, level = "INFO")
                # We create an new timer based on stored input_datetime - end of slot1
                self.slot1_end_handler = self.run_at(self.callback_stop_filtration, end_time, slot=1, message="Slot1 Automation")
                self.log("Create new timer for slot1 with handler %s", self.slot1_end_handler, level = "INFO")
            else:
                self.log("Duration between slot1 and slot2 start time (%s minutes) is less than time need for filtration (%s minutes). We will not stop filtration for slot1", timedelta_minutes, filtration_duration, level="WARNING")
        elif kwargs['slot'] == 2:
            # Retrieves the time (in minutes) the pump was already running today
            elapsed_filtration_minutes = int(float(self.get_state(self.args['pump_stats_sensor_id'])) * 60)
            # Calculate the remaining time of filtration
            remaining_filtration_minutes = self._get_filtration_duration() - elapsed_filtration_minutes
            self.log("Slot2 - Elapsed time of filtration : %s minutes / Remaining time : %s minutes", elapsed_filtration_minutes, remaining_filtration_minutes, level = "INFO")
            start_time = datetime.strptime(self.get_state(self.args['times'][1]['start_time_id']), "%H:%M:%S")
            end_time = datetime.strftime(start_time + timedelta(minutes=remaining_filtration_minutes), "%H:%M:%S")
            # Setting end time in a HA input_datetime for slot2
            self.set_state(self.args['times'][1]['stop_time_id'], state=end_time)
            self.log("Slot2 Filtration times - Start : %s / End : %s", start_time.time(), end_time, level = "INFO")
            # If an existing timer run for self.slot2_end_handler handler, we cancel it
            if self.timer_running(self.slot2_end_handler) == True:
                self.cancel_timer(self.slot2_end_handler)
                self.log("Cancel existing timer for slot2 with handler %s", self.slot2_end_handler, level = "INFO")
            # If remaining time is superior than 0
            if remaining_filtration_minutes > 0:
                # Start filtration
                self.callback_start_filtration(message="Pump starting for slot {}".format(kwargs['slot']))
                # We create an new timer based on stored input_datetime - end of slot1
                self.slot2_end_handler = self.run_at(self.callback_stop_filtration, end_time, slot=2, message="Slot2 Automation")
                self.log("Create new timer for slot2 with handler %s", self.slot2_end_handler, level = "INFO")
            else:
                self.log("There is no more filtration time left to do", level = "INFO")

    # Callback when start time change on slot1 or slot2
    # ---------------------------------------------
    def callback_change_start_slots(self, entity, attribute, old, new, **kwargs: dict) -> None:
        self.log("Change detected in %s time - old value %s / new value : %s", entity, old, new, level = "INFO")
        # Generate new task for a specific slot
        slot_handler = self._generate_tasks(kwargs['slot'], self.get_state(entity))
        self.log("Generate a new task with handler %s for slot%i - at %s", slot_handler, kwargs['slot'], new, level = "INFO")
        if kwargs['slot'] == 1:
            # Cancel previous handler
            self.cancel_timer(self.slot1_start_handler)
            # Store new handler
            self.slot1_start_handler = slot_handler
        elif kwargs['slot'] == 2:
            # Cancel previous handler
            self.cancel_timer(self.slot2_start_handler)
            # Store new handler
            self.slot2_start_handler = slot_handler
        self.log("New handler %s stored for slot%i", slot_handler, kwargs['slot'], level = "DEBUG")


    # Callback who start filtration
    # -----------------------------
    def callback_start_filtration(self, **kwargs: dict) -> None:
        if self.get_state(self.args['pump_sensor_id']).lower() == 'off':
            self.log("Starting Pump - %s", kwargs['message'], level = "INFO")
            self.turn_on(self.args['pump_sensor_id'])
        else:
            self.log("%s - Pump is already On !", kwargs['message'], level = "INFO")


    # Callback who stop filtration
    # ----------------------------
    def callback_stop_filtration(self, **kwargs: dict) -> None:
        if self._boost_in_progress() == False:
            if self.get_state(self.args['pump_sensor_id']).lower() == 'on':
                self.log("Stopping Pump - %s", kwargs['message'], level = "INFO")
                self.turn_off(self.args['pump_sensor_id'])
            else:
                self.log("Pump is already Off !", level = "INFO")
        else:
            self.log("Boost is in progress (%s). Pump stopping is canceled.", self.get_state(self.args['boost_selector_sensor_id']), level = "INFO")
        # If slot is in method arguments and equal to slot2, we send a notification
        if 'slot' in kwargs and kwargs['slot'] == 2:
            self._end_notification()

    # Callback triggerred when boost time change is detected
    # ------------------------------------------------------
    def callback_boost_trigger(self, entity, attribute, old, new, **kwargs: dict) -> None:
        self.log("Change in boost trigger detected : %s (Old: %s)", new, old, level = "INFO")
        if new != "Aucun":
            boost_duration_hour = int(''.join(filter(str.isdigit, new)))
            boost_duration_timer = (datetime(1900, 1, 1) + timedelta(hours=boost_duration_hour)).strftime('%H:%M:%S')
            self.call_service("timer/start", entity_id=self.args['boost_timer_sensor_id'], duration=boost_duration_timer)
            self.callback_start_filtration(message="Boost {}".format(new))
        elif new == "Aucun":
            self.call_service("timer/cancel", entity_id=self.args['boost_timer_sensor_id'])
            if self._is_during_slot() is False:
                self.callback_stop_filtration(message="Stopping boost {}".format(old))
                self.log("Boost mode change from %s to %s. Stopping filtration", old, new, level = "INFO")
            else:
                self.log("As boost change from mode %s to %s during normal filtration time, pump stopping is canceled", old, new, level = "INFO")


    # Triggered when boost time finish to stop pump if we are not in normal filtration periods
    # ----------------------------------------------------------------------------------------
    def callback_boost_timer_finished(self, event, data, **kwargs: dict) -> None:
        self.log("Boost Timer finish (%s) with data: %s", event, data, level = "INFO")
        if self._is_during_slot() is False:
            self.log("Boost timer finished at %s - Stopping filtration", data['finished_at'], level = "INFO")
            self._send_notification(
                message="Fin du boost {}. Arrêt de la pompe.".format(self.get_state(self.args['boost_selector_sensor_id'])),
                tag="pool_boost")
        else:
            self.log("As boost %s end during normal filtration time, pump stopping is canceled", self.get_state(self.args['boost_selector_sensor_id']), level = "INFO")
            self._send_notification(
                message="Fin du boost {}. La pompe n'est pas arrêté car c'est la période de filtration normale.".format(self.get_state(self.args['boost_selector_sensor_id'])),
                tag="pool_boost")
        self.select_option(entity_id=self.args['boost_selector_sensor_id'], option="Aucun")


    # Return boolean depending if now time is between start and stop time of each slots
    # ---------------------------------------------------------------------------------
    def _is_during_slot(self) -> bool:
        if self.now_is_between(self.get_state(self.args['times'][0]['start_time_id']), self.get_state(self.args['times'][0]['stop_time_id'])) or self.now_is_between(self.get_state(self.args['times'][1]['start_time_id']), self.get_state(self.args['times'][1]['stop_time_id'])):
            return True
        else:
            return False

    # Detect if boost is in progress
    # ------------------------------
    def _boost_in_progress(self) -> bool:
        if self.get_state(self.args['boost_timer_sensor_id']) == "active":
            return True
        else:
            return False


    # Send notification via Home Assistant
    # ------------------------------------
    def _send_notification(self, **kwargs) -> None:
        self.fire_event("NOTIFIER",
            action = "send_to_marc",
            title = "💦 Temps de filtration piscine", 
            message = kwargs['message'],
            tag = kwargs['tag'])


    # Send End Filtration notification
    # --------------------------------
    def _end_notification(self, **kwargs) -> None:
        filtration_duration = self._get_filtration_duration() # Duration in minutes
        filtration_done = float(self.get_state(self.args['pump_stats_sensor_id'])) * 60 # Duration in minutes
        filtration_percent = (100 / filtration_duration) * filtration_done
        messages = []
        messages.append(
            "La piscine a était filtrée durant {} sur {} soit {}%".format(
                timedelta(minutes=filtration_done),
                timedelta(minutes=filtration_duration),
                str(round(filtration_percent))
            )
        )
        if self._boost_in_progress() is True:
            boost_type = self.get_state(self.args['boost_selector_sensor_id'])
            boost_end_date = datetime.strptime(self.get_state(self.args['boost_timer_sensor_id'], attribute="finishes_at"), "%Y-%m-%dT%H:%M:%S%z")
            now = datetime.now().astimezone()
            humanize.i18n.activate("fr_FR")
            remaining_boost = humanize.precisedelta(boost_end_date.astimezone() - now, minimum_unit="minutes")
            messages.append(
                "Un boost de {} est en cours et il reste {} de filtration (Fin : {})".format(
                    boost_type,
                    remaining_boost,
                    boost_end_date.astimezone().strftime("%d-%m-%Y %H:%M")
                )
            )
        self._send_notification(message='. '.join(map(str, messages)), tag="pool_end_filtration")

    # List existing Handlers
    # ----------------------
    def _list_all_handler(self) -> None:
        all_handlers = self.get_scheduler_entries()['pool_pump_manager']
        for handler in all_handlers:
            self.log("Existing Handlers => Date : %s / repeat : %s / interval : %s / callback : %s / kwargs : %s", 
                        all_handlers[handler]['timestamp'],
                        all_handlers[handler]['repeat'],
                        all_handlers[handler]['interval'],
                        all_handlers[handler]['callback'],
                        all_handlers[handler]['kwargs'],
                        level="DEBUG")

Merci!

Merci. Il me faudrait aussi le error.log de appdaemon

De ce que je vois, comme tu as fait tourner plus que la recommandation, il s’avère que ca retourne un nombre négatif de minutes ce qui explique l’heure de fin.

2023-06-03 20:00:00.050776 INFO pool_pump_manager: Based on configuration, filtration duration is 390 minutes (iopool recommandation is 390 minutes)
2023-06-03 20:00:00.060879 INFO pool_pump_manager: Slot2 - Elapsed time of filtration : 1200 minutes / Remaining time : -810 minutes

Toutefois, comme tu as déjà fais tout le temps de filtration, la pompe ne démarre pas à 20h00

Essaye ce code qui devrait résoudre le problème :

import hassapi as hass
import math
from datetime import datetime, timedelta, time
import humanize

"""
Describe here
"""

class pool_pump_manager(hass.Hass):

    # Initialize Class
    # ----------------
    def initialize(self):
        self.log("Initialized")
        # Verify app configuration conformity
        if (self._check_configuration() != True):
            self.log("Error in configuration. Stopping app waiting configuration correction")
            self.stop_app(self.name)
            raise RuntimeError("Invalid configuration. Please look critical events in logs")
        self.log("INIT - Pool is in mode %s", self.get_state(self.args['mode_sensor_id']))
        # Depending of mode in progress
        if self.get_state(self.args['mode_sensor_id']).lower() == "Standard".lower():
            # Create task for slots
            self.slot1_start_handler = self._generate_tasks(1, self.get_state(self.args['times'][0]['start_time_id']))
            self.slot2_start_handler = self._generate_tasks(2, self.get_state(self.args['times'][1]['start_time_id']))
            # Create end task SLOT1 if not exist - for security in case app is reload
            self.slot1_end_handler = ""
            if self.timer_running(self.slot1_end_handler) == False:
                self.slot1_end_handler = self.run_at(self.callback_stop_filtration, self.get_state(self.args['times'][0]['stop_time_id']), slot=1, message="Slot1 Automation")
                self.log("INIT - Based on slot1 end time in %s, we create a task with handler %s at %s", self.args['times'][0]['stop_time_id'], self.slot1_end_handler, self.get_state(self.args['times'][0]['stop_time_id']), level = "INFO")
            # Create end task SLOT2 if not exist - for security in case app is reload
            self.slot2_end_handler = ""
            if self.timer_running(self.slot2_end_handler) == False:
                self.slot2_end_handler = self.run_at(self.callback_stop_filtration, self.get_state(self.args['times'][1]['stop_time_id']), slot=2, message="Slot2 Automation")
                self.log("INIT - Based on slot2 end time in %s, we create a task with handler %s at %s", self.args['times'][1]['stop_time_id'], self.slot2_end_handler, self.get_state(self.args['times'][1]['stop_time_id']), level = "INFO")
            # Listen change on slot times
            self.listen_state(self.callback_change_start_slots, self.args['times'][0]['start_time_id'], duration=1, slot=1)
            self.listen_state(self.callback_change_start_slots, self.args['times'][1]['start_time_id'], duration=1, slot=2)
        elif self.get_state(self.args['mode_sensor_id']).lower() == "Active".lower():
            # Create the start task for active winter filtration
            self.run_daily(self.callback_start_filtration, self.args['winter'][0]['start_time'], message="Active Winter")
            # Create the end task for active winter filtration
            self.run_daily(self.callback_stop_filtration, (datetime.strptime(self.args['winter'][0]['start_time'], "%H:%M:%S") + timedelta(minutes=self.args['winter'][0]['duration_minutes'])).time(), message="Active Winter")
        # Listen change in mode sensor
        self.listen_state(self.callback_change_mode, self.args['mode_sensor_id'], duration=1)
        # Listen change in boost selector and timer
        self.listen_state(self.callback_boost_trigger, self.args['boost_selector_sensor_id'])
        self.listen_event(self.callback_boost_timer_finished, entity_id = self.args['boost_timer_sensor_id'], event = "timer.finished")
        # List all existing handler for this app
        self._list_all_handler()


    # Check if all app configuration is good. In case of error, we stopping app
    # -------------------------------------------------------------------------
    def _check_configuration(self) -> bool:
        if self.entity_exists(self.args['pump_sensor_id']) == False:
            self.log("Entity defined in 'pump_sensor_id' configuration don't exist. Please update your configuration !", level = "CRITICAL")
            return False
        if self.entity_exists(self.args['pool_filtration_duration_sensor_id']) == False:
            self.log("Entity defined in 'pool_filtration_duration_sensor_id' configuration don't exist. Please update your configuration !", level = "CRITICAL")
            return False
        if self.entity_exists(self.args['mode_sensor_id']) == False:
            self.log("Entity defined in 'mode_sensor_id' configuration don't exist. Please update your configuration !", level = "CRITICAL")
            return False
        if self.entity_exists(self.args['times'][0]['start_time_id']) == False:
            self.log("Entity defined in 'times.slot1.start_time_id' configuration don't exist. Please update your configuration !", level = "CRITICAL")
            return False
        if self.entity_exists(self.args['times'][1]['start_time_id']) == False:
            self.log("Entity defined in 'times.slot2.start_time_id' configuration don't exist. Please update your configuration !", level = "CRITICAL")
            return False
        if not math.isclose(self.args['times'][0]['duration_percent'] + self.args['times'][1]['duration_percent'], 1, rel_tol=0, abs_tol=0):
            self.log("Sum of all duration_percent in times configuration is not equal to 1. Please update your configuration !", level = "CRITICAL")
            return False
        if datetime.strptime(self.get_state(self.args['times'][0]['start_time_id']), "%H:%M:%S") >= datetime.strptime(self.get_state(self.args['times'][1]['start_time_id']), "%H:%M:%S"):
            self.log("Slot1 start time is before or equal to slot2 start time. Please update your configuration !", level = "CRITICAL")
            return False
        if self.entity_exists(self.args['pool_filtration_duration_storage']) == False:
            self.log("Entity defined in 'pool_filtration_duration_storage' configuration don't exist. Please update your configuration !", level = "CRITICAL")
            return False
        if 'pool_filtration_duration_min' in self.args and 'pool_filtration_duration_max' in self.args and self.args['pool_filtration_duration_min'] > self.args['pool_filtration_duration_max']:
            self.log("pool_filtration_duration_min (%i) cannot be higher than pool_filtration_duration_max (%i)", self.args['pool_filtration_duration_min'], self.args['pool_filtration_duration_max'], level = "CRITICAL")
            return False
        return True


    # Return Filtration Duration
    # --------------------------
    def _get_filtration_duration(self) -> int:
        if (self.get_state(self.args['pool_filtration_duration_sensor_id']) == "unavailable"):
            self.log("Filtration duration is unavailable", level = "ERROR")
            filtration_duration = 0
        else:
            filtration_duration = int(float(self.get_state(self.args['pool_filtration_duration_sensor_id'])))
        if 'pool_filtration_duration_min' in self.args and filtration_duration < self.args['pool_filtration_duration_min']:
            filtration_duration = self.args['pool_filtration_duration_min']
        if 'pool_filtration_duration_max' in self.args and filtration_duration > self.args['pool_filtration_duration_max']:
            filtration_duration = self.args['pool_filtration_duration_max']
        self.set_value(self.args['pool_filtration_duration_storage'], filtration_duration)
        self.log("Based on configuration, filtration duration is %i minutes (iopool recommandation is %i minutes)", filtration_duration, int(float(self.get_state(self.args['pool_filtration_duration_sensor_id']))), level = "INFO")
        return filtration_duration


    # Callback to restart app and force a new initialize when mode change
    # If mode is Standard or Active
    # With this, we trigger new tasks by cleaning all old tasks
    # -------------------------------------------------------------------
    def callback_change_mode(self, entity, attribute, old, new, **kwargs: dict) -> None:
        self.log("New mode detected : %s (Old: %s)", new, old, level = "INFO")
        self.restart_app(self.name)


    # Generate scheduled task
    # -----------------------
    def _generate_tasks(self, slot: int, time: str) -> dict:
        if slot == 1:
            slot_start_handler = self.run_daily(self.callback_slot_start, time, slot=slot)
        elif slot == 2:
            slot_start_handler = self.run_daily(self.callback_slot_start, time, slot=slot)
        self.log("Generate a daily task at %s for slot%i start", time, slot, level = "INFO")
        return slot_start_handler


    # Callback when one slot start
    # ----------------------------
    def callback_slot_start(self, **kwargs: dict) -> None:
        if kwargs['slot'] == 1:
            # Start filtration
            self.callback_start_filtration(message="Pump starting for slot {}".format(kwargs['slot']))
            # Calculate time delta between slot1 and slot2
            timedelta_minutes = int((datetime.strptime(self.get_state(self.args['times'][1]['start_time_id']), "%H:%M:%S") - datetime.strptime(self.get_state(self.args['times'][0]['start_time_id']), "%H:%M:%S")).total_seconds() / 60)
            # Calculate filtration duration based on configuration percent and iopool filtration time recommandation
            filtration_duration = self._get_filtration_duration() * float(self.args['times'][0]['duration_percent'])
            self.log("Duration Between slots : %s minutes / Filtration Duration : %s (minutes)", int(timedelta_minutes), int(filtration_duration), level = "DEBUG")
            # If time between slot1 and slot 2 is superior than filtration time
            if int(timedelta_minutes) > int(filtration_duration):
                start_time = datetime.strptime(self.get_state(self.args['times'][0]['start_time_id']), "%H:%M:%S")
                end_time = datetime.strftime(start_time + timedelta(minutes=filtration_duration), "%H:%M:%S")
                # Setting end time in a HA input_datetime for slot1
                self.set_state(self.args['times'][0]['stop_time_id'], state=end_time)
                self.log("Slot1 Filtration times - Start : %s / End : %s", start_time.time(), end_time, level = "INFO")
                # If an existing timer run for self.slot1_end_handler handler, we cancel it
                if self.timer_running(self.slot1_end_handler) == True:
                    self.cancel_timer(self.slot1_end_handler)
                    self.log("Cancel existing timer for slot1 with handler %s", self.slot1_end_handler, level = "INFO")
                # We create an new timer based on stored input_datetime - end of slot1
                self.slot1_end_handler = self.run_at(self.callback_stop_filtration, end_time, slot=1, message="Slot1 Automation")
                self.log("Create new timer for slot1 with handler %s", self.slot1_end_handler, level = "INFO")
            else:
                self.log("Duration between slot1 and slot2 start time (%s minutes) is less than time need for filtration (%s minutes). We will not stop filtration for slot1", timedelta_minutes, filtration_duration, level="WARNING")
        elif kwargs['slot'] == 2:
            # Retrieves the time (in minutes) the pump was already running today
            elapsed_filtration_minutes = int(float(self.get_state(self.args['pump_stats_sensor_id'])) * 60)
            # Calculate the remaining time of filtration
            remaining_filtration_minutes = self._get_filtration_duration() - elapsed_filtration_minutes
            if remaining_filtration_minutes < 0:
                remaining_filtration_minutes = 0
            self.log("Slot2 - Elapsed time of filtration : %s minutes / Remaining time : %s minutes", elapsed_filtration_minutes, remaining_filtration_minutes, level = "INFO")
            start_time = datetime.strptime(self.get_state(self.args['times'][1]['start_time_id']), "%H:%M:%S")
            end_time = datetime.strftime(start_time + timedelta(minutes=remaining_filtration_minutes), "%H:%M:%S")
            # Setting end time in a HA input_datetime for slot2
            self.set_state(self.args['times'][1]['stop_time_id'], state=end_time)
            self.log("Slot2 Filtration times - Start : %s / End : %s", start_time.time(), end_time, level = "INFO")
            # If an existing timer run for self.slot2_end_handler handler, we cancel it
            if self.timer_running(self.slot2_end_handler) == True:
                self.cancel_timer(self.slot2_end_handler)
                self.log("Cancel existing timer for slot2 with handler %s", self.slot2_end_handler, level = "INFO")
            # If remaining time is superior than 0
            if remaining_filtration_minutes > 0:
                # Start filtration
                self.callback_start_filtration(message="Pump starting for slot {}".format(kwargs['slot']))
                # We create an new timer based on stored input_datetime - end of slot1
                self.slot2_end_handler = self.run_at(self.callback_stop_filtration, end_time, slot=2, message="Slot2 Automation")
                self.log("Create new timer for slot2 with handler %s", self.slot2_end_handler, level = "INFO")
            else:
                self.log("There is no more filtration time left to do", level = "INFO")

    # Callback when start time change on slot1 or slot2
    # ---------------------------------------------
    def callback_change_start_slots(self, entity, attribute, old, new, **kwargs: dict) -> None:
        self.log("Change detected in %s time - old value %s / new value : %s", entity, old, new, level = "INFO")
        # Generate new task for a specific slot
        slot_handler = self._generate_tasks(kwargs['slot'], self.get_state(entity))
        self.log("Generate a new task with handler %s for slot%i - at %s", slot_handler, kwargs['slot'], new, level = "INFO")
        if kwargs['slot'] == 1:
            # Cancel previous handler
            self.cancel_timer(self.slot1_start_handler)
            # Store new handler
            self.slot1_start_handler = slot_handler
        elif kwargs['slot'] == 2:
            # Cancel previous handler
            self.cancel_timer(self.slot2_start_handler)
            # Store new handler
            self.slot2_start_handler = slot_handler
        self.log("New handler %s stored for slot%i", slot_handler, kwargs['slot'], level = "DEBUG")


    # Callback who start filtration
    # -----------------------------
    def callback_start_filtration(self, **kwargs: dict) -> None:
        if self.get_state(self.args['pump_sensor_id']).lower() == 'off':
            self.log("Starting Pump - %s", kwargs['message'], level = "INFO")
            self.turn_on(self.args['pump_sensor_id'])
        else:
            self.log("%s - Pump is already On !", kwargs['message'], level = "INFO")


    # Callback who stop filtration
    # ----------------------------
    def callback_stop_filtration(self, **kwargs: dict) -> None:
        if self._boost_in_progress() == False:
            if self.get_state(self.args['pump_sensor_id']).lower() == 'on':
                self.log("Stopping Pump - %s", kwargs['message'], level = "INFO")
                self.turn_off(self.args['pump_sensor_id'])
            else:
                self.log("Pump is already Off !", level = "INFO")
        else:
            self.log("Boost is in progress (%s). Pump stopping is canceled.", self.get_state(self.args['boost_selector_sensor_id']), level = "INFO")
        # If slot is in method arguments and equal to slot2, we send a notification
        if 'slot' in kwargs and kwargs['slot'] == 2:
            self._end_notification()

    # Callback triggerred when boost time change is detected
    # ------------------------------------------------------
    def callback_boost_trigger(self, entity, attribute, old, new, **kwargs: dict) -> None:
        self.log("Change in boost trigger detected : %s (Old: %s)", new, old, level = "INFO")
        if new != "Aucun":
            boost_duration_hour = int(''.join(filter(str.isdigit, new)))
            boost_duration_timer = (datetime(1900, 1, 1) + timedelta(hours=boost_duration_hour)).strftime('%H:%M:%S')
            self.call_service("timer/start", entity_id=self.args['boost_timer_sensor_id'], duration=boost_duration_timer)
            self.callback_start_filtration(message="Boost {}".format(new))
        elif new == "Aucun":
            self.call_service("timer/cancel", entity_id=self.args['boost_timer_sensor_id'])
            if self._is_during_slot() is False:
                self.callback_stop_filtration(message="Stopping boost {}".format(old))
                self.log("Boost mode change from %s to %s. Stopping filtration", old, new, level = "INFO")
            else:
                self.log("As boost change from mode %s to %s during normal filtration time, pump stopping is canceled", old, new, level = "INFO")


    # Triggered when boost time finish to stop pump if we are not in normal filtration periods
    # ----------------------------------------------------------------------------------------
    def callback_boost_timer_finished(self, event, data, **kwargs: dict) -> None:
        self.log("Boost Timer finish (%s) with data: %s", event, data, level = "INFO")
        if self._is_during_slot() is False:
            self.log("Boost timer finished at %s - Stopping filtration", data['finished_at'], level = "INFO")
            self._send_notification(
                message="Fin du boost {}. Arrêt de la pompe.".format(self.get_state(self.args['boost_selector_sensor_id'])),
                tag="pool_boost")
        else:
            self.log("As boost %s end during normal filtration time, pump stopping is canceled", self.get_state(self.args['boost_selector_sensor_id']), level = "INFO")
            self._send_notification(
                message="Fin du boost {}. La pompe n'est pas arrêté car c'est la période de filtration normale.".format(self.get_state(self.args['boost_selector_sensor_id'])),
                tag="pool_boost")
        self.select_option(entity_id=self.args['boost_selector_sensor_id'], option="Aucun")


    # Return boolean depending if now time is between start and stop time of each slots
    # ---------------------------------------------------------------------------------
    def _is_during_slot(self) -> bool:
        if self.now_is_between(self.get_state(self.args['times'][0]['start_time_id']), self.get_state(self.args['times'][0]['stop_time_id'])) or self.now_is_between(self.get_state(self.args['times'][1]['start_time_id']), self.get_state(self.args['times'][1]['stop_time_id'])):
            return True
        else:
            return False

    # Detect if boost is in progress
    # ------------------------------
    def _boost_in_progress(self) -> bool:
        if self.get_state(self.args['boost_timer_sensor_id']) == "active":
            return True
        else:
            return False


    # Send notification via Home Assistant
    # ------------------------------------
    def _send_notification(self, **kwargs) -> None:
        self.fire_event("NOTIFIER",
            action = "send_to_marc",
            title = "💦 Temps de filtration piscine", 
            message = kwargs['message'],
            tag = kwargs['tag'])


    # Send End Filtration notification
    # --------------------------------
    def _end_notification(self, **kwargs) -> None:
        filtration_duration = self._get_filtration_duration() # Duration in minutes
        filtration_done = float(self.get_state(self.args['pump_stats_sensor_id'])) * 60 # Duration in minutes
        filtration_percent = (100 / filtration_duration) * filtration_done
        messages = []
        messages.append(
            "La piscine a était filtrée durant {} sur {} soit {}%".format(
                timedelta(minutes=filtration_done),
                timedelta(minutes=filtration_duration),
                str(round(filtration_percent))
            )
        )
        if self._boost_in_progress() is True:
            boost_type = self.get_state(self.args['boost_selector_sensor_id'])
            boost_end_date = datetime.strptime(self.get_state(self.args['boost_timer_sensor_id'], attribute="finishes_at"), "%Y-%m-%dT%H:%M:%S%z")
            now = datetime.now().astimezone()
            humanize.i18n.activate("fr_FR")
            remaining_boost = humanize.precisedelta(boost_end_date.astimezone() - now, minimum_unit="minutes")
            messages.append(
                "Un boost de {} est en cours et il reste {} de filtration (Fin : {})".format(
                    boost_type,
                    remaining_boost,
                    boost_end_date.astimezone().strftime("%d-%m-%Y %H:%M")
                )
            )
        self._send_notification(message='. '.join(map(str, messages)), tag="pool_end_filtration")

    # List existing Handlers
    # ----------------------
    def _list_all_handler(self) -> None:
        all_handlers = self.get_scheduler_entries()['pool_pump_manager']
        for handler in all_handlers:
            self.log("Existing Handlers => Date : %s / repeat : %s / interval : %s / callback : %s / kwargs : %s", 
                        all_handlers[handler]['timestamp'],
                        all_handlers[handler]['repeat'],
                        all_handlers[handler]['interval'],
                        all_handlers[handler]['callback'],
                        all_handlers[handler]['kwargs'],
                        level="DEBUG")

Si ca corrige ton souci, je changerais le code dans le premier post.

Voici le log:

2023-06-02 19:46:22.935871 WARNING pool_pump_manager: ------------------------------------------------------------
2023-06-02 19:46:22.937629 WARNING pool_pump_manager: Unexpected error running initialize() for pool_pump_manager
2023-06-02 19:46:22.938965 WARNING pool_pump_manager: ------------------------------------------------------------
2023-06-02 19:46:22.949153 WARNING pool_pump_manager: Traceback (most recent call last):
  File "/usr/lib/python3.11/site-packages/appdaemon/app_management.py", line 162, in initialize_app
    await utils.run_in_executor(self, init)
  File "/usr/lib/python3.11/site-packages/appdaemon/utils.py", line 304, in run_in_executor
    response = future.result()
               ^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/appdaemon/apps/pool_pump_manager.py", line 20, in initialize
    raise RuntimeError("Invalid configuration. Please look critical events in logs")
RuntimeError: Invalid configuration. Please look critical events in logs

2023-06-02 19:46:22.950341 WARNING pool_pump_manager: ------------------------------------------------------------
2023-06-03 17:08:01.667601 WARNING pool_pump_manager: ------------------------------------------------------------
2023-06-03 17:08:01.670410 WARNING pool_pump_manager: Unexpected error running initialize() for pool_pump_manager
2023-06-03 17:08:01.671391 WARNING pool_pump_manager: ------------------------------------------------------------
2023-06-03 17:08:01.720793 WARNING pool_pump_manager: Traceback (most recent call last):
  File "/usr/lib/python3.11/site-packages/appdaemon/app_management.py", line 162, in initialize_app
    await utils.run_in_executor(self, init)
  File "/usr/lib/python3.11/site-packages/appdaemon/utils.py", line 304, in run_in_executor
    response = future.result()
               ^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/appdaemon/apps/pool_pump_manager.py", line 51, in initialize
    self._list_all_handler()
  File "/config/appdaemon/apps/pool_pump_manager.py", line 311, in _list_all_handler
    all_handlers = self.get_scheduler_entries()['pool_pump_manager']
                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
KeyError: 'pool_pump_manager'

2023-06-03 17:08:01.722453 WARNING pool_pump_manager: ------------------------------------------------------------
2023-06-03 17:25:15.982158 WARNING pool_pump_manager: ------------------------------------------------------------
2023-06-03 17:25:15.983438 WARNING pool_pump_manager: Unexpected error running initialize() for pool_pump_manager
2023-06-03 17:25:15.984403 WARNING pool_pump_manager: ------------------------------------------------------------
2023-06-03 17:25:15.989854 WARNING pool_pump_manager: Traceback (most recent call last):
  File "/usr/lib/python3.11/site-packages/appdaemon/app_management.py", line 162, in initialize_app
    await utils.run_in_executor(self, init)
  File "/usr/lib/python3.11/site-packages/appdaemon/utils.py", line 304, in run_in_executor
    response = future.result()
               ^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/appdaemon/apps/pool_pump_manager.py", line 51, in initialize
    self._list_all_handler()
  File "/config/appdaemon/apps/pool_pump_manager.py", line 311, in _list_all_handler
    all_handlers = self.get_scheduler_entries()['pool_pump_manager']
                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
KeyError: 'pool_pump_manager'

2023-06-03 17:25:15.991147 WARNING pool_pump_manager: ------------------------------------------------------------

Merci!!!

Ce log d’erreur est bizarre. Dis moi si c’est une erreur qui reviens tout les jours.
As tu essayé de mettre le code que j’ai mis dans mon précédent message ?

Hello,

Oui,j’ai mis ton nouveau code.
Pour le slot 1 j’ai bien 40% du temps de filtration recommandé.mais pour le slot,c’est pas juste.
En commancant a 20h, la filtration devrait s’arrêter à 2h18.
Merci pour ton aide.

Hello,

La fin du slot2 est calculé au début du slot2 car si durant le slot1 la pompe a pas tourné comme prévu, ou si la pompe a tourné aussi en dehors du slot1 avant le slot2, on fera tourner durant le slot2, uniquement le temps restant de filtration.
Avant le démarrage du slot2, c’est l’heure de fin du slot2 qui avait était calculé la veille qui est affiché. Il faut donc attendre le démarrage du slot2 pour vraiment connaitre la fin du slot2 de la journée.

Ok,il faudrait je j’analyse un peu plus le code 1vant de poser toutes ces questions…
Penses tu qu’il soit possible d’ajouter un bouton « Arrêt Forcé » afin de pouvoir stopper la pompe comme on le veut?

Merci

Il te suffit de cliquer ici :


Ca arrêtera la pompe.

A moins que le besoin soit différents. Peut être pour empêcher complètement la filtration automatisé ?
Dans ce cas, si tu passes le mode de filtration en Passive, ca empêchera le démarrage des slots

Ok je vais voir ça demain après la réinitialisation.
Mais ce bouton ne me renvoyais pas correctement l’état de la pompe.Elle était par moment active et le bouton en desactivé.
je vais eplucher correctement ce code.

Ce bouton c’est HA. Rien à voir avec mon code AppDaemon.
Si il ne marche pas, il faut regarder cote HA

Hello
Je viens d’acheter cette sonde, tout marche nickel.
Il n’y a pas possibilité de créer des sensors ou remonter les valeurs de dureté, alcalinité,… de l’eau dans HA?

Bonjour,

Non la sonde ne les expose pas. Et en plus, le seul moyen que iopool a de les connaitre c’est au travers du dernier test bandelette donc les données peuvent clairement ne pas être à jour si iopool l’exposé dans l’API

Bonjour,

D’abord, merci pour ton tuto et ton aide sur celui-ci.

J’ai suivi pas à pas le tuto, tout remonte côté iopool mais sur ma carte lovelace, j’ai tout qui est à 00:00. Je ne sais pas où est le problème ! J’ai bien mis les heures de démarrage de slot1 et slot2 mais les fins de filtration ne viennent pas.
Pourrais-tu m’aiguiller ?

Merci

Bonjour,

Alors pour le temps de filtration, ton 00:00 est dû au fait que aucune filtration n’a encore dû effectuer. A la premiere filtration (ainsi qu’a chaque demarrage de filtration par AppDeamon, il va regarder le temps recommandé par iopool pour ensuite y appliquer les potentiels temps minimum et/ou maximum que tu aurais défini dans appDaemon.
Donc normalement, à 14h il a dû te remplir cela.

Pour les horaires de fin de filtration ils sont calculé à chaque début de filtration pour le slot en cours. Donc à 14h, il doit t’avoir remplir la fin du slot2 avec un temps correspondant au temps restant de filtration (basé sur les 9h d’iopool si pas de min/max defini dans appdaemon).
Demain matin, il remplira la fin de slot1 en lancant le slot1 avec un temps entre le début et la fin du slot, correspondant au pourcentage du temps de filtration que tu as configuré.

Merci, oui nickel ca a fonctionné, il a démarré comme prévu a 14h00 et m’a rempli la fin de slot 2.

Il fallait juste de la patiente :wink:. Me reste plus qu’a trouvé une solution (peut-être sur base d’appdaemon) pour la pompe a chaleur de ma piscine en fonction de la temperature extérieure et de la température de la piscine.

Merci encore, désolé du derangement.

Moi je la laisse allumé en auto. Tant que la temperature de l’eau n’est pas sous la temperature de consigne, elle démarre pas.

1 « J'aime »

Salut, je reviens un peu vers toi car j’ai laissé faire appdaemon pour la filtration de la piscine.
Le debut de slot1 est a 9h30 et le debut de slot 2 est a 13h30, malheureusement, les fin ne se mettent pas a jour. Quand je vais dans l’interface appdaemon, je vois un stop filtration a 13h06, est-ce que ca serait cette heure la qui doit se mettre en fin de slot1 ?

Merci.


Hello,

Rien dans les logs appdaemon ?
Tu peux partager ta configuration pool_manager ?