ha(H2): исправления по ревью — несколько устройств, suggested values, YAML-import, типы ошибок

- critical: listen_port по умолчанию 0 (эфемерный) — несколько ConfigEntry
  не конфликтуют; тест двух записей на дефолтном порту
- manifest: добавлен обязательный ключ codeowners
- unload: set_log_handler(None) вынесен в executor (не блокирует loop);
  рефкаунт лог-пампа без гонки (старт после успешного setup)
- config flow: возврат введённого в форму при ошибке
  (add_suggested_values_to_schema; секреты исключены), YAML-import подключён
  через async_setup + SOURCE_IMPORT, ProvisionError.kind вместо разбора
  русского текста, валидация device_port/key_id из JSON
- trial: требует получения всех базовых свойств шаблона (не пустой ok),
  безопасное создание Session
- py-ci.sh: отсутствие .venv-ha — ошибка (PY_CI_SKIP_HA=1 для пропуска);
  pytest.ini testpaths
This commit is contained in:
2026-09-29 12:20:37 +03:00
parent 26d1d6d64f
commit da01c607a6
16 changed files with 275 additions and 100 deletions
+9 -7
View File
@@ -147,18 +147,20 @@ class FglairClient:
async def async_start(self) -> None:
if self._session is not None:
return
self._session = await self.hass.async_add_executor_job(
self._build_session
)
started = await self.hass.async_add_executor_job(self._session.start)
session = await self.hass.async_add_executor_job(self._build_session)
try:
started = await self.hass.async_add_executor_job(session.start)
except Exception:
await session.async_stop()
raise
if not started:
await self._session.async_stop()
self._session = None
await session.async_stop()
raise ConfigEntryNotReady(
"не удалось запустить локальный HTTP-сервер FGLair "
f"(порт {self._data.get(CONF_LISTEN_PORT, DEFAULT_LISTEN_PORT)})"
)
self._state = self._session.state
self._session = session
self._state = session.state
async def async_stop(self) -> None:
session, self._session = self._session, None