From f32f46aff50f02687830516d17328ccc1a7bd79f Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 1 Feb 2023 11:48:04 -0500 Subject: [PATCH] Fix Assist skipping entities that are hidden or have entity category (#87096) Skipping entities that are hidden or have entity category --- .../components/conversation/default_agent.py | 12 +++-- .../conversation/test_default_agent.py | 44 +++++++++++++++++++ 2 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 tests/components/conversation/test_default_agent.py diff --git a/homeassistant/components/conversation/default_agent.py b/homeassistant/components/conversation/default_agent.py index cabf9089b1c..2756998b3a6 100644 --- a/homeassistant/components/conversation/default_agent.py +++ b/homeassistant/components/conversation/default_agent.py @@ -403,16 +403,20 @@ class DefaultAgent(AbstractConversationAgent): entity = entities.async_get(state.entity_id) if entity is not None: - if entity.entity_category: - # Skip configuration/diagnostic entities + if entity.entity_category or entity.hidden: + # Skip configuration/diagnostic/hidden entities continue if entity.aliases: for alias in entity.aliases: names.append((alias, state.entity_id, context)) - # Default name - names.append((state.name, state.entity_id, context)) + # Default name + names.append((state.name, state.entity_id, context)) + + else: + # Default name + names.append((state.name, state.entity_id, context)) self._names_list = TextSlotList.from_tuples(names, allow_template=False) return self._names_list diff --git a/tests/components/conversation/test_default_agent.py b/tests/components/conversation/test_default_agent.py new file mode 100644 index 00000000000..591802f5888 --- /dev/null +++ b/tests/components/conversation/test_default_agent.py @@ -0,0 +1,44 @@ +"""Test for the default agent.""" +import pytest + +from homeassistant.components import conversation +from homeassistant.core import DOMAIN as HASS_DOMAIN, Context +from homeassistant.helpers import entity, entity_registry, intent +from homeassistant.setup import async_setup_component + +from tests.common import async_mock_service + + +@pytest.fixture +async def init_components(hass): + """Initialize relevant components with empty configs.""" + assert await async_setup_component(hass, "homeassistant", {}) + assert await async_setup_component(hass, "conversation", {}) + assert await async_setup_component(hass, "intent", {}) + + +@pytest.mark.parametrize( + "er_kwargs", + [ + {"hidden_by": entity_registry.RegistryEntryHider.USER}, + {"hidden_by": entity_registry.RegistryEntryHider.INTEGRATION}, + {"entity_category": entity.EntityCategory.CONFIG}, + {"entity_category": entity.EntityCategory.DIAGNOSTIC}, + ], +) +async def test_hidden_entities_skipped(hass, init_components, er_kwargs): + """Test we skip hidden entities.""" + + er = entity_registry.async_get(hass) + er.async_get_or_create( + "light", "demo", "1234", suggested_object_id="Test light", **er_kwargs + ) + hass.states.async_set("light.test_light", "off") + calls = async_mock_service(hass, HASS_DOMAIN, "turn_on") + result = await conversation.async_converse( + hass, "turn on test light", None, Context(), None + ) + + assert len(calls) == 0 + assert result.response.response_type == intent.IntentResponseType.ERROR + assert result.response.error_code == intent.IntentResponseErrorCode.NO_INTENT_MATCH