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:
@@ -103,29 +103,35 @@ def _import_schema() -> vol.Schema:
|
||||
|
||||
def _preview_schema(data: dict[str, Any]) -> vol.Schema:
|
||||
template = Template[str(data.get(CONF_TEMPLATE, "A"))]
|
||||
spec = (data.get(CONF_OVERRIDES) or {}).get(
|
||||
Prop.ADJUST_TEMPERATURE.name.lower(), {}
|
||||
)
|
||||
temp_min = int(spec.get("min", TEMP_MIN_TENTHS))
|
||||
temp_max = int(spec.get("max", TEMP_MAX_TENTHS))
|
||||
step = int(data.get(CONF_TEMP_STEP) or TEMP_STEP_TENTHS[template])
|
||||
return vol.Schema(
|
||||
{
|
||||
vol.Required(CONF_TEMPLATE, default=template.name): vol.In(
|
||||
["A", "B", "F"]
|
||||
),
|
||||
vol.Required(CONF_TEMP_MIN, default=16.0): vol.All(
|
||||
vol.Required(CONF_TEMP_MIN, default=temp_min / 10): vol.All(
|
||||
vol.Coerce(float), vol.Range(min=-10.0, max=45.0)
|
||||
),
|
||||
vol.Required(CONF_TEMP_MAX, default=30.0): vol.All(
|
||||
vol.Required(CONF_TEMP_MAX, default=temp_max / 10): vol.All(
|
||||
vol.Coerce(float), vol.Range(min=-10.0, max=45.0)
|
||||
),
|
||||
vol.Required(CONF_TEMP_STEP, default=step / 10): vol.All(
|
||||
vol.Coerce(float), vol.Range(min=0.1, max=5.0)
|
||||
),
|
||||
vol.Required(CONF_TEMP_NUM, default=int(spec.get("num", 1))): vol.All(
|
||||
int, vol.Range(min=1, max=1000)
|
||||
),
|
||||
vol.Required(CONF_TEMP_DEN, default=int(spec.get("den", 1))): vol.All(
|
||||
int, vol.Range(min=1, max=1000)
|
||||
),
|
||||
vol.Required(
|
||||
CONF_TEMP_STEP, default=TEMP_STEP_TENTHS[template] / 10
|
||||
): vol.All(vol.Coerce(float), vol.Range(min=0.1, max=5.0)),
|
||||
vol.Required(CONF_TEMP_NUM, default=1): vol.All(
|
||||
int, vol.Range(min=1, max=1000)
|
||||
),
|
||||
vol.Required(CONF_TEMP_DEN, default=1): vol.All(
|
||||
int, vol.Range(min=1, max=1000)
|
||||
),
|
||||
vol.Required(CONF_TEMP_OFFSET, default=0): vol.All(
|
||||
int, vol.Range(min=-1000, max=1000)
|
||||
),
|
||||
CONF_TEMP_OFFSET, default=int(spec.get("offset", 0))
|
||||
): vol.All(int, vol.Range(min=-1000, max=1000)),
|
||||
}
|
||||
)
|
||||
|
||||
@@ -496,6 +502,11 @@ class FglairConfigFlow(ConfigFlow, domain=DOMAIN):
|
||||
|
||||
async def _async_trial(self, data: dict[str, Any]) -> str | None:
|
||||
"""None — сессия поднялась; иначе ключ ошибки формы."""
|
||||
if self._reconfigure_entry is not None:
|
||||
# Сохраняем служебные поля записи (listen_port/keepalive_ms) и
|
||||
# текущие конверсии, если путь их не задаёт.
|
||||
for key, value in self._reconfigure_entry.data.items():
|
||||
data.setdefault(key, value)
|
||||
await self.async_set_unique_id(data[CONF_DSN], raise_on_progress=False)
|
||||
if self._reconfigure_entry is not None:
|
||||
self._abort_if_unique_id_mismatch()
|
||||
|
||||
Reference in New Issue
Block a user