ha(H4): исправления по ревью — маскировка ключа в дампе, reload-repair, reconfigure сохраняет поля

- major: diagnostics больше не содержит полный lanip_key (esp_home —
  маска, entry_data redacted); ключ для ESPHome — через reconfigure/CLI;
  план §3 синхронизирован; дамп при незагруженной записи не падает
- reconfigure: сохраняет listen_port/keepalive_ms и текущие overrides/
  temp_step; превью-дефолты подхватывают значения записи
- repair fix-flow: подтверждение перезагружает запись (issue снимается
  только когда сессия вышла из key_error; иначе создаётся заново)
- key_issue_id helper, использование async_remove_issue (мёртвый код),
  CONF_EMAIL/PASSWORD в TO_REDACT, placeholders в fix_flow, тест
  плейсхолдеров ru
- тесты обновлены (47 components)
This commit is contained in:
2026-09-29 14:29:36 +03:00
parent dcbf9a6c7e
commit 43d3ff7dea
12 changed files with 160 additions and 80 deletions
+4 -4
View File
@@ -12,7 +12,7 @@ from homeassistant.helpers import issue_registry as ir
import pyfglair
from .const import CONF_DSN, DOMAIN
from .coordinator import FglairCoordinator, FglairRuntime
from .coordinator import FglairCoordinator, FglairRuntime, key_issue_id
from .fglair_client import FglairClient
from .overrides import ConversionSet
@@ -68,7 +68,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
conversions = ConversionSet.from_entry(entry.data)
# Координатор создаётся (и подписывается) до старта сессии, чтобы не
# пропустить первое ONLINE.
coordinator = FglairCoordinator(hass, client, conversions)
coordinator = FglairCoordinator(hass, client, conversions, entry.entry_id)
try:
await client.async_start()
await coordinator.async_config_entry_first_refresh()
@@ -98,8 +98,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
if not unloaded:
return False
await runtime.coordinator.async_shutdown()
runtime.coordinator.async_remove_issue()
await runtime.client.async_stop()
ir.async_delete_issue(hass, DOMAIN, runtime.coordinator.key_issue_id)
clients: dict[str, FglairClient] = hass.data.get(DATA_CLIENTS, {})
clients.pop(entry.entry_id, None)
@@ -110,5 +110,5 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
async def async_remove_entry(hass: HomeAssistant, entry: ConfigEntry) -> None:
ir.async_delete_issue(
hass, DOMAIN, f"key_mismatch_{entry.data.get(CONF_DSN)}"
hass, DOMAIN, key_issue_id(str(entry.data.get(CONF_DSN, "")))
)