mirror of
https://github.com/home-assistant/core.git
synced 2025-07-24 13:47:35 +00:00
Fix energy gas price validation (#57075)
This commit is contained in:
parent
91d3d39f6c
commit
11ed70b774
@ -24,13 +24,21 @@ ENERGY_USAGE_DEVICE_CLASSES = (sensor.DEVICE_CLASS_ENERGY,)
|
|||||||
ENERGY_USAGE_UNITS = {
|
ENERGY_USAGE_UNITS = {
|
||||||
sensor.DEVICE_CLASS_ENERGY: (ENERGY_KILO_WATT_HOUR, ENERGY_WATT_HOUR)
|
sensor.DEVICE_CLASS_ENERGY: (ENERGY_KILO_WATT_HOUR, ENERGY_WATT_HOUR)
|
||||||
}
|
}
|
||||||
|
ENERGY_PRICE_UNITS = tuple(
|
||||||
|
f"/{unit}" for units in ENERGY_USAGE_UNITS.values() for unit in units
|
||||||
|
)
|
||||||
ENERGY_UNIT_ERROR = "entity_unexpected_unit_energy"
|
ENERGY_UNIT_ERROR = "entity_unexpected_unit_energy"
|
||||||
|
ENERGY_PRICE_UNIT_ERROR = "entity_unexpected_unit_energy_price"
|
||||||
GAS_USAGE_DEVICE_CLASSES = (sensor.DEVICE_CLASS_ENERGY, sensor.DEVICE_CLASS_GAS)
|
GAS_USAGE_DEVICE_CLASSES = (sensor.DEVICE_CLASS_ENERGY, sensor.DEVICE_CLASS_GAS)
|
||||||
GAS_USAGE_UNITS = {
|
GAS_USAGE_UNITS = {
|
||||||
sensor.DEVICE_CLASS_ENERGY: (ENERGY_WATT_HOUR, ENERGY_KILO_WATT_HOUR),
|
sensor.DEVICE_CLASS_ENERGY: (ENERGY_WATT_HOUR, ENERGY_KILO_WATT_HOUR),
|
||||||
sensor.DEVICE_CLASS_GAS: (VOLUME_CUBIC_METERS, VOLUME_CUBIC_FEET),
|
sensor.DEVICE_CLASS_GAS: (VOLUME_CUBIC_METERS, VOLUME_CUBIC_FEET),
|
||||||
}
|
}
|
||||||
|
GAS_PRICE_UNITS = tuple(
|
||||||
|
f"/{unit}" for units in GAS_USAGE_UNITS.values() for unit in units
|
||||||
|
)
|
||||||
GAS_UNIT_ERROR = "entity_unexpected_unit_gas"
|
GAS_UNIT_ERROR = "entity_unexpected_unit_gas"
|
||||||
|
GAS_PRICE_UNIT_ERROR = "entity_unexpected_unit_gas_price"
|
||||||
|
|
||||||
|
|
||||||
@dataclasses.dataclass
|
@dataclasses.dataclass
|
||||||
@ -152,7 +160,11 @@ def _async_validate_usage_stat(
|
|||||||
|
|
||||||
@callback
|
@callback
|
||||||
def _async_validate_price_entity(
|
def _async_validate_price_entity(
|
||||||
hass: HomeAssistant, entity_id: str, result: list[ValidationIssue]
|
hass: HomeAssistant,
|
||||||
|
entity_id: str,
|
||||||
|
result: list[ValidationIssue],
|
||||||
|
allowed_units: tuple[str, ...],
|
||||||
|
unit_error: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Validate that the price entity is correct."""
|
"""Validate that the price entity is correct."""
|
||||||
state = hass.states.get(entity_id)
|
state = hass.states.get(entity_id)
|
||||||
@ -176,10 +188,8 @@ def _async_validate_price_entity(
|
|||||||
|
|
||||||
unit = state.attributes.get("unit_of_measurement")
|
unit = state.attributes.get("unit_of_measurement")
|
||||||
|
|
||||||
if unit is None or not unit.endswith(
|
if unit is None or not unit.endswith(allowed_units):
|
||||||
(f"/{ENERGY_KILO_WATT_HOUR}", f"/{ENERGY_WATT_HOUR}")
|
result.append(ValidationIssue(unit_error, entity_id, unit))
|
||||||
):
|
|
||||||
result.append(ValidationIssue("entity_unexpected_unit_price", entity_id, unit))
|
|
||||||
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
@ -274,7 +284,11 @@ async def async_validate(hass: HomeAssistant) -> EnergyPreferencesValidation:
|
|||||||
_async_validate_cost_stat(hass, flow["stat_cost"], source_result)
|
_async_validate_cost_stat(hass, flow["stat_cost"], source_result)
|
||||||
elif flow.get("entity_energy_price") is not None:
|
elif flow.get("entity_energy_price") is not None:
|
||||||
_async_validate_price_entity(
|
_async_validate_price_entity(
|
||||||
hass, flow["entity_energy_price"], source_result
|
hass,
|
||||||
|
flow["entity_energy_price"],
|
||||||
|
source_result,
|
||||||
|
ENERGY_PRICE_UNITS,
|
||||||
|
ENERGY_PRICE_UNIT_ERROR,
|
||||||
)
|
)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@ -303,7 +317,11 @@ async def async_validate(hass: HomeAssistant) -> EnergyPreferencesValidation:
|
|||||||
)
|
)
|
||||||
elif flow.get("entity_energy_price") is not None:
|
elif flow.get("entity_energy_price") is not None:
|
||||||
_async_validate_price_entity(
|
_async_validate_price_entity(
|
||||||
hass, flow["entity_energy_price"], source_result
|
hass,
|
||||||
|
flow["entity_energy_price"],
|
||||||
|
source_result,
|
||||||
|
ENERGY_PRICE_UNITS,
|
||||||
|
ENERGY_PRICE_UNIT_ERROR,
|
||||||
)
|
)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@ -330,7 +348,11 @@ async def async_validate(hass: HomeAssistant) -> EnergyPreferencesValidation:
|
|||||||
_async_validate_cost_stat(hass, source["stat_cost"], source_result)
|
_async_validate_cost_stat(hass, source["stat_cost"], source_result)
|
||||||
elif source.get("entity_energy_price") is not None:
|
elif source.get("entity_energy_price") is not None:
|
||||||
_async_validate_price_entity(
|
_async_validate_price_entity(
|
||||||
hass, source["entity_energy_price"], source_result
|
hass,
|
||||||
|
source["entity_energy_price"],
|
||||||
|
source_result,
|
||||||
|
GAS_PRICE_UNITS,
|
||||||
|
GAS_PRICE_UNIT_ERROR,
|
||||||
)
|
)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
@ -473,7 +473,7 @@ async def test_validation_grid_price_not_exist(hass, mock_energy_manager):
|
|||||||
"123",
|
"123",
|
||||||
"$/Ws",
|
"$/Ws",
|
||||||
{
|
{
|
||||||
"type": "entity_unexpected_unit_price",
|
"type": "entity_unexpected_unit_energy_price",
|
||||||
"identifier": "sensor.grid_price_1",
|
"identifier": "sensor.grid_price_1",
|
||||||
"value": "$/Ws",
|
"value": "$/Ws",
|
||||||
},
|
},
|
||||||
@ -551,11 +551,19 @@ async def test_validation_gas(hass, mock_energy_manager, mock_is_entity_recorded
|
|||||||
{
|
{
|
||||||
"type": "gas",
|
"type": "gas",
|
||||||
"stat_energy_from": "sensor.gas_consumption_4",
|
"stat_energy_from": "sensor.gas_consumption_4",
|
||||||
"stat_cost": "sensor.gas_cost_2",
|
"entity_energy_from": "sensor.gas_consumption_4",
|
||||||
|
"entity_energy_price": "sensor.gas_price_1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "gas",
|
||||||
|
"stat_energy_from": "sensor.gas_consumption_3",
|
||||||
|
"entity_energy_from": "sensor.gas_consumption_3",
|
||||||
|
"entity_energy_price": "sensor.gas_price_2",
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
hass.states.async_set(
|
hass.states.async_set(
|
||||||
"sensor.gas_consumption_1",
|
"sensor.gas_consumption_1",
|
||||||
"10.10",
|
"10.10",
|
||||||
@ -593,6 +601,16 @@ async def test_validation_gas(hass, mock_energy_manager, mock_is_entity_recorded
|
|||||||
"10.10",
|
"10.10",
|
||||||
{"unit_of_measurement": "EUR/kWh", "state_class": "total_increasing"},
|
{"unit_of_measurement": "EUR/kWh", "state_class": "total_increasing"},
|
||||||
)
|
)
|
||||||
|
hass.states.async_set(
|
||||||
|
"sensor.gas_price_1",
|
||||||
|
"10.10",
|
||||||
|
{"unit_of_measurement": "EUR/m³", "state_class": "total_increasing"},
|
||||||
|
)
|
||||||
|
hass.states.async_set(
|
||||||
|
"sensor.gas_price_2",
|
||||||
|
"10.10",
|
||||||
|
{"unit_of_measurement": "EUR/invalid", "state_class": "total_increasing"},
|
||||||
|
)
|
||||||
|
|
||||||
assert (await validate.async_validate(hass)).as_dict() == {
|
assert (await validate.async_validate(hass)).as_dict() == {
|
||||||
"energy_sources": [
|
"energy_sources": [
|
||||||
@ -622,6 +640,13 @@ async def test_validation_gas(hass, mock_energy_manager, mock_is_entity_recorded
|
|||||||
"value": None,
|
"value": None,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"type": "entity_unexpected_unit_gas_price",
|
||||||
|
"identifier": "sensor.gas_price_2",
|
||||||
|
"value": "EUR/invalid",
|
||||||
|
},
|
||||||
|
],
|
||||||
],
|
],
|
||||||
"device_consumption": [],
|
"device_consumption": [],
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user