diff --git a/homeassistant/components/intent/timers.py b/homeassistant/components/intent/timers.py index 3b7cf8813a9..0f7417f41b5 100644 --- a/homeassistant/components/intent/timers.py +++ b/homeassistant/components/intent/timers.py @@ -292,7 +292,8 @@ class TimerManager: timer.cancel() - self.handlers[timer.device_id](TimerEventType.CANCELLED, timer) + if timer.device_id in self.handlers: + self.handlers[timer.device_id](TimerEventType.CANCELLED, timer) _LOGGER.debug( "Timer cancelled: id=%s, name=%s, seconds_left=%s, device_id=%s", timer_id, @@ -320,7 +321,8 @@ class TimerManager: name=f"Timer {timer_id}", ) - self.handlers[timer.device_id](TimerEventType.UPDATED, timer) + if timer.device_id in self.handlers: + self.handlers[timer.device_id](TimerEventType.UPDATED, timer) if seconds > 0: log_verb = "increased" @@ -357,7 +359,8 @@ class TimerManager: task = self.timer_tasks.pop(timer_id) task.cancel() - self.handlers[timer.device_id](TimerEventType.UPDATED, timer) + if timer.device_id in self.handlers: + self.handlers[timer.device_id](TimerEventType.UPDATED, timer) _LOGGER.debug( "Timer paused: id=%s, name=%s, seconds_left=%s, device_id=%s", timer_id, @@ -382,7 +385,8 @@ class TimerManager: name=f"Timer {timer.id}", ) - self.handlers[timer.device_id](TimerEventType.UPDATED, timer) + if timer.device_id in self.handlers: + self.handlers[timer.device_id](TimerEventType.UPDATED, timer) _LOGGER.debug( "Timer unpaused: id=%s, name=%s, seconds_left=%s, device_id=%s", timer_id, @@ -397,7 +401,8 @@ class TimerManager: timer.finish() - self.handlers[timer.device_id](TimerEventType.FINISHED, timer) + if timer.device_id in self.handlers: + self.handlers[timer.device_id](TimerEventType.FINISHED, timer) _LOGGER.debug( "Timer finished: id=%s, name=%s, device_id=%s", timer_id, diff --git a/tests/components/intent/test_timers.py b/tests/components/intent/test_timers.py index d017713bb1d..1c4e38349d0 100644 --- a/tests/components/intent/test_timers.py +++ b/tests/components/intent/test_timers.py @@ -971,6 +971,36 @@ async def test_timers_not_supported(hass: HomeAssistant) -> None: language=hass.config.language, ) + # Start a timer + @callback + def handle_timer(event_type: TimerEventType, timer: TimerInfo) -> None: + pass + + device_id = "test_device" + unregister = timer_manager.register_handler(device_id, handle_timer) + + timer_id = timer_manager.start_timer( + device_id, + hours=None, + minutes=5, + seconds=None, + language=hass.config.language, + ) + + # Unregister handler so device no longer "supports" timers + unregister() + + # All operations on the timer should not crash + timer_manager.add_time(timer_id, 1) + + timer_manager.remove_time(timer_id, 1) + + timer_manager.pause_timer(timer_id) + + timer_manager.unpause_timer(timer_id) + + timer_manager.cancel_timer(timer_id) + async def test_timer_status_with_names(hass: HomeAssistant, init_components) -> None: """Test getting the status of named timers."""