1
0
mirror of https://github.com/home-assistant/core.git synced 2026-02-15 07:36:16 +00:00

Align number unit converters with sensor (#162662)

This commit is contained in:
Abílio Costa
2026-02-11 22:07:04 +00:00
committed by GitHub
parent db55dfe3c7
commit fd78e35a86
3 changed files with 71 additions and 11 deletions

View File

@@ -47,10 +47,35 @@ from homeassistant.const import (
UnitOfVolumetricFlux,
)
from homeassistant.util.unit_conversion import (
ApparentPowerConverter,
AreaConverter,
BaseUnitConverter,
BloodGlucoseConcentrationConverter,
CarbonMonoxideConcentrationConverter,
ConductivityConverter,
DataRateConverter,
DistanceConverter,
DurationConverter,
ElectricCurrentConverter,
ElectricPotentialConverter,
EnergyConverter,
EnergyDistanceConverter,
InformationConverter,
MassConverter,
MassVolumeConcentrationConverter,
NitrogenDioxideConcentrationConverter,
NitrogenMonoxideConcentrationConverter,
OzoneConcentrationConverter,
PowerConverter,
PressureConverter,
ReactiveEnergyConverter,
ReactivePowerConverter,
SpeedConverter,
SulphurDioxideConcentrationConverter,
TemperatureConverter,
TemperatureDeltaConverter,
UnitlessRatioConverter,
VolumeConverter,
VolumeFlowRateConverter,
)
@@ -587,10 +612,45 @@ DEVICE_CLASS_UNITS: dict[NumberDeviceClass, set[type[StrEnum] | str | None]] = {
}
UNIT_CONVERTERS: dict[NumberDeviceClass, type[BaseUnitConverter]] = {
NumberDeviceClass.APPARENT_POWER: ApparentPowerConverter,
NumberDeviceClass.ABSOLUTE_HUMIDITY: MassVolumeConcentrationConverter,
NumberDeviceClass.AREA: AreaConverter,
NumberDeviceClass.ATMOSPHERIC_PRESSURE: PressureConverter,
NumberDeviceClass.BLOOD_GLUCOSE_CONCENTRATION: BloodGlucoseConcentrationConverter,
NumberDeviceClass.CO: CarbonMonoxideConcentrationConverter,
NumberDeviceClass.CONDUCTIVITY: ConductivityConverter,
NumberDeviceClass.CURRENT: ElectricCurrentConverter,
NumberDeviceClass.DATA_RATE: DataRateConverter,
NumberDeviceClass.DATA_SIZE: InformationConverter,
NumberDeviceClass.DISTANCE: DistanceConverter,
NumberDeviceClass.DURATION: DurationConverter,
NumberDeviceClass.ENERGY: EnergyConverter,
NumberDeviceClass.ENERGY_DISTANCE: EnergyDistanceConverter,
NumberDeviceClass.ENERGY_STORAGE: EnergyConverter,
NumberDeviceClass.GAS: VolumeConverter,
NumberDeviceClass.NITROGEN_DIOXIDE: NitrogenDioxideConcentrationConverter,
NumberDeviceClass.NITROGEN_MONOXIDE: NitrogenMonoxideConcentrationConverter,
NumberDeviceClass.OZONE: OzoneConcentrationConverter,
NumberDeviceClass.POWER: PowerConverter,
NumberDeviceClass.POWER_FACTOR: UnitlessRatioConverter,
NumberDeviceClass.PRECIPITATION: DistanceConverter,
NumberDeviceClass.PRECIPITATION_INTENSITY: SpeedConverter,
NumberDeviceClass.PRESSURE: PressureConverter,
NumberDeviceClass.REACTIVE_ENERGY: ReactiveEnergyConverter,
NumberDeviceClass.REACTIVE_POWER: ReactivePowerConverter,
NumberDeviceClass.SULPHUR_DIOXIDE: SulphurDioxideConcentrationConverter,
NumberDeviceClass.SPEED: SpeedConverter,
NumberDeviceClass.TEMPERATURE: TemperatureConverter,
NumberDeviceClass.TEMPERATURE_DELTA: TemperatureDeltaConverter,
NumberDeviceClass.VOLATILE_ORGANIC_COMPOUNDS: MassVolumeConcentrationConverter,
NumberDeviceClass.VOLATILE_ORGANIC_COMPOUNDS_PARTS: UnitlessRatioConverter,
NumberDeviceClass.VOLTAGE: ElectricPotentialConverter,
NumberDeviceClass.VOLUME: VolumeConverter,
NumberDeviceClass.VOLUME_STORAGE: VolumeConverter,
NumberDeviceClass.VOLUME_FLOW_RATE: VolumeFlowRateConverter,
NumberDeviceClass.WATER: VolumeConverter,
NumberDeviceClass.WEIGHT: MassConverter,
NumberDeviceClass.WIND_SPEED: SpeedConverter,
}
# We translate units that were using using the legacy coding of μ \u00b5

View File

@@ -37,17 +37,6 @@ async def test_device_class_units(
assert msg["success"]
assert msg["result"] == {"units": ["K", "°C", "°F"]}
# Device class with units which number doesn't allow customizing & converting
await client.send_json_auto_id(
{
"type": "number/device_class_convertible_units",
"device_class": "energy",
}
)
msg = await client.receive_json()
assert msg["success"]
assert msg["result"] == {"units": []}
# Unknown device class
await client.send_json_auto_id(
{

View File

@@ -14,6 +14,7 @@ import pytest
from homeassistant.components import sensor
from homeassistant.components.number import (
AMBIGUOUS_UNITS as NUMBER_AMBIGUOUS_UNITS,
UNIT_CONVERTERS as NUMBER_UNIT_CONVERTERS,
NumberDeviceClass,
)
from homeassistant.components.sensor import (
@@ -2118,6 +2119,16 @@ def test_device_classes_aligned() -> None:
assert getattr(SensorDeviceClass, device_class.name).value == device_class.value
def test_unit_converters_aligned() -> None:
"""Make sure all number unit converters are also available in sensor converters."""
assert len(NUMBER_UNIT_CONVERTERS) == len(UNIT_CONVERTERS)
for device_class, converter in NUMBER_UNIT_CONVERTERS.items():
assert device_class.value in UNIT_CONVERTERS
assert UNIT_CONVERTERS[device_class.value] == converter
async def test_value_unknown_in_enumeration(
hass: HomeAssistant,
caplog: pytest.LogCaptureFixture,