From bc28c8fd3c92597ec351324d08f45bcad374cb5e Mon Sep 17 00:00:00 2001 From: Thomas55555 <59625598+Thomas55555@users.noreply.github.com> Date: Tue, 20 Jan 2026 16:07:24 +0100 Subject: [PATCH] Add ppb as a valid uom for sensor/number CO device class (#159554) --- homeassistant/components/number/const.py | 3 +- homeassistant/components/sensor/const.py | 3 +- homeassistant/util/unit_conversion.py | 2 + tests/util/test_unit_conversion.py | 65 +++++++++++++++++++----- 4 files changed, 57 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/number/const.py b/homeassistant/components/number/const.py index 41b4863cf32..a7f8e80ca97 100644 --- a/homeassistant/components/number/const.py +++ b/homeassistant/components/number/const.py @@ -125,7 +125,7 @@ class NumberDeviceClass(StrEnum): CO = "carbon_monoxide" """Carbon Monoxide gas concentration. - Unit of measurement: `ppm` (parts per million), `mg/m³`, `μg/m³` + Unit of measurement: `ppb` (parts per billion), `ppm` (parts per million), `mg/m³`, `μg/m³` """ CO2 = "carbon_dioxide" @@ -483,6 +483,7 @@ DEVICE_CLASS_UNITS: dict[NumberDeviceClass, set[type[StrEnum] | str | None]] = { NumberDeviceClass.BATTERY: {PERCENTAGE}, NumberDeviceClass.BLOOD_GLUCOSE_CONCENTRATION: set(UnitOfBloodGlucoseConcentration), NumberDeviceClass.CO: { + CONCENTRATION_PARTS_PER_BILLION, CONCENTRATION_PARTS_PER_MILLION, CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER, CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, diff --git a/homeassistant/components/sensor/const.py b/homeassistant/components/sensor/const.py index f223755c061..1702a981c10 100644 --- a/homeassistant/components/sensor/const.py +++ b/homeassistant/components/sensor/const.py @@ -159,7 +159,7 @@ class SensorDeviceClass(StrEnum): CO = "carbon_monoxide" """Carbon Monoxide gas concentration. - Unit of measurement: `ppm` (parts per million), `mg/m³`, `μg/m³` + Unit of measurement: `ppb` (parts per billion), `ppm` (parts per million), `mg/m³`, `μg/m³` """ CO2 = "carbon_dioxide" @@ -597,6 +597,7 @@ DEVICE_CLASS_UNITS: dict[SensorDeviceClass, set[type[StrEnum] | str | None]] = { SensorDeviceClass.BATTERY: {PERCENTAGE}, SensorDeviceClass.BLOOD_GLUCOSE_CONCENTRATION: set(UnitOfBloodGlucoseConcentration), SensorDeviceClass.CO: { + CONCENTRATION_PARTS_PER_BILLION, CONCENTRATION_PARTS_PER_MILLION, CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER, CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, diff --git a/homeassistant/util/unit_conversion.py b/homeassistant/util/unit_conversion.py index 64e3ed9131b..5926a57cd67 100644 --- a/homeassistant/util/unit_conversion.py +++ b/homeassistant/util/unit_conversion.py @@ -194,6 +194,7 @@ class CarbonMonoxideConcentrationConverter(BaseUnitConverter): UNIT_CLASS = "carbon_monoxide" _UNIT_CONVERSION: dict[str | None, float] = { + CONCENTRATION_PARTS_PER_BILLION: 1e9, CONCENTRATION_PARTS_PER_MILLION: 1e6, CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER: ( _CARBON_MONOXIDE_MOLAR_MASS / _AMBIENT_IDEAL_GAS_MOLAR_VOLUME * 1e3 @@ -203,6 +204,7 @@ class CarbonMonoxideConcentrationConverter(BaseUnitConverter): ), } VALID_UNITS = { + CONCENTRATION_PARTS_PER_BILLION, CONCENTRATION_PARTS_PER_MILLION, CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER, CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, diff --git a/tests/util/test_unit_conversion.py b/tests/util/test_unit_conversion.py index aebcf76744c..e37237a48cb 100644 --- a/tests/util/test_unit_conversion.py +++ b/tests/util/test_unit_conversion.py @@ -302,7 +302,32 @@ _CONVERTED_VALUE: dict[ ), ], CarbonMonoxideConcentrationConverter: [ + # PPB to other units + ( + 1, + CONCENTRATION_PARTS_PER_BILLION, + 0.001, + CONCENTRATION_PARTS_PER_MILLION, + ), + ( + 1, + CONCENTRATION_PARTS_PER_BILLION, + 1.16441, + CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, + ), + ( + 1, + CONCENTRATION_PARTS_PER_BILLION, + 0.00116441, + CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER, + ), # PPM to other units + ( + 1, + CONCENTRATION_PARTS_PER_MILLION, + 1000, + CONCENTRATION_PARTS_PER_BILLION, + ), ( 1, CONCENTRATION_PARTS_PER_MILLION, @@ -315,24 +340,17 @@ _CONVERTED_VALUE: dict[ 1164.41, CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, ), - # MILLIGRAMS_PER_CUBIC_METER to other units - ( - 120, - CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER, - 103.05655, - CONCENTRATION_PARTS_PER_MILLION, - ), - ( - 120, - CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER, - 120000, - CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, - ), # MICROGRAMS_PER_CUBIC_METER to other units ( 120000, CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, - 103.05655, + 103056.5, + CONCENTRATION_PARTS_PER_BILLION, + ), + ( + 120000, + CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, + 103.0565, CONCENTRATION_PARTS_PER_MILLION, ), ( @@ -341,6 +359,25 @@ _CONVERTED_VALUE: dict[ 120, CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER, ), + # MILLIGRAMS_PER_CUBIC_METER to other units + ( + 120, + CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER, + 103056.5, + CONCENTRATION_PARTS_PER_BILLION, + ), + ( + 120, + CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER, + 103.0565, + CONCENTRATION_PARTS_PER_MILLION, + ), + ( + 120, + CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER, + 120000, + CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, + ), ], ConductivityConverter: [ (