mirror of
https://github.com/XiaoMi/ha_xiaomi_home.git
synced 2026-01-17 23:50:42 +08:00
feat: recover network connection after a 2-minute delay
This commit is contained in:
parent
0954b003b0
commit
647adcc02e
@ -79,6 +79,13 @@ from .miot_i18n import MIoTI18n
|
|||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
RECOVER_NETWORK_DELAY = 120
|
||||||
|
RECOVER_NETWORK_RETRY_DELAY = 600
|
||||||
|
REFRESH_PROPS_DELAY = 0.2
|
||||||
|
REFRESH_PROPS_RETRY_DELAY = 3
|
||||||
|
REFRESH_CLOUD_DEVICES_DELAY = 6
|
||||||
|
REFRESH_GATEWAY_DEVICES_DELAY = 3
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class MIoTClientSub:
|
class MIoTClientSub:
|
||||||
"""MIoT client subscription."""
|
"""MIoT client subscription."""
|
||||||
@ -156,6 +163,7 @@ class MIoTClient:
|
|||||||
_sub_device_state: dict[str, MipsDeviceState]
|
_sub_device_state: dict[str, MipsDeviceState]
|
||||||
|
|
||||||
_mips_local_state_changed_timers: dict[str, asyncio.TimerHandle]
|
_mips_local_state_changed_timers: dict[str, asyncio.TimerHandle]
|
||||||
|
_recover_network_timer: Optional[asyncio.TimerHandle]
|
||||||
_refresh_token_timer: Optional[asyncio.TimerHandle]
|
_refresh_token_timer: Optional[asyncio.TimerHandle]
|
||||||
_refresh_cert_timer: Optional[asyncio.TimerHandle]
|
_refresh_cert_timer: Optional[asyncio.TimerHandle]
|
||||||
_refresh_cloud_devices_timer: Optional[asyncio.TimerHandle]
|
_refresh_cloud_devices_timer: Optional[asyncio.TimerHandle]
|
||||||
@ -226,6 +234,7 @@ class MIoTClient:
|
|||||||
self._sub_device_state = {}
|
self._sub_device_state = {}
|
||||||
|
|
||||||
self._mips_local_state_changed_timers = {}
|
self._mips_local_state_changed_timers = {}
|
||||||
|
self._recover_network_timer = None
|
||||||
self._refresh_token_timer = None
|
self._refresh_token_timer = None
|
||||||
self._refresh_cert_timer = None
|
self._refresh_cert_timer = None
|
||||||
self._refresh_cloud_devices_timer = None
|
self._refresh_cloud_devices_timer = None
|
||||||
@ -406,6 +415,10 @@ class MIoTClient:
|
|||||||
devices=list(self._device_list_cache.keys()))
|
devices=list(self._device_list_cache.keys()))
|
||||||
await self._miot_lan.vote_for_lan_ctrl_async(
|
await self._miot_lan.vote_for_lan_ctrl_async(
|
||||||
key=f'{self._uid}-{self._cloud_server}', vote=False)
|
key=f'{self._uid}-{self._cloud_server}', vote=False)
|
||||||
|
# Cancel recover network
|
||||||
|
if self._recover_network_timer:
|
||||||
|
self._recover_network_timer.cancel()
|
||||||
|
self._recover_network_timer = None
|
||||||
# Cancel refresh auth info
|
# Cancel refresh auth info
|
||||||
if self._refresh_token_timer:
|
if self._refresh_token_timer:
|
||||||
self._refresh_token_timer.cancel()
|
self._refresh_token_timer.cancel()
|
||||||
@ -717,7 +730,7 @@ class MIoTClient:
|
|||||||
if self._refresh_props_timer:
|
if self._refresh_props_timer:
|
||||||
return
|
return
|
||||||
self._refresh_props_timer = self._main_loop.call_later(
|
self._refresh_props_timer = self._main_loop.call_later(
|
||||||
0.2, lambda: self._main_loop.create_task(
|
REFRESH_PROPS_DELAY, lambda: self._main_loop.create_task(
|
||||||
self.__refresh_props_handler()))
|
self.__refresh_props_handler()))
|
||||||
|
|
||||||
async def get_prop_async(self, did: str, siid: int, piid: int) -> Any:
|
async def get_prop_async(self, did: str, siid: int, piid: int) -> Any:
|
||||||
@ -1022,14 +1035,13 @@ class MIoTClient:
|
|||||||
@final
|
@final
|
||||||
async def __on_network_status_changed(self, status: bool) -> None:
|
async def __on_network_status_changed(self, status: bool) -> None:
|
||||||
_LOGGER.info('network status changed, %s', status)
|
_LOGGER.info('network status changed, %s', status)
|
||||||
|
if self._recover_network_timer:
|
||||||
|
self._recover_network_timer.cancel()
|
||||||
|
self._recover_network_timer = None
|
||||||
if status:
|
if status:
|
||||||
# Check auth_info
|
self._recover_network_timer = self._main_loop.call_later(
|
||||||
if await self.refresh_oauth_info_async():
|
RECOVER_NETWORK_DELAY, lambda: self._main_loop.create_task(
|
||||||
# Connect to mips cloud
|
self.__recover_network_async()))
|
||||||
self._mips_cloud.connect()
|
|
||||||
# Update device list
|
|
||||||
self.__request_refresh_cloud_devices()
|
|
||||||
await self.refresh_user_cert_async()
|
|
||||||
else:
|
else:
|
||||||
self.__request_show_devices_changed_notify(delay_sec=30)
|
self.__request_show_devices_changed_notify(delay_sec=30)
|
||||||
# Cancel refresh cloud devices
|
# Cancel refresh cloud devices
|
||||||
@ -1039,6 +1051,25 @@ class MIoTClient:
|
|||||||
# Disconnect cloud mips
|
# Disconnect cloud mips
|
||||||
self._mips_cloud.disconnect()
|
self._mips_cloud.disconnect()
|
||||||
|
|
||||||
|
@final
|
||||||
|
async def __recover_network_async(self) -> None:
|
||||||
|
_LOGGER.info('recover network connection')
|
||||||
|
if self._recover_network_timer:
|
||||||
|
self._recover_network_timer.cancel()
|
||||||
|
self._recover_network_timer = None
|
||||||
|
# Check auth_info
|
||||||
|
if await self.refresh_oauth_info_async():
|
||||||
|
# Connect to mips cloud
|
||||||
|
self._mips_cloud.connect()
|
||||||
|
# Update device list
|
||||||
|
self.__request_refresh_cloud_devices()
|
||||||
|
else:
|
||||||
|
self._recover_network_timer = self._main_loop.call_later(
|
||||||
|
RECOVER_NETWORK_RETRY_DELAY,
|
||||||
|
lambda: self._main_loop.create_task(
|
||||||
|
self.__recover_network_async()))
|
||||||
|
await self.refresh_user_cert_async()
|
||||||
|
|
||||||
@final
|
@final
|
||||||
async def __on_mips_service_state_change(
|
async def __on_mips_service_state_change(
|
||||||
self, group_id: str, state: MipsServiceState, data: dict
|
self, group_id: str, state: MipsServiceState, data: dict
|
||||||
@ -1495,7 +1526,7 @@ class MIoTClient:
|
|||||||
if self._refresh_cloud_devices_timer:
|
if self._refresh_cloud_devices_timer:
|
||||||
return
|
return
|
||||||
self._refresh_cloud_devices_timer = self._main_loop.call_later(
|
self._refresh_cloud_devices_timer = self._main_loop.call_later(
|
||||||
6, lambda: self._main_loop.create_task(
|
REFRESH_CLOUD_DEVICES_DELAY, lambda: self._main_loop.create_task(
|
||||||
self.__refresh_cloud_devices_async()))
|
self.__refresh_cloud_devices_async()))
|
||||||
|
|
||||||
@final
|
@final
|
||||||
@ -1619,7 +1650,8 @@ class MIoTClient:
|
|||||||
return
|
return
|
||||||
self._mips_local_state_changed_timers[group_id] = (
|
self._mips_local_state_changed_timers[group_id] = (
|
||||||
self._main_loop.call_later(
|
self._main_loop.call_later(
|
||||||
3, lambda: self._main_loop.create_task(
|
REFRESH_GATEWAY_DEVICES_DELAY,
|
||||||
|
lambda: self._main_loop.create_task(
|
||||||
self.__refresh_gw_devices_with_group_id_async(
|
self.__refresh_gw_devices_with_group_id_async(
|
||||||
group_id=group_id))))
|
group_id=group_id))))
|
||||||
|
|
||||||
@ -1773,7 +1805,7 @@ class MIoTClient:
|
|||||||
self._refresh_props_retry_count = 0
|
self._refresh_props_retry_count = 0
|
||||||
if self._refresh_props_list:
|
if self._refresh_props_list:
|
||||||
self._refresh_props_timer = self._main_loop.call_later(
|
self._refresh_props_timer = self._main_loop.call_later(
|
||||||
0.2, lambda: self._main_loop.create_task(
|
REFRESH_PROPS_DELAY, lambda: self._main_loop.create_task(
|
||||||
self.__refresh_props_handler()))
|
self.__refresh_props_handler()))
|
||||||
else:
|
else:
|
||||||
self._refresh_props_timer = None
|
self._refresh_props_timer = None
|
||||||
@ -1792,7 +1824,7 @@ class MIoTClient:
|
|||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
'refresh props failed, retry, %s', self._refresh_props_retry_count)
|
'refresh props failed, retry, %s', self._refresh_props_retry_count)
|
||||||
self._refresh_props_timer = self._main_loop.call_later(
|
self._refresh_props_timer = self._main_loop.call_later(
|
||||||
3, lambda: self._main_loop.create_task(
|
REFRESH_PROPS_RETRY_DELAY, lambda: self._main_loop.create_task(
|
||||||
self.__refresh_props_handler()))
|
self.__refresh_props_handler()))
|
||||||
|
|
||||||
@final
|
@final
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user