From fe7bdd394014df77785bdf598a37e41bd3d3ae44 Mon Sep 17 00:00:00 2001 From: Bas Nijholt Date: Sat, 8 Apr 2023 03:39:08 -0700 Subject: [PATCH] Add auto_reset_time_remaining attribute (#558) * Add auto_reset_time_remaining attribute * fix attr * Add test --- custom_components/adaptive_lighting/switch.py | 13 +++++++++++++ tests/test_switch.py | 6 ++++++ 2 files changed, 19 insertions(+) diff --git a/custom_components/adaptive_lighting/switch.py b/custom_components/adaptive_lighting/switch.py index 5b816b67..884f74cd 100644 --- a/custom_components/adaptive_lighting/switch.py +++ b/custom_components/adaptive_lighting/switch.py @@ -1014,6 +1014,12 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity): if self.turn_on_off_listener.manual_control.get(light) ] extra_state_attributes.update(self._settings) + timers = self.turn_on_off_listener.auto_reset_manual_control_timers + extra_state_attributes["autoreset_time_remaining"] = { + light: time + for light in self._lights + if (timer := timers.get(light)) and (time := timer.remaining_time()) > 0 + } return extra_state_attributes def create_context( @@ -2106,3 +2112,10 @@ class _AsyncSingleShotTimer: if self.task: self.task.cancel() self.callback = None + + def remaining_time(self): + """Return the remaining time before the timer expires.""" + if self.start_time is not None: + elapsed_time = (dt_util.utcnow() - self.start_time).total_seconds() + return max(0, self.delay - elapsed_time) + return 0 diff --git a/tests/test_switch.py b/tests/test_switch.py index f6d671f4..476e83cc 100644 --- a/tests/test_switch.py +++ b/tests/test_switch.py @@ -692,9 +692,15 @@ async def test_auto_reset_manual_control(hass): await turn_light(True, brightness=1) await turn_light(True, brightness=10) assert manual_control[light.entity_id] + assert ( + switch.extra_state_attributes["autoreset_time_remaining"][light.entity_id] > 0 + ) await asyncio.sleep(0.3) # Should be enough time for auto reset await update() assert not manual_control[light.entity_id], (light, manual_control) + assert ( + light.entity_id not in switch.extra_state_attributes["autoreset_time_remaining"] + ) # Do a couple of quick changes and check that light is not reset for i in range(3):