fix: 修复阻塞事件循环的警告
将 serial.tools.list_ports.comports() 和串口验证移到线程池执行 避免阻塞 HA 事件循环,消除 asyncio_blocking_operations 警告
This commit is contained in:
parent
cbb36d7300
commit
1af5333792
@ -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):
|
class SigMeshGatewayConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
||||||
"""SigMesh Gateway 配置流程."""
|
"""SigMesh Gateway 配置流程."""
|
||||||
|
|
||||||
@ -48,29 +62,24 @@ class SigMeshGatewayConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
self._errors = {}
|
self._errors = {}
|
||||||
|
|
||||||
if user_input is not None:
|
if user_input is not None:
|
||||||
# 验证串口连接
|
# 验证串口连接(在线程池中执行,避免阻塞事件循环)
|
||||||
try:
|
try:
|
||||||
import serial
|
await self.hass.async_add_executor_job(
|
||||||
|
_test_serial_connection,
|
||||||
test_serial = serial.Serial(
|
|
||||||
user_input[CONF_SERIAL_DEVICE],
|
user_input[CONF_SERIAL_DEVICE],
|
||||||
baudrate=user_input.get(CONF_BAUDRATE, DEFAULT_BAUDRATE),
|
user_input.get(CONF_BAUDRATE, DEFAULT_BAUDRATE),
|
||||||
timeout=0.5,
|
|
||||||
)
|
)
|
||||||
test_serial.close()
|
|
||||||
self._user_input = user_input
|
self._user_input = user_input
|
||||||
# 进入配网配置步骤
|
# 进入配网配置步骤
|
||||||
return await self.async_step_prov_config()
|
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}"
|
self._errors[CONF_SERIAL_DEVICE] = f"无法打开串口:{e}"
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self._errors["base"] = f"验证失败:{e}"
|
self._errors["base"] = f"验证失败:{e}"
|
||||||
|
|
||||||
# 获取可用串口列表
|
# 获取可用串口列表(在线程池中执行,避免阻塞事件循环)
|
||||||
try:
|
try:
|
||||||
import serial.tools.list_ports
|
ports = await self.hass.async_add_executor_job(_get_serial_ports)
|
||||||
|
|
||||||
ports = serial.tools.list_ports.comports()
|
|
||||||
port_list = [
|
port_list = [
|
||||||
selector.SelectOptionDict(value=p.device, label=f"{p.device} - {p.description}")
|
selector.SelectOptionDict(value=p.device, label=f"{p.device} - {p.description}")
|
||||||
for p in ports
|
for p in ports
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user