fix: 修复阻塞事件循环的警告

将 serial.tools.list_ports.comports() 和串口验证移到线程池执行
避免阻塞 HA 事件循环,消除 asyncio_blocking_operations 警告
This commit is contained in:
impressionyang 2026-04-16 16:08:57 +08:00
parent cbb36d7300
commit 1af5333792

View File

@ -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