Skip to content

Commit 339a71e

Browse files
committed
feat: refresh cloud devices retry
1 parent 647adcc commit 339a71e

1 file changed

Lines changed: 18 additions & 43 deletions

File tree

custom_components/xiaomi_home/miot/miot_client.py

Lines changed: 18 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,10 @@
7979
_LOGGER = logging.getLogger(__name__)
8080

8181

82-
RECOVER_NETWORK_DELAY = 120
83-
RECOVER_NETWORK_RETRY_DELAY = 600
8482
REFRESH_PROPS_DELAY = 0.2
8583
REFRESH_PROPS_RETRY_DELAY = 3
8684
REFRESH_CLOUD_DEVICES_DELAY = 6
85+
REFRESH_CLOUD_DEVICES_RETRY_DELAY = 60
8786
REFRESH_GATEWAY_DEVICES_DELAY = 3
8887

8988
@dataclass
@@ -163,7 +162,6 @@ class MIoTClient:
163162
_sub_device_state: dict[str, MipsDeviceState]
164163

165164
_mips_local_state_changed_timers: dict[str, asyncio.TimerHandle]
166-
_recover_network_timer: Optional[asyncio.TimerHandle]
167165
_refresh_token_timer: Optional[asyncio.TimerHandle]
168166
_refresh_cert_timer: Optional[asyncio.TimerHandle]
169167
_refresh_cloud_devices_timer: Optional[asyncio.TimerHandle]
@@ -234,7 +232,6 @@ def __init__(
234232
self._sub_device_state = {}
235233

236234
self._mips_local_state_changed_timers = {}
237-
self._recover_network_timer = None
238235
self._refresh_token_timer = None
239236
self._refresh_cert_timer = None
240237
self._refresh_cloud_devices_timer = None
@@ -415,10 +412,6 @@ async def deinit_async(self) -> None:
415412
devices=list(self._device_list_cache.keys()))
416413
await self._miot_lan.vote_for_lan_ctrl_async(
417414
key=f'{self._uid}-{self._cloud_server}', vote=False)
418-
# Cancel recover network
419-
if self._recover_network_timer:
420-
self._recover_network_timer.cancel()
421-
self._recover_network_timer = None
422415
# Cancel refresh auth info
423416
if self._refresh_token_timer:
424417
self._refresh_token_timer.cancel()
@@ -1035,13 +1028,14 @@ def __update_device_msg_sub(self, did: str) -> None:
10351028
@final
10361029
async def __on_network_status_changed(self, status: bool) -> None:
10371030
_LOGGER.info('network status changed, %s', status)
1038-
if self._recover_network_timer:
1039-
self._recover_network_timer.cancel()
1040-
self._recover_network_timer = None
10411031
if status:
1042-
self._recover_network_timer = self._main_loop.call_later(
1043-
RECOVER_NETWORK_DELAY, lambda: self._main_loop.create_task(
1044-
self.__recover_network_async()))
1032+
# Check auth_info
1033+
if await self.refresh_oauth_info_async():
1034+
# Connect to mips cloud
1035+
self._mips_cloud.connect()
1036+
# Update device list
1037+
self.__request_refresh_cloud_devices()
1038+
await self.refresh_user_cert_async()
10451039
else:
10461040
self.__request_show_devices_changed_notify(delay_sec=30)
10471041
# Cancel refresh cloud devices
@@ -1051,25 +1045,6 @@ async def __on_network_status_changed(self, status: bool) -> None:
10511045
# Disconnect cloud mips
10521046
self._mips_cloud.disconnect()
10531047

1054-
@final
1055-
async def __recover_network_async(self) -> None:
1056-
_LOGGER.info('recover network connection')
1057-
if self._recover_network_timer:
1058-
self._recover_network_timer.cancel()
1059-
self._recover_network_timer = None
1060-
# Check auth_info
1061-
if await self.refresh_oauth_info_async():
1062-
# Connect to mips cloud
1063-
self._mips_cloud.connect()
1064-
# Update device list
1065-
self.__request_refresh_cloud_devices()
1066-
else:
1067-
self._recover_network_timer = self._main_loop.call_later(
1068-
RECOVER_NETWORK_RETRY_DELAY,
1069-
lambda: self._main_loop.create_task(
1070-
self.__recover_network_async()))
1071-
await self.refresh_user_cert_async()
1072-
10731048
@final
10741049
async def __on_mips_service_state_change(
10751050
self, group_id: str, state: MipsServiceState, data: dict
@@ -1464,12 +1439,18 @@ async def __update_devices_from_cloud_async(
14641439
async def __refresh_cloud_devices_async(self) -> None:
14651440
_LOGGER.debug(
14661441
'refresh cloud devices, %s, %s', self._uid, self._cloud_server)
1467-
self._refresh_cloud_devices_timer = None
1442+
if self._refresh_cloud_devices_timer:
1443+
self._refresh_cloud_devices_timer.cancel()
1444+
self._refresh_cloud_devices_timer = None
14681445
try:
14691446
result = await self._http.get_devices_async(
14701447
home_ids=list(self._entry_data.get('home_selected', {}).keys()))
14711448
except Exception as err: # pylint: disable=broad-exception-caught
14721449
_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()))
14731454
return
14741455
if not result and 'devices' not in result:
14751456
self.__show_client_error_notify(
@@ -1516,17 +1497,11 @@ def __request_refresh_cloud_devices(self, immediately=False) -> None:
15161497
_LOGGER.debug(
15171498
'request refresh cloud devices, %s, %s',
15181499
self._uid, self._cloud_server)
1519-
if immediately:
1520-
if self._refresh_cloud_devices_timer:
1521-
self._refresh_cloud_devices_timer.cancel()
1522-
self._refresh_cloud_devices_timer = self._main_loop.call_later(
1523-
0, lambda: self._main_loop.create_task(
1524-
self.__refresh_cloud_devices_async()))
1525-
return
1500+
delay_sec : int = 0 if immediately else REFRESH_CLOUD_DEVICES_DELAY
15261501
if self._refresh_cloud_devices_timer:
1527-
return
1502+
self._refresh_cloud_devices_timer.cancel()
15281503
self._refresh_cloud_devices_timer = self._main_loop.call_later(
1529-
REFRESH_CLOUD_DEVICES_DELAY, lambda: self._main_loop.create_task(
1504+
delay_sec, lambda: self._main_loop.create_task(
15301505
self.__refresh_cloud_devices_async()))
15311506

15321507
@final

0 commit comments

Comments
 (0)