Ensure numeric sensors have a valid value (#85605)
* Ensure numeric sensors have a valid value * Flake8pull/90836/head
parent
2e26b6e0cc
commit
ab699d17a5
|
@ -167,7 +167,6 @@ class SensorEntity(Entity):
|
|||
_attr_unit_of_measurement: None = (
|
||||
None # Subclasses of SensorEntity should not set this
|
||||
)
|
||||
_invalid_numeric_value_reported = False
|
||||
_invalid_state_class_reported = False
|
||||
_invalid_unit_of_measurement_reported = False
|
||||
_last_reset_reported = False
|
||||
|
@ -463,7 +462,7 @@ class SensorEntity(Entity):
|
|||
|
||||
@final
|
||||
@property
|
||||
def state(self) -> Any: # noqa: C901
|
||||
def state(self) -> Any:
|
||||
"""Return the state of the sensor and perform unit conversions, if needed."""
|
||||
native_unit_of_measurement = self.native_unit_of_measurement
|
||||
unit_of_measurement = self.unit_of_measurement
|
||||
|
@ -581,33 +580,13 @@ class SensorEntity(Entity):
|
|||
else:
|
||||
numerical_value = float(value) # type:ignore[arg-type]
|
||||
except (TypeError, ValueError) as err:
|
||||
# Raise if precision is not None, for other cases log a warning
|
||||
if suggested_precision is not None:
|
||||
raise ValueError(
|
||||
f"Sensor {self.entity_id} has device class {device_class}, "
|
||||
f"state class {state_class} unit {unit_of_measurement} and "
|
||||
f"suggested precision {suggested_precision} thus indicating it "
|
||||
f"has a numeric value; however, it has the non-numeric value: "
|
||||
f"{value} ({type(value)})"
|
||||
) from err
|
||||
# This should raise in Home Assistant Core 2023.4
|
||||
if not self._invalid_numeric_value_reported:
|
||||
self._invalid_numeric_value_reported = True
|
||||
report_issue = self._suggest_report_issue()
|
||||
_LOGGER.warning(
|
||||
"Sensor %s has device class %s, state class %s and unit %s "
|
||||
"thus indicating it has a numeric value; however, it has the "
|
||||
"non-numeric value: %s (%s); Please update your configuration "
|
||||
"if your entity is manually configured, otherwise %s",
|
||||
self.entity_id,
|
||||
device_class,
|
||||
state_class,
|
||||
unit_of_measurement,
|
||||
value,
|
||||
type(value),
|
||||
report_issue,
|
||||
)
|
||||
return value
|
||||
raise ValueError(
|
||||
f"Sensor {self.entity_id} has device class {device_class}, "
|
||||
f"state class {state_class} unit {unit_of_measurement} and "
|
||||
f"suggested precision {suggested_precision} thus indicating it "
|
||||
f"has a numeric value; however, it has the non-numeric value: "
|
||||
f"{value} ({type(value)})"
|
||||
) from err
|
||||
else:
|
||||
numerical_value = value
|
||||
|
||||
|
|
|
@ -1803,20 +1803,20 @@ async def test_device_classes_with_invalid_unit_of_measurement(
|
|||
],
|
||||
)
|
||||
@pytest.mark.parametrize(
|
||||
("native_value", "expected"),
|
||||
"native_value",
|
||||
[
|
||||
("abc", "abc"),
|
||||
("13.7.1", "13.7.1"),
|
||||
(datetime(2012, 11, 10, 7, 35, 1), "2012-11-10 07:35:01"),
|
||||
(date(2012, 11, 10), "2012-11-10"),
|
||||
"",
|
||||
"abc",
|
||||
"13.7.1",
|
||||
datetime(2012, 11, 10, 7, 35, 1),
|
||||
date(2012, 11, 10),
|
||||
],
|
||||
)
|
||||
async def test_non_numeric_validation_warn(
|
||||
async def test_non_numeric_validation_error(
|
||||
hass: HomeAssistant,
|
||||
caplog: pytest.LogCaptureFixture,
|
||||
enable_custom_integrations: None,
|
||||
native_value: Any,
|
||||
expected: str,
|
||||
device_class: SensorDeviceClass | None,
|
||||
state_class: SensorStateClass | None,
|
||||
unit: str | None,
|
||||
|
@ -1837,7 +1837,7 @@ async def test_non_numeric_validation_warn(
|
|||
await hass.async_block_till_done()
|
||||
|
||||
state = hass.states.get(entity0.entity_id)
|
||||
assert state.state == expected
|
||||
assert state is None
|
||||
|
||||
assert (
|
||||
"thus indicating it has a numeric value; "
|
||||
|
|
Loading…
Reference in New Issue