Convert UnitConverter protocol to a class (#78934)

* Convert UnitConverter protocl to a class

* Remove logic change

* Use TypeVar

* Remove NORMALIZED_UNIT from pressure

* Reduce size of PR

* Reduce some more

* Once more

* Once more

* Remove DEVICE_CLASS
This commit is contained in:
epenet 2022-09-22 14:15:22 +02:00 committed by GitHub
parent 27d1c1f471
commit 6002377d4f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 103 additions and 37 deletions

View File

@ -28,8 +28,8 @@ from homeassistant.helpers.config_validation import ( # noqa: F401
from homeassistant.helpers.entity import Entity, EntityDescription from homeassistant.helpers.entity import Entity, EntityDescription
from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers.entity_component import EntityComponent
from homeassistant.helpers.restore_state import ExtraStoredData, RestoreEntity from homeassistant.helpers.restore_state import ExtraStoredData, RestoreEntity
from homeassistant.helpers.typing import ConfigType, UnitConverter from homeassistant.helpers.typing import ConfigType
from homeassistant.util import temperature as temperature_util from homeassistant.util.unit_conversion import BaseUnitConverter, TemperatureConverter
from .const import ( from .const import (
ATTR_MAX, ATTR_MAX,
@ -70,8 +70,8 @@ class NumberMode(StrEnum):
SLIDER = "slider" SLIDER = "slider"
UNIT_CONVERTERS: dict[str, UnitConverter] = { UNIT_CONVERTERS: dict[str, type[BaseUnitConverter]] = {
NumberDeviceClass.TEMPERATURE: temperature_util, NumberDeviceClass.TEMPERATURE: TemperatureConverter,
} }
# mypy: disallow-any-generics # mypy: disallow-any-generics

View File

@ -29,7 +29,7 @@ from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import entity_registry from homeassistant.helpers import entity_registry
from homeassistant.helpers.json import JSONEncoder from homeassistant.helpers.json import JSONEncoder
from homeassistant.helpers.storage import STORAGE_DIR from homeassistant.helpers.storage import STORAGE_DIR
from homeassistant.helpers.typing import UNDEFINED, UndefinedType, UnitConverter from homeassistant.helpers.typing import UNDEFINED, UndefinedType
from homeassistant.util import ( from homeassistant.util import (
dt as dt_util, dt as dt_util,
energy as energy_util, energy as energy_util,
@ -38,6 +38,14 @@ from homeassistant.util import (
temperature as temperature_util, temperature as temperature_util,
volume as volume_util, volume as volume_util,
) )
from homeassistant.util.unit_conversion import (
BaseUnitConverter,
EnergyConverter,
PowerConverter,
PressureConverter,
TemperatureConverter,
VolumeConverter,
)
from .const import DOMAIN, MAX_ROWS_TO_PURGE, SupportedDialect from .const import DOMAIN, MAX_ROWS_TO_PURGE, SupportedDialect
from .db_schema import Statistics, StatisticsMeta, StatisticsRuns, StatisticsShortTerm from .db_schema import Statistics, StatisticsMeta, StatisticsRuns, StatisticsShortTerm
@ -179,12 +187,12 @@ STATISTIC_UNIT_TO_UNIT_CLASS: dict[str | None, str] = {
volume_util.NORMALIZED_UNIT: "volume", volume_util.NORMALIZED_UNIT: "volume",
} }
STATISTIC_UNIT_TO_UNIT_CONVERTER: dict[str | None, UnitConverter] = { STATISTIC_UNIT_TO_UNIT_CONVERTER: dict[str | None, type[BaseUnitConverter]] = {
energy_util.NORMALIZED_UNIT: energy_util, energy_util.NORMALIZED_UNIT: EnergyConverter,
power_util.NORMALIZED_UNIT: power_util, power_util.NORMALIZED_UNIT: PowerConverter,
pressure_util.NORMALIZED_UNIT: pressure_util, pressure_util.NORMALIZED_UNIT: PressureConverter,
temperature_util.NORMALIZED_UNIT: temperature_util, temperature_util.NORMALIZED_UNIT: TemperatureConverter,
volume_util.NORMALIZED_UNIT: volume_util, volume_util.NORMALIZED_UNIT: VolumeConverter,
} }
# Convert energy power, pressure, temperature and volume statistics from the # Convert energy power, pressure, temperature and volume statistics from the

View File

@ -56,11 +56,12 @@ from homeassistant.helpers.config_validation import ( # noqa: F401
from homeassistant.helpers.entity import Entity, EntityDescription from homeassistant.helpers.entity import Entity, EntityDescription
from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers.entity_component import EntityComponent
from homeassistant.helpers.restore_state import ExtraStoredData, RestoreEntity from homeassistant.helpers.restore_state import ExtraStoredData, RestoreEntity
from homeassistant.helpers.typing import ConfigType, StateType, UnitConverter from homeassistant.helpers.typing import ConfigType, StateType
from homeassistant.util import ( from homeassistant.util import dt as dt_util, pressure as pressure_util
dt as dt_util, from homeassistant.util.unit_conversion import (
pressure as pressure_util, BaseUnitConverter,
temperature as temperature_util, PressureConverter,
TemperatureConverter,
) )
from .const import CONF_STATE_CLASS # noqa: F401 from .const import CONF_STATE_CLASS # noqa: F401
@ -207,9 +208,9 @@ STATE_CLASS_TOTAL: Final = "total"
STATE_CLASS_TOTAL_INCREASING: Final = "total_increasing" STATE_CLASS_TOTAL_INCREASING: Final = "total_increasing"
STATE_CLASSES: Final[list[str]] = [cls.value for cls in SensorStateClass] STATE_CLASSES: Final[list[str]] = [cls.value for cls in SensorStateClass]
UNIT_CONVERTERS: dict[str, UnitConverter] = { UNIT_CONVERTERS: dict[str, type[BaseUnitConverter]] = {
SensorDeviceClass.PRESSURE: pressure_util, SensorDeviceClass.PRESSURE: PressureConverter,
SensorDeviceClass.TEMPERATURE: temperature_util, SensorDeviceClass.TEMPERATURE: TemperatureConverter,
} }
UNIT_RATIOS: dict[str, dict[str, float]] = { UNIT_RATIOS: dict[str, dict[str, float]] = {

View File

@ -47,7 +47,6 @@ from homeassistant.const import (
from homeassistant.core import HomeAssistant, State from homeassistant.core import HomeAssistant, State
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity import entity_sources from homeassistant.helpers.entity import entity_sources
from homeassistant.helpers.typing import UnitConverter
from homeassistant.util import ( from homeassistant.util import (
dt as dt_util, dt as dt_util,
energy as energy_util, energy as energy_util,
@ -56,6 +55,14 @@ from homeassistant.util import (
temperature as temperature_util, temperature as temperature_util,
volume as volume_util, volume as volume_util,
) )
from homeassistant.util.unit_conversion import (
BaseUnitConverter,
EnergyConverter,
PowerConverter,
PressureConverter,
TemperatureConverter,
VolumeConverter,
)
from . import ( from . import (
ATTR_LAST_RESET, ATTR_LAST_RESET,
@ -76,12 +83,12 @@ DEFAULT_STATISTICS = {
STATE_CLASS_TOTAL_INCREASING: {"sum"}, STATE_CLASS_TOTAL_INCREASING: {"sum"},
} }
UNIT_CONVERTERS: dict[str, UnitConverter] = { UNIT_CONVERTERS: dict[str, type[BaseUnitConverter]] = {
SensorDeviceClass.ENERGY: energy_util, SensorDeviceClass.ENERGY: EnergyConverter,
SensorDeviceClass.POWER: power_util, SensorDeviceClass.POWER: PowerConverter,
SensorDeviceClass.PRESSURE: pressure_util, SensorDeviceClass.PRESSURE: PressureConverter,
SensorDeviceClass.TEMPERATURE: temperature_util, SensorDeviceClass.TEMPERATURE: TemperatureConverter,
SensorDeviceClass.GAS: volume_util, SensorDeviceClass.GAS: VolumeConverter,
} }
UNIT_CONVERSIONS: dict[str, dict[str, Callable]] = { UNIT_CONVERSIONS: dict[str, dict[str, Callable]] = {

View File

@ -1,7 +1,7 @@
"""Typing Helpers for Home Assistant.""" """Typing Helpers for Home Assistant."""
from collections.abc import Mapping from collections.abc import Mapping
from enum import Enum from enum import Enum
from typing import Any, Optional, Protocol, Union from typing import Any, Optional, Union
import homeassistant.core import homeassistant.core
@ -27,16 +27,6 @@ class UndefinedType(Enum):
UNDEFINED = UndefinedType._singleton # pylint: disable=protected-access UNDEFINED = UndefinedType._singleton # pylint: disable=protected-access
class UnitConverter(Protocol):
"""Define the format of a conversion utility."""
VALID_UNITS: tuple[str, ...]
NORMALIZED_UNIT: str
def convert(self, value: float, from_unit: str, to_unit: str) -> float:
"""Convert one unit of measurement to another."""
# The following types should not used and # The following types should not used and
# are not present in the core code base. # are not present in the core code base.
# They are kept in order not to break custom integrations # They are kept in order not to break custom integrations

View File

@ -0,0 +1,60 @@
"""Typing Helpers for Home Assistant."""
from __future__ import annotations
from collections.abc import Callable
from . import (
energy as energy_util,
power as power_util,
pressure as pressure_util,
temperature as temperature_util,
volume as volume_util,
)
class BaseUnitConverter:
"""Define the format of a conversion utility."""
NORMALIZED_UNIT: str
VALID_UNITS: tuple[str, ...]
convert: Callable[[float, str, str], float]
class EnergyConverter(BaseUnitConverter):
"""Utility to convert energy values."""
NORMALIZED_UNIT = energy_util.NORMALIZED_UNIT
VALID_UNITS = energy_util.VALID_UNITS
convert = energy_util.convert
class PowerConverter(BaseUnitConverter):
"""Utility to convert power values."""
NORMALIZED_UNIT = power_util.NORMALIZED_UNIT
VALID_UNITS = power_util.VALID_UNITS
convert = power_util.convert
class PressureConverter(BaseUnitConverter):
"""Utility to convert pressure values."""
NORMALIZED_UNIT = pressure_util.NORMALIZED_UNIT
VALID_UNITS = pressure_util.VALID_UNITS
convert = pressure_util.convert
class TemperatureConverter(BaseUnitConverter):
"""Utility to convert temperature values."""
NORMALIZED_UNIT = temperature_util.NORMALIZED_UNIT
VALID_UNITS = temperature_util.VALID_UNITS
convert = temperature_util.convert
class VolumeConverter(BaseUnitConverter):
"""Utility to convert volume values."""
NORMALIZED_UNIT = volume_util.NORMALIZED_UNIT
VALID_UNITS = volume_util.VALID_UNITS
convert = volume_util.convert