mirror of
https://github.com/home-assistant/core.git
synced 2025-07-25 22:27:07 +00:00
Energy validation: Require last_reset attribute to be set for state_class measurement energy and cost sensors (#56254)
* Require last_reset attribute to be set for measurement state_class * Tweak * Improve tests * Lint Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
This commit is contained in:
parent
974376a8de
commit
83156fb9ec
@ -135,12 +135,20 @@ def _async_validate_usage_stat(
|
|||||||
if state_class not in allowed_state_classes:
|
if state_class not in allowed_state_classes:
|
||||||
result.append(
|
result.append(
|
||||||
ValidationIssue(
|
ValidationIssue(
|
||||||
"entity_unexpected_state_class_total_increasing",
|
"entity_unexpected_state_class",
|
||||||
stat_value,
|
stat_value,
|
||||||
state_class,
|
state_class,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (
|
||||||
|
state_class == sensor.STATE_CLASS_MEASUREMENT
|
||||||
|
and sensor.ATTR_LAST_RESET not in state.attributes
|
||||||
|
):
|
||||||
|
result.append(
|
||||||
|
ValidationIssue("entity_state_class_measurement_no_last_reset", stat_value)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def _async_validate_price_entity(
|
def _async_validate_price_entity(
|
||||||
@ -212,9 +220,15 @@ def _async_validate_cost_stat(
|
|||||||
]
|
]
|
||||||
if state_class not in supported_state_classes:
|
if state_class not in supported_state_classes:
|
||||||
result.append(
|
result.append(
|
||||||
ValidationIssue(
|
ValidationIssue("entity_unexpected_state_class", stat_id, state_class)
|
||||||
"entity_unexpected_state_class_total_increasing", stat_id, state_class
|
)
|
||||||
)
|
|
||||||
|
if (
|
||||||
|
state_class == sensor.STATE_CLASS_MEASUREMENT
|
||||||
|
and sensor.ATTR_LAST_RESET not in state.attributes
|
||||||
|
):
|
||||||
|
result.append(
|
||||||
|
ValidationIssue("entity_state_class_measurement_no_last_reset", stat_id)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,7 +39,16 @@ async def test_validation_empty_config(hass):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async def test_validation(hass, mock_energy_manager):
|
@pytest.mark.parametrize(
|
||||||
|
"state_class, extra",
|
||||||
|
[
|
||||||
|
("total_increasing", {}),
|
||||||
|
("total", {}),
|
||||||
|
("total", {"last_reset": "abc"}),
|
||||||
|
("measurement", {"last_reset": "abc"}),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
async def test_validation(hass, mock_energy_manager, state_class, extra):
|
||||||
"""Test validating success."""
|
"""Test validating success."""
|
||||||
for key in ("device_cons", "battery_import", "battery_export", "solar_production"):
|
for key in ("device_cons", "battery_import", "battery_export", "solar_production"):
|
||||||
hass.states.async_set(
|
hass.states.async_set(
|
||||||
@ -48,7 +57,8 @@ async def test_validation(hass, mock_energy_manager):
|
|||||||
{
|
{
|
||||||
"device_class": "energy",
|
"device_class": "energy",
|
||||||
"unit_of_measurement": "kWh",
|
"unit_of_measurement": "kWh",
|
||||||
"state_class": "total_increasing",
|
"state_class": state_class,
|
||||||
|
**extra,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -190,6 +200,35 @@ async def test_validation_device_consumption_recorder_not_tracked(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def test_validation_device_consumption_no_last_reset(hass, mock_energy_manager):
|
||||||
|
"""Test validating device based on untracked entity."""
|
||||||
|
await mock_energy_manager.async_update(
|
||||||
|
{"device_consumption": [{"stat_consumption": "sensor.no_last_reset"}]}
|
||||||
|
)
|
||||||
|
hass.states.async_set(
|
||||||
|
"sensor.no_last_reset",
|
||||||
|
"10.10",
|
||||||
|
{
|
||||||
|
"device_class": "energy",
|
||||||
|
"unit_of_measurement": "kWh",
|
||||||
|
"state_class": "measurement",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert (await validate.async_validate(hass)).as_dict() == {
|
||||||
|
"energy_sources": [],
|
||||||
|
"device_consumption": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"type": "entity_state_class_measurement_no_last_reset",
|
||||||
|
"identifier": "sensor.no_last_reset",
|
||||||
|
"value": None,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
async def test_validation_solar(hass, mock_energy_manager):
|
async def test_validation_solar(hass, mock_energy_manager):
|
||||||
"""Test validating missing stat for device."""
|
"""Test validating missing stat for device."""
|
||||||
await mock_energy_manager.async_update(
|
await mock_energy_manager.async_update(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user