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
Erik Montnemery 2022-10-25 16:43:00 +02:00 committed by GitHub
parent e9a3982560
commit 727eccfec4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 33 additions and 4 deletions

View File

@ -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:

View File

@ -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),
}

View File

@ -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"

View File

@ -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"

View File

@ -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,
}

View File

@ -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(

View File

@ -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(

View File

@ -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(