diff --git a/homeassistant/helpers/event.py b/homeassistant/helpers/event.py index 6cd6a6c2cb9..ba0b07a207e 100644 --- a/homeassistant/helpers/event.py +++ b/homeassistant/helpers/event.py @@ -562,6 +562,11 @@ class _TrackTemplateResultInfo: entities = set(self._info.entities) for entity_id in self.hass.states.async_entity_ids(self._info.domains): entities.add(entity_id) + + # Entities has changed to none + if not entities: + return + self._entities_listener = async_track_state_change_event( self.hass, entities, self._refresh ) @@ -570,6 +575,10 @@ class _TrackTemplateResultInfo: def _setup_domains_listener(self) -> None: assert self._info + # Domains has changed to none + if not self._info.domains: + return + self._domains_listener = async_track_state_added_domain( self.hass, self._info.domains, self._refresh ) diff --git a/tests/helpers/test_event.py b/tests/helpers/test_event.py index 80f4dc9a09f..6fb422e03e7 100644 --- a/tests/helpers/test_event.py +++ b/tests/helpers/test_event.py @@ -543,6 +543,33 @@ async def test_track_template_error(hass, caplog): assert "TemplateAssertionError" not in caplog.text +async def test_track_template_error_can_recover(hass, caplog): + """Test tracking template with error.""" + hass.states.async_set("switch.data_system", "cow", {"opmode": 0}) + template_error = Template( + "{{ states.sensor.data_system.attributes['opmode'] == '0' }}", hass + ) + error_calls = [] + + @ha.callback + def error_callback(entity_id, old_state, new_state): + error_calls.append((entity_id, old_state, new_state)) + + async_track_template(hass, template_error, error_callback) + await hass.async_block_till_done() + assert not error_calls + + hass.states.async_remove("switch.data_system") + + assert "UndefinedError" in caplog.text + + hass.states.async_set("switch.data_system", "cow", {"opmode": 0}) + + caplog.clear() + + assert "UndefinedError" not in caplog.text + + async def test_track_template_result(hass): """Test tracking template.""" specific_runs = []