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