From 005bc8994d15bd4b30a98332ccfffeb4f70d848c Mon Sep 17 00:00:00 2001 From: SukramJ Date: Fri, 30 Dec 2022 13:55:14 +0100 Subject: [PATCH] Add mA to SensorDeviceClass.CURRENT units (#84492) fixes undefined --- homeassistant/components/number/__init__.py | 2 +- homeassistant/components/sensor/__init__.py | 6 +++-- homeassistant/util/unit_conversion.py | 13 ++++++++++ tests/util/test_unit_conversion.py | 28 +++++++++++++++++++++ 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/number/__init__.py b/homeassistant/components/number/__init__.py index 523cd50a6ed..de2580eab75 100644 --- a/homeassistant/components/number/__init__.py +++ b/homeassistant/components/number/__init__.py @@ -91,7 +91,7 @@ class NumberDeviceClass(StrEnum): CURRENT = "current" """Current. - Unit of measurement: `A` + Unit of measurement: `A`, `mA` """ DATA_RATE = "data_rate" diff --git a/homeassistant/components/sensor/__init__.py b/homeassistant/components/sensor/__init__.py index e893c0f9e79..2db8a7680c4 100644 --- a/homeassistant/components/sensor/__init__.py +++ b/homeassistant/components/sensor/__init__.py @@ -88,6 +88,7 @@ from homeassistant.util.unit_conversion import ( BaseUnitConverter, DataRateConverter, DistanceConverter, + ElectricCurrentConverter, ElectricPotentialConverter, InformationConverter, MassConverter, @@ -186,7 +187,7 @@ class SensorDeviceClass(StrEnum): CURRENT = "current" """Current. - Unit of measurement: `A` + Unit of measurement: `A`, `mA` """ DATA_RATE = "data_rate" @@ -472,6 +473,7 @@ UNIT_CONVERTERS: dict[SensorDeviceClass | str | None, type[BaseUnitConverter]] = SensorDeviceClass.DATA_RATE: DataRateConverter, SensorDeviceClass.DATA_SIZE: InformationConverter, SensorDeviceClass.DISTANCE: DistanceConverter, + SensorDeviceClass.CURRENT: ElectricCurrentConverter, SensorDeviceClass.GAS: VolumeConverter, SensorDeviceClass.PRECIPITATION: DistanceConverter, SensorDeviceClass.PRESSURE: PressureConverter, @@ -491,7 +493,7 @@ DEVICE_CLASS_UNITS: dict[SensorDeviceClass, set[type[StrEnum] | str | None]] = { SensorDeviceClass.BATTERY: {PERCENTAGE}, SensorDeviceClass.CO: {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_SIZE: set(UnitOfInformation), SensorDeviceClass.DISTANCE: set(UnitOfLength), diff --git a/homeassistant/util/unit_conversion.py b/homeassistant/util/unit_conversion.py index fc58014c143..f9f4d78899a 100644 --- a/homeassistant/util/unit_conversion.py +++ b/homeassistant/util/unit_conversion.py @@ -4,6 +4,7 @@ from __future__ import annotations from homeassistant.const import ( UNIT_NOT_RECOGNIZED_TEMPLATE, UnitOfDataRate, + UnitOfElectricCurrent, UnitOfElectricPotential, UnitOfEnergy, 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): """Utility to convert electric potential values.""" diff --git a/tests/util/test_unit_conversion.py b/tests/util/test_unit_conversion.py index 7271f414cce..4367d166aed 100644 --- a/tests/util/test_unit_conversion.py +++ b/tests/util/test_unit_conversion.py @@ -3,6 +3,7 @@ import pytest from homeassistant.const import ( UnitOfDataRate, + UnitOfElectricCurrent, UnitOfEnergy, UnitOfInformation, UnitOfLength, @@ -19,6 +20,7 @@ from homeassistant.util.unit_conversion import ( BaseUnitConverter, DataRateConverter, DistanceConverter, + ElectricCurrentConverter, EnergyConverter, InformationConverter, MassConverter, @@ -44,6 +46,8 @@ INVALID_SYMBOL = "bob" (DistanceConverter, UnitOfLength.YARDS), (DistanceConverter, UnitOfLength.FEET), (DistanceConverter, UnitOfLength.INCHES), + (ElectricCurrentConverter, UnitOfElectricCurrent.AMPERE), + (ElectricCurrentConverter, UnitOfElectricCurrent.MILLIAMPERE), (EnergyConverter, UnitOfEnergy.WATT_HOUR), (EnergyConverter, UnitOfEnergy.KILO_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), (DistanceConverter, UnitOfLength.KILOMETERS), + (ElectricCurrentConverter, UnitOfElectricCurrent.AMPERE), (EnergyConverter, UnitOfEnergy.KILO_WATT_HOUR), (InformationConverter, UnitOfInformation.GIBIBYTES), (MassConverter, UnitOfMass.GRAMS), @@ -157,6 +162,12 @@ def test_convert_nonnumeric_value( 8, ), (DistanceConverter, UnitOfLength.KILOMETERS, UnitOfLength.METERS, 1 / 1000), + ( + ElectricCurrentConverter, + UnitOfElectricCurrent.AMPERE, + UnitOfElectricCurrent.MILLIAMPERE, + 1 / 1000, + ), (EnergyConverter, UnitOfEnergy.WATT_HOUR, UnitOfEnergy.KILO_WATT_HOUR, 1000), (InformationConverter, UnitOfInformation.BITS, UnitOfInformation.BYTES, 8), (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( "value,from_unit,expected,to_unit", [