Move hortimax UNIT_DESCRIPTIONS into sensor.py (#178553)

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Willem Vooijs
2026-08-14 15:11:35 +02:00
committed by GitHub
co-authored by Claude Sonnet 5
parent 578c553e6a
commit 253afde1a8
2 changed files with 74 additions and 64 deletions
@@ -3,7 +3,6 @@
import logging
from typing import Final
from homeassistant.components.sensor import SensorDeviceClass, SensorEntityDescription
from homeassistant.const import (
DEGREE,
LIGHT_LUX,
@@ -101,64 +100,3 @@ UNIT_MAP: Final[dict[str, str]] = {
"Watt": UnitOfPower.WATT,
"Kilowatt": UnitOfPower.KILO_WATT,
}
# Everything that follows from the unit alone. Device classes that also need
# the readout identifier or its source (humidity, CO2, wind, gas) are set in
# sensor.py. Precision is display only, and needs a default because the API
# emits float32-converted doubles (90.15303039550781 %).
UNIT_DESCRIPTIONS: Final[dict[str, SensorEntityDescription]] = {
unit: SensorEntityDescription(
key=unit,
native_unit_of_measurement=unit,
device_class=device_class,
suggested_display_precision=precision,
)
for unit, device_class, precision in (
(UnitOfTemperature.CELSIUS, SensorDeviceClass.TEMPERATURE, 1),
(UnitOfTemperature.FAHRENHEIT, SensorDeviceClass.TEMPERATURE, 1),
(UnitOfTemperature.KELVIN, SensorDeviceClass.TEMPERATURE, 1),
(PERCENTAGE, None, 1),
("g/kg", None, 1),
("g/m³", None, 1),
("J/cm²", None, 1),
("J/m²", None, 0),
(UnitOfSpeed.METERS_PER_SECOND, None, 1),
(UnitOfSpeed.KILOMETERS_PER_HOUR, None, 1),
(UnitOfVolumeFlowRate.LITERS_PER_MINUTE, SensorDeviceClass.VOLUME_FLOW_RATE, 1),
(
UnitOfVolumeFlowRate.CUBIC_METERS_PER_HOUR,
SensorDeviceClass.VOLUME_FLOW_RATE,
1,
),
("l/m²", None, 1),
("ml/m²", None, 0),
(UnitOfEnergy.KILO_WATT_HOUR, SensorDeviceClass.ENERGY, 2),
(UnitOfVolume.CUBIC_METERS, None, 2),
(UnitOfVolume.LITERS, None, 1),
(UnitOfVolume.MILLILITERS, None, 0),
(UnitOfTime.SECONDS, SensorDeviceClass.DURATION, 0),
(UnitOfTime.MINUTES, SensorDeviceClass.DURATION, 0),
(UnitOfTime.HOURS, SensorDeviceClass.DURATION, 1),
(UnitOfIrradiance.WATTS_PER_SQUARE_METER, SensorDeviceClass.IRRADIANCE, 0),
(UnitOfRatio.PARTS_PER_MILLION, None, 0),
(LIGHT_LUX, SensorDeviceClass.ILLUMINANCE, 0),
(UnitOfConductivity.MILLISIEMENS_PER_CM, SensorDeviceClass.CONDUCTIVITY, 2),
(UnitOfConductivity.MICROSIEMENS_PER_CM, SensorDeviceClass.CONDUCTIVITY, 0),
(UnitOfPressure.BAR, SensorDeviceClass.PRESSURE, 2),
(UnitOfPressure.MBAR, SensorDeviceClass.PRESSURE, 0),
(UnitOfPressure.HPA, SensorDeviceClass.PRESSURE, 0),
(UnitOfPressure.PA, SensorDeviceClass.PRESSURE, 0),
("µmol/m²/s", None, 0),
("mol/m²/d", None, 1),
(DEGREE, None, 0),
(UnitOfPower.WATT, SensorDeviceClass.POWER, 0),
(UnitOfPower.KILO_WATT, SensorDeviceClass.POWER, 2),
(UnitOfMass.KILOGRAMS, SensorDeviceClass.WEIGHT, 1),
(UnitOfMass.GRAMS, SensorDeviceClass.WEIGHT, 0),
)
} | {
# pH is dimensionless (a logarithmic ratio), so SensorDeviceClass.PH takes no unit.
"pH": SensorEntityDescription(
key="pH", device_class=SensorDeviceClass.PH, suggested_display_precision=1
)
}
+74 -2
View File
@@ -3,7 +3,7 @@
from dataclasses import replace
from datetime import datetime, timedelta
from math import isfinite
from typing import override
from typing import Final, override
from aiohortos import (
Readout,
@@ -21,10 +21,21 @@ from homeassistant.components.sensor import (
)
from homeassistant.const import (
DEGREE,
LIGHT_LUX,
PERCENTAGE,
EntityCategory,
UnitOfConductivity,
UnitOfEnergy,
UnitOfIrradiance,
UnitOfMass,
UnitOfPower,
UnitOfPressure,
UnitOfRatio,
UnitOfSpeed,
UnitOfTemperature,
UnitOfTime,
UnitOfVolume,
UnitOfVolumeFlowRate,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
@@ -35,7 +46,6 @@ from .const import (
READOUT_ICONS,
SECONDS_PER_DAY,
TIME_OF_DAY_READOUTS,
UNIT_DESCRIPTIONS,
UNIT_MAP,
WIND_DIRECTION_SUBJECT,
)
@@ -45,6 +55,68 @@ from .entity import HortimaxEntity
PARALLEL_UPDATES = 0
# Everything that follows from the unit alone. Device classes that also need
# the readout identifier or its source (humidity, CO2, wind, gas) are set
# below in `_describe`. Precision is display only, and needs a default
# because the API emits float32-converted doubles (90.15303039550781 %).
UNIT_DESCRIPTIONS: Final[dict[str, SensorEntityDescription]] = {
unit: SensorEntityDescription(
key=unit,
native_unit_of_measurement=unit,
device_class=device_class,
suggested_display_precision=precision,
)
for unit, device_class, precision in (
(UnitOfTemperature.CELSIUS, SensorDeviceClass.TEMPERATURE, 1),
(UnitOfTemperature.FAHRENHEIT, SensorDeviceClass.TEMPERATURE, 1),
(UnitOfTemperature.KELVIN, SensorDeviceClass.TEMPERATURE, 1),
(PERCENTAGE, None, 1),
("g/kg", None, 1),
("g/m³", None, 1),
("J/cm²", None, 1),
("J/m²", None, 0),
(UnitOfSpeed.METERS_PER_SECOND, None, 1),
(UnitOfSpeed.KILOMETERS_PER_HOUR, None, 1),
(UnitOfVolumeFlowRate.LITERS_PER_MINUTE, SensorDeviceClass.VOLUME_FLOW_RATE, 1),
(
UnitOfVolumeFlowRate.CUBIC_METERS_PER_HOUR,
SensorDeviceClass.VOLUME_FLOW_RATE,
1,
),
("l/m²", None, 1),
("ml/m²", None, 0),
(UnitOfEnergy.KILO_WATT_HOUR, SensorDeviceClass.ENERGY, 2),
(UnitOfVolume.CUBIC_METERS, None, 2),
(UnitOfVolume.LITERS, None, 1),
(UnitOfVolume.MILLILITERS, None, 0),
(UnitOfTime.SECONDS, SensorDeviceClass.DURATION, 0),
(UnitOfTime.MINUTES, SensorDeviceClass.DURATION, 0),
(UnitOfTime.HOURS, SensorDeviceClass.DURATION, 1),
(UnitOfIrradiance.WATTS_PER_SQUARE_METER, SensorDeviceClass.IRRADIANCE, 0),
(UnitOfRatio.PARTS_PER_MILLION, None, 0),
(LIGHT_LUX, SensorDeviceClass.ILLUMINANCE, 0),
(UnitOfConductivity.MILLISIEMENS_PER_CM, SensorDeviceClass.CONDUCTIVITY, 2),
(UnitOfConductivity.MICROSIEMENS_PER_CM, SensorDeviceClass.CONDUCTIVITY, 0),
(UnitOfPressure.BAR, SensorDeviceClass.PRESSURE, 2),
(UnitOfPressure.MBAR, SensorDeviceClass.PRESSURE, 0),
(UnitOfPressure.HPA, SensorDeviceClass.PRESSURE, 0),
(UnitOfPressure.PA, SensorDeviceClass.PRESSURE, 0),
("µmol/m²/s", None, 0),
("mol/m²/d", None, 1),
(DEGREE, None, 0),
(UnitOfPower.WATT, SensorDeviceClass.POWER, 0),
(UnitOfPower.KILO_WATT, SensorDeviceClass.POWER, 2),
(UnitOfMass.KILOGRAMS, SensorDeviceClass.WEIGHT, 1),
(UnitOfMass.GRAMS, SensorDeviceClass.WEIGHT, 0),
)
} | {
# pH is dimensionless (a logarithmic ratio), so SensorDeviceClass.PH takes no unit.
"pH": SensorEntityDescription(
key="pH", device_class=SensorDeviceClass.PH, suggested_display_precision=1
)
}
async def async_setup_entry(
hass: HomeAssistant,
entry: HortimaxConfigEntry,