ha(H5): исправления по ревью — GitHub/HACS, рабочий ESPHome-канал, restore, manylinux

- critical: README честно описывает HACS (только публичный GitHub-зеркало)
  + ручная установка копированием; RELEASE_HA — шаг зеркала и codeowners
- critical: ESPHome-канал приёмки реализован реально (aioesphomeapi:
  connect/list_entities/climate_command для режима и уставки; fan/swing —
  только HA); unit-тест на фейковом модуле
- major: quick/long восстанавливают исходное состояние в finally даже при
  сбое; quick ждёт восстановления; ошибки шага пишутся в результат (rc 1),
  а не фаталят (rc 2)
- major: RELEASE_HA — manylinux через auditwheel repair (PyPI отклоняет
  linux_x86_64), build/twine, aarch64, корректные проверки .so, тег/версия
- major: полный ключ для ESPHome теперь реально виден в options flow
  («Настройка» на карточке интеграции, поле LAN IP key, можно заменить) —
  README/diagnostics синхронизированы
- minor: non-JSON ответ → rc 2; CSV quick+long и инкрементальная запись;
  допуск _matches в long; --settle-timeout; hacs.json homeassistant=2025.1;
  brand/{icon,logo}.png заглушки; план §6/§7 уточнён
- тесты: acceptance self-test 11 (restore-after-failure, long fail, non-JSON,
  esphome channel), options flow (2), всего 28+11+49
This commit is contained in:
2026-09-29 14:54:50 +03:00
parent 8013781e09
commit a03458f9bc
15 changed files with 609 additions and 178 deletions
+43 -1
View File
@@ -8,7 +8,12 @@ from functools import partial
from typing import Any
import voluptuous as vol
from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult
from homeassistant.config_entries import (
ConfigEntry,
ConfigFlow,
ConfigFlowResult,
OptionsFlow,
)
from homeassistant.helpers import selector
import pyfglair
@@ -547,3 +552,40 @@ class FglairConfigFlow(ConfigFlow, domain=DOMAIN):
self._reconfigure_entry, title=title, data=data
)
return self.async_create_entry(title=title, data=data)
@staticmethod
def async_get_options_flow(config_entry: ConfigEntry) -> "FglairOptionsFlow":
return FglairOptionsFlow()
class FglairOptionsFlow(OptionsFlow):
"""Показывает полный LAN-ключ (для secrets.yaml ESPHome) и позволяет
обновить его без облака."""
async def async_step_init(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
entry = self.config_entry
if user_input is not None:
key = str(user_input[CONF_LANIP_KEY]).strip()
if key and key != entry.data.get(CONF_LANIP_KEY):
self.hass.config_entries.async_update_entry(
entry, data={**entry.data, CONF_LANIP_KEY: key}
)
self.hass.config_entries.async_schedule_reload(entry.entry_id)
return self.async_create_entry(title="", data={})
schema = vol.Schema(
{vol.Required(CONF_LANIP_KEY): selector.TextSelector()}
)
schema = self.add_suggested_values_to_schema(
schema, {CONF_LANIP_KEY: entry.data.get(CONF_LANIP_KEY, "")}
)
return self.async_show_form(
step_id="init",
data_schema=schema,
description_placeholders={
"dsn": str(entry.data.get(CONF_DSN, "")),
"lanip_key_id": str(entry.data.get(CONF_LANIP_KEY_ID, "")),
"host": str(entry.data.get(CONF_HOST, "")),
},
)