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 v2pull/125763/head
parent
1dd1de2636
commit
31f9687ba1
|
@ -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
|
||||
)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in New Issue