ha(H4): защита _preview_schema от повреждённых overrides в storage

This commit is contained in:
2026-09-29 14:37:52 +03:00
parent 43d3ff7dea
commit 4d0bbd1d8e
+27 -12
View File
@@ -101,14 +101,29 @@ def _import_schema() -> vol.Schema:
)
def _spec_int(spec: dict[str, Any], key: str, default: int) -> int:
try:
return int(spec.get(key, default))
except (TypeError, ValueError):
return default
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(), {}
overrides = data.get(CONF_OVERRIDES)
spec = (
overrides.get(Prop.ADJUST_TEMPERATURE.name.lower(), {})
if isinstance(overrides, dict)
else {}
)
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])
if not isinstance(spec, dict):
spec = {}
temp_min = _spec_int(spec, "min", TEMP_MIN_TENTHS)
temp_max = _spec_int(spec, "max", TEMP_MAX_TENTHS)
try:
step = int(data.get(CONF_TEMP_STEP) or TEMP_STEP_TENTHS[template])
except (TypeError, ValueError):
step = TEMP_STEP_TENTHS[template]
return vol.Schema(
{
vol.Required(CONF_TEMPLATE, default=template.name): vol.In(
@@ -123,14 +138,14 @@ def _preview_schema(data: dict[str, Any]) -> vol.Schema:
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_OFFSET, default=int(spec.get("offset", 0))
CONF_TEMP_NUM, default=_spec_int(spec, "num", 1)
): vol.All(int, vol.Range(min=1, max=1000)),
vol.Required(
CONF_TEMP_DEN, default=_spec_int(spec, "den", 1)
): vol.All(int, vol.Range(min=1, max=1000)),
vol.Required(
CONF_TEMP_OFFSET, default=_spec_int(spec, "offset", 0)
): vol.All(int, vol.Range(min=-1000, max=1000)),
}
)