Skip to content

Commit 593d7d3

Browse files
authored
fix: retry to get cloud device list until successfully fetching device online state when the network resumes (#1555)
1 parent 77cebb2 commit 593d7d3

2 files changed

Lines changed: 28 additions & 17 deletions

File tree

custom_components/xiaomi_home/miot/miot_client.py

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,12 @@
7979
_LOGGER = logging.getLogger(__name__)
8080

8181

82+
REFRESH_PROPS_DELAY = 0.2
83+
REFRESH_PROPS_RETRY_DELAY = 3
84+
REFRESH_CLOUD_DEVICES_DELAY = 6
85+
REFRESH_CLOUD_DEVICES_RETRY_DELAY = 60
86+
REFRESH_GATEWAY_DEVICES_DELAY = 3
87+
8288
@dataclass
8389
class MIoTClientSub:
8490
"""MIoT client subscription."""
@@ -717,7 +723,7 @@ def request_refresh_prop(
717723
if self._refresh_props_timer:
718724
return
719725
self._refresh_props_timer = self._main_loop.call_later(
720-
0.2, lambda: self._main_loop.create_task(
726+
REFRESH_PROPS_DELAY, lambda: self._main_loop.create_task(
721727
self.__refresh_props_handler()))
722728

723729
async def get_prop_async(self, did: str, siid: int, piid: int) -> Any:
@@ -1433,9 +1439,19 @@ async def __update_devices_from_cloud_async(
14331439
async def __refresh_cloud_devices_async(self) -> None:
14341440
_LOGGER.debug(
14351441
'refresh cloud devices, %s, %s', self._uid, self._cloud_server)
1436-
self._refresh_cloud_devices_timer = None
1437-
result = await self._http.get_devices_async(
1438-
home_ids=list(self._entry_data.get('home_selected', {}).keys()))
1442+
if self._refresh_cloud_devices_timer:
1443+
self._refresh_cloud_devices_timer.cancel()
1444+
self._refresh_cloud_devices_timer = None
1445+
try:
1446+
result = await self._http.get_devices_async(
1447+
home_ids=list(self._entry_data.get('home_selected', {}).keys()))
1448+
except Exception as err: # pylint: disable=broad-exception-caught
1449+
_LOGGER.error('refresh cloud devices failed, %s', err)
1450+
self._refresh_cloud_devices_timer = self._main_loop.call_later(
1451+
REFRESH_CLOUD_DEVICES_RETRY_DELAY,
1452+
lambda: self._main_loop.create_task(
1453+
self.__refresh_cloud_devices_async()))
1454+
return
14391455
if not result and 'devices' not in result:
14401456
self.__show_client_error_notify(
14411457
message=self._i18n.translate(
@@ -1481,17 +1497,11 @@ def __request_refresh_cloud_devices(self, immediately=False) -> None:
14811497
_LOGGER.debug(
14821498
'request refresh cloud devices, %s, %s',
14831499
self._uid, self._cloud_server)
1484-
if immediately:
1485-
if self._refresh_cloud_devices_timer:
1486-
self._refresh_cloud_devices_timer.cancel()
1487-
self._refresh_cloud_devices_timer = self._main_loop.call_later(
1488-
0, lambda: self._main_loop.create_task(
1489-
self.__refresh_cloud_devices_async()))
1490-
return
1500+
delay_sec : int = 0 if immediately else REFRESH_CLOUD_DEVICES_DELAY
14911501
if self._refresh_cloud_devices_timer:
1492-
return
1502+
self._refresh_cloud_devices_timer.cancel()
14931503
self._refresh_cloud_devices_timer = self._main_loop.call_later(
1494-
6, lambda: self._main_loop.create_task(
1504+
delay_sec, lambda: self._main_loop.create_task(
14951505
self.__refresh_cloud_devices_async()))
14961506

14971507
@final
@@ -1615,7 +1625,8 @@ def __request_refresh_gw_devices_by_group_id(
16151625
return
16161626
self._mips_local_state_changed_timers[group_id] = (
16171627
self._main_loop.call_later(
1618-
3, lambda: self._main_loop.create_task(
1628+
REFRESH_GATEWAY_DEVICES_DELAY,
1629+
lambda: self._main_loop.create_task(
16191630
self.__refresh_gw_devices_with_group_id_async(
16201631
group_id=group_id))))
16211632

@@ -1769,7 +1780,7 @@ async def __refresh_props_handler(self) -> None:
17691780
self._refresh_props_retry_count = 0
17701781
if self._refresh_props_list:
17711782
self._refresh_props_timer = self._main_loop.call_later(
1772-
0.2, lambda: self._main_loop.create_task(
1783+
REFRESH_PROPS_DELAY, lambda: self._main_loop.create_task(
17731784
self.__refresh_props_handler()))
17741785
else:
17751786
self._refresh_props_timer = None
@@ -1788,7 +1799,7 @@ async def __refresh_props_handler(self) -> None:
17881799
_LOGGER.info(
17891800
'refresh props failed, retry, %s', self._refresh_props_retry_count)
17901801
self._refresh_props_timer = self._main_loop.call_later(
1791-
3, lambda: self._main_loop.create_task(
1802+
REFRESH_PROPS_RETRY_DELAY, lambda: self._main_loop.create_task(
17921803
self.__refresh_props_handler()))
17931804

17941805
@final

custom_components/xiaomi_home/miot/miot_network.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ async def __ping_async(self, address: Optional[str] = None) -> float:
291291
return self._main_loop.time() - start_ts
292292
return self._DETECT_TIMEOUT
293293
except Exception as err: # pylint: disable=broad-exception-caught
294-
print(err)
294+
_LOGGER.debug('ping error, %s',err)
295295
return self._DETECT_TIMEOUT
296296

297297
async def __http_async(self, url: str) -> float:

0 commit comments

Comments
 (0)