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
|
@ -17,6 +17,7 @@ from homeassistant.components.sensor import (
|
|||
from homeassistant.components.sensor.recorder import reset_detected
|
||||
from homeassistant.const import (
|
||||
ATTR_UNIT_OF_MEASUREMENT,
|
||||
ENERGY_GIGA_JOULE,
|
||||
ENERGY_KILO_WATT_HOUR,
|
||||
ENERGY_MEGA_WATT_HOUR,
|
||||
ENERGY_WATT_HOUR,
|
||||
|
@ -44,7 +45,12 @@ SUPPORTED_STATE_CLASSES = [
|
|||
SensorStateClass.TOTAL,
|
||||
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
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
@ -233,7 +239,7 @@ class EnergyCostSensor(SensorEntity):
|
|||
self.async_write_ha_state()
|
||||
|
||||
@callback
|
||||
def _update_cost(self) -> None:
|
||||
def _update_cost(self) -> None: # noqa: C901
|
||||
"""Update incurred costs."""
|
||||
energy_state = self.hass.states.get(
|
||||
cast(str, self._config[self._adapter.stat_energy_key])
|
||||
|
@ -289,6 +295,11 @@ class EnergyCostSensor(SensorEntity):
|
|||
):
|
||||
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:
|
||||
energy_price_state = None
|
||||
energy_price = cast(float, self._config["number_energy_price"])
|
||||
|
@ -312,6 +323,8 @@ class EnergyCostSensor(SensorEntity):
|
|||
energy_price /= 1000
|
||||
elif energy_unit == ENERGY_MEGA_WATT_HOUR:
|
||||
energy_price *= 1000
|
||||
elif energy_unit == ENERGY_GIGA_JOULE:
|
||||
energy_price *= 1000 / 3.6
|
||||
|
||||
if energy_unit is None:
|
||||
if not self._wrong_unit_reported:
|
||||
|
|
|
@ -9,6 +9,7 @@ from typing import Any
|
|||
from homeassistant.components import recorder, sensor
|
||||
from homeassistant.const import (
|
||||
ATTR_DEVICE_CLASS,
|
||||
ENERGY_GIGA_JOULE,
|
||||
ENERGY_KILO_WATT_HOUR,
|
||||
ENERGY_MEGA_WATT_HOUR,
|
||||
ENERGY_WATT_HOUR,
|
||||
|
@ -28,6 +29,7 @@ ENERGY_USAGE_UNITS = {
|
|||
ENERGY_KILO_WATT_HOUR,
|
||||
ENERGY_MEGA_WATT_HOUR,
|
||||
ENERGY_WATT_HOUR,
|
||||
ENERGY_GIGA_JOULE,
|
||||
)
|
||||
}
|
||||
ENERGY_PRICE_UNITS = tuple(
|
||||
|
@ -44,6 +46,7 @@ GAS_USAGE_UNITS = {
|
|||
ENERGY_WATT_HOUR,
|
||||
ENERGY_KILO_WATT_HOUR,
|
||||
ENERGY_MEGA_WATT_HOUR,
|
||||
ENERGY_GIGA_JOULE,
|
||||
),
|
||||
sensor.SensorDeviceClass.GAS: (VOLUME_CUBIC_METERS, VOLUME_CUBIC_FEET),
|
||||
}
|
||||
|
|
|
@ -147,7 +147,7 @@ class SensorDeviceClass(StrEnum):
|
|||
ENERGY = "energy"
|
||||
"""Energy.
|
||||
|
||||
Unit of measurement: `Wh`, `kWh`, `MWh`
|
||||
Unit of measurement: `Wh`, `kWh`, `MWh`, `GJ`
|
||||
"""
|
||||
|
||||
FREQUENCY = "frequency"
|
||||
|
|
|
@ -487,9 +487,10 @@ POWER_BTU_PER_HOUR: Final = "BTU/h"
|
|||
POWER_VOLT_AMPERE_REACTIVE: Final = "var"
|
||||
|
||||
# Energy units
|
||||
ENERGY_WATT_HOUR: Final = "Wh"
|
||||
ENERGY_GIGA_JOULE: Final = "GJ"
|
||||
ENERGY_KILO_WATT_HOUR: Final = "kWh"
|
||||
ENERGY_MEGA_WATT_HOUR: Final = "MWh"
|
||||
ENERGY_WATT_HOUR: Final = "Wh"
|
||||
|
||||
# Electric_current units
|
||||
ELECTRIC_CURRENT_MILLIAMPERE: Final = "mA"
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
from __future__ import annotations
|
||||
|
||||
from homeassistant.const import (
|
||||
ENERGY_GIGA_JOULE,
|
||||
ENERGY_KILO_WATT_HOUR,
|
||||
ENERGY_MEGA_WATT_HOUR,
|
||||
ENERGY_WATT_HOUR,
|
||||
|
@ -158,11 +159,13 @@ class EnergyConverter(BaseUnitConverter):
|
|||
ENERGY_WATT_HOUR: 1 * 1000,
|
||||
ENERGY_KILO_WATT_HOUR: 1,
|
||||
ENERGY_MEGA_WATT_HOUR: 1 / 1000,
|
||||
ENERGY_GIGA_JOULE: 3.6 / 1000,
|
||||
}
|
||||
VALID_UNITS = {
|
||||
ENERGY_WATT_HOUR,
|
||||
ENERGY_KILO_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 (
|
||||
ATTR_DEVICE_CLASS,
|
||||
ATTR_UNIT_OF_MEASUREMENT,
|
||||
ENERGY_GIGA_JOULE,
|
||||
ENERGY_KILO_WATT_HOUR,
|
||||
ENERGY_MEGA_WATT_HOUR,
|
||||
ENERGY_WATT_HOUR,
|
||||
|
@ -703,6 +704,7 @@ async def test_cost_sensor_price_entity_total_no_reset(
|
|||
(ENERGY_WATT_HOUR, 1000),
|
||||
(ENERGY_KILO_WATT_HOUR, 1),
|
||||
(ENERGY_MEGA_WATT_HOUR, 0.001),
|
||||
(ENERGY_GIGA_JOULE, 0.001 * 3.6),
|
||||
],
|
||||
)
|
||||
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_KILO_WATT_HOUR}", 1),
|
||||
(f"EUR/{ENERGY_MEGA_WATT_HOUR}", 1000),
|
||||
(f"EUR/{ENERGY_GIGA_JOULE}", 1000 / 3.6),
|
||||
],
|
||||
)
|
||||
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.const import (
|
||||
ENERGY_GIGA_JOULE,
|
||||
ENERGY_KILO_WATT_HOUR,
|
||||
ENERGY_MEGA_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, {"last_reset": "abc"}),
|
||||
("measurement", ENERGY_KILO_WATT_HOUR, {"last_reset": "abc"}),
|
||||
("total_increasing", ENERGY_GIGA_JOULE, {}),
|
||||
],
|
||||
)
|
||||
async def test_validation(
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
import pytest
|
||||
|
||||
from homeassistant.const import (
|
||||
ENERGY_GIGA_JOULE,
|
||||
ENERGY_KILO_WATT_HOUR,
|
||||
ENERGY_MEGA_WATT_HOUR,
|
||||
ENERGY_WATT_HOUR,
|
||||
|
@ -78,6 +79,7 @@ INVALID_SYMBOL = "bob"
|
|||
(EnergyConverter, ENERGY_WATT_HOUR),
|
||||
(EnergyConverter, ENERGY_KILO_WATT_HOUR),
|
||||
(EnergyConverter, ENERGY_MEGA_WATT_HOUR),
|
||||
(EnergyConverter, ENERGY_GIGA_JOULE),
|
||||
(MassConverter, MASS_GRAMS),
|
||||
(MassConverter, MASS_KILOGRAMS),
|
||||
(MassConverter, MASS_MICROGRAMS),
|
||||
|
@ -268,6 +270,8 @@ def test_distance_convert(
|
|||
(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, 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(
|
||||
|
|
Loading…
Reference in New Issue