mirror of
https://github.com/home-assistant/core.git
synced 2025-11-09 19:09:32 +00:00
Add mg/m³ as a valid UOM for sensor/number Carbon Monoxide device class (#152456)
This commit is contained in:
@@ -124,7 +124,7 @@ class NumberDeviceClass(StrEnum):
|
|||||||
CO = "carbon_monoxide"
|
CO = "carbon_monoxide"
|
||||||
"""Carbon Monoxide gas concentration.
|
"""Carbon Monoxide gas concentration.
|
||||||
|
|
||||||
Unit of measurement: `ppm` (parts per million)
|
Unit of measurement: `ppm` (parts per million), mg/m³
|
||||||
"""
|
"""
|
||||||
|
|
||||||
CO2 = "carbon_dioxide"
|
CO2 = "carbon_dioxide"
|
||||||
@@ -469,7 +469,10 @@ DEVICE_CLASS_UNITS: dict[NumberDeviceClass, set[type[StrEnum] | str | None]] = {
|
|||||||
NumberDeviceClass.ATMOSPHERIC_PRESSURE: set(UnitOfPressure),
|
NumberDeviceClass.ATMOSPHERIC_PRESSURE: set(UnitOfPressure),
|
||||||
NumberDeviceClass.BATTERY: {PERCENTAGE},
|
NumberDeviceClass.BATTERY: {PERCENTAGE},
|
||||||
NumberDeviceClass.BLOOD_GLUCOSE_CONCENTRATION: set(UnitOfBloodGlucoseConcentration),
|
NumberDeviceClass.BLOOD_GLUCOSE_CONCENTRATION: set(UnitOfBloodGlucoseConcentration),
|
||||||
NumberDeviceClass.CO: {CONCENTRATION_PARTS_PER_MILLION},
|
NumberDeviceClass.CO: {
|
||||||
|
CONCENTRATION_PARTS_PER_MILLION,
|
||||||
|
CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER,
|
||||||
|
},
|
||||||
NumberDeviceClass.CO2: {CONCENTRATION_PARTS_PER_MILLION},
|
NumberDeviceClass.CO2: {CONCENTRATION_PARTS_PER_MILLION},
|
||||||
NumberDeviceClass.CONDUCTIVITY: set(UnitOfConductivity),
|
NumberDeviceClass.CONDUCTIVITY: set(UnitOfConductivity),
|
||||||
NumberDeviceClass.CURRENT: set(UnitOfElectricCurrent),
|
NumberDeviceClass.CURRENT: set(UnitOfElectricCurrent),
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ from homeassistant.util.unit_conversion import (
|
|||||||
AreaConverter,
|
AreaConverter,
|
||||||
BaseUnitConverter,
|
BaseUnitConverter,
|
||||||
BloodGlucoseConcentrationConverter,
|
BloodGlucoseConcentrationConverter,
|
||||||
|
CarbonMonoxideConcentrationConverter,
|
||||||
ConductivityConverter,
|
ConductivityConverter,
|
||||||
DataRateConverter,
|
DataRateConverter,
|
||||||
DistanceConverter,
|
DistanceConverter,
|
||||||
@@ -204,6 +205,10 @@ STATISTIC_UNIT_TO_UNIT_CONVERTER: dict[str | None, type[BaseUnitConverter]] = {
|
|||||||
**dict.fromkeys(
|
**dict.fromkeys(
|
||||||
MassVolumeConcentrationConverter.VALID_UNITS, MassVolumeConcentrationConverter
|
MassVolumeConcentrationConverter.VALID_UNITS, MassVolumeConcentrationConverter
|
||||||
),
|
),
|
||||||
|
**dict.fromkeys(
|
||||||
|
CarbonMonoxideConcentrationConverter.VALID_UNITS,
|
||||||
|
CarbonMonoxideConcentrationConverter,
|
||||||
|
),
|
||||||
**dict.fromkeys(ConductivityConverter.VALID_UNITS, ConductivityConverter),
|
**dict.fromkeys(ConductivityConverter.VALID_UNITS, ConductivityConverter),
|
||||||
**dict.fromkeys(DataRateConverter.VALID_UNITS, DataRateConverter),
|
**dict.fromkeys(DataRateConverter.VALID_UNITS, DataRateConverter),
|
||||||
**dict.fromkeys(DistanceConverter.VALID_UNITS, DistanceConverter),
|
**dict.fromkeys(DistanceConverter.VALID_UNITS, DistanceConverter),
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ from homeassistant.util.unit_conversion import (
|
|||||||
ApparentPowerConverter,
|
ApparentPowerConverter,
|
||||||
AreaConverter,
|
AreaConverter,
|
||||||
BloodGlucoseConcentrationConverter,
|
BloodGlucoseConcentrationConverter,
|
||||||
|
CarbonMonoxideConcentrationConverter,
|
||||||
ConductivityConverter,
|
ConductivityConverter,
|
||||||
DataRateConverter,
|
DataRateConverter,
|
||||||
DistanceConverter,
|
DistanceConverter,
|
||||||
@@ -66,6 +67,9 @@ UNIT_SCHEMA = vol.Schema(
|
|||||||
vol.Optional("blood_glucose_concentration"): vol.In(
|
vol.Optional("blood_glucose_concentration"): vol.In(
|
||||||
BloodGlucoseConcentrationConverter.VALID_UNITS
|
BloodGlucoseConcentrationConverter.VALID_UNITS
|
||||||
),
|
),
|
||||||
|
vol.Optional("carbon_monoxide"): vol.In(
|
||||||
|
CarbonMonoxideConcentrationConverter.VALID_UNITS
|
||||||
|
),
|
||||||
vol.Optional("concentration"): vol.In(
|
vol.Optional("concentration"): vol.In(
|
||||||
MassVolumeConcentrationConverter.VALID_UNITS
|
MassVolumeConcentrationConverter.VALID_UNITS
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ from homeassistant.util.unit_conversion import (
|
|||||||
AreaConverter,
|
AreaConverter,
|
||||||
BaseUnitConverter,
|
BaseUnitConverter,
|
||||||
BloodGlucoseConcentrationConverter,
|
BloodGlucoseConcentrationConverter,
|
||||||
|
CarbonMonoxideConcentrationConverter,
|
||||||
ConductivityConverter,
|
ConductivityConverter,
|
||||||
DataRateConverter,
|
DataRateConverter,
|
||||||
DistanceConverter,
|
DistanceConverter,
|
||||||
@@ -156,7 +157,7 @@ class SensorDeviceClass(StrEnum):
|
|||||||
CO = "carbon_monoxide"
|
CO = "carbon_monoxide"
|
||||||
"""Carbon Monoxide gas concentration.
|
"""Carbon Monoxide gas concentration.
|
||||||
|
|
||||||
Unit of measurement: `ppm` (parts per million)
|
Unit of measurement: `ppm` (parts per million), `mg/m³`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
CO2 = "carbon_dioxide"
|
CO2 = "carbon_dioxide"
|
||||||
@@ -537,6 +538,7 @@ UNIT_CONVERTERS: dict[SensorDeviceClass | str | None, type[BaseUnitConverter]] =
|
|||||||
SensorDeviceClass.AREA: AreaConverter,
|
SensorDeviceClass.AREA: AreaConverter,
|
||||||
SensorDeviceClass.ATMOSPHERIC_PRESSURE: PressureConverter,
|
SensorDeviceClass.ATMOSPHERIC_PRESSURE: PressureConverter,
|
||||||
SensorDeviceClass.BLOOD_GLUCOSE_CONCENTRATION: BloodGlucoseConcentrationConverter,
|
SensorDeviceClass.BLOOD_GLUCOSE_CONCENTRATION: BloodGlucoseConcentrationConverter,
|
||||||
|
SensorDeviceClass.CO: CarbonMonoxideConcentrationConverter,
|
||||||
SensorDeviceClass.CONDUCTIVITY: ConductivityConverter,
|
SensorDeviceClass.CONDUCTIVITY: ConductivityConverter,
|
||||||
SensorDeviceClass.CURRENT: ElectricCurrentConverter,
|
SensorDeviceClass.CURRENT: ElectricCurrentConverter,
|
||||||
SensorDeviceClass.DATA_RATE: DataRateConverter,
|
SensorDeviceClass.DATA_RATE: DataRateConverter,
|
||||||
@@ -578,7 +580,10 @@ DEVICE_CLASS_UNITS: dict[SensorDeviceClass, set[type[StrEnum] | str | None]] = {
|
|||||||
SensorDeviceClass.ATMOSPHERIC_PRESSURE: set(UnitOfPressure),
|
SensorDeviceClass.ATMOSPHERIC_PRESSURE: set(UnitOfPressure),
|
||||||
SensorDeviceClass.BATTERY: {PERCENTAGE},
|
SensorDeviceClass.BATTERY: {PERCENTAGE},
|
||||||
SensorDeviceClass.BLOOD_GLUCOSE_CONCENTRATION: set(UnitOfBloodGlucoseConcentration),
|
SensorDeviceClass.BLOOD_GLUCOSE_CONCENTRATION: set(UnitOfBloodGlucoseConcentration),
|
||||||
SensorDeviceClass.CO: {CONCENTRATION_PARTS_PER_MILLION},
|
SensorDeviceClass.CO: {
|
||||||
|
CONCENTRATION_PARTS_PER_MILLION,
|
||||||
|
CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER,
|
||||||
|
},
|
||||||
SensorDeviceClass.CO2: {CONCENTRATION_PARTS_PER_MILLION},
|
SensorDeviceClass.CO2: {CONCENTRATION_PARTS_PER_MILLION},
|
||||||
SensorDeviceClass.CONDUCTIVITY: set(UnitOfConductivity),
|
SensorDeviceClass.CONDUCTIVITY: set(UnitOfConductivity),
|
||||||
SensorDeviceClass.CURRENT: set(UnitOfElectricCurrent),
|
SensorDeviceClass.CURRENT: set(UnitOfElectricCurrent),
|
||||||
|
|||||||
@@ -168,6 +168,20 @@ class BaseUnitConverter:
|
|||||||
return (from_unit in cls._UNIT_INVERSES) != (to_unit in cls._UNIT_INVERSES)
|
return (from_unit in cls._UNIT_INVERSES) != (to_unit in cls._UNIT_INVERSES)
|
||||||
|
|
||||||
|
|
||||||
|
class CarbonMonoxideConcentrationConverter(BaseUnitConverter):
|
||||||
|
"""Convert carbon monoxide ratio to mass per volume."""
|
||||||
|
|
||||||
|
UNIT_CLASS = "carbon_monoxide"
|
||||||
|
_UNIT_CONVERSION: dict[str | None, float] = {
|
||||||
|
CONCENTRATION_PARTS_PER_MILLION: 1,
|
||||||
|
CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER: 1.145609,
|
||||||
|
}
|
||||||
|
VALID_UNITS = {
|
||||||
|
CONCENTRATION_PARTS_PER_MILLION,
|
||||||
|
CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class DataRateConverter(BaseUnitConverter):
|
class DataRateConverter(BaseUnitConverter):
|
||||||
"""Utility to convert data rate values."""
|
"""Utility to convert data rate values."""
|
||||||
|
|
||||||
|
|||||||
@@ -3007,7 +3007,6 @@ def test_device_class_converters_are_complete() -> None:
|
|||||||
no_converter_device_classes = {
|
no_converter_device_classes = {
|
||||||
SensorDeviceClass.AQI,
|
SensorDeviceClass.AQI,
|
||||||
SensorDeviceClass.BATTERY,
|
SensorDeviceClass.BATTERY,
|
||||||
SensorDeviceClass.CO,
|
|
||||||
SensorDeviceClass.CO2,
|
SensorDeviceClass.CO2,
|
||||||
SensorDeviceClass.DATE,
|
SensorDeviceClass.DATE,
|
||||||
SensorDeviceClass.ENUM,
|
SensorDeviceClass.ENUM,
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ from homeassistant.util.unit_conversion import (
|
|||||||
AreaConverter,
|
AreaConverter,
|
||||||
BaseUnitConverter,
|
BaseUnitConverter,
|
||||||
BloodGlucoseConcentrationConverter,
|
BloodGlucoseConcentrationConverter,
|
||||||
|
CarbonMonoxideConcentrationConverter,
|
||||||
ConductivityConverter,
|
ConductivityConverter,
|
||||||
DataRateConverter,
|
DataRateConverter,
|
||||||
DistanceConverter,
|
DistanceConverter,
|
||||||
@@ -78,6 +79,7 @@ _ALL_CONVERTERS: dict[type[BaseUnitConverter], list[str | None]] = {
|
|||||||
AreaConverter,
|
AreaConverter,
|
||||||
BloodGlucoseConcentrationConverter,
|
BloodGlucoseConcentrationConverter,
|
||||||
MassVolumeConcentrationConverter,
|
MassVolumeConcentrationConverter,
|
||||||
|
CarbonMonoxideConcentrationConverter,
|
||||||
ConductivityConverter,
|
ConductivityConverter,
|
||||||
DataRateConverter,
|
DataRateConverter,
|
||||||
DistanceConverter,
|
DistanceConverter,
|
||||||
@@ -114,6 +116,11 @@ _GET_UNIT_RATIO: dict[type[BaseUnitConverter], tuple[str | None, str | None, flo
|
|||||||
UnitOfBloodGlucoseConcentration.MILLIMOLE_PER_LITER,
|
UnitOfBloodGlucoseConcentration.MILLIMOLE_PER_LITER,
|
||||||
18,
|
18,
|
||||||
),
|
),
|
||||||
|
CarbonMonoxideConcentrationConverter: (
|
||||||
|
CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER,
|
||||||
|
CONCENTRATION_PARTS_PER_MILLION,
|
||||||
|
1.145609,
|
||||||
|
),
|
||||||
ConductivityConverter: (
|
ConductivityConverter: (
|
||||||
UnitOfConductivity.MICROSIEMENS_PER_CM,
|
UnitOfConductivity.MICROSIEMENS_PER_CM,
|
||||||
UnitOfConductivity.MILLISIEMENS_PER_CM,
|
UnitOfConductivity.MILLISIEMENS_PER_CM,
|
||||||
@@ -280,6 +287,20 @@ _CONVERTED_VALUE: dict[
|
|||||||
UnitOfBloodGlucoseConcentration.MILLIGRAMS_PER_DECILITER,
|
UnitOfBloodGlucoseConcentration.MILLIGRAMS_PER_DECILITER,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
CarbonMonoxideConcentrationConverter: [
|
||||||
|
(
|
||||||
|
1,
|
||||||
|
CONCENTRATION_PARTS_PER_MILLION,
|
||||||
|
1.145609,
|
||||||
|
CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
120,
|
||||||
|
CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER,
|
||||||
|
104.74778,
|
||||||
|
CONCENTRATION_PARTS_PER_MILLION,
|
||||||
|
),
|
||||||
|
],
|
||||||
ConductivityConverter: [
|
ConductivityConverter: [
|
||||||
# Deprecated to deprecated
|
# Deprecated to deprecated
|
||||||
(5, UnitOfConductivity.SIEMENS, 5e3, UnitOfConductivity.MILLISIEMENS),
|
(5, UnitOfConductivity.SIEMENS, 5e3, UnitOfConductivity.MILLISIEMENS),
|
||||||
|
|||||||
Reference in New Issue
Block a user