Improve unit handling in recorder (#153941)

This commit is contained in:
Erik Montnemery
2025-10-09 10:29:42 +02:00
committed by GitHub
parent 2eba650064
commit d45114cd11
30 changed files with 2303 additions and 116 deletions

View File

@@ -241,10 +241,25 @@ async def assert_validation_result(
),
[
(None, "%", "%", "%", "unitless", 13.050847, -10, 30),
(None, "ppm", "ppm", "ppm", "unitless", 13.050847, -10, 30),
(None, "g/m³", "g/m³", "g/m³", "concentration", 13.050847, -10, 30),
(None, "mg/m³", "mg/m³", "mg/m³", "concentration", 13.050847, -10, 30),
("area", "", "", "", "area", 13.050847, -10, 30),
("area", "mi²", "mi²", "mi²", "area", 13.050847, -10, 30),
("battery", "%", "%", "%", "unitless", 13.050847, -10, 30),
("battery", None, None, None, "unitless", 13.050847, -10, 30),
# We can't yet convert carbon_monoxide
(
"carbon_monoxide",
"mg/m³",
"mg/m³",
"mg/m³",
"concentration",
13.050847,
-10,
30,
),
("carbon_monoxide", "ppm", "ppm", "ppm", "unitless", 13.050847, -10, 30),
("distance", "m", "m", "m", "distance", 13.050847, -10, 30),
("distance", "mi", "mi", "mi", "distance", 13.050847, -10, 30),
("humidity", "%", "%", "%", "unitless", 13.050847, -10, 30),
@@ -3261,6 +3276,9 @@ async def test_list_statistic_ids_unsupported(
(None, "ft³", "ft3", "volume", 13.050847, -10, 30),
(None, "ft³/min", "ft³/m", "volume_flow_rate", 13.050847, -10, 30),
(None, "", "m3", "volume", 13.050847, -10, 30),
# Can't yet convert carbon_monoxide
("carbon_monoxide", "ppm", "mg/m³", "unitless", 13.050847, -10, 30),
("carbon_monoxide", "mg/m³", "ppm", "concentration", 13.050847, -10, 30),
],
)
async def test_compile_hourly_statistics_changing_units_1(
@@ -3589,17 +3607,30 @@ async def test_compile_hourly_statistics_changing_units_3(
@pytest.mark.parametrize(
("state_unit_1", "state_unit_2", "unit_class", "mean", "min", "max", "factor"),
(
"device_class",
"state_unit_1",
"state_unit_2",
"unit_class",
"mean",
"min",
"max",
"factor",
),
[
(None, "%", "unitless", 13.050847, -10, 30, 100),
("%", None, "unitless", 13.050847, -10, 30, 0.01),
("W", "kW", "power", 13.050847, -10, 30, 0.001),
("kW", "W", "power", 13.050847, -10, 30, 1000),
(None, None, "%", "unitless", 13.050847, -10, 30, 100),
(None, None, "ppm", "unitless", 13.050847, -10, 30, 1000000),
(None, "g/m³", "mg/m³", "concentration", 13.050847, -10, 30, 1000),
(None, "mg/m³", "g/m³", "concentration", 13.050847, -10, 30, 0.001),
(None, "%", None, "unitless", 13.050847, -10, 30, 0.01),
(None, "W", "kW", "power", 13.050847, -10, 30, 0.001),
(None, "kW", "W", "power", 13.050847, -10, 30, 1000),
],
)
async def test_compile_hourly_statistics_convert_units_1(
hass: HomeAssistant,
caplog: pytest.LogCaptureFixture,
device_class,
state_unit_1,
state_unit_2,
unit_class,
@@ -3617,7 +3648,7 @@ async def test_compile_hourly_statistics_convert_units_1(
# Wait for the sensor recorder platform to be added
await async_recorder_block_till_done(hass)
attributes = {
"device_class": None,
"device_class": device_class,
"state_class": "measurement",
"unit_of_measurement": state_unit_1,
}
@@ -4441,6 +4472,7 @@ async def test_compile_hourly_statistics_changing_state_class(
"name": None,
"source": "recorder",
"statistic_id": "sensor.test1",
"unit_class": unit_class,
"unit_of_measurement": None,
},
)
@@ -4485,6 +4517,7 @@ async def test_compile_hourly_statistics_changing_state_class(
"name": None,
"source": "recorder",
"statistic_id": "sensor.test1",
"unit_class": unit_class,
"unit_of_measurement": None,
},
)
@@ -5936,6 +5969,7 @@ async def test_validate_statistics_other_domain(
"name": None,
"source": RECORDER_DOMAIN,
"statistic_id": "number.test",
"unit_class": None,
"unit_of_measurement": None,
}
statistics: StatisticData = {