mirror of
https://github.com/home-assistant/core.git
synced 2025-12-24 12:59:34 +00:00
Allow selecting display unit when fetching statistics (#78578)
This commit is contained in:
@@ -76,20 +76,20 @@ def set_time_zone():
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"device_class,state_unit,display_unit,statistics_unit,mean,min,max",
|
||||
"device_class, state_unit, display_unit, statistics_unit, unit_class, mean, min, max",
|
||||
[
|
||||
(None, "%", "%", "%", 13.050847, -10, 30),
|
||||
("battery", "%", "%", "%", 13.050847, -10, 30),
|
||||
("battery", None, None, None, 13.050847, -10, 30),
|
||||
("humidity", "%", "%", "%", 13.050847, -10, 30),
|
||||
("humidity", None, None, None, 13.050847, -10, 30),
|
||||
("pressure", "Pa", "Pa", "Pa", 13.050847, -10, 30),
|
||||
("pressure", "hPa", "hPa", "Pa", 13.050847, -10, 30),
|
||||
("pressure", "mbar", "mbar", "Pa", 13.050847, -10, 30),
|
||||
("pressure", "inHg", "inHg", "Pa", 13.050847, -10, 30),
|
||||
("pressure", "psi", "psi", "Pa", 13.050847, -10, 30),
|
||||
("temperature", "°C", "°C", "°C", 13.050847, -10, 30),
|
||||
("temperature", "°F", "°F", "°C", 13.050847, -10, 30),
|
||||
(None, "%", "%", "%", None, 13.050847, -10, 30),
|
||||
("battery", "%", "%", "%", None, 13.050847, -10, 30),
|
||||
("battery", None, None, None, None, 13.050847, -10, 30),
|
||||
("humidity", "%", "%", "%", None, 13.050847, -10, 30),
|
||||
("humidity", None, None, None, None, 13.050847, -10, 30),
|
||||
("pressure", "Pa", "Pa", "Pa", "pressure", 13.050847, -10, 30),
|
||||
("pressure", "hPa", "hPa", "Pa", "pressure", 13.050847, -10, 30),
|
||||
("pressure", "mbar", "mbar", "Pa", "pressure", 13.050847, -10, 30),
|
||||
("pressure", "inHg", "inHg", "Pa", "pressure", 13.050847, -10, 30),
|
||||
("pressure", "psi", "psi", "Pa", "pressure", 13.050847, -10, 30),
|
||||
("temperature", "°C", "°C", "°C", "temperature", 13.050847, -10, 30),
|
||||
("temperature", "°F", "°F", "°C", "temperature", 13.050847, -10, 30),
|
||||
],
|
||||
)
|
||||
def test_compile_hourly_statistics(
|
||||
@@ -99,6 +99,7 @@ def test_compile_hourly_statistics(
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistics_unit,
|
||||
unit_class,
|
||||
mean,
|
||||
min,
|
||||
max,
|
||||
@@ -129,6 +130,7 @@ def test_compile_hourly_statistics(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
}
|
||||
]
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
@@ -151,13 +153,19 @@ def test_compile_hourly_statistics(
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"device_class,state_unit,display_unit,statistics_unit",
|
||||
"device_class, state_unit, display_unit, statistics_unit, unit_class",
|
||||
[
|
||||
(None, "%", "%", "%"),
|
||||
(None, "%", "%", "%", None),
|
||||
],
|
||||
)
|
||||
def test_compile_hourly_statistics_purged_state_changes(
|
||||
hass_recorder, caplog, device_class, state_unit, display_unit, statistics_unit
|
||||
hass_recorder,
|
||||
caplog,
|
||||
device_class,
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistics_unit,
|
||||
unit_class,
|
||||
):
|
||||
"""Test compiling hourly statistics."""
|
||||
zero = dt_util.utcnow()
|
||||
@@ -197,6 +205,7 @@ def test_compile_hourly_statistics_purged_state_changes(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
}
|
||||
]
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
@@ -266,6 +275,7 @@ def test_compile_hourly_statistics_unsupported(hass_recorder, caplog, attributes
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": "°C",
|
||||
"unit_class": "temperature",
|
||||
},
|
||||
{
|
||||
"statistic_id": "sensor.test6",
|
||||
@@ -275,6 +285,7 @@ def test_compile_hourly_statistics_unsupported(hass_recorder, caplog, attributes
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": "°C",
|
||||
"unit_class": "temperature",
|
||||
},
|
||||
{
|
||||
"statistic_id": "sensor.test7",
|
||||
@@ -284,6 +295,7 @@ def test_compile_hourly_statistics_unsupported(hass_recorder, caplog, attributes
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": "°C",
|
||||
"unit_class": "temperature",
|
||||
},
|
||||
]
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
@@ -333,20 +345,20 @@ def test_compile_hourly_statistics_unsupported(hass_recorder, caplog, attributes
|
||||
|
||||
@pytest.mark.parametrize("state_class", ["total"])
|
||||
@pytest.mark.parametrize(
|
||||
"units,device_class,state_unit,display_unit,statistics_unit,factor",
|
||||
"units, device_class, state_unit, display_unit, statistics_unit, unit_class, factor",
|
||||
[
|
||||
(IMPERIAL_SYSTEM, "energy", "kWh", "kWh", "kWh", 1),
|
||||
(IMPERIAL_SYSTEM, "energy", "Wh", "kWh", "kWh", 1 / 1000),
|
||||
(IMPERIAL_SYSTEM, "monetary", "EUR", "EUR", "EUR", 1),
|
||||
(IMPERIAL_SYSTEM, "monetary", "SEK", "SEK", "SEK", 1),
|
||||
(IMPERIAL_SYSTEM, "gas", "m³", "ft³", "m³", 35.314666711),
|
||||
(IMPERIAL_SYSTEM, "gas", "ft³", "ft³", "m³", 1),
|
||||
(METRIC_SYSTEM, "energy", "kWh", "kWh", "kWh", 1),
|
||||
(METRIC_SYSTEM, "energy", "Wh", "kWh", "kWh", 1 / 1000),
|
||||
(METRIC_SYSTEM, "monetary", "EUR", "EUR", "EUR", 1),
|
||||
(METRIC_SYSTEM, "monetary", "SEK", "SEK", "SEK", 1),
|
||||
(METRIC_SYSTEM, "gas", "m³", "m³", "m³", 1),
|
||||
(METRIC_SYSTEM, "gas", "ft³", "m³", "m³", 0.0283168466),
|
||||
(IMPERIAL_SYSTEM, "energy", "kWh", "kWh", "kWh", "energy", 1),
|
||||
(IMPERIAL_SYSTEM, "energy", "Wh", "Wh", "kWh", "energy", 1),
|
||||
(IMPERIAL_SYSTEM, "monetary", "EUR", "EUR", "EUR", None, 1),
|
||||
(IMPERIAL_SYSTEM, "monetary", "SEK", "SEK", "SEK", None, 1),
|
||||
(IMPERIAL_SYSTEM, "gas", "m³", "m³", "m³", "volume", 1),
|
||||
(IMPERIAL_SYSTEM, "gas", "ft³", "ft³", "m³", "volume", 1),
|
||||
(METRIC_SYSTEM, "energy", "kWh", "kWh", "kWh", "energy", 1),
|
||||
(METRIC_SYSTEM, "energy", "Wh", "Wh", "kWh", "energy", 1),
|
||||
(METRIC_SYSTEM, "monetary", "EUR", "EUR", "EUR", None, 1),
|
||||
(METRIC_SYSTEM, "monetary", "SEK", "SEK", "SEK", None, 1),
|
||||
(METRIC_SYSTEM, "gas", "m³", "m³", "m³", "volume", 1),
|
||||
(METRIC_SYSTEM, "gas", "ft³", "ft³", "m³", "volume", 1),
|
||||
],
|
||||
)
|
||||
async def test_compile_hourly_sum_statistics_amount(
|
||||
@@ -360,6 +372,7 @@ async def test_compile_hourly_sum_statistics_amount(
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistics_unit,
|
||||
unit_class,
|
||||
factor,
|
||||
):
|
||||
"""Test compiling hourly statistics."""
|
||||
@@ -405,6 +418,7 @@ async def test_compile_hourly_sum_statistics_amount(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
}
|
||||
]
|
||||
stats = statistics_during_period(hass, period0, period="5minute")
|
||||
@@ -478,6 +492,7 @@ async def test_compile_hourly_sum_statistics_amount(
|
||||
"statistic_id": "sensor.test1",
|
||||
"start_time": period1.isoformat(),
|
||||
"adjustment": 100.0,
|
||||
"display_unit": display_unit,
|
||||
}
|
||||
)
|
||||
response = await client.receive_json()
|
||||
@@ -497,6 +512,7 @@ async def test_compile_hourly_sum_statistics_amount(
|
||||
"statistic_id": "sensor.test1",
|
||||
"start_time": period2.isoformat(),
|
||||
"adjustment": -400.0,
|
||||
"display_unit": display_unit,
|
||||
}
|
||||
)
|
||||
response = await client.receive_json()
|
||||
@@ -511,14 +527,14 @@ async def test_compile_hourly_sum_statistics_amount(
|
||||
|
||||
@pytest.mark.parametrize("state_class", ["total"])
|
||||
@pytest.mark.parametrize(
|
||||
"device_class,state_unit,display_unit,statistics_unit,factor",
|
||||
"device_class, state_unit, display_unit, statistics_unit, unit_class, factor",
|
||||
[
|
||||
("energy", "kWh", "kWh", "kWh", 1),
|
||||
("energy", "Wh", "kWh", "kWh", 1 / 1000),
|
||||
("monetary", "EUR", "EUR", "EUR", 1),
|
||||
("monetary", "SEK", "SEK", "SEK", 1),
|
||||
("gas", "m³", "m³", "m³", 1),
|
||||
("gas", "ft³", "m³", "m³", 0.0283168466),
|
||||
("energy", "kWh", "kWh", "kWh", "energy", 1),
|
||||
("energy", "Wh", "Wh", "kWh", "energy", 1),
|
||||
("monetary", "EUR", "EUR", "EUR", None, 1),
|
||||
("monetary", "SEK", "SEK", "SEK", None, 1),
|
||||
("gas", "m³", "m³", "m³", "volume", 1),
|
||||
("gas", "ft³", "ft³", "m³", "volume", 1),
|
||||
],
|
||||
)
|
||||
def test_compile_hourly_sum_statistics_amount_reset_every_state_change(
|
||||
@@ -529,6 +545,7 @@ def test_compile_hourly_sum_statistics_amount_reset_every_state_change(
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistics_unit,
|
||||
unit_class,
|
||||
factor,
|
||||
):
|
||||
"""Test compiling hourly statistics."""
|
||||
@@ -594,6 +611,7 @@ def test_compile_hourly_sum_statistics_amount_reset_every_state_change(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
}
|
||||
]
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
@@ -630,9 +648,9 @@ def test_compile_hourly_sum_statistics_amount_reset_every_state_change(
|
||||
|
||||
@pytest.mark.parametrize("state_class", ["total"])
|
||||
@pytest.mark.parametrize(
|
||||
"device_class,state_unit,display_unit,statistics_unit,factor",
|
||||
"device_class, state_unit, display_unit, statistics_unit, unit_class, factor",
|
||||
[
|
||||
("energy", "kWh", "kWh", "kWh", 1),
|
||||
("energy", "kWh", "kWh", "kWh", "energy", 1),
|
||||
],
|
||||
)
|
||||
def test_compile_hourly_sum_statistics_amount_invalid_last_reset(
|
||||
@@ -643,6 +661,7 @@ def test_compile_hourly_sum_statistics_amount_invalid_last_reset(
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistics_unit,
|
||||
unit_class,
|
||||
factor,
|
||||
):
|
||||
"""Test compiling hourly statistics."""
|
||||
@@ -693,6 +712,7 @@ def test_compile_hourly_sum_statistics_amount_invalid_last_reset(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
}
|
||||
]
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
@@ -717,9 +737,9 @@ def test_compile_hourly_sum_statistics_amount_invalid_last_reset(
|
||||
|
||||
@pytest.mark.parametrize("state_class", ["total"])
|
||||
@pytest.mark.parametrize(
|
||||
"device_class,state_unit,display_unit,statistics_unit,factor",
|
||||
"device_class, state_unit, display_unit, statistics_unit, unit_class, factor",
|
||||
[
|
||||
("energy", "kWh", "kWh", "kWh", 1),
|
||||
("energy", "kWh", "kWh", "kWh", "energy", 1),
|
||||
],
|
||||
)
|
||||
def test_compile_hourly_sum_statistics_nan_inf_state(
|
||||
@@ -730,6 +750,7 @@ def test_compile_hourly_sum_statistics_nan_inf_state(
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistics_unit,
|
||||
unit_class,
|
||||
factor,
|
||||
):
|
||||
"""Test compiling hourly statistics with nan and inf states."""
|
||||
@@ -776,6 +797,7 @@ def test_compile_hourly_sum_statistics_nan_inf_state(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
}
|
||||
]
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
@@ -819,9 +841,9 @@ def test_compile_hourly_sum_statistics_nan_inf_state(
|
||||
)
|
||||
@pytest.mark.parametrize("state_class", ["total_increasing"])
|
||||
@pytest.mark.parametrize(
|
||||
"device_class,state_unit,display_unit,statistics_unit,factor",
|
||||
"device_class, state_unit, display_unit, statistics_unit, unit_class, factor",
|
||||
[
|
||||
("energy", "kWh", "kWh", "kWh", 1),
|
||||
("energy", "kWh", "kWh", "kWh", "energy", 1),
|
||||
],
|
||||
)
|
||||
def test_compile_hourly_sum_statistics_negative_state(
|
||||
@@ -835,6 +857,7 @@ def test_compile_hourly_sum_statistics_negative_state(
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistics_unit,
|
||||
unit_class,
|
||||
factor,
|
||||
):
|
||||
"""Test compiling hourly statistics with negative states."""
|
||||
@@ -889,6 +912,7 @@ def test_compile_hourly_sum_statistics_negative_state(
|
||||
"source": "recorder",
|
||||
"statistic_id": entity_id,
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
} in statistic_ids
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
assert stats[entity_id] == [
|
||||
@@ -916,14 +940,14 @@ def test_compile_hourly_sum_statistics_negative_state(
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"device_class,state_unit,display_unit,statistics_unit,factor",
|
||||
"device_class, state_unit, display_unit, statistics_unit, unit_class, factor",
|
||||
[
|
||||
("energy", "kWh", "kWh", "kWh", 1),
|
||||
("energy", "Wh", "kWh", "kWh", 1 / 1000),
|
||||
("monetary", "EUR", "EUR", "EUR", 1),
|
||||
("monetary", "SEK", "SEK", "SEK", 1),
|
||||
("gas", "m³", "m³", "m³", 1),
|
||||
("gas", "ft³", "m³", "m³", 0.0283168466),
|
||||
("energy", "kWh", "kWh", "kWh", "energy", 1),
|
||||
("energy", "Wh", "Wh", "kWh", "energy", 1),
|
||||
("monetary", "EUR", "EUR", "EUR", None, 1),
|
||||
("monetary", "SEK", "SEK", "SEK", None, 1),
|
||||
("gas", "m³", "m³", "m³", "volume", 1),
|
||||
("gas", "ft³", "ft³", "m³", "volume", 1),
|
||||
],
|
||||
)
|
||||
def test_compile_hourly_sum_statistics_total_no_reset(
|
||||
@@ -933,6 +957,7 @@ def test_compile_hourly_sum_statistics_total_no_reset(
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistics_unit,
|
||||
unit_class,
|
||||
factor,
|
||||
):
|
||||
"""Test compiling hourly statistics."""
|
||||
@@ -975,6 +1000,7 @@ def test_compile_hourly_sum_statistics_total_no_reset(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
}
|
||||
]
|
||||
stats = statistics_during_period(hass, period0, period="5minute")
|
||||
@@ -1019,12 +1045,12 @@ def test_compile_hourly_sum_statistics_total_no_reset(
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"device_class,state_unit,display_unit,statistics_unit,factor",
|
||||
"device_class, state_unit, display_unit, statistics_unit, unit_class, factor",
|
||||
[
|
||||
("energy", "kWh", "kWh", "kWh", 1),
|
||||
("energy", "Wh", "kWh", "kWh", 1 / 1000),
|
||||
("gas", "m³", "m³", "m³", 1),
|
||||
("gas", "ft³", "m³", "m³", 0.0283168466),
|
||||
("energy", "kWh", "kWh", "kWh", "energy", 1),
|
||||
("energy", "Wh", "Wh", "kWh", "energy", 1),
|
||||
("gas", "m³", "m³", "m³", "volume", 1),
|
||||
("gas", "ft³", "ft³", "m³", "volume", 1),
|
||||
],
|
||||
)
|
||||
def test_compile_hourly_sum_statistics_total_increasing(
|
||||
@@ -1034,6 +1060,7 @@ def test_compile_hourly_sum_statistics_total_increasing(
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistics_unit,
|
||||
unit_class,
|
||||
factor,
|
||||
):
|
||||
"""Test compiling hourly statistics."""
|
||||
@@ -1076,6 +1103,7 @@ def test_compile_hourly_sum_statistics_total_increasing(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
}
|
||||
]
|
||||
stats = statistics_during_period(hass, period0, period="5minute")
|
||||
@@ -1123,8 +1151,8 @@ def test_compile_hourly_sum_statistics_total_increasing(
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"device_class,state_unit,display_unit,statistics_unit,factor",
|
||||
[("energy", "kWh", "kWh", "kWh", 1)],
|
||||
"device_class, state_unit, display_unit, statistics_unit, unit_class, factor",
|
||||
[("energy", "kWh", "kWh", "kWh", "energy", 1)],
|
||||
)
|
||||
def test_compile_hourly_sum_statistics_total_increasing_small_dip(
|
||||
hass_recorder,
|
||||
@@ -1133,6 +1161,7 @@ def test_compile_hourly_sum_statistics_total_increasing_small_dip(
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistics_unit,
|
||||
unit_class,
|
||||
factor,
|
||||
):
|
||||
"""Test small dips in sensor readings do not trigger a reset."""
|
||||
@@ -1188,6 +1217,7 @@ def test_compile_hourly_sum_statistics_total_increasing_small_dip(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
}
|
||||
]
|
||||
stats = statistics_during_period(hass, period0, period="5minute")
|
||||
@@ -1282,6 +1312,7 @@ def test_compile_hourly_energy_statistics_unsupported(hass_recorder, caplog):
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": "kWh",
|
||||
"unit_class": "energy",
|
||||
}
|
||||
]
|
||||
stats = statistics_during_period(hass, period0, period="5minute")
|
||||
@@ -1374,6 +1405,7 @@ def test_compile_hourly_energy_statistics_multiple(hass_recorder, caplog):
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": "kWh",
|
||||
"unit_class": "energy",
|
||||
},
|
||||
{
|
||||
"statistic_id": "sensor.test2",
|
||||
@@ -1383,15 +1415,17 @@ def test_compile_hourly_energy_statistics_multiple(hass_recorder, caplog):
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": "kWh",
|
||||
"unit_class": "energy",
|
||||
},
|
||||
{
|
||||
"statistic_id": "sensor.test3",
|
||||
"display_unit_of_measurement": "kWh",
|
||||
"display_unit_of_measurement": "Wh",
|
||||
"has_mean": False,
|
||||
"has_sum": True,
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": "kWh",
|
||||
"unit_class": "energy",
|
||||
},
|
||||
]
|
||||
stats = statistics_during_period(hass, period0, period="5minute")
|
||||
@@ -1475,8 +1509,8 @@ def test_compile_hourly_energy_statistics_multiple(hass_recorder, caplog):
|
||||
"mean": None,
|
||||
"min": None,
|
||||
"last_reset": process_timestamp_to_utc_isoformat(period0),
|
||||
"state": approx(5.0 / 1000),
|
||||
"sum": approx(5.0 / 1000),
|
||||
"state": approx(5.0),
|
||||
"sum": approx(5.0),
|
||||
},
|
||||
{
|
||||
"statistic_id": "sensor.test3",
|
||||
@@ -1486,8 +1520,8 @@ def test_compile_hourly_energy_statistics_multiple(hass_recorder, caplog):
|
||||
"mean": None,
|
||||
"min": None,
|
||||
"last_reset": process_timestamp_to_utc_isoformat(four),
|
||||
"state": approx(50.0 / 1000),
|
||||
"sum": approx(60.0 / 1000),
|
||||
"state": approx(50.0),
|
||||
"sum": approx(60.0),
|
||||
},
|
||||
{
|
||||
"statistic_id": "sensor.test3",
|
||||
@@ -1497,8 +1531,8 @@ def test_compile_hourly_energy_statistics_multiple(hass_recorder, caplog):
|
||||
"mean": None,
|
||||
"min": None,
|
||||
"last_reset": process_timestamp_to_utc_isoformat(four),
|
||||
"state": approx(90.0 / 1000),
|
||||
"sum": approx(100.0 / 1000),
|
||||
"state": approx(90.0),
|
||||
"sum": approx(100.0),
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -1666,31 +1700,31 @@ def test_compile_hourly_statistics_fails(hass_recorder, caplog):
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"state_class,device_class,state_unit,display_unit,statistics_unit,statistic_type",
|
||||
"state_class, device_class, state_unit, display_unit, statistics_unit, unit_class, statistic_type",
|
||||
[
|
||||
("measurement", "battery", "%", "%", "%", "mean"),
|
||||
("measurement", "battery", None, None, None, "mean"),
|
||||
("total", "energy", "Wh", "kWh", "kWh", "sum"),
|
||||
("total", "energy", "kWh", "kWh", "kWh", "sum"),
|
||||
("measurement", "energy", "Wh", "kWh", "kWh", "mean"),
|
||||
("measurement", "energy", "kWh", "kWh", "kWh", "mean"),
|
||||
("measurement", "humidity", "%", "%", "%", "mean"),
|
||||
("measurement", "humidity", None, None, None, "mean"),
|
||||
("total", "monetary", "USD", "USD", "USD", "sum"),
|
||||
("total", "monetary", "None", "None", "None", "sum"),
|
||||
("total", "gas", "m³", "m³", "m³", "sum"),
|
||||
("total", "gas", "ft³", "m³", "m³", "sum"),
|
||||
("measurement", "monetary", "USD", "USD", "USD", "mean"),
|
||||
("measurement", "monetary", "None", "None", "None", "mean"),
|
||||
("measurement", "gas", "m³", "m³", "m³", "mean"),
|
||||
("measurement", "gas", "ft³", "m³", "m³", "mean"),
|
||||
("measurement", "pressure", "Pa", "Pa", "Pa", "mean"),
|
||||
("measurement", "pressure", "hPa", "hPa", "Pa", "mean"),
|
||||
("measurement", "pressure", "mbar", "mbar", "Pa", "mean"),
|
||||
("measurement", "pressure", "inHg", "inHg", "Pa", "mean"),
|
||||
("measurement", "pressure", "psi", "psi", "Pa", "mean"),
|
||||
("measurement", "temperature", "°C", "°C", "°C", "mean"),
|
||||
("measurement", "temperature", "°F", "°F", "°C", "mean"),
|
||||
("measurement", "battery", "%", "%", "%", None, "mean"),
|
||||
("measurement", "battery", None, None, None, None, "mean"),
|
||||
("total", "energy", "Wh", "Wh", "kWh", "energy", "sum"),
|
||||
("total", "energy", "kWh", "kWh", "kWh", "energy", "sum"),
|
||||
("measurement", "energy", "Wh", "Wh", "kWh", "energy", "mean"),
|
||||
("measurement", "energy", "kWh", "kWh", "kWh", "energy", "mean"),
|
||||
("measurement", "humidity", "%", "%", "%", None, "mean"),
|
||||
("measurement", "humidity", None, None, None, None, "mean"),
|
||||
("total", "monetary", "USD", "USD", "USD", None, "sum"),
|
||||
("total", "monetary", "None", "None", "None", None, "sum"),
|
||||
("total", "gas", "m³", "m³", "m³", "volume", "sum"),
|
||||
("total", "gas", "ft³", "ft³", "m³", "volume", "sum"),
|
||||
("measurement", "monetary", "USD", "USD", "USD", None, "mean"),
|
||||
("measurement", "monetary", "None", "None", "None", None, "mean"),
|
||||
("measurement", "gas", "m³", "m³", "m³", "volume", "mean"),
|
||||
("measurement", "gas", "ft³", "ft³", "m³", "volume", "mean"),
|
||||
("measurement", "pressure", "Pa", "Pa", "Pa", "pressure", "mean"),
|
||||
("measurement", "pressure", "hPa", "hPa", "Pa", "pressure", "mean"),
|
||||
("measurement", "pressure", "mbar", "mbar", "Pa", "pressure", "mean"),
|
||||
("measurement", "pressure", "inHg", "inHg", "Pa", "pressure", "mean"),
|
||||
("measurement", "pressure", "psi", "psi", "Pa", "pressure", "mean"),
|
||||
("measurement", "temperature", "°C", "°C", "°C", "temperature", "mean"),
|
||||
("measurement", "temperature", "°F", "°F", "°C", "temperature", "mean"),
|
||||
],
|
||||
)
|
||||
def test_list_statistic_ids(
|
||||
@@ -1701,6 +1735,7 @@ def test_list_statistic_ids(
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistics_unit,
|
||||
unit_class,
|
||||
statistic_type,
|
||||
):
|
||||
"""Test listing future statistic ids."""
|
||||
@@ -1724,6 +1759,7 @@ def test_list_statistic_ids(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
},
|
||||
]
|
||||
for stat_type in ["mean", "sum", "dogs"]:
|
||||
@@ -1738,6 +1774,7 @@ def test_list_statistic_ids(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
},
|
||||
]
|
||||
else:
|
||||
@@ -1772,12 +1809,12 @@ def test_list_statistic_ids_unsupported(hass_recorder, caplog, _attributes):
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"device_class,state_unit,display_unit,statistics_unit,mean,min,max",
|
||||
"device_class, state_unit, display_unit, statistics_unit, unit_class, mean, min, max",
|
||||
[
|
||||
(None, None, None, None, 13.050847, -10, 30),
|
||||
(None, "%", "%", "%", 13.050847, -10, 30),
|
||||
("battery", "%", "%", "%", 13.050847, -10, 30),
|
||||
("battery", None, None, None, 13.050847, -10, 30),
|
||||
(None, None, None, None, None, 13.050847, -10, 30),
|
||||
(None, "%", "%", "%", None, 13.050847, -10, 30),
|
||||
("battery", "%", "%", "%", None, 13.050847, -10, 30),
|
||||
("battery", None, None, None, None, 13.050847, -10, 30),
|
||||
],
|
||||
)
|
||||
def test_compile_hourly_statistics_changing_units_1(
|
||||
@@ -1787,6 +1824,7 @@ def test_compile_hourly_statistics_changing_units_1(
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistics_unit,
|
||||
unit_class,
|
||||
mean,
|
||||
min,
|
||||
max,
|
||||
@@ -1827,6 +1865,7 @@ def test_compile_hourly_statistics_changing_units_1(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
},
|
||||
]
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
@@ -1862,6 +1901,7 @@ def test_compile_hourly_statistics_changing_units_1(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
},
|
||||
]
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
@@ -1884,12 +1924,12 @@ def test_compile_hourly_statistics_changing_units_1(
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"device_class,state_unit,display_unit,statistics_unit,mean,min,max",
|
||||
"device_class, state_unit, display_unit, statistics_unit, unit_class, mean, min, max",
|
||||
[
|
||||
(None, None, None, None, 13.050847, -10, 30),
|
||||
(None, "%", "%", "%", 13.050847, -10, 30),
|
||||
("battery", "%", "%", "%", 13.050847, -10, 30),
|
||||
("battery", None, None, None, 13.050847, -10, 30),
|
||||
(None, None, None, None, None, 13.050847, -10, 30),
|
||||
(None, "%", "%", "%", None, 13.050847, -10, 30),
|
||||
("battery", "%", "%", "%", None, 13.050847, -10, 30),
|
||||
("battery", None, None, None, None, 13.050847, -10, 30),
|
||||
],
|
||||
)
|
||||
def test_compile_hourly_statistics_changing_units_2(
|
||||
@@ -1899,6 +1939,7 @@ def test_compile_hourly_statistics_changing_units_2(
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistics_unit,
|
||||
unit_class,
|
||||
mean,
|
||||
min,
|
||||
max,
|
||||
@@ -1936,6 +1977,7 @@ def test_compile_hourly_statistics_changing_units_2(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": "cats",
|
||||
"unit_class": unit_class,
|
||||
},
|
||||
]
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
@@ -1945,12 +1987,12 @@ def test_compile_hourly_statistics_changing_units_2(
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"device_class,state_unit,display_unit,statistics_unit,mean,min,max",
|
||||
"device_class, state_unit, display_unit, statistics_unit, unit_class, mean, min, max",
|
||||
[
|
||||
(None, None, None, None, 13.050847, -10, 30),
|
||||
(None, "%", "%", "%", 13.050847, -10, 30),
|
||||
("battery", "%", "%", "%", 13.050847, -10, 30),
|
||||
("battery", None, None, None, 13.050847, -10, 30),
|
||||
(None, None, None, None, None, 13.050847, -10, 30),
|
||||
(None, "%", "%", "%", None, 13.050847, -10, 30),
|
||||
("battery", "%", "%", "%", None, 13.050847, -10, 30),
|
||||
("battery", None, None, None, None, 13.050847, -10, 30),
|
||||
],
|
||||
)
|
||||
def test_compile_hourly_statistics_changing_units_3(
|
||||
@@ -1960,6 +2002,7 @@ def test_compile_hourly_statistics_changing_units_3(
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistics_unit,
|
||||
unit_class,
|
||||
mean,
|
||||
min,
|
||||
max,
|
||||
@@ -2000,6 +2043,7 @@ def test_compile_hourly_statistics_changing_units_3(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
},
|
||||
]
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
@@ -2035,6 +2079,7 @@ def test_compile_hourly_statistics_changing_units_3(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistics_unit,
|
||||
"unit_class": unit_class,
|
||||
},
|
||||
]
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
@@ -2057,13 +2102,21 @@ def test_compile_hourly_statistics_changing_units_3(
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"device_class,state_unit,statistic_unit,mean,min,max",
|
||||
"device_class, state_unit, statistic_unit, unit_class, mean, min, max",
|
||||
[
|
||||
("power", "kW", "W", 13.050847, -10, 30),
|
||||
("power", "kW", "W", None, 13.050847, -10, 30),
|
||||
],
|
||||
)
|
||||
def test_compile_hourly_statistics_changing_device_class_1(
|
||||
hass_recorder, caplog, device_class, state_unit, statistic_unit, mean, min, max
|
||||
hass_recorder,
|
||||
caplog,
|
||||
device_class,
|
||||
state_unit,
|
||||
statistic_unit,
|
||||
unit_class,
|
||||
mean,
|
||||
min,
|
||||
max,
|
||||
):
|
||||
"""Test compiling hourly statistics where device class changes from one hour to the next."""
|
||||
zero = dt_util.utcnow()
|
||||
@@ -2091,6 +2144,7 @@ def test_compile_hourly_statistics_changing_device_class_1(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": state_unit,
|
||||
"unit_class": unit_class,
|
||||
},
|
||||
]
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
@@ -2140,6 +2194,7 @@ def test_compile_hourly_statistics_changing_device_class_1(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": state_unit,
|
||||
"unit_class": unit_class,
|
||||
},
|
||||
]
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
@@ -2162,9 +2217,9 @@ def test_compile_hourly_statistics_changing_device_class_1(
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"device_class,state_unit,display_unit,statistic_unit,mean,min,max",
|
||||
"device_class, state_unit, display_unit, statistic_unit, unit_class, mean, min, max",
|
||||
[
|
||||
("power", "kW", "kW", "W", 13.050847, -10, 30),
|
||||
("power", "kW", "kW", "W", "power", 13.050847, -10, 30),
|
||||
],
|
||||
)
|
||||
def test_compile_hourly_statistics_changing_device_class_2(
|
||||
@@ -2174,6 +2229,7 @@ def test_compile_hourly_statistics_changing_device_class_2(
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistic_unit,
|
||||
unit_class,
|
||||
mean,
|
||||
min,
|
||||
max,
|
||||
@@ -2205,6 +2261,7 @@ def test_compile_hourly_statistics_changing_device_class_2(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistic_unit,
|
||||
"unit_class": unit_class,
|
||||
},
|
||||
]
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
@@ -2254,6 +2311,7 @@ def test_compile_hourly_statistics_changing_device_class_2(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": statistic_unit,
|
||||
"unit_class": unit_class,
|
||||
},
|
||||
]
|
||||
stats = statistics_during_period(hass, zero, period="5minute")
|
||||
@@ -2276,9 +2334,9 @@ def test_compile_hourly_statistics_changing_device_class_2(
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"device_class,state_unit,display_unit,statistics_unit,mean,min,max",
|
||||
"device_class, state_unit, display_unit, statistics_unit, unit_class, mean, min, max",
|
||||
[
|
||||
(None, None, None, None, 13.050847, -10, 30),
|
||||
(None, None, None, None, None, 13.050847, -10, 30),
|
||||
],
|
||||
)
|
||||
def test_compile_hourly_statistics_changing_statistics(
|
||||
@@ -2288,6 +2346,7 @@ def test_compile_hourly_statistics_changing_statistics(
|
||||
state_unit,
|
||||
display_unit,
|
||||
statistics_unit,
|
||||
unit_class,
|
||||
mean,
|
||||
min,
|
||||
max,
|
||||
@@ -2322,6 +2381,7 @@ def test_compile_hourly_statistics_changing_statistics(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": None,
|
||||
"unit_class": None,
|
||||
},
|
||||
]
|
||||
metadata = get_metadata(hass, statistic_ids=("sensor.test1",))
|
||||
@@ -2358,6 +2418,7 @@ def test_compile_hourly_statistics_changing_statistics(
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": None,
|
||||
"unit_class": None,
|
||||
},
|
||||
]
|
||||
metadata = get_metadata(hass, statistic_ids=("sensor.test1",))
|
||||
@@ -2552,6 +2613,7 @@ def test_compile_statistics_hourly_daily_monthly_summary(hass_recorder, caplog):
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": "%",
|
||||
"unit_class": None,
|
||||
},
|
||||
{
|
||||
"statistic_id": "sensor.test2",
|
||||
@@ -2561,6 +2623,7 @@ def test_compile_statistics_hourly_daily_monthly_summary(hass_recorder, caplog):
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": "%",
|
||||
"unit_class": None,
|
||||
},
|
||||
{
|
||||
"statistic_id": "sensor.test3",
|
||||
@@ -2570,6 +2633,7 @@ def test_compile_statistics_hourly_daily_monthly_summary(hass_recorder, caplog):
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": "%",
|
||||
"unit_class": None,
|
||||
},
|
||||
{
|
||||
"statistic_id": "sensor.test4",
|
||||
@@ -2579,6 +2643,7 @@ def test_compile_statistics_hourly_daily_monthly_summary(hass_recorder, caplog):
|
||||
"name": None,
|
||||
"source": "recorder",
|
||||
"statistics_unit_of_measurement": "EUR",
|
||||
"unit_class": None,
|
||||
},
|
||||
]
|
||||
|
||||
@@ -2588,7 +2653,7 @@ def test_compile_statistics_hourly_daily_monthly_summary(hass_recorder, caplog):
|
||||
for i in range(13, 24):
|
||||
expected_sums["sensor.test4"][i] += sum_adjustment
|
||||
instance.async_adjust_statistics(
|
||||
"sensor.test4", sum_adjustement_start, sum_adjustment
|
||||
"sensor.test4", sum_adjustement_start, sum_adjustment, "EUR"
|
||||
)
|
||||
wait_recording_done(hass)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user