diff --git a/homeassistant/helpers/entity_registry.py b/homeassistant/helpers/entity_registry.py index 70a516c10a64..5cbc342dda25 100644 --- a/homeassistant/helpers/entity_registry.py +++ b/homeassistant/helpers/entity_registry.py @@ -550,7 +550,7 @@ def _async_get_full_entity_name( if name is None and overridden_name is not None: full_name = overridden_name - elif not use_legacy_naming or name is None: + elif not use_legacy_naming or not name: raw_device_name: str | None = None device_name: str | None = None parent_device_name: str | None = None diff --git a/tests/helpers/test_entity.py b/tests/helpers/test_entity.py index 3b8b530378cb..78ac0ff62e3a 100644 --- a/tests/helpers/test_entity.py +++ b/tests/helpers/test_entity.py @@ -1042,6 +1042,44 @@ async def _test_friendly_name( assert state.attributes.get(ATTR_FRIENDLY_NAME) == expected_friendly_name +@pytest.mark.parametrize("has_entity_name", [False, True]) +async def test_friendly_name_empty_override_uses_device_name( + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + device_registry: dr.DeviceRegistry, + has_entity_name: bool, +) -> None: + """Test an empty name follows the device until the override is reset.""" + ent = MockEntity( + unique_id="empty_name", + device_info={ + "identifiers": {("test", "device")}, + "name": "Device Bla", + }, + has_entity_name=has_entity_name, + name="Temperature", + ) + await _test_friendly_name(hass, ent, "Device Bla Temperature") + + entry = entity_registry.async_update_entity(ent.entity_id, name="") + await hass.async_block_till_done() + assert hass.states.get(ent.entity_id).attributes[ATTR_FRIENDLY_NAME] == "Device Bla" + + assert entry.device_id is not None + device_registry.async_update_device(entry.device_id, name_by_user="Living room") + await hass.async_block_till_done() + assert ( + hass.states.get(ent.entity_id).attributes[ATTR_FRIENDLY_NAME] == "Living room" + ) + + entity_registry.async_update_entity(ent.entity_id, name=None) + await hass.async_block_till_done() + assert ( + hass.states.get(ent.entity_id).attributes[ATTR_FRIENDLY_NAME] + == "Living room Temperature" + ) + + @pytest.mark.parametrize( ( "has_entity_name", diff --git a/tests/helpers/test_entity_registry.py b/tests/helpers/test_entity_registry.py index 86b9ea82e73a..c6b5315ac780 100644 --- a/tests/helpers/test_entity_registry.py +++ b/tests/helpers/test_entity_registry.py @@ -3658,6 +3658,16 @@ async def test_restore_states( pytest.param( None, None, "Living Room Fan", "Living Room Fan", id="device_rename_applied" ), + pytest.param( + "Temperature", "", None, "Pedestal Fan", id="empty_name_uses_device_name" + ), + pytest.param( + "Temperature", + "", + "Living Room Fan", + "Living Room Fan", + id="empty_name_uses_renamed_device", + ), ], ) async def test_restore_state_uses_device_name(