Improve template sensor config flow validation (#99373)
This commit is contained in:
parent
047f936d4c
commit
f36a300651
2 changed files with 68 additions and 13 deletions
|
@ -160,32 +160,43 @@ def _validate_unit(options: dict[str, Any]) -> None:
|
||||||
and (units := DEVICE_CLASS_UNITS.get(device_class)) is not None
|
and (units := DEVICE_CLASS_UNITS.get(device_class)) is not None
|
||||||
and (unit := options.get(CONF_UNIT_OF_MEASUREMENT)) not in units
|
and (unit := options.get(CONF_UNIT_OF_MEASUREMENT)) not in units
|
||||||
):
|
):
|
||||||
units_string = sorted(
|
sorted_units = sorted(
|
||||||
[str(unit) if unit else "no unit of measurement" for unit in units],
|
[f"'{str(unit)}'" if unit else "no unit of measurement" for unit in units],
|
||||||
key=str.casefold,
|
key=str.casefold,
|
||||||
)
|
)
|
||||||
|
if len(sorted_units) == 1:
|
||||||
|
units_string = sorted_units[0]
|
||||||
|
else:
|
||||||
|
units_string = f"one of {', '.join(sorted_units)}"
|
||||||
|
|
||||||
raise vol.Invalid(
|
raise vol.Invalid(
|
||||||
f"'{unit}' is not a valid unit for device class '{device_class}'; "
|
f"'{unit}' is not a valid unit for device class '{device_class}'; "
|
||||||
f"expected one of {', '.join(units_string)}"
|
f"expected {units_string}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _validate_state_class(options: dict[str, Any]) -> None:
|
def _validate_state_class(options: dict[str, Any]) -> None:
|
||||||
"""Validate state class."""
|
"""Validate state class."""
|
||||||
if (
|
if (
|
||||||
(device_class := options.get(CONF_DEVICE_CLASS))
|
(state_class := options.get(CONF_STATE_CLASS))
|
||||||
|
and (device_class := options.get(CONF_DEVICE_CLASS))
|
||||||
and (state_classes := DEVICE_CLASS_STATE_CLASSES.get(device_class)) is not None
|
and (state_classes := DEVICE_CLASS_STATE_CLASSES.get(device_class)) is not None
|
||||||
and (state_class := options.get(CONF_STATE_CLASS)) not in state_classes
|
and state_class not in state_classes
|
||||||
):
|
):
|
||||||
state_classes_string = sorted(
|
sorted_state_classes = sorted(
|
||||||
[str(state_class) for state_class in state_classes],
|
[f"'{str(state_class)}'" for state_class in state_classes],
|
||||||
key=str.casefold,
|
key=str.casefold,
|
||||||
)
|
)
|
||||||
|
if len(sorted_state_classes) == 0:
|
||||||
|
state_classes_string = "no state class"
|
||||||
|
elif len(sorted_state_classes) == 1:
|
||||||
|
state_classes_string = sorted_state_classes[0]
|
||||||
|
else:
|
||||||
|
state_classes_string = f"one of {', '.join(sorted_state_classes)}"
|
||||||
|
|
||||||
raise vol.Invalid(
|
raise vol.Invalid(
|
||||||
f"'{state_class}' is not a valid state class for device class "
|
f"'{state_class}' is not a valid state class for device class "
|
||||||
f"'{device_class}'; expected one of {', '.join(state_classes_string)}"
|
f"'{device_class}'; expected {state_classes_string}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -349,18 +349,62 @@ EARLY_END_ERROR = "invalid template (TemplateSyntaxError: unexpected 'end of tem
|
||||||
[
|
[
|
||||||
("binary_sensor", "{{", {}, {"state": EARLY_END_ERROR}),
|
("binary_sensor", "{{", {}, {"state": EARLY_END_ERROR}),
|
||||||
("sensor", "{{", {}, {"state": EARLY_END_ERROR}),
|
("sensor", "{{", {}, {"state": EARLY_END_ERROR}),
|
||||||
|
(
|
||||||
|
"sensor",
|
||||||
|
"",
|
||||||
|
{"device_class": "aqi", "unit_of_measurement": "cats"},
|
||||||
|
{
|
||||||
|
"unit_of_measurement": (
|
||||||
|
"'cats' is not a valid unit for device class 'aqi'; "
|
||||||
|
"expected no unit of measurement"
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
(
|
(
|
||||||
"sensor",
|
"sensor",
|
||||||
"",
|
"",
|
||||||
{"device_class": "temperature", "unit_of_measurement": "cats"},
|
{"device_class": "temperature", "unit_of_measurement": "cats"},
|
||||||
{
|
{
|
||||||
"state_class": (
|
|
||||||
"'None' is not a valid state class for device class 'temperature'; "
|
|
||||||
"expected one of measurement"
|
|
||||||
),
|
|
||||||
"unit_of_measurement": (
|
"unit_of_measurement": (
|
||||||
"'cats' is not a valid unit for device class 'temperature'; "
|
"'cats' is not a valid unit for device class 'temperature'; "
|
||||||
"expected one of K, °C, °F"
|
"expected one of 'K', '°C', '°F'"
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"sensor",
|
||||||
|
"",
|
||||||
|
{"device_class": "timestamp", "state_class": "measurement"},
|
||||||
|
{
|
||||||
|
"state_class": (
|
||||||
|
"'measurement' is not a valid state class for device class "
|
||||||
|
"'timestamp'; expected no state class"
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"sensor",
|
||||||
|
"",
|
||||||
|
{"device_class": "aqi", "state_class": "total"},
|
||||||
|
{
|
||||||
|
"state_class": (
|
||||||
|
"'total' is not a valid state class for device class "
|
||||||
|
"'aqi'; expected 'measurement'"
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"sensor",
|
||||||
|
"",
|
||||||
|
{"device_class": "energy", "state_class": "measurement"},
|
||||||
|
{
|
||||||
|
"state_class": (
|
||||||
|
"'measurement' is not a valid state class for device class "
|
||||||
|
"'energy'; expected one of 'total', 'total_increasing'"
|
||||||
|
),
|
||||||
|
"unit_of_measurement": (
|
||||||
|
"'None' is not a valid unit for device class 'energy'; "
|
||||||
|
"expected one of 'GJ', 'kWh', 'MJ', 'MWh', 'Wh'"
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue