Adjust precipitation units (#79780)

* Adjust precipitation units

* Use PRECIPITATION_INTENSITY

* Revert isy994

* Adjust SensorDeviceClass docstring

* Adjust comment
This commit is contained in:
epenet 2022-10-19 14:35:49 +02:00 committed by GitHub
parent a70f9b8995
commit 9afb4c6c9e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 83 additions and 25 deletions

View file

@ -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`

View file

@ -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"

View file

@ -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,
}

View file

@ -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,
),