diff --git a/homeassistant/components/twinkly/light.py b/homeassistant/components/twinkly/light.py index b3fa97ea247..453ba900706 100644 --- a/homeassistant/components/twinkly/light.py +++ b/homeassistant/components/twinkly/light.py @@ -64,6 +64,8 @@ async def async_setup_entry( class TwinklyLight(LightEntity): """Implementation of the light for the Twinkly service.""" + _attr_has_entity_name = True + _attr_name = None _attr_icon = "mdi:string-lights" def __init__( @@ -92,7 +94,7 @@ class TwinklyLight(LightEntity): # Those are saved in the config entry in order to have meaningful values even # if the device is currently offline. # They are expected to be updated using the device_info. - self._name = conf.data[CONF_NAME] + self._name = conf.data[CONF_NAME] or "Twinkly light" self._model = conf.data[CONF_MODEL] self._client = client @@ -106,11 +108,6 @@ class TwinklyLight(LightEntity): # We guess that most devices are "new" and support effects self._attr_supported_features = LightEntityFeature.EFFECT - @property - def name(self) -> str: - """Name of the device.""" - return self._name if self._name else "Twinkly light" - @property def device_info(self) -> DeviceInfo | None: """Get device specific attributes.""" @@ -118,7 +115,7 @@ class TwinklyLight(LightEntity): identifiers={(DOMAIN, self._attr_unique_id)}, manufacturer="LEDWORKS", model=self._model, - name=self.name, + name=self._name, sw_version=self._software_version, ) @@ -271,6 +268,15 @@ class TwinklyLight(LightEntity): }, ) + device_registry = dr.async_get(self.hass) + device_entry = device_registry.async_get_device( + {(DOMAIN, self._attr_unique_id)} + ) + if device_entry: + device_registry.async_update_device( + device_entry.id, name=self._name, model=self._model + ) + if LightEntityFeature.EFFECT & self.supported_features: await self.async_update_movies() await self.async_update_current_movie() diff --git a/tests/components/twinkly/test_light.py b/tests/components/twinkly/test_light.py index e3b8b499c8e..452467bb160 100644 --- a/tests/components/twinkly/test_light.py +++ b/tests/components/twinkly/test_light.py @@ -1,8 +1,11 @@ """Tests for the integration of a twinly device.""" from __future__ import annotations +from datetime import timedelta from unittest.mock import patch +from freezegun.api import FrozenDateTimeFactory + from homeassistant.components.light import ATTR_BRIGHTNESS, LightEntityFeature from homeassistant.components.twinkly.const import DOMAIN as TWINKLY_DOMAIN from homeassistant.const import CONF_HOST, CONF_ID, CONF_MODEL, CONF_NAME @@ -13,7 +16,7 @@ from homeassistant.helpers.entity_registry import RegistryEntry from . import TEST_MODEL, TEST_NAME, TEST_NAME_ORIGINAL, ClientMock -from tests.common import MockConfigEntry +from tests.common import MockConfigEntry, async_fire_time_changed async def test_initial_state(hass: HomeAssistant) -> None: @@ -29,7 +32,6 @@ async def test_initial_state(hass: HomeAssistant) -> None: assert state.attributes["friendly_name"] == TEST_NAME assert state.attributes["icon"] == "mdi:string-lights" - assert entity.original_name == TEST_NAME assert entity.original_icon == "mdi:string-lights" assert device.name == TEST_NAME @@ -283,7 +285,11 @@ async def test_turn_off(hass: HomeAssistant) -> None: assert state.state == "off" -async def test_update_name(hass: HomeAssistant) -> None: +async def test_update_name( + hass: HomeAssistant, + device_registry: dr.DeviceRegistry, + freezer: FrozenDateTimeFactory, +) -> None: """Validate device's name update behavior. Validate that if device name is changed from the Twinkly app, @@ -293,14 +299,14 @@ async def test_update_name(hass: HomeAssistant) -> None: entity, _, client, config_entry = await _create_entries(hass) client.change_name("new_device_name") - await hass.services.async_call( - "light", "turn_off", service_data={"entity_id": entity.entity_id}, blocking=True - ) # We call turn_off which will automatically cause an async_update + freezer.tick(timedelta(seconds=30)) + async_fire_time_changed(hass) + await hass.async_block_till_done() - state = hass.states.get(entity.entity_id) + dev_entry = device_registry.async_get_device({(TWINKLY_DOMAIN, client.id)}) + assert dev_entry.name == "new_device_name" assert config_entry.data[CONF_NAME] == "new_device_name" - assert state.attributes["friendly_name"] == "new_device_name" async def test_unload(hass: HomeAssistant) -> None: