From b14fb6b4cf8c5743e8537e89a42f74e0a417ad0d Mon Sep 17 00:00:00 2001 From: sworld Date: Wed, 25 Dec 2024 23:17:13 +0800 Subject: [PATCH] fix: fix miot http type error --- .../xiaomi_home/miot/miot_cloud.py | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/custom_components/xiaomi_home/miot/miot_cloud.py b/custom_components/xiaomi_home/miot/miot_cloud.py index 4632a6c..d5a785c 100644 --- a/custom_components/xiaomi_home/miot/miot_cloud.py +++ b/custom_components/xiaomi_home/miot/miot_cloud.py @@ -224,20 +224,20 @@ class MIoTHttpClient: _client_id: str _access_token: str - _get_prop_timer: asyncio.TimerHandle - _get_prop_list: dict[str, dict[str, asyncio.Future | str | bool]] + _get_prop_timer: Optional[asyncio.TimerHandle] + _get_prop_list: dict[str, dict] def __init__( self, cloud_server: str, client_id: str, access_token: str, loop: Optional[asyncio.AbstractEventLoop] = None ) -> None: self._main_loop = loop or asyncio.get_running_loop() - self._host = None - self._base_url = None - self._client_id = None - self._access_token = None + self._host = DEFAULT_OAUTH2_API_HOST + self._base_url = '' + self._client_id = '' + self._access_token = '' - self._get_prop_timer: asyncio.TimerHandle = None + self._get_prop_timer = None self._get_prop_list = {} if ( @@ -258,8 +258,9 @@ async def deinit_async(self) -> None: self._get_prop_timer.cancel() self._get_prop_timer = None for item in self._get_prop_list.values(): - fut: asyncio.Future = item.get('fut') - fut.cancel() + fut: Optional[asyncio.Future] = item.get('fut', None) + if fut: + fut.cancel() self._get_prop_list.clear() if self._session and not self._session.closed: await self._session.close() @@ -270,9 +271,7 @@ def update_http_header( access_token: Optional[str] = None ) -> None: if isinstance(cloud_server, str): - if cloud_server == 'cn': - self._host = DEFAULT_OAUTH2_API_HOST - else: + if cloud_server != 'cn': self._host = f'{cloud_server}.{DEFAULT_OAUTH2_API_HOST}' self._base_url = f'https://{self._host}' if isinstance(client_id, str): @@ -350,8 +349,8 @@ async def __mihome_api_post_async( async def get_user_info_async(self) -> dict: http_res = await self._session.get( url='https://open.account.xiaomi.com/user/profile', - params={'clientId': self._client_id, - 'token': self._access_token}, + params={ + 'clientId': self._client_id, 'token': self._access_token}, headers={'content-type': 'application/x-www-form-urlencoded'}, timeout=MIHOME_HTTP_API_TIMEOUT ) @@ -386,7 +385,9 @@ async def get_central_cert_async(self, csr: str) -> Optional[str]: return cert - async def __get_dev_room_page_async(self, max_id: str = None) -> dict: + async def __get_dev_room_page_async( + self, max_id: Optional[str] = None + ) -> dict: res_obj = await self.__mihome_api_post_async( url_path='/app/v2/homeroom/get_dev_room_page', data={ @@ -442,7 +443,7 @@ async def get_homeinfos_async(self) -> dict: if 'result' not in res_obj: raise MIoTHttpError('invalid response result') - uid: str = None + uid: Optional[str] = None home_infos: dict = {} for device_source in ['homelist', 'share_home_list']: home_infos.setdefault(device_source, {}) @@ -507,7 +508,7 @@ async def get_uid_async(self) -> str: return (await self.get_homeinfos_async()).get('uid', None) async def __get_device_list_page_async( - self, dids: list[str], start_did: str = None + self, dids: list[str], start_did: Optional[str] = None ) -> dict[str, dict]: req_data: dict = { 'limit': 200, @@ -575,9 +576,9 @@ async def __get_device_list_page_async( async def get_devices_with_dids_async( self, dids: list[str] - ) -> dict[str, dict]: + ) -> Optional[dict[str, dict]]: results: list[dict[str, dict]] = await asyncio.gather( - *[self.__get_device_list_page_async(dids[index:index+150]) + *[self.__get_device_list_page_async(dids=dids[index:index+150]) for index in range(0, len(dids), 150)]) devices = {} for result in results: @@ -587,7 +588,7 @@ async def get_devices_with_dids_async( return devices async def get_devices_async( - self, home_ids: list[str] = None + self, home_ids: Optional[list[str]] = None ) -> dict[str, dict]: homeinfos = await self.get_homeinfos_async() homes: dict[str, dict[str, Any]] = {} @@ -627,8 +628,9 @@ async def get_devices_async( 'group_id': group_id } for did in room_info.get('dids', [])}) dids = sorted(list(devices.keys())) - results: dict[str, dict] = await self.get_devices_with_dids_async( - dids=dids) + results = await self.get_devices_with_dids_async(dids=dids) + if results is None: + raise MIoTHttpError('get devices failed') for did in dids: if did not in results: devices.pop(did, None)