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:
@@ -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, "")),
|
||||
},
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user