From ec914815bdcfb92942d99c8838cf50bbb4e481f1 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Wed, 19 Apr 2023 18:20:17 +0200 Subject: [PATCH] Fix lingering timer in ZHA light transition (#91683) --- homeassistant/components/zha/light.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/zha/light.py b/homeassistant/components/zha/light.py index a15c51fff5a..e97f32fe527 100644 --- a/homeassistant/components/zha/light.py +++ b/homeassistant/components/zha/light.py @@ -138,6 +138,11 @@ class BaseLight(LogMixin, light.LightEntity): self._transitioning_group: bool = False self._transition_listener: Callable[[], None] | None = None + async def async_will_remove_from_hass(self) -> None: + """Disconnect entity object when removed.""" + self._async_unsub_transition_listener() + await super().async_will_remove_from_hass() + @property def extra_state_attributes(self) -> dict[str, Any]: """Return state attributes.""" @@ -575,8 +580,7 @@ class BaseLight(LogMixin, light.LightEntity): SIGNAL_LIGHT_GROUP_TRANSITION_START, {"entity_ids": self._entity_ids}, ) - if self._transition_listener is not None: - self._transition_listener() + self._async_unsub_transition_listener() @callback def async_transition_start_timer(self, transition_time) -> None: @@ -596,14 +600,19 @@ class BaseLight(LogMixin, light.LightEntity): self.async_transition_complete, ) + @callback + def _async_unsub_transition_listener(self) -> None: + """Unsubscribe transition listener.""" + if self._transition_listener: + self._transition_listener() + self._transition_listener = None + @callback def async_transition_complete(self, _=None) -> None: """Set _transitioning_individual to False and write HA state.""" self.debug("transition complete - future attribute reports will write HA state") self._transitioning_individual = False - if self._transition_listener: - self._transition_listener() - self._transition_listener = None + self._async_unsub_transition_listener() self.async_write_ha_state() if isinstance(self, LightGroup): async_dispatcher_send(