Update repairs for Smlight integration to allow firmware updates where possible (#126113)

* Dont launch SSE client for core firmware 0.9.9

* Dont offer updates on core firmware 0.9.9

* Add correct firmware done event for legacy v2 firmware

* test update legacy v2 firmware

* Dont raise issue for firmware v2
pull/125763/head
TimL 2024-09-19 18:29:02 +10:00 committed by GitHub
parent 1dd1de2636
commit 31f9687ba1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 67 additions and 11 deletions

View File

@ -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
)

View File

@ -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,

View File

@ -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

View File

@ -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)

View File

@ -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",