diff --git a/homeassistant/components/smlight/__init__.py b/homeassistant/components/smlight/__init__.py index 52db6c8770b..cbfb8162d63 100644 --- a/homeassistant/components/smlight/__init__.py +++ b/homeassistant/components/smlight/__init__.py @@ -36,7 +36,6 @@ type SmConfigEntry = ConfigEntry[SmlightData] async def async_setup_entry(hass: HomeAssistant, entry: SmConfigEntry) -> bool: """Set up SMLIGHT Zigbee from a config entry.""" client = Api2(host=entry.data[CONF_HOST], session=async_get_clientsession(hass)) - entry.async_create_background_task(hass, client.sse.client(), "smlight-sse-client") data_coordinator = SmDataUpdateCoordinator(hass, entry.data[CONF_HOST], client) firmware_coordinator = SmFirmwareUpdateCoordinator( @@ -46,6 +45,11 @@ async def async_setup_entry(hass: HomeAssistant, entry: SmConfigEntry) -> bool: await data_coordinator.async_config_entry_first_refresh() await firmware_coordinator.async_config_entry_first_refresh() + if data_coordinator.data.info.legacy_api < 2: + entry.async_create_background_task( + hass, client.sse.client(), "smlight-sse-client" + ) + entry.runtime_data = SmlightData( data=data_coordinator, firmware=firmware_coordinator ) diff --git a/homeassistant/components/smlight/coordinator.py b/homeassistant/components/smlight/coordinator.py index e5ef21bd531..5b38ec4a89e 100644 --- a/homeassistant/components/smlight/coordinator.py +++ b/homeassistant/components/smlight/coordinator.py @@ -80,9 +80,8 @@ class SmBaseDataUpdateCoordinator[_DataT](DataUpdateCoordinator[_DataT]): info = await self.client.get_info() self.unique_id = format_mac(info.MAC) - - if info.legacy_api: - self.legacy_api = info.legacy_api + self.legacy_api = info.legacy_api + if info.legacy_api == 2: ir.async_create_issue( self.hass, DOMAIN, diff --git a/homeassistant/components/smlight/update.py b/homeassistant/components/smlight/update.py index e00499760b1..cb28a197860 100644 --- a/homeassistant/components/smlight/update.py +++ b/homeassistant/components/smlight/update.py @@ -102,6 +102,8 @@ class SmUpdateEntity(SmEntity, UpdateEntity): def latest_version(self) -> str | None: """Latest version available for install.""" data = self.coordinator.data + if self.coordinator.legacy_api == 2: + return None fw = self.entity_description.fw_list(data) @@ -126,6 +128,12 @@ class SmUpdateEntity(SmEntity, UpdateEntity): SmEvents.FW_UPD_done, self._update_finished ) ) + if self.coordinator.legacy_api == 1: + self._unload.append( + self.coordinator.client.sse.register_callback( + SmEvents.ESP_UPD_done, self._update_finished + ) + ) self._unload.append( self.coordinator.client.sse.register_callback( SmEvents.ZB_FW_err, self._update_failed diff --git a/tests/components/smlight/test_init.py b/tests/components/smlight/test_init.py index eb7b6396d26..afc53932fb0 100644 --- a/tests/components/smlight/test_init.py +++ b/tests/components/smlight/test_init.py @@ -122,10 +122,10 @@ async def test_device_legacy_firmware( issue_registry: IssueRegistry, ) -> None: """Test device setup for old firmware version that dont support required API.""" - LEGACY_VERSION = "v2.3.1" + LEGACY_VERSION = "v0.9.9" mock_smlight_client.get_sensors.side_effect = SmlightError mock_smlight_client.get_info.return_value = Info( - legacy_api=1, sw_version=LEGACY_VERSION, MAC="AA:BB:CC:DD:EE:FF" + legacy_api=2, sw_version=LEGACY_VERSION, MAC="AA:BB:CC:DD:EE:FF" ) entry = await setup_integration(hass, mock_config_entry) diff --git a/tests/components/smlight/test_update.py b/tests/components/smlight/test_update.py index b8b8de8a09b..b0b8910ef9b 100644 --- a/tests/components/smlight/test_update.py +++ b/tests/components/smlight/test_update.py @@ -126,10 +126,7 @@ async def test_update_firmware( mock_smlight_client, SmEvents.ZB_FW_prgs ) - async def _call_event_function(event: MessageEvent): - event_function(event) - - await _call_event_function(MOCK_FIRMWARE_PROGRESS) + event_function(MOCK_FIRMWARE_PROGRESS) state = hass.states.get(entity_id) assert state.attributes[ATTR_IN_PROGRESS] == 50 @@ -137,7 +134,55 @@ async def test_update_firmware( mock_smlight_client, SmEvents.FW_UPD_done ) - await _call_event_function(MOCK_FIRMWARE_DONE) + event_function(MOCK_FIRMWARE_DONE) + + mock_smlight_client.get_info.return_value = Info( + sw_version="v2.5.2", + ) + + freezer.tick(SCAN_FIRMWARE_INTERVAL) + async_fire_time_changed(hass) + await hass.async_block_till_done() + + state = hass.states.get(entity_id) + assert state.state == STATE_OFF + assert state.attributes[ATTR_INSTALLED_VERSION] == "v2.5.2" + assert state.attributes[ATTR_LATEST_VERSION] == "v2.5.2" + + +async def test_update_legacy_firmware_v2( + hass: HomeAssistant, + freezer: FrozenDateTimeFactory, + mock_config_entry: MockConfigEntry, + mock_smlight_client: MagicMock, +) -> None: + """Test firmware update for legacy v2 firmware.""" + mock_smlight_client.get_info.return_value = Info( + sw_version="v2.0.18", + legacy_api=1, + MAC="AA:BB:CC:DD:EE:FF", + ) + await setup_integration(hass, mock_config_entry) + entity_id = "update.mock_title_core_firmware" + state = hass.states.get(entity_id) + assert state.state == STATE_ON + assert state.attributes[ATTR_INSTALLED_VERSION] == "v2.0.18" + assert state.attributes[ATTR_LATEST_VERSION] == "v2.5.2" + + await hass.services.async_call( + PLATFORM, + SERVICE_INSTALL, + {ATTR_ENTITY_ID: entity_id}, + blocking=False, + ) + + assert len(mock_smlight_client.fw_update.mock_calls) == 1 + + event_function: Callable[[MessageEvent], None] = get_callback_function( + mock_smlight_client, SmEvents.ESP_UPD_done + ) + + event_function(MOCK_FIRMWARE_DONE) mock_smlight_client.get_info.return_value = Info( sw_version="v2.5.2",