mirror of
https://github.com/home-assistant/core.git
synced 2025-07-26 22:57:17 +00:00
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
This commit is contained in:
parent
1dd1de2636
commit
31f9687ba1
@ -36,7 +36,6 @@ type SmConfigEntry = ConfigEntry[SmlightData]
|
|||||||
async def async_setup_entry(hass: HomeAssistant, entry: SmConfigEntry) -> bool:
|
async def async_setup_entry(hass: HomeAssistant, entry: SmConfigEntry) -> bool:
|
||||||
"""Set up SMLIGHT Zigbee from a config entry."""
|
"""Set up SMLIGHT Zigbee from a config entry."""
|
||||||
client = Api2(host=entry.data[CONF_HOST], session=async_get_clientsession(hass))
|
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)
|
data_coordinator = SmDataUpdateCoordinator(hass, entry.data[CONF_HOST], client)
|
||||||
firmware_coordinator = SmFirmwareUpdateCoordinator(
|
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 data_coordinator.async_config_entry_first_refresh()
|
||||||
await firmware_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(
|
entry.runtime_data = SmlightData(
|
||||||
data=data_coordinator, firmware=firmware_coordinator
|
data=data_coordinator, firmware=firmware_coordinator
|
||||||
)
|
)
|
||||||
|
@ -80,9 +80,8 @@ class SmBaseDataUpdateCoordinator[_DataT](DataUpdateCoordinator[_DataT]):
|
|||||||
|
|
||||||
info = await self.client.get_info()
|
info = await self.client.get_info()
|
||||||
self.unique_id = format_mac(info.MAC)
|
self.unique_id = format_mac(info.MAC)
|
||||||
|
self.legacy_api = info.legacy_api
|
||||||
if info.legacy_api:
|
if info.legacy_api == 2:
|
||||||
self.legacy_api = info.legacy_api
|
|
||||||
ir.async_create_issue(
|
ir.async_create_issue(
|
||||||
self.hass,
|
self.hass,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
|
@ -102,6 +102,8 @@ class SmUpdateEntity(SmEntity, UpdateEntity):
|
|||||||
def latest_version(self) -> str | None:
|
def latest_version(self) -> str | None:
|
||||||
"""Latest version available for install."""
|
"""Latest version available for install."""
|
||||||
data = self.coordinator.data
|
data = self.coordinator.data
|
||||||
|
if self.coordinator.legacy_api == 2:
|
||||||
|
return None
|
||||||
|
|
||||||
fw = self.entity_description.fw_list(data)
|
fw = self.entity_description.fw_list(data)
|
||||||
|
|
||||||
@ -126,6 +128,12 @@ class SmUpdateEntity(SmEntity, UpdateEntity):
|
|||||||
SmEvents.FW_UPD_done, self._update_finished
|
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._unload.append(
|
||||||
self.coordinator.client.sse.register_callback(
|
self.coordinator.client.sse.register_callback(
|
||||||
SmEvents.ZB_FW_err, self._update_failed
|
SmEvents.ZB_FW_err, self._update_failed
|
||||||
|
@ -122,10 +122,10 @@ async def test_device_legacy_firmware(
|
|||||||
issue_registry: IssueRegistry,
|
issue_registry: IssueRegistry,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test device setup for old firmware version that dont support required API."""
|
"""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_sensors.side_effect = SmlightError
|
||||||
mock_smlight_client.get_info.return_value = Info(
|
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)
|
entry = await setup_integration(hass, mock_config_entry)
|
||||||
|
|
||||||
|
@ -126,10 +126,7 @@ async def test_update_firmware(
|
|||||||
mock_smlight_client, SmEvents.ZB_FW_prgs
|
mock_smlight_client, SmEvents.ZB_FW_prgs
|
||||||
)
|
)
|
||||||
|
|
||||||
async def _call_event_function(event: MessageEvent):
|
event_function(MOCK_FIRMWARE_PROGRESS)
|
||||||
event_function(event)
|
|
||||||
|
|
||||||
await _call_event_function(MOCK_FIRMWARE_PROGRESS)
|
|
||||||
state = hass.states.get(entity_id)
|
state = hass.states.get(entity_id)
|
||||||
assert state.attributes[ATTR_IN_PROGRESS] == 50
|
assert state.attributes[ATTR_IN_PROGRESS] == 50
|
||||||
|
|
||||||
@ -137,7 +134,55 @@ async def test_update_firmware(
|
|||||||
mock_smlight_client, SmEvents.FW_UPD_done
|
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(
|
mock_smlight_client.get_info.return_value = Info(
|
||||||
sw_version="v2.5.2",
|
sw_version="v2.5.2",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user