diff --git a/homeassistant/components/sensor/__init__.py b/homeassistant/components/sensor/__init__.py index f7fbecea224..3c158f1be9c 100644 --- a/homeassistant/components/sensor/__init__.py +++ b/homeassistant/components/sensor/__init__.py @@ -266,7 +266,7 @@ class SensorDeviceClass(StrEnum): SPEED = "speed" """Generic speed. - Unit of measurement: `SPEED_*` units + Unit of measurement: `SPEED_*` or `PRECIPITATION_INTENSITY_*` units - SI /metric: `mm/d`, `mm/h`, `m/s`, `km/h` - USCS / imperial: `in/d`, `in/h`, `ft/s`, `mph` - Nautical: `kn` diff --git a/homeassistant/const.py b/homeassistant/const.py index 99af9974ea0..49749c1b5e5 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -525,11 +525,15 @@ TIME_YEARS: Final = "y" # Length units LENGTH_MILLIMETERS: Final = "mm" +"""Note: for precipitation, please use PRECIPITATION_MILLIMETERS""" + LENGTH_CENTIMETERS: Final = "cm" LENGTH_METERS: Final = "m" LENGTH_KILOMETERS: Final = "km" LENGTH_INCHES: Final = "in" +"""Note: for precipitation, please use PRECIPITATION_INCHES""" + LENGTH_FEET: Final = "ft" LENGTH_YARD: Final = "yd" LENGTH_MILES: Final = "mi" @@ -602,10 +606,25 @@ REVOLUTIONS_PER_MINUTE: Final = "rpm" IRRADIATION_WATTS_PER_SQUARE_METER: Final = "W/m²" IRRADIATION_BTUS_PER_HOUR_SQUARE_FOOT: Final = "BTU/(h×ft²)" +# Precipitation intensity units +# The derivation of these units is a volume of rain amassing in a container +# with constant cross section in a given time +PRECIPITATION_INTENSITY_INCHES_PER_DAY: Final = "in/d" +PRECIPITATION_INTENSITY_INCHES_PER_HOUR: Final = "in/h" +PRECIPITATION_INTENSITY_MILLIMETERS_PER_DAY: Final = "mm/d" +PRECIPITATION_INTENSITY_MILLIMETERS_PER_HOUR: Final = "mm/h" + # Precipitation units -PRECIPITATION_MILLIMETERS_PER_HOUR: Final = "mm/h" +# The derivation of these units is a volume of rain amassing in a container +# with constant cross section PRECIPITATION_INCHES: Final = "in" +PRECIPITATION_MILLIMETERS: Final = "mm" + +PRECIPITATION_MILLIMETERS_PER_HOUR: Final = "mm/h" +"""Deprecated: please use PRECIPITATION_INTENSITY_MILLIMETERS_PER_HOUR""" + PRECIPITATION_INCHES_PER_HOUR: Final = "in/h" +"""Deprecated: please use PRECIPITATION_INTENSITY_INCHES_PER_HOUR""" # Concentration units CONCENTRATION_MICROGRAMS_PER_CUBIC_METER: Final = "µg/m³" @@ -616,15 +635,22 @@ CONCENTRATION_PARTS_PER_MILLION: Final = "ppm" CONCENTRATION_PARTS_PER_BILLION: Final = "ppb" # Speed units -SPEED_MILLIMETERS_PER_DAY: Final = "mm/d" SPEED_FEET_PER_SECOND: Final = "ft/s" -SPEED_INCHES_PER_DAY: Final = "in/d" SPEED_METERS_PER_SECOND: Final = "m/s" -SPEED_INCHES_PER_HOUR: Final = "in/h" SPEED_KILOMETERS_PER_HOUR: Final = "km/h" SPEED_KNOTS: Final = "kn" SPEED_MILES_PER_HOUR: Final = "mph" +SPEED_MILLIMETERS_PER_DAY: Final = "mm/d" +"""Deprecated: please use PRECIPITATION_INTENSITY_MILLIMETERS_PER_DAY""" + +SPEED_INCHES_PER_DAY: Final = "in/d" +"""Deprecated: please use PRECIPITATION_INTENSITY_INCHES_PER_DAY""" + +SPEED_INCHES_PER_HOUR: Final = "in/h" +"""Deprecated: please use PRECIPITATION_INTENSITY_INCHES_PER_HOUR""" + + # Signal_strength units SIGNAL_STRENGTH_DECIBELS: Final = "dB" SIGNAL_STRENGTH_DECIBELS_MILLIWATT: Final = "dBm" diff --git a/homeassistant/util/unit_conversion.py b/homeassistant/util/unit_conversion.py index 9aa3084887e..0bf895f34a0 100644 --- a/homeassistant/util/unit_conversion.py +++ b/homeassistant/util/unit_conversion.py @@ -21,6 +21,10 @@ from homeassistant.const import ( MASS_POUNDS, POWER_KILO_WATT, POWER_WATT, + PRECIPITATION_INTENSITY_INCHES_PER_DAY, + PRECIPITATION_INTENSITY_INCHES_PER_HOUR, + PRECIPITATION_INTENSITY_MILLIMETERS_PER_DAY, + PRECIPITATION_INTENSITY_MILLIMETERS_PER_HOUR, PRESSURE_BAR, PRESSURE_CBAR, PRESSURE_HPA, @@ -31,13 +35,10 @@ from homeassistant.const import ( PRESSURE_PA, PRESSURE_PSI, SPEED_FEET_PER_SECOND, - SPEED_INCHES_PER_DAY, - SPEED_INCHES_PER_HOUR, SPEED_KILOMETERS_PER_HOUR, SPEED_KNOTS, SPEED_METERS_PER_SECOND, SPEED_MILES_PER_HOUR, - SPEED_MILLIMETERS_PER_DAY, TEMP_CELSIUS, TEMP_FAHRENHEIT, TEMP_KELVIN, @@ -238,24 +239,26 @@ class SpeedConverter(BaseUnitConverter): UNIT_CLASS = "speed" NORMALIZED_UNIT = SPEED_METERS_PER_SECOND _UNIT_CONVERSION: dict[str, float] = { + PRECIPITATION_INTENSITY_INCHES_PER_DAY: _DAYS_TO_SECS / _IN_TO_M, + PRECIPITATION_INTENSITY_INCHES_PER_HOUR: _HRS_TO_SECS / _IN_TO_M, + PRECIPITATION_INTENSITY_MILLIMETERS_PER_DAY: _DAYS_TO_SECS / _MM_TO_M, + PRECIPITATION_INTENSITY_MILLIMETERS_PER_HOUR: _HRS_TO_SECS / _MM_TO_M, SPEED_FEET_PER_SECOND: 1 / _FOOT_TO_M, - SPEED_INCHES_PER_DAY: _DAYS_TO_SECS / _IN_TO_M, - SPEED_INCHES_PER_HOUR: _HRS_TO_SECS / _IN_TO_M, SPEED_KILOMETERS_PER_HOUR: _HRS_TO_SECS / _KM_TO_M, SPEED_KNOTS: _HRS_TO_SECS / _NAUTICAL_MILE_TO_M, SPEED_METERS_PER_SECOND: 1, SPEED_MILES_PER_HOUR: _HRS_TO_SECS / _MILE_TO_M, - SPEED_MILLIMETERS_PER_DAY: _DAYS_TO_SECS / _MM_TO_M, } VALID_UNITS = { + PRECIPITATION_INTENSITY_INCHES_PER_DAY, + PRECIPITATION_INTENSITY_INCHES_PER_HOUR, + PRECIPITATION_INTENSITY_MILLIMETERS_PER_DAY, + PRECIPITATION_INTENSITY_MILLIMETERS_PER_HOUR, SPEED_FEET_PER_SECOND, - SPEED_INCHES_PER_DAY, - SPEED_INCHES_PER_HOUR, SPEED_KILOMETERS_PER_HOUR, SPEED_KNOTS, SPEED_METERS_PER_SECOND, SPEED_MILES_PER_HOUR, - SPEED_MILLIMETERS_PER_DAY, } diff --git a/tests/util/test_unit_conversion.py b/tests/util/test_unit_conversion.py index d74bacc66f8..98be32584c6 100644 --- a/tests/util/test_unit_conversion.py +++ b/tests/util/test_unit_conversion.py @@ -21,6 +21,10 @@ from homeassistant.const import ( MASS_POUNDS, POWER_KILO_WATT, POWER_WATT, + PRECIPITATION_INTENSITY_INCHES_PER_DAY, + PRECIPITATION_INTENSITY_INCHES_PER_HOUR, + PRECIPITATION_INTENSITY_MILLIMETERS_PER_DAY, + PRECIPITATION_INTENSITY_MILLIMETERS_PER_HOUR, PRESSURE_CBAR, PRESSURE_HPA, PRESSURE_INHG, @@ -30,13 +34,10 @@ from homeassistant.const import ( PRESSURE_PA, PRESSURE_PSI, SPEED_FEET_PER_SECOND, - SPEED_INCHES_PER_DAY, - SPEED_INCHES_PER_HOUR, SPEED_KILOMETERS_PER_HOUR, SPEED_KNOTS, SPEED_METERS_PER_SECOND, SPEED_MILES_PER_HOUR, - SPEED_MILLIMETERS_PER_DAY, TEMP_CELSIUS, TEMP_FAHRENHEIT, TEMP_KELVIN, @@ -93,14 +94,15 @@ INVALID_SYMBOL = "bob" (PressureConverter, PRESSURE_CBAR), (PressureConverter, PRESSURE_MMHG), (PressureConverter, PRESSURE_PSI), + (SpeedConverter, PRECIPITATION_INTENSITY_INCHES_PER_DAY), + (SpeedConverter, PRECIPITATION_INTENSITY_INCHES_PER_HOUR), + (SpeedConverter, PRECIPITATION_INTENSITY_MILLIMETERS_PER_DAY), + (SpeedConverter, PRECIPITATION_INTENSITY_MILLIMETERS_PER_HOUR), (SpeedConverter, SPEED_FEET_PER_SECOND), - (SpeedConverter, SPEED_INCHES_PER_DAY), - (SpeedConverter, SPEED_INCHES_PER_HOUR), (SpeedConverter, SPEED_KILOMETERS_PER_HOUR), (SpeedConverter, SPEED_KNOTS), (SpeedConverter, SPEED_METERS_PER_SECOND), (SpeedConverter, SPEED_MILES_PER_HOUR), - (SpeedConverter, SPEED_MILLIMETERS_PER_DAY), (TemperatureConverter, TEMP_CELSIUS), (TemperatureConverter, TEMP_FAHRENHEIT), (TemperatureConverter, TEMP_KELVIN), @@ -389,17 +391,44 @@ def test_pressure_convert( # 5 mi/h * 1.609 km/mi = 8.04672 km/h (5, SPEED_MILES_PER_HOUR, 8.04672, SPEED_KILOMETERS_PER_HOUR), # 5 in/day * 25.4 mm/in = 127 mm/day - (5, SPEED_INCHES_PER_DAY, 127, SPEED_MILLIMETERS_PER_DAY), + ( + 5, + PRECIPITATION_INTENSITY_INCHES_PER_DAY, + 127, + PRECIPITATION_INTENSITY_MILLIMETERS_PER_DAY, + ), # 5 mm/day / 25.4 mm/in = 0.19685 in/day - (5, SPEED_MILLIMETERS_PER_DAY, pytest.approx(0.1968504), SPEED_INCHES_PER_DAY), + ( + 5, + PRECIPITATION_INTENSITY_MILLIMETERS_PER_DAY, + pytest.approx(0.1968504), + PRECIPITATION_INTENSITY_INCHES_PER_DAY, + ), + # 48 mm/day = 2 mm/h + ( + 48, + PRECIPITATION_INTENSITY_MILLIMETERS_PER_DAY, + pytest.approx(2), + PRECIPITATION_INTENSITY_MILLIMETERS_PER_HOUR, + ), # 5 in/hr * 24 hr/day = 3048 mm/day - (5, SPEED_INCHES_PER_HOUR, 3048, SPEED_MILLIMETERS_PER_DAY), + ( + 5, + PRECIPITATION_INTENSITY_INCHES_PER_HOUR, + 3048, + PRECIPITATION_INTENSITY_MILLIMETERS_PER_DAY, + ), # 5 m/s * 39.3701 in/m * 3600 s/hr = 708661 - (5, SPEED_METERS_PER_SECOND, pytest.approx(708661.42), SPEED_INCHES_PER_HOUR), + ( + 5, + SPEED_METERS_PER_SECOND, + pytest.approx(708661.42), + PRECIPITATION_INTENSITY_INCHES_PER_HOUR, + ), # 5000 in/h / 39.3701 in/m / 3600 s/h = 0.03528 m/s ( 5000, - SPEED_INCHES_PER_HOUR, + PRECIPITATION_INTENSITY_INCHES_PER_HOUR, pytest.approx(0.0352778), SPEED_METERS_PER_SECOND, ),