Use a constant for sensor statistics issues (#141441)

This commit is contained in:
Robert Resch 2025-03-26 09:43:09 +01:00 committed by GitHub
parent 1cb4332a3c
commit 65c05d66c0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 26 additions and 20 deletions

View File

@ -78,6 +78,8 @@ WARN_UNSUPPORTED_UNIT: HassKey[set[str]] = HassKey(f"{DOMAIN}_warn_unsupported_u
WARN_UNSTABLE_UNIT: HassKey[set[str]] = HassKey(f"{DOMAIN}_warn_unstable_unit")
# Link to dev statistics where issues around LTS can be fixed
LINK_DEV_STATISTICS = "https://my.home-assistant.io/redirect/developer_statistics"
STATE_CLASS_REMOVED_ISSUE = "state_class_removed"
UNITS_CHANGED_ISSUE = "units_changed"
def _get_sensor_states(hass: HomeAssistant) -> list[State]:
@ -697,7 +699,7 @@ def _update_issues(
if numeric and state_class is None:
# Sensor no longer has a valid state class
report_issue(
"state_class_removed",
STATE_CLASS_REMOVED_ISSUE,
entity_id,
{"statistic_id": entity_id},
)
@ -708,7 +710,7 @@ def _update_issues(
if numeric and not _equivalent_units({state_unit, metadata_unit}):
# The unit has changed, and it's not possible to convert
report_issue(
"units_changed",
UNITS_CHANGED_ISSUE,
entity_id,
{
"statistic_id": entity_id,
@ -722,7 +724,7 @@ def _update_issues(
valid_units = (unit or "<None>" for unit in converter.VALID_UNITS)
valid_units_str = ", ".join(sorted(valid_units))
report_issue(
"units_changed",
UNITS_CHANGED_ISSUE,
entity_id,
{
"statistic_id": entity_id,
@ -754,7 +756,7 @@ def update_statistics_issues(
issue.domain != DOMAIN
or not (issue_data := issue.data)
or issue_data.get("issue_type")
not in ("state_class_removed", "units_changed")
not in (STATE_CLASS_REMOVED_ISSUE, UNITS_CHANGED_ISSUE)
):
continue
issues.add(issue.issue_id)

View File

@ -36,6 +36,10 @@ from homeassistant.components.recorder.statistics import (
)
from homeassistant.components.recorder.util import get_instance, session_scope
from homeassistant.components.sensor import ATTR_OPTIONS, DOMAIN, SensorDeviceClass
from homeassistant.components.sensor.recorder import (
STATE_CLASS_REMOVED_ISSUE,
UNITS_CHANGED_ISSUE,
)
from homeassistant.const import ATTR_FRIENDLY_NAME, STATE_UNAVAILABLE
from homeassistant.core import HomeAssistant, State
from homeassistant.helpers import issue_registry as ir
@ -4428,11 +4432,11 @@ async def test_validate_unit_change_convertible(
"statistic_id": "sensor.test",
"supported_unit": supported_unit,
},
"type": "units_changed",
"type": UNITS_CHANGED_ISSUE,
}
],
}
await assert_validation_result(hass, client, expected, {"units_changed"})
await assert_validation_result(hass, client, expected, {UNITS_CHANGED_ISSUE})
# Unavailable state - empty response
hass.states.async_set(
@ -4653,11 +4657,11 @@ async def test_validate_statistics_unit_change_no_device_class(
"statistic_id": "sensor.test",
"supported_unit": supported_unit,
},
"type": "units_changed",
"type": UNITS_CHANGED_ISSUE,
}
],
}
await assert_validation_result(hass, client, expected, {"units_changed"})
await assert_validation_result(hass, client, expected, {UNITS_CHANGED_ISSUE})
# Unavailable state - empty response
hass.states.async_set(
@ -4769,11 +4773,11 @@ async def test_validate_statistics_state_class_removed(
"sensor.test": [
{
"data": {"statistic_id": "sensor.test"},
"type": "state_class_removed",
"type": STATE_CLASS_REMOVED_ISSUE,
}
],
}
await assert_validation_result(hass, client, expected, {"state_class_removed"})
await assert_validation_result(hass, client, expected, {STATE_CLASS_REMOVED_ISSUE})
# Unavailable state - empty response
hass.states.async_set(
@ -4837,11 +4841,11 @@ async def test_validate_statistics_state_class_removed_issue_cleaned_up(
"sensor.test": [
{
"data": {"statistic_id": "sensor.test"},
"type": "state_class_removed",
"type": STATE_CLASS_REMOVED_ISSUE,
}
],
}
await assert_validation_result(hass, client, expected, {"state_class_removed"})
await assert_validation_result(hass, client, expected, {STATE_CLASS_REMOVED_ISSUE})
# Remove the statistics - empty response
get_instance(hass).async_clear_statistics(["sensor.test"])
@ -5086,11 +5090,11 @@ async def test_validate_statistics_unit_change_no_conversion(
"statistic_id": "sensor.test",
"supported_unit": unit1,
},
"type": "units_changed",
"type": UNITS_CHANGED_ISSUE,
}
],
}
await assert_validation_result(hass, client, expected, {"units_changed"})
await assert_validation_result(hass, client, expected, {UNITS_CHANGED_ISSUE})
# Unavailable state - empty response
hass.states.async_set(
@ -5267,11 +5271,11 @@ async def test_validate_statistics_unit_change_equivalent_units_2(
"statistic_id": "sensor.test",
"supported_unit": supported_unit,
},
"type": "units_changed",
"type": UNITS_CHANGED_ISSUE,
}
],
}
await assert_validation_result(hass, client, expected, {"units_changed"})
await assert_validation_result(hass, client, expected, {UNITS_CHANGED_ISSUE})
# Run statistics one hour later, metadata will not be updated
await async_recorder_block_till_done(hass)
@ -5280,7 +5284,7 @@ async def test_validate_statistics_unit_change_equivalent_units_2(
await assert_statistic_ids(
hass, [{"statistic_id": "sensor.test", "unit_of_measurement": unit1}]
)
await assert_validation_result(hass, client, expected, {"units_changed"})
await assert_validation_result(hass, client, expected, {UNITS_CHANGED_ISSUE})
async def test_validate_statistics_other_domain(
@ -5369,7 +5373,7 @@ async def test_update_statistics_issues(
now = await one_hour_stats(now)
expected = {
"state_class_removed_sensor.test": {
"issue_type": "state_class_removed",
"issue_type": STATE_CLASS_REMOVED_ISSUE,
"statistic_id": "sensor.test",
}
}
@ -5573,8 +5577,8 @@ async def test_clean_up_repairs(
create_issue("test", "test_issue", None)
create_issue(DOMAIN, "test_issue_1", None)
create_issue(DOMAIN, "test_issue_2", {"issue_type": "another_issue"})
create_issue(DOMAIN, "test_issue_3", {"issue_type": "state_class_removed"})
create_issue(DOMAIN, "test_issue_4", {"issue_type": "units_changed"})
create_issue(DOMAIN, "test_issue_3", {"issue_type": STATE_CLASS_REMOVED_ISSUE})
create_issue(DOMAIN, "test_issue_4", {"issue_type": UNITS_CHANGED_ISSUE})
# Check the issues
assert set(issue_registry.issues) == {