diff --git a/homeassistant/helpers/llm.py b/homeassistant/helpers/llm.py index 1eb30fe7512..6995bb140fd 100644 --- a/homeassistant/helpers/llm.py +++ b/homeassistant/helpers/llm.py @@ -658,19 +658,27 @@ def _get_exposed_entities( entity_entry = entity_registry.async_get(state.entity_id) names = [state.name] + device_name = None area_names = [] if entity_entry is not None: names.extend(entity_entry.aliases) + device = ( + device_registry.async_get(entity_entry.device_id) + if entity_entry.device_id + else None + ) + + if device: + device_name = device.name_by_user or device.name + if entity_entry.area_id and ( area := area_registry.async_get_area(entity_entry.area_id) ): # Entity is in area area_names.append(area.name) area_names.extend(area.aliases) - elif entity_entry.device_id and ( - device := device_registry.async_get(entity_entry.device_id) - ): + elif device: # Check device area if device.area_id and ( area := area_registry.async_get_area(device.area_id) @@ -691,6 +699,9 @@ def _get_exposed_entities( if (parsed_utc := dt_util.parse_datetime(state.state)) is not None: info["state"] = dt_util.as_local(parsed_utc).isoformat() + if device_name: + info["device"] = device_name + if area_names: info["areas"] = ", ".join(area_names) diff --git a/tests/helpers/test_llm.py b/tests/helpers/test_llm.py index accc681ca9d..c536f811913 100644 --- a/tests/helpers/test_llm.py +++ b/tests/helpers/test_llm.py @@ -453,6 +453,7 @@ async def test_assist_api_prompt( connections={("test", "1234")}, suggested_area="Test Area", ) + device_registry.async_update_device(device.id, name_by_user="Friendly Device") area = area_registry.async_get_area_by_name("Test Area") area_registry.async_update(area.id, aliases=["Alternative name"]) entry1 = entity_registry.async_get_or_create( @@ -580,6 +581,7 @@ async def test_assist_api_prompt( - names: '1' domain: light state: unavailable + device: 1 areas: Test Area 2 - names: Kitchen domain: light @@ -590,34 +592,42 @@ async def test_assist_api_prompt( - names: Living Room domain: light state: 'on' + device: Friendly Device areas: Test Area, Alternative name - names: Test Device, my test light domain: light state: unavailable + device: Friendly Device areas: Test Area, Alternative name - names: Test Device 2 domain: light state: unavailable + device: Test Device 2 areas: Test Area 2 - names: Test Device 3 domain: light state: unavailable + device: Test Device 3 areas: Test Area 2 - names: Test Device 4 domain: light state: unavailable + device: Test Device 4 areas: Test Area 2 - names: Test Service domain: light state: unavailable + device: Test Service areas: Test Area, Alternative name - names: Test Service domain: light state: unavailable + device: Test Service areas: Test Area, Alternative name - names: Test Service domain: light state: unavailable + device: Test Service areas: Test Area, Alternative name - names: Unnamed Device domain: light @@ -627,32 +637,41 @@ async def test_assist_api_prompt( stateless_exposed_entities_prompt = """Static Context: An overview of the areas and the devices in this smart home: - names: '1' domain: light + device: 1 areas: Test Area 2 - names: Kitchen domain: light - names: Living Room domain: light + device: Friendly Device areas: Test Area, Alternative name - names: Test Device, my test light domain: light + device: Friendly Device areas: Test Area, Alternative name - names: Test Device 2 domain: light + device: Test Device 2 areas: Test Area 2 - names: Test Device 3 domain: light + device: Test Device 3 areas: Test Area 2 - names: Test Device 4 domain: light + device: Test Device 4 areas: Test Area 2 - names: Test Service domain: light + device: Test Service areas: Test Area, Alternative name - names: Test Service domain: light + device: Test Service areas: Test Area, Alternative name - names: Test Service domain: light + device: Test Service areas: Test Area, Alternative name - names: Unnamed Device domain: light