From 70e766973dfba48d99c007e55b7a8374fe1fc76c Mon Sep 17 00:00:00 2001 From: Ruoqi Huang Date: Tue, 22 Jul 2025 00:36:01 -0700 Subject: [PATCH 1/2] read exact size for status --- aidot/device_client.py | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/aidot/device_client.py b/aidot/device_client.py index 5050aae7..d55a74a7 100644 --- a/aidot/device_client.py +++ b/aidot/device_client.py @@ -214,41 +214,48 @@ async def login(self) -> None: await self.send_action({}, "getDevAttrReq") async def read_status(self) -> DeviceStatusData: - if self._connect_and_login is False: + if not self._connect_and_login: await asyncio.sleep(2) raise AidotNotLogin + try: - data = await self.reader.read(1024) - except (BrokenPipeError, ConnectionResetError) as e: - _LOGGER.error(f"{self.device_id} read status error {e}") + # Read exactly 8 bytes for the header + header = await self.reader.readexactly(8) + magic, msgtype, bodysize = struct.unpack(">HHI", header) + + # Read exactly the declared body length + encrypted_data = await self.reader.readexactly(bodysize) + + except asyncio.IncompleteReadError as e: + _LOGGER.error(f"{self.device_id} incomplete read: {e}") await self.reset() self.status.online = False return self.status - except Exception as e: - _LOGGER.error(f"recv data error {e}") - return self.status - data_len = len(data) - if data_len <= 0: - _LOGGER.error("recv data error len") + except (BrokenPipeError, ConnectionResetError) as e: + _LOGGER.error(f"{self.device_id} read status error: {e}") await self.reset() self.status.online = False return self.status + except Exception as e: + _LOGGER.error(f"{self.device_id} read error: {e}") + return self.status + try: - magic, msgtype, bodysize = struct.unpack(">HHI", data[:8]) - decrypted_data = aes_decrypt(data[8:], self.aes_key) + decrypted_data = aes_decrypt(encrypted_data, self.aes_key) json_data = json.loads(decrypted_data) except Exception as e: - _LOGGER.error(f"recv json error : {e}") + _LOGGER.error(f"{self.device_id} recv json error: {e}") + return await self.read_status() # retry once + + if json_data.get("service") == "test": + self.ping_count = 0 return await self.read_status() - if "service" in json_data: - if "test" == json_data["service"]: - self.ping_count = 0 - return await self.read_status() payload = json_data.get(CONF_PAYLOAD) if payload is not None: self.ascNumber = payload.get(CONF_ASCNUMBER) self.status.update(payload.get(CONF_ATTR)) + return self.status async def ping_task(self) -> None: From aac62e02f4a35a632c4065f862a05679dc3b7ddc Mon Sep 17 00:00:00 2001 From: Ruoqi Huang Date: Tue, 22 Jul 2025 00:37:12 -0700 Subject: [PATCH 2/2] version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 49cce271..0eeda465 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="python-aidot", - version="0.3.41", + version="0.3.42", author="aidotdev2024", url='https://github.com/Aidot-Development-Team/python-aidot', description="aidot control wifi lights",