From b172abaeeb97523fdf4bd9b2b54e5fc049a7db7f Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Fri, 9 Dec 2022 08:02:53 +0100 Subject: [PATCH] Add new atmospheric pressure device class (#83455) * Add new atmospheric pressure device class * Translations * Automatic conversion * Convert all pressure units --- homeassistant/components/number/__init__.py | 6 ++++ homeassistant/components/sensor/__init__.py | 6 ++++ .../components/sensor/device_condition.py | 3 ++ .../components/sensor/device_trigger.py | 3 ++ homeassistant/components/sensor/strings.json | 2 ++ .../components/sensor/translations/en.json | 2 ++ homeassistant/util/unit_system.py | 12 +++++++ tests/util/test_unit_system.py | 36 +++++++++++++++++++ 8 files changed, 70 insertions(+) diff --git a/homeassistant/components/number/__init__.py b/homeassistant/components/number/__init__.py index 793ed148419..52eb9f945e2 100644 --- a/homeassistant/components/number/__init__.py +++ b/homeassistant/components/number/__init__.py @@ -69,6 +69,12 @@ class NumberDeviceClass(StrEnum): Unit of measurement: `None` """ + ATMOSPHERIC_PRESSURE = "atmospheric_pressure" + """Atmospheric pressure. + + Unit of measurement: `UnitOfPressure` units + """ + BATTERY = "battery" """Percentage of battery that is left. diff --git a/homeassistant/components/sensor/__init__.py b/homeassistant/components/sensor/__init__.py index aff562c9612..14af1462cdc 100644 --- a/homeassistant/components/sensor/__init__.py +++ b/homeassistant/components/sensor/__init__.py @@ -133,6 +133,12 @@ class SensorDeviceClass(StrEnum): Unit of measurement: `None` """ + ATMOSPHERIC_PRESSURE = "atmospheric_pressure" + """Atmospheric pressure. + + Unit of measurement: `UnitOfPressure` units + """ + BATTERY = "battery" """Percentage of battery that is left. diff --git a/homeassistant/components/sensor/device_condition.py b/homeassistant/components/sensor/device_condition.py index 41f2a5739f0..37eb96786f9 100644 --- a/homeassistant/components/sensor/device_condition.py +++ b/homeassistant/components/sensor/device_condition.py @@ -32,6 +32,7 @@ from . import ATTR_STATE_CLASS, DOMAIN, SensorDeviceClass DEVICE_CLASS_NONE = "none" CONF_IS_APPARENT_POWER = "is_apparent_power" +CONF_IS_ATMOSPHERIC_PRESSURE = "atmospheric_pressure" CONF_IS_BATTERY_LEVEL = "is_battery_level" CONF_IS_CO = "is_carbon_monoxide" CONF_IS_CO2 = "is_carbon_dioxide" @@ -74,6 +75,7 @@ CONF_IS_WIND_SPEED = "is_wind_speed" ENTITY_CONDITIONS = { SensorDeviceClass.APPARENT_POWER: [{CONF_TYPE: CONF_IS_APPARENT_POWER}], + SensorDeviceClass.ATMOSPHERIC_PRESSURE: [{CONF_TYPE: CONF_IS_ATMOSPHERIC_PRESSURE}], SensorDeviceClass.BATTERY: [{CONF_TYPE: CONF_IS_BATTERY_LEVEL}], SensorDeviceClass.CO: [{CONF_TYPE: CONF_IS_CO}], SensorDeviceClass.CO2: [{CONF_TYPE: CONF_IS_CO2}], @@ -126,6 +128,7 @@ CONDITION_SCHEMA = vol.All( vol.Required(CONF_TYPE): vol.In( [ CONF_IS_APPARENT_POWER, + CONF_IS_ATMOSPHERIC_PRESSURE, CONF_IS_BATTERY_LEVEL, CONF_IS_CO, CONF_IS_CO2, diff --git a/homeassistant/components/sensor/device_trigger.py b/homeassistant/components/sensor/device_trigger.py index 14e2dddaaef..a5949768ebf 100644 --- a/homeassistant/components/sensor/device_trigger.py +++ b/homeassistant/components/sensor/device_trigger.py @@ -31,6 +31,7 @@ from . import ATTR_STATE_CLASS, DOMAIN, SensorDeviceClass DEVICE_CLASS_NONE = "none" CONF_APPARENT_POWER = "apparent_power" +CONF_ATMOSPHERIC_PRESSURE = "atmospheric_pressure" CONF_BATTERY_LEVEL = "battery_level" CONF_CO = "carbon_monoxide" CONF_CO2 = "carbon_dioxide" @@ -73,6 +74,7 @@ CONF_WIND_SPEED = "wind_speed" ENTITY_TRIGGERS = { SensorDeviceClass.APPARENT_POWER: [{CONF_TYPE: CONF_APPARENT_POWER}], + SensorDeviceClass.ATMOSPHERIC_PRESSURE: [{CONF_TYPE: CONF_ATMOSPHERIC_PRESSURE}], SensorDeviceClass.BATTERY: [{CONF_TYPE: CONF_BATTERY_LEVEL}], SensorDeviceClass.CO: [{CONF_TYPE: CONF_CO}], SensorDeviceClass.CO2: [{CONF_TYPE: CONF_CO2}], @@ -126,6 +128,7 @@ TRIGGER_SCHEMA = vol.All( vol.Required(CONF_TYPE): vol.In( [ CONF_APPARENT_POWER, + CONF_ATMOSPHERIC_PRESSURE, CONF_BATTERY_LEVEL, CONF_CO, CONF_CO2, diff --git a/homeassistant/components/sensor/strings.json b/homeassistant/components/sensor/strings.json index 879fc4602b3..2d536126980 100644 --- a/homeassistant/components/sensor/strings.json +++ b/homeassistant/components/sensor/strings.json @@ -3,6 +3,7 @@ "device_automation": { "condition_type": { "is_apparent_power": "Current {entity_name} apparent power", + "is_atmospheric_pressure": "Current {entity_name} atmospheric pressure", "is_battery_level": "Current {entity_name} battery level", "is_carbon_monoxide": "Current {entity_name} carbon monoxide concentration level", "is_carbon_dioxide": "Current {entity_name} carbon dioxide concentration level", @@ -42,6 +43,7 @@ }, "trigger_type": { "apparent_power": "{entity_name} apparent power changes", + "atmospheric_pressure": "{entity_name} atmospheric pressure changes", "battery_level": "{entity_name} battery level changes", "carbon_monoxide": "{entity_name} carbon monoxide concentration changes", "carbon_dioxide": "{entity_name} carbon dioxide concentration changes", diff --git a/homeassistant/components/sensor/translations/en.json b/homeassistant/components/sensor/translations/en.json index 58f4d3b8bd5..18ca324a557 100644 --- a/homeassistant/components/sensor/translations/en.json +++ b/homeassistant/components/sensor/translations/en.json @@ -2,6 +2,7 @@ "device_automation": { "condition_type": { "is_apparent_power": "Current {entity_name} apparent power", + "is_atmospheric_pressure": "Current {entity_name} atmospheric pressure", "is_battery_level": "Current {entity_name} battery level", "is_carbon_dioxide": "Current {entity_name} carbon dioxide concentration level", "is_carbon_monoxide": "Current {entity_name} carbon monoxide concentration level", @@ -41,6 +42,7 @@ }, "trigger_type": { "apparent_power": "{entity_name} apparent power changes", + "atmospheric_pressure": "{entity_name} atmospheric pressure changes", "battery_level": "{entity_name} battery level changes", "carbon_dioxide": "{entity_name} carbon dioxide concentration changes", "carbon_monoxide": "{entity_name} carbon monoxide concentration changes", diff --git a/homeassistant/util/unit_system.py b/homeassistant/util/unit_system.py index 49a19792645..24bcee2ed93 100644 --- a/homeassistant/util/unit_system.py +++ b/homeassistant/util/unit_system.py @@ -250,6 +250,12 @@ METRIC_SYSTEM = UnitSystem( _CONF_UNIT_SYSTEM_METRIC, accumulated_precipitation=UnitOfPrecipitationDepth.MILLIMETERS, conversions={ + # Force atmospheric pressures to hPa + **{ + ("atmospheric_pressure", unit): UnitOfPressure.HPA + for unit in UnitOfPressure + if unit != UnitOfPressure.HPA + }, # Convert non-metric distances ("distance", UnitOfLength.FEET): UnitOfLength.METERS, ("distance", UnitOfLength.INCHES): UnitOfLength.MILLIMETERS, @@ -282,6 +288,12 @@ US_CUSTOMARY_SYSTEM = UnitSystem( _CONF_UNIT_SYSTEM_US_CUSTOMARY, accumulated_precipitation=UnitOfPrecipitationDepth.INCHES, conversions={ + # Force atmospheric pressures to inHg + **{ + ("atmospheric_pressure", unit): UnitOfPressure.INHG + for unit in UnitOfPressure + if unit != UnitOfPressure.INHG + }, # Convert non-USCS distances ("distance", UnitOfLength.CENTIMETERS): UnitOfLength.INCHES, ("distance", UnitOfLength.KILOMETERS): UnitOfLength.MILES, diff --git a/tests/util/test_unit_system.py b/tests/util/test_unit_system.py index 03385196cab..44e045a5c40 100644 --- a/tests/util/test_unit_system.py +++ b/tests/util/test_unit_system.py @@ -380,6 +380,24 @@ def test_get_unit_system_invalid(key: str) -> None: @pytest.mark.parametrize( "device_class, original_unit, state_unit", ( + # Test atmospheric pressure + ( + SensorDeviceClass.ATMOSPHERIC_PRESSURE, + UnitOfPressure.PSI, + UnitOfPressure.HPA, + ), + ( + SensorDeviceClass.ATMOSPHERIC_PRESSURE, + UnitOfPressure.BAR, + UnitOfPressure.HPA, + ), + ( + SensorDeviceClass.ATMOSPHERIC_PRESSURE, + UnitOfPressure.INHG, + UnitOfPressure.HPA, + ), + (SensorDeviceClass.ATMOSPHERIC_PRESSURE, UnitOfPressure.HPA, None), + (SensorDeviceClass.ATMOSPHERIC_PRESSURE, "very_much", None), # Test distance conversion (SensorDeviceClass.DISTANCE, UnitOfLength.FEET, UnitOfLength.METERS), (SensorDeviceClass.DISTANCE, UnitOfLength.INCHES, UnitOfLength.MILLIMETERS), @@ -435,6 +453,24 @@ def test_get_metric_converted_unit_( @pytest.mark.parametrize( "device_class, original_unit, state_unit", ( + # Test atmospheric pressure + ( + SensorDeviceClass.ATMOSPHERIC_PRESSURE, + UnitOfPressure.PSI, + UnitOfPressure.INHG, + ), + ( + SensorDeviceClass.ATMOSPHERIC_PRESSURE, + UnitOfPressure.BAR, + UnitOfPressure.INHG, + ), + ( + SensorDeviceClass.ATMOSPHERIC_PRESSURE, + UnitOfPressure.HPA, + UnitOfPressure.INHG, + ), + (SensorDeviceClass.ATMOSPHERIC_PRESSURE, UnitOfPressure.INHG, None), + (SensorDeviceClass.ATMOSPHERIC_PRESSURE, "very_much", None), # Test distance conversion (SensorDeviceClass.DISTANCE, UnitOfLength.CENTIMETERS, UnitOfLength.INCHES), (SensorDeviceClass.DISTANCE, UnitOfLength.KILOMETERS, UnitOfLength.MILES),