parent
df2d0cd3e3
commit
005bc8994d
4 changed files with 46 additions and 3 deletions
|
@ -91,7 +91,7 @@ class NumberDeviceClass(StrEnum):
|
||||||
CURRENT = "current"
|
CURRENT = "current"
|
||||||
"""Current.
|
"""Current.
|
||||||
|
|
||||||
Unit of measurement: `A`
|
Unit of measurement: `A`, `mA`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
DATA_RATE = "data_rate"
|
DATA_RATE = "data_rate"
|
||||||
|
|
|
@ -88,6 +88,7 @@ from homeassistant.util.unit_conversion import (
|
||||||
BaseUnitConverter,
|
BaseUnitConverter,
|
||||||
DataRateConverter,
|
DataRateConverter,
|
||||||
DistanceConverter,
|
DistanceConverter,
|
||||||
|
ElectricCurrentConverter,
|
||||||
ElectricPotentialConverter,
|
ElectricPotentialConverter,
|
||||||
InformationConverter,
|
InformationConverter,
|
||||||
MassConverter,
|
MassConverter,
|
||||||
|
@ -186,7 +187,7 @@ class SensorDeviceClass(StrEnum):
|
||||||
CURRENT = "current"
|
CURRENT = "current"
|
||||||
"""Current.
|
"""Current.
|
||||||
|
|
||||||
Unit of measurement: `A`
|
Unit of measurement: `A`, `mA`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
DATA_RATE = "data_rate"
|
DATA_RATE = "data_rate"
|
||||||
|
@ -472,6 +473,7 @@ UNIT_CONVERTERS: dict[SensorDeviceClass | str | None, type[BaseUnitConverter]] =
|
||||||
SensorDeviceClass.DATA_RATE: DataRateConverter,
|
SensorDeviceClass.DATA_RATE: DataRateConverter,
|
||||||
SensorDeviceClass.DATA_SIZE: InformationConverter,
|
SensorDeviceClass.DATA_SIZE: InformationConverter,
|
||||||
SensorDeviceClass.DISTANCE: DistanceConverter,
|
SensorDeviceClass.DISTANCE: DistanceConverter,
|
||||||
|
SensorDeviceClass.CURRENT: ElectricCurrentConverter,
|
||||||
SensorDeviceClass.GAS: VolumeConverter,
|
SensorDeviceClass.GAS: VolumeConverter,
|
||||||
SensorDeviceClass.PRECIPITATION: DistanceConverter,
|
SensorDeviceClass.PRECIPITATION: DistanceConverter,
|
||||||
SensorDeviceClass.PRESSURE: PressureConverter,
|
SensorDeviceClass.PRESSURE: PressureConverter,
|
||||||
|
@ -491,7 +493,7 @@ DEVICE_CLASS_UNITS: dict[SensorDeviceClass, set[type[StrEnum] | str | None]] = {
|
||||||
SensorDeviceClass.BATTERY: {PERCENTAGE},
|
SensorDeviceClass.BATTERY: {PERCENTAGE},
|
||||||
SensorDeviceClass.CO: {CONCENTRATION_PARTS_PER_MILLION},
|
SensorDeviceClass.CO: {CONCENTRATION_PARTS_PER_MILLION},
|
||||||
SensorDeviceClass.CO2: {CONCENTRATION_PARTS_PER_MILLION},
|
SensorDeviceClass.CO2: {CONCENTRATION_PARTS_PER_MILLION},
|
||||||
SensorDeviceClass.CURRENT: {UnitOfElectricCurrent.AMPERE},
|
SensorDeviceClass.CURRENT: set(UnitOfElectricCurrent),
|
||||||
SensorDeviceClass.DATA_RATE: set(UnitOfDataRate),
|
SensorDeviceClass.DATA_RATE: set(UnitOfDataRate),
|
||||||
SensorDeviceClass.DATA_SIZE: set(UnitOfInformation),
|
SensorDeviceClass.DATA_SIZE: set(UnitOfInformation),
|
||||||
SensorDeviceClass.DISTANCE: set(UnitOfLength),
|
SensorDeviceClass.DISTANCE: set(UnitOfLength),
|
||||||
|
|
|
@ -4,6 +4,7 @@ from __future__ import annotations
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
UNIT_NOT_RECOGNIZED_TEMPLATE,
|
UNIT_NOT_RECOGNIZED_TEMPLATE,
|
||||||
UnitOfDataRate,
|
UnitOfDataRate,
|
||||||
|
UnitOfElectricCurrent,
|
||||||
UnitOfElectricPotential,
|
UnitOfElectricPotential,
|
||||||
UnitOfEnergy,
|
UnitOfEnergy,
|
||||||
UnitOfInformation,
|
UnitOfInformation,
|
||||||
|
@ -138,6 +139,18 @@ class DistanceConverter(BaseUnitConverter):
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ElectricCurrentConverter(BaseUnitConverter):
|
||||||
|
"""Utility to convert electric current values."""
|
||||||
|
|
||||||
|
UNIT_CLASS = "electric_current"
|
||||||
|
NORMALIZED_UNIT = UnitOfElectricCurrent.AMPERE
|
||||||
|
_UNIT_CONVERSION: dict[str, float] = {
|
||||||
|
UnitOfElectricCurrent.AMPERE: 1,
|
||||||
|
UnitOfElectricCurrent.MILLIAMPERE: 1e3,
|
||||||
|
}
|
||||||
|
VALID_UNITS = set(UnitOfElectricCurrent)
|
||||||
|
|
||||||
|
|
||||||
class ElectricPotentialConverter(BaseUnitConverter):
|
class ElectricPotentialConverter(BaseUnitConverter):
|
||||||
"""Utility to convert electric potential values."""
|
"""Utility to convert electric potential values."""
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ import pytest
|
||||||
|
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
UnitOfDataRate,
|
UnitOfDataRate,
|
||||||
|
UnitOfElectricCurrent,
|
||||||
UnitOfEnergy,
|
UnitOfEnergy,
|
||||||
UnitOfInformation,
|
UnitOfInformation,
|
||||||
UnitOfLength,
|
UnitOfLength,
|
||||||
|
@ -19,6 +20,7 @@ from homeassistant.util.unit_conversion import (
|
||||||
BaseUnitConverter,
|
BaseUnitConverter,
|
||||||
DataRateConverter,
|
DataRateConverter,
|
||||||
DistanceConverter,
|
DistanceConverter,
|
||||||
|
ElectricCurrentConverter,
|
||||||
EnergyConverter,
|
EnergyConverter,
|
||||||
InformationConverter,
|
InformationConverter,
|
||||||
MassConverter,
|
MassConverter,
|
||||||
|
@ -44,6 +46,8 @@ INVALID_SYMBOL = "bob"
|
||||||
(DistanceConverter, UnitOfLength.YARDS),
|
(DistanceConverter, UnitOfLength.YARDS),
|
||||||
(DistanceConverter, UnitOfLength.FEET),
|
(DistanceConverter, UnitOfLength.FEET),
|
||||||
(DistanceConverter, UnitOfLength.INCHES),
|
(DistanceConverter, UnitOfLength.INCHES),
|
||||||
|
(ElectricCurrentConverter, UnitOfElectricCurrent.AMPERE),
|
||||||
|
(ElectricCurrentConverter, UnitOfElectricCurrent.MILLIAMPERE),
|
||||||
(EnergyConverter, UnitOfEnergy.WATT_HOUR),
|
(EnergyConverter, UnitOfEnergy.WATT_HOUR),
|
||||||
(EnergyConverter, UnitOfEnergy.KILO_WATT_HOUR),
|
(EnergyConverter, UnitOfEnergy.KILO_WATT_HOUR),
|
||||||
(EnergyConverter, UnitOfEnergy.MEGA_WATT_HOUR),
|
(EnergyConverter, UnitOfEnergy.MEGA_WATT_HOUR),
|
||||||
|
@ -93,6 +97,7 @@ def test_convert_same_unit(converter: type[BaseUnitConverter], valid_unit: str)
|
||||||
[
|
[
|
||||||
(DataRateConverter, UnitOfDataRate.GIBIBYTES_PER_SECOND),
|
(DataRateConverter, UnitOfDataRate.GIBIBYTES_PER_SECOND),
|
||||||
(DistanceConverter, UnitOfLength.KILOMETERS),
|
(DistanceConverter, UnitOfLength.KILOMETERS),
|
||||||
|
(ElectricCurrentConverter, UnitOfElectricCurrent.AMPERE),
|
||||||
(EnergyConverter, UnitOfEnergy.KILO_WATT_HOUR),
|
(EnergyConverter, UnitOfEnergy.KILO_WATT_HOUR),
|
||||||
(InformationConverter, UnitOfInformation.GIBIBYTES),
|
(InformationConverter, UnitOfInformation.GIBIBYTES),
|
||||||
(MassConverter, UnitOfMass.GRAMS),
|
(MassConverter, UnitOfMass.GRAMS),
|
||||||
|
@ -157,6 +162,12 @@ def test_convert_nonnumeric_value(
|
||||||
8,
|
8,
|
||||||
),
|
),
|
||||||
(DistanceConverter, UnitOfLength.KILOMETERS, UnitOfLength.METERS, 1 / 1000),
|
(DistanceConverter, UnitOfLength.KILOMETERS, UnitOfLength.METERS, 1 / 1000),
|
||||||
|
(
|
||||||
|
ElectricCurrentConverter,
|
||||||
|
UnitOfElectricCurrent.AMPERE,
|
||||||
|
UnitOfElectricCurrent.MILLIAMPERE,
|
||||||
|
1 / 1000,
|
||||||
|
),
|
||||||
(EnergyConverter, UnitOfEnergy.WATT_HOUR, UnitOfEnergy.KILO_WATT_HOUR, 1000),
|
(EnergyConverter, UnitOfEnergy.WATT_HOUR, UnitOfEnergy.KILO_WATT_HOUR, 1000),
|
||||||
(InformationConverter, UnitOfInformation.BITS, UnitOfInformation.BYTES, 8),
|
(InformationConverter, UnitOfInformation.BITS, UnitOfInformation.BYTES, 8),
|
||||||
(PowerConverter, UnitOfPower.WATT, UnitOfPower.KILO_WATT, 1000),
|
(PowerConverter, UnitOfPower.WATT, UnitOfPower.KILO_WATT, 1000),
|
||||||
|
@ -235,6 +246,23 @@ def test_data_rate_convert(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"value,from_unit,expected,to_unit",
|
||||||
|
[
|
||||||
|
(5, UnitOfElectricCurrent.AMPERE, 5000, UnitOfElectricCurrent.MILLIAMPERE),
|
||||||
|
(5, UnitOfElectricCurrent.MILLIAMPERE, 0.005, UnitOfElectricCurrent.AMPERE),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_electric_current_convert(
|
||||||
|
value: float,
|
||||||
|
from_unit: str,
|
||||||
|
expected: float,
|
||||||
|
to_unit: str,
|
||||||
|
) -> None:
|
||||||
|
"""Test conversion to other units."""
|
||||||
|
assert ElectricCurrentConverter.convert(value, from_unit, to_unit) == expected
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"value,from_unit,expected,to_unit",
|
"value,from_unit,expected,to_unit",
|
||||||
[
|
[
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue