From 4c22264b13bf4f7428ab9e911d58725dee512c78 Mon Sep 17 00:00:00 2001 From: ekobres Date: Fri, 12 Sep 2025 05:24:45 -0400 Subject: [PATCH] =?UTF-8?q?Add=20support=20for=20`inH=E2=82=82O`=20pressur?= =?UTF-8?q?e=20unit=20(#148289)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Erik Montnemery --- homeassistant/components/number/const.py | 1 + homeassistant/components/sensor/const.py | 1 + homeassistant/const.py | 1 + homeassistant/util/unit_conversion.py | 3 +++ homeassistant/util/unit_system.py | 2 ++ tests/components/sensor/test_recorder.py | 8 ++++---- tests/util/test_unit_conversion.py | 11 +++++++++++ 7 files changed, 23 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/number/const.py b/homeassistant/components/number/const.py index a9333212fa4..9a227102ad7 100644 --- a/homeassistant/components/number/const.py +++ b/homeassistant/components/number/const.py @@ -328,6 +328,7 @@ class NumberDeviceClass(StrEnum): - `Pa`, `hPa`, `kPa` - `inHg` - `psi` + - `inH₂O` """ REACTIVE_ENERGY = "reactive_energy" diff --git a/homeassistant/components/sensor/const.py b/homeassistant/components/sensor/const.py index 12d9595d059..7d21b68019d 100644 --- a/homeassistant/components/sensor/const.py +++ b/homeassistant/components/sensor/const.py @@ -361,6 +361,7 @@ class SensorDeviceClass(StrEnum): - `Pa`, `hPa`, `kPa` - `inHg` - `psi` + - `inH₂O` """ REACTIVE_ENERGY = "reactive_energy" diff --git a/homeassistant/const.py b/homeassistant/const.py index d61945e2ef8..913ef5e177f 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -749,6 +749,7 @@ class UnitOfPressure(StrEnum): MBAR = "mbar" MMHG = "mmHg" INHG = "inHg" + INH2O = "inH₂O" PSI = "psi" diff --git a/homeassistant/util/unit_conversion.py b/homeassistant/util/unit_conversion.py index 1bd40a12d3d..5502163472d 100644 --- a/homeassistant/util/unit_conversion.py +++ b/homeassistant/util/unit_conversion.py @@ -82,6 +82,7 @@ _STONE_TO_G = _POUND_TO_G * 14 # 14 pounds to a stone # Pressure conversion constants _STANDARD_GRAVITY = 9.80665 _MERCURY_DENSITY = 13.5951 +_INH2O_TO_PA = 249.0889083333348 # 1 inH₂O = 249.0889083333348 Pa at 4°C # Volume conversion constants _L_TO_CUBIC_METER = 0.001 # 1 L = 0.001 m³ @@ -435,6 +436,7 @@ class PressureConverter(BaseUnitConverter): UnitOfPressure.MBAR: 1 / 100, UnitOfPressure.INHG: 1 / (_IN_TO_M * 1000 * _STANDARD_GRAVITY * _MERCURY_DENSITY), + UnitOfPressure.INH2O: 1 / _INH2O_TO_PA, UnitOfPressure.PSI: 1 / 6894.757, UnitOfPressure.MMHG: 1 / (_MM_TO_M * 1000 * _STANDARD_GRAVITY * _MERCURY_DENSITY), @@ -447,6 +449,7 @@ class PressureConverter(BaseUnitConverter): UnitOfPressure.CBAR, UnitOfPressure.MBAR, UnitOfPressure.INHG, + UnitOfPressure.INH2O, UnitOfPressure.PSI, UnitOfPressure.MMHG, } diff --git a/homeassistant/util/unit_system.py b/homeassistant/util/unit_system.py index 934cd6d4b69..d86beb8b7e7 100644 --- a/homeassistant/util/unit_system.py +++ b/homeassistant/util/unit_system.py @@ -296,6 +296,7 @@ METRIC_SYSTEM = UnitSystem( # Convert non-metric pressure ("pressure", UnitOfPressure.PSI): UnitOfPressure.KPA, ("pressure", UnitOfPressure.INHG): UnitOfPressure.HPA, + ("pressure", UnitOfPressure.INH2O): UnitOfPressure.KPA, # Convert non-metric speeds except knots to km/h ("speed", UnitOfSpeed.FEET_PER_SECOND): UnitOfSpeed.KILOMETERS_PER_HOUR, ("speed", UnitOfSpeed.INCHES_PER_SECOND): UnitOfSpeed.MILLIMETERS_PER_SECOND, @@ -379,6 +380,7 @@ US_CUSTOMARY_SYSTEM = UnitSystem( ("pressure", UnitOfPressure.HPA): UnitOfPressure.PSI, ("pressure", UnitOfPressure.KPA): UnitOfPressure.PSI, ("pressure", UnitOfPressure.MMHG): UnitOfPressure.INHG, + ("pressure", UnitOfPressure.INH2O): UnitOfPressure.PSI, # Convert non-USCS speeds, except knots, to mph ("speed", UnitOfSpeed.METERS_PER_SECOND): UnitOfSpeed.MILES_PER_HOUR, ("speed", UnitOfSpeed.MILLIMETERS_PER_SECOND): UnitOfSpeed.INCHES_PER_SECOND, diff --git a/tests/components/sensor/test_recorder.py b/tests/components/sensor/test_recorder.py index 645c4754a7b..df38a246a7a 100644 --- a/tests/components/sensor/test_recorder.py +++ b/tests/components/sensor/test_recorder.py @@ -4957,14 +4957,14 @@ async def async_record_states( PRESSURE_SENSOR_ATTRIBUTES, "psi", "bar", - "Pa, bar, cbar, hPa, inHg, kPa, mbar, mmHg, psi", + "Pa, bar, cbar, hPa, inHg, inH₂O, kPa, mbar, mmHg, psi", ), ( METRIC_SYSTEM, PRESSURE_SENSOR_ATTRIBUTES, "Pa", "bar", - "Pa, bar, cbar, hPa, inHg, kPa, mbar, mmHg, psi", + "Pa, bar, cbar, hPa, inHg, inH₂O, kPa, mbar, mmHg, psi", ), ], ) @@ -5175,14 +5175,14 @@ async def test_validate_statistics_unit_ignore_device_class( PRESSURE_SENSOR_ATTRIBUTES, "psi", "bar", - "Pa, bar, cbar, hPa, inHg, kPa, mbar, mmHg, psi", + "Pa, bar, cbar, hPa, inHg, inH₂O, kPa, mbar, mmHg, psi", ), ( METRIC_SYSTEM, PRESSURE_SENSOR_ATTRIBUTES, "Pa", "bar", - "Pa, bar, cbar, hPa, inHg, kPa, mbar, mmHg, psi", + "Pa, bar, cbar, hPa, inHg, inH₂O, kPa, mbar, mmHg, psi", ), ( METRIC_SYSTEM, diff --git a/tests/util/test_unit_conversion.py b/tests/util/test_unit_conversion.py index 3fe0078aabf..c25a40f5fc0 100644 --- a/tests/util/test_unit_conversion.py +++ b/tests/util/test_unit_conversion.py @@ -672,12 +672,21 @@ _CONVERTED_VALUE: dict[ (1000, UnitOfPressure.HPA, 100, UnitOfPressure.KPA), (1000, UnitOfPressure.HPA, 1000, UnitOfPressure.MBAR), (1000, UnitOfPressure.HPA, 100, UnitOfPressure.CBAR), + (1000, UnitOfPressure.HPA, 401.46307866177, UnitOfPressure.INH2O), (100, UnitOfPressure.KPA, 14.5037743897, UnitOfPressure.PSI), (100, UnitOfPressure.KPA, 29.5299801647, UnitOfPressure.INHG), (100, UnitOfPressure.KPA, 100000, UnitOfPressure.PA), (100, UnitOfPressure.KPA, 1000, UnitOfPressure.HPA), (100, UnitOfPressure.KPA, 1000, UnitOfPressure.MBAR), (100, UnitOfPressure.KPA, 100, UnitOfPressure.CBAR), + (100, UnitOfPressure.INH2O, 3.6127291827353996, UnitOfPressure.PSI), + (100, UnitOfPressure.INH2O, 186.83201548767, UnitOfPressure.MMHG), + (100, UnitOfPressure.INH2O, 7.3555912463681, UnitOfPressure.INHG), + (100, UnitOfPressure.INH2O, 24908.890833333, UnitOfPressure.PA), + (100, UnitOfPressure.INH2O, 249.08890833333, UnitOfPressure.HPA), + (100, UnitOfPressure.INH2O, 249.08890833333, UnitOfPressure.MBAR), + (100, UnitOfPressure.INH2O, 24.908890833333, UnitOfPressure.KPA), + (100, UnitOfPressure.INH2O, 24.908890833333, UnitOfPressure.CBAR), (30, UnitOfPressure.INHG, 14.7346266155, UnitOfPressure.PSI), (30, UnitOfPressure.INHG, 101.59167, UnitOfPressure.KPA), (30, UnitOfPressure.INHG, 1015.9167, UnitOfPressure.HPA), @@ -685,6 +694,7 @@ _CONVERTED_VALUE: dict[ (30, UnitOfPressure.INHG, 1015.9167, UnitOfPressure.MBAR), (30, UnitOfPressure.INHG, 101.59167, UnitOfPressure.CBAR), (30, UnitOfPressure.INHG, 762, UnitOfPressure.MMHG), + (30, UnitOfPressure.INHG, 407.85300589959, UnitOfPressure.INH2O), (30, UnitOfPressure.MMHG, 0.580103, UnitOfPressure.PSI), (30, UnitOfPressure.MMHG, 3.99967, UnitOfPressure.KPA), (30, UnitOfPressure.MMHG, 39.9967, UnitOfPressure.HPA), @@ -692,6 +702,7 @@ _CONVERTED_VALUE: dict[ (30, UnitOfPressure.MMHG, 39.9967, UnitOfPressure.MBAR), (30, UnitOfPressure.MMHG, 3.99967, UnitOfPressure.CBAR), (30, UnitOfPressure.MMHG, 1.181102, UnitOfPressure.INHG), + (30, UnitOfPressure.MMHG, 16.0572051431838, UnitOfPressure.INH2O), (5, UnitOfPressure.BAR, 72.51887, UnitOfPressure.PSI), ], ReactiveEnergyConverter: [