From 1af53337922992d9f8eb28c824806aac06eecd1a Mon Sep 17 00:00:00 2001 From: impressionyang Date: Thu, 16 Apr 2026 16:08:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=98=BB=E5=A1=9E?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E5=BE=AA=E7=8E=AF=E7=9A=84=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 serial.tools.list_ports.comports() 和串口验证移到线程池执行 避免阻塞 HA 事件循环,消除 asyncio_blocking_operations 警告 --- .../sigmesh_gateway/config_flow.py | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/custom_components/sigmesh_gateway/config_flow.py b/custom_components/sigmesh_gateway/config_flow.py index 477f1d6..a83aae6 100644 --- a/custom_components/sigmesh_gateway/config_flow.py +++ b/custom_components/sigmesh_gateway/config_flow.py @@ -30,6 +30,20 @@ from .const import ( ) +def _get_serial_ports() -> list: + """获取可用串口列表(在同步线程中执行).""" + import serial.tools.list_ports + return serial.tools.list_ports.comports() + + +def _test_serial_connection(device: str, baudrate: int) -> bool: + """测试串口连接(在同步线程中执行).""" + import serial + test_serial = serial.Serial(device, baudrate=baudrate, timeout=0.5) + test_serial.close() + return True + + class SigMeshGatewayConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): """SigMesh Gateway 配置流程.""" @@ -48,29 +62,24 @@ class SigMeshGatewayConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): self._errors = {} if user_input is not None: - # 验证串口连接 + # 验证串口连接(在线程池中执行,避免阻塞事件循环) try: - import serial - - test_serial = serial.Serial( + await self.hass.async_add_executor_job( + _test_serial_connection, user_input[CONF_SERIAL_DEVICE], - baudrate=user_input.get(CONF_BAUDRATE, DEFAULT_BAUDRATE), - timeout=0.5, + user_input.get(CONF_BAUDRATE, DEFAULT_BAUDRATE), ) - test_serial.close() self._user_input = user_input # 进入配网配置步骤 return await self.async_step_prov_config() - except serial.SerialException as e: + except (ImportError, serial.SerialException) as e: self._errors[CONF_SERIAL_DEVICE] = f"无法打开串口:{e}" except Exception as e: self._errors["base"] = f"验证失败:{e}" - # 获取可用串口列表 + # 获取可用串口列表(在线程池中执行,避免阻塞事件循环) try: - import serial.tools.list_ports - - ports = serial.tools.list_ports.comports() + ports = await self.hass.async_add_executor_job(_get_serial_ports) port_list = [ selector.SelectOptionDict(value=p.device, label=f"{p.device} - {p.description}") for p in ports