Add GJ as supported unit for energy sensors (#80870)
* Add GJ as supported unit for energy sensors * Update homeassistant/const.py Co-authored-by: epenet <6771947+epenet@users.noreply.github.com> Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>pull/80963/head
parent
e9a3982560
commit
727eccfec4
homeassistant
tests
components/energy
|
@ -17,6 +17,7 @@ from homeassistant.components.sensor import (
|
||||||
from homeassistant.components.sensor.recorder import reset_detected
|
from homeassistant.components.sensor.recorder import reset_detected
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_UNIT_OF_MEASUREMENT,
|
ATTR_UNIT_OF_MEASUREMENT,
|
||||||
|
ENERGY_GIGA_JOULE,
|
||||||
ENERGY_KILO_WATT_HOUR,
|
ENERGY_KILO_WATT_HOUR,
|
||||||
ENERGY_MEGA_WATT_HOUR,
|
ENERGY_MEGA_WATT_HOUR,
|
||||||
ENERGY_WATT_HOUR,
|
ENERGY_WATT_HOUR,
|
||||||
|
@ -44,7 +45,12 @@ SUPPORTED_STATE_CLASSES = [
|
||||||
SensorStateClass.TOTAL,
|
SensorStateClass.TOTAL,
|
||||||
SensorStateClass.TOTAL_INCREASING,
|
SensorStateClass.TOTAL_INCREASING,
|
||||||
]
|
]
|
||||||
VALID_ENERGY_UNITS = [ENERGY_WATT_HOUR, ENERGY_KILO_WATT_HOUR, ENERGY_MEGA_WATT_HOUR]
|
VALID_ENERGY_UNITS = [
|
||||||
|
ENERGY_WATT_HOUR,
|
||||||
|
ENERGY_KILO_WATT_HOUR,
|
||||||
|
ENERGY_MEGA_WATT_HOUR,
|
||||||
|
ENERGY_GIGA_JOULE,
|
||||||
|
]
|
||||||
VALID_ENERGY_UNITS_GAS = [VOLUME_CUBIC_FEET, VOLUME_CUBIC_METERS] + VALID_ENERGY_UNITS
|
VALID_ENERGY_UNITS_GAS = [VOLUME_CUBIC_FEET, VOLUME_CUBIC_METERS] + VALID_ENERGY_UNITS
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -233,7 +239,7 @@ class EnergyCostSensor(SensorEntity):
|
||||||
self.async_write_ha_state()
|
self.async_write_ha_state()
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def _update_cost(self) -> None:
|
def _update_cost(self) -> None: # noqa: C901
|
||||||
"""Update incurred costs."""
|
"""Update incurred costs."""
|
||||||
energy_state = self.hass.states.get(
|
energy_state = self.hass.states.get(
|
||||||
cast(str, self._config[self._adapter.stat_energy_key])
|
cast(str, self._config[self._adapter.stat_energy_key])
|
||||||
|
@ -289,6 +295,11 @@ class EnergyCostSensor(SensorEntity):
|
||||||
):
|
):
|
||||||
energy_price /= 1000.0
|
energy_price /= 1000.0
|
||||||
|
|
||||||
|
if energy_price_state.attributes.get(ATTR_UNIT_OF_MEASUREMENT, "").endswith(
|
||||||
|
f"/{ENERGY_GIGA_JOULE}"
|
||||||
|
):
|
||||||
|
energy_price /= 1000 / 3.6
|
||||||
|
|
||||||
else:
|
else:
|
||||||
energy_price_state = None
|
energy_price_state = None
|
||||||
energy_price = cast(float, self._config["number_energy_price"])
|
energy_price = cast(float, self._config["number_energy_price"])
|
||||||
|
@ -312,6 +323,8 @@ class EnergyCostSensor(SensorEntity):
|
||||||
energy_price /= 1000
|
energy_price /= 1000
|
||||||
elif energy_unit == ENERGY_MEGA_WATT_HOUR:
|
elif energy_unit == ENERGY_MEGA_WATT_HOUR:
|
||||||
energy_price *= 1000
|
energy_price *= 1000
|
||||||
|
elif energy_unit == ENERGY_GIGA_JOULE:
|
||||||
|
energy_price *= 1000 / 3.6
|
||||||
|
|
||||||
if energy_unit is None:
|
if energy_unit is None:
|
||||||
if not self._wrong_unit_reported:
|
if not self._wrong_unit_reported:
|
||||||
|
|
|
@ -9,6 +9,7 @@ from typing import Any
|
||||||
from homeassistant.components import recorder, sensor
|
from homeassistant.components import recorder, sensor
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_DEVICE_CLASS,
|
ATTR_DEVICE_CLASS,
|
||||||
|
ENERGY_GIGA_JOULE,
|
||||||
ENERGY_KILO_WATT_HOUR,
|
ENERGY_KILO_WATT_HOUR,
|
||||||
ENERGY_MEGA_WATT_HOUR,
|
ENERGY_MEGA_WATT_HOUR,
|
||||||
ENERGY_WATT_HOUR,
|
ENERGY_WATT_HOUR,
|
||||||
|
@ -28,6 +29,7 @@ ENERGY_USAGE_UNITS = {
|
||||||
ENERGY_KILO_WATT_HOUR,
|
ENERGY_KILO_WATT_HOUR,
|
||||||
ENERGY_MEGA_WATT_HOUR,
|
ENERGY_MEGA_WATT_HOUR,
|
||||||
ENERGY_WATT_HOUR,
|
ENERGY_WATT_HOUR,
|
||||||
|
ENERGY_GIGA_JOULE,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
ENERGY_PRICE_UNITS = tuple(
|
ENERGY_PRICE_UNITS = tuple(
|
||||||
|
@ -44,6 +46,7 @@ GAS_USAGE_UNITS = {
|
||||||
ENERGY_WATT_HOUR,
|
ENERGY_WATT_HOUR,
|
||||||
ENERGY_KILO_WATT_HOUR,
|
ENERGY_KILO_WATT_HOUR,
|
||||||
ENERGY_MEGA_WATT_HOUR,
|
ENERGY_MEGA_WATT_HOUR,
|
||||||
|
ENERGY_GIGA_JOULE,
|
||||||
),
|
),
|
||||||
sensor.SensorDeviceClass.GAS: (VOLUME_CUBIC_METERS, VOLUME_CUBIC_FEET),
|
sensor.SensorDeviceClass.GAS: (VOLUME_CUBIC_METERS, VOLUME_CUBIC_FEET),
|
||||||
}
|
}
|
||||||
|
|
|
@ -147,7 +147,7 @@ class SensorDeviceClass(StrEnum):
|
||||||
ENERGY = "energy"
|
ENERGY = "energy"
|
||||||
"""Energy.
|
"""Energy.
|
||||||
|
|
||||||
Unit of measurement: `Wh`, `kWh`, `MWh`
|
Unit of measurement: `Wh`, `kWh`, `MWh`, `GJ`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
FREQUENCY = "frequency"
|
FREQUENCY = "frequency"
|
||||||
|
|
|
@ -487,9 +487,10 @@ POWER_BTU_PER_HOUR: Final = "BTU/h"
|
||||||
POWER_VOLT_AMPERE_REACTIVE: Final = "var"
|
POWER_VOLT_AMPERE_REACTIVE: Final = "var"
|
||||||
|
|
||||||
# Energy units
|
# Energy units
|
||||||
ENERGY_WATT_HOUR: Final = "Wh"
|
ENERGY_GIGA_JOULE: Final = "GJ"
|
||||||
ENERGY_KILO_WATT_HOUR: Final = "kWh"
|
ENERGY_KILO_WATT_HOUR: Final = "kWh"
|
||||||
ENERGY_MEGA_WATT_HOUR: Final = "MWh"
|
ENERGY_MEGA_WATT_HOUR: Final = "MWh"
|
||||||
|
ENERGY_WATT_HOUR: Final = "Wh"
|
||||||
|
|
||||||
# Electric_current units
|
# Electric_current units
|
||||||
ELECTRIC_CURRENT_MILLIAMPERE: Final = "mA"
|
ELECTRIC_CURRENT_MILLIAMPERE: Final = "mA"
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
|
ENERGY_GIGA_JOULE,
|
||||||
ENERGY_KILO_WATT_HOUR,
|
ENERGY_KILO_WATT_HOUR,
|
||||||
ENERGY_MEGA_WATT_HOUR,
|
ENERGY_MEGA_WATT_HOUR,
|
||||||
ENERGY_WATT_HOUR,
|
ENERGY_WATT_HOUR,
|
||||||
|
@ -158,11 +159,13 @@ class EnergyConverter(BaseUnitConverter):
|
||||||
ENERGY_WATT_HOUR: 1 * 1000,
|
ENERGY_WATT_HOUR: 1 * 1000,
|
||||||
ENERGY_KILO_WATT_HOUR: 1,
|
ENERGY_KILO_WATT_HOUR: 1,
|
||||||
ENERGY_MEGA_WATT_HOUR: 1 / 1000,
|
ENERGY_MEGA_WATT_HOUR: 1 / 1000,
|
||||||
|
ENERGY_GIGA_JOULE: 3.6 / 1000,
|
||||||
}
|
}
|
||||||
VALID_UNITS = {
|
VALID_UNITS = {
|
||||||
ENERGY_WATT_HOUR,
|
ENERGY_WATT_HOUR,
|
||||||
ENERGY_KILO_WATT_HOUR,
|
ENERGY_KILO_WATT_HOUR,
|
||||||
ENERGY_MEGA_WATT_HOUR,
|
ENERGY_MEGA_WATT_HOUR,
|
||||||
|
ENERGY_GIGA_JOULE,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ from homeassistant.components.sensor.recorder import compile_statistics
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_DEVICE_CLASS,
|
ATTR_DEVICE_CLASS,
|
||||||
ATTR_UNIT_OF_MEASUREMENT,
|
ATTR_UNIT_OF_MEASUREMENT,
|
||||||
|
ENERGY_GIGA_JOULE,
|
||||||
ENERGY_KILO_WATT_HOUR,
|
ENERGY_KILO_WATT_HOUR,
|
||||||
ENERGY_MEGA_WATT_HOUR,
|
ENERGY_MEGA_WATT_HOUR,
|
||||||
ENERGY_WATT_HOUR,
|
ENERGY_WATT_HOUR,
|
||||||
|
@ -703,6 +704,7 @@ async def test_cost_sensor_price_entity_total_no_reset(
|
||||||
(ENERGY_WATT_HOUR, 1000),
|
(ENERGY_WATT_HOUR, 1000),
|
||||||
(ENERGY_KILO_WATT_HOUR, 1),
|
(ENERGY_KILO_WATT_HOUR, 1),
|
||||||
(ENERGY_MEGA_WATT_HOUR, 0.001),
|
(ENERGY_MEGA_WATT_HOUR, 0.001),
|
||||||
|
(ENERGY_GIGA_JOULE, 0.001 * 3.6),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
async def test_cost_sensor_handle_energy_units(
|
async def test_cost_sensor_handle_energy_units(
|
||||||
|
@ -768,6 +770,7 @@ async def test_cost_sensor_handle_energy_units(
|
||||||
(f"EUR/{ENERGY_WATT_HOUR}", 0.001),
|
(f"EUR/{ENERGY_WATT_HOUR}", 0.001),
|
||||||
(f"EUR/{ENERGY_KILO_WATT_HOUR}", 1),
|
(f"EUR/{ENERGY_KILO_WATT_HOUR}", 1),
|
||||||
(f"EUR/{ENERGY_MEGA_WATT_HOUR}", 1000),
|
(f"EUR/{ENERGY_MEGA_WATT_HOUR}", 1000),
|
||||||
|
(f"EUR/{ENERGY_GIGA_JOULE}", 1000 / 3.6),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
async def test_cost_sensor_handle_price_units(
|
async def test_cost_sensor_handle_price_units(
|
||||||
|
|
|
@ -5,6 +5,7 @@ import pytest
|
||||||
|
|
||||||
from homeassistant.components.energy import async_get_manager, validate
|
from homeassistant.components.energy import async_get_manager, validate
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
|
ENERGY_GIGA_JOULE,
|
||||||
ENERGY_KILO_WATT_HOUR,
|
ENERGY_KILO_WATT_HOUR,
|
||||||
ENERGY_MEGA_WATT_HOUR,
|
ENERGY_MEGA_WATT_HOUR,
|
||||||
ENERGY_WATT_HOUR,
|
ENERGY_WATT_HOUR,
|
||||||
|
@ -73,6 +74,7 @@ async def test_validation_empty_config(hass):
|
||||||
("total", ENERGY_KILO_WATT_HOUR, {}),
|
("total", ENERGY_KILO_WATT_HOUR, {}),
|
||||||
("total", ENERGY_KILO_WATT_HOUR, {"last_reset": "abc"}),
|
("total", ENERGY_KILO_WATT_HOUR, {"last_reset": "abc"}),
|
||||||
("measurement", ENERGY_KILO_WATT_HOUR, {"last_reset": "abc"}),
|
("measurement", ENERGY_KILO_WATT_HOUR, {"last_reset": "abc"}),
|
||||||
|
("total_increasing", ENERGY_GIGA_JOULE, {}),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
async def test_validation(
|
async def test_validation(
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
|
ENERGY_GIGA_JOULE,
|
||||||
ENERGY_KILO_WATT_HOUR,
|
ENERGY_KILO_WATT_HOUR,
|
||||||
ENERGY_MEGA_WATT_HOUR,
|
ENERGY_MEGA_WATT_HOUR,
|
||||||
ENERGY_WATT_HOUR,
|
ENERGY_WATT_HOUR,
|
||||||
|
@ -78,6 +79,7 @@ INVALID_SYMBOL = "bob"
|
||||||
(EnergyConverter, ENERGY_WATT_HOUR),
|
(EnergyConverter, ENERGY_WATT_HOUR),
|
||||||
(EnergyConverter, ENERGY_KILO_WATT_HOUR),
|
(EnergyConverter, ENERGY_KILO_WATT_HOUR),
|
||||||
(EnergyConverter, ENERGY_MEGA_WATT_HOUR),
|
(EnergyConverter, ENERGY_MEGA_WATT_HOUR),
|
||||||
|
(EnergyConverter, ENERGY_GIGA_JOULE),
|
||||||
(MassConverter, MASS_GRAMS),
|
(MassConverter, MASS_GRAMS),
|
||||||
(MassConverter, MASS_KILOGRAMS),
|
(MassConverter, MASS_KILOGRAMS),
|
||||||
(MassConverter, MASS_MICROGRAMS),
|
(MassConverter, MASS_MICROGRAMS),
|
||||||
|
@ -268,6 +270,8 @@ def test_distance_convert(
|
||||||
(10, ENERGY_KILO_WATT_HOUR, 0.01, ENERGY_MEGA_WATT_HOUR),
|
(10, ENERGY_KILO_WATT_HOUR, 0.01, ENERGY_MEGA_WATT_HOUR),
|
||||||
(10, ENERGY_MEGA_WATT_HOUR, 10000000, ENERGY_WATT_HOUR),
|
(10, ENERGY_MEGA_WATT_HOUR, 10000000, ENERGY_WATT_HOUR),
|
||||||
(10, ENERGY_MEGA_WATT_HOUR, 10000, ENERGY_KILO_WATT_HOUR),
|
(10, ENERGY_MEGA_WATT_HOUR, 10000, ENERGY_KILO_WATT_HOUR),
|
||||||
|
(10, ENERGY_GIGA_JOULE, 10000 / 3.6, ENERGY_KILO_WATT_HOUR),
|
||||||
|
(10, ENERGY_GIGA_JOULE, 10 / 3.6, ENERGY_MEGA_WATT_HOUR),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
def test_energy_convert(
|
def test_energy_convert(
|
||||||
|
|
Loading…
Reference in New Issue