ha(H4): защита _preview_schema от повреждённых overrides в storage
This commit is contained in:
@@ -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:
|
def _preview_schema(data: dict[str, Any]) -> vol.Schema:
|
||||||
template = Template[str(data.get(CONF_TEMPLATE, "A"))]
|
template = Template[str(data.get(CONF_TEMPLATE, "A"))]
|
||||||
spec = (data.get(CONF_OVERRIDES) or {}).get(
|
overrides = data.get(CONF_OVERRIDES)
|
||||||
Prop.ADJUST_TEMPERATURE.name.lower(), {}
|
spec = (
|
||||||
|
overrides.get(Prop.ADJUST_TEMPERATURE.name.lower(), {})
|
||||||
|
if isinstance(overrides, dict)
|
||||||
|
else {}
|
||||||
)
|
)
|
||||||
temp_min = int(spec.get("min", TEMP_MIN_TENTHS))
|
if not isinstance(spec, dict):
|
||||||
temp_max = int(spec.get("max", TEMP_MAX_TENTHS))
|
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])
|
step = int(data.get(CONF_TEMP_STEP) or TEMP_STEP_TENTHS[template])
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
step = TEMP_STEP_TENTHS[template]
|
||||||
return vol.Schema(
|
return vol.Schema(
|
||||||
{
|
{
|
||||||
vol.Required(CONF_TEMPLATE, default=template.name): vol.In(
|
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.Required(CONF_TEMP_STEP, default=step / 10): vol.All(
|
||||||
vol.Coerce(float), vol.Range(min=0.1, max=5.0)
|
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(
|
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)),
|
): vol.All(int, vol.Range(min=-1000, max=1000)),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user