diff --git a/homeassistant/components/weather/__init__.py b/homeassistant/components/weather/__init__.py index 6f2de6a3cb0..1fdb9173646 100644 --- a/homeassistant/components/weather/__init__.py +++ b/homeassistant/components/weather/__init__.py @@ -22,7 +22,9 @@ from homeassistant.const import ( PRESSURE_INHG, PRESSURE_MBAR, PRESSURE_MMHG, + SPEED_FEET_PER_SECOND, SPEED_KILOMETERS_PER_HOUR, + SPEED_KNOTS, SPEED_METERS_PER_SECOND, SPEED_MILES_PER_HOUR, TEMP_CELSIUS, @@ -118,8 +120,10 @@ VALID_UNITS_VISIBILITY: tuple[str, ...] = ( LENGTH_MILES, ) VALID_UNITS_WIND_SPEED: tuple[str, ...] = ( - SPEED_METERS_PER_SECOND, + SPEED_FEET_PER_SECOND, SPEED_KILOMETERS_PER_HOUR, + SPEED_KNOTS, + SPEED_METERS_PER_SECOND, SPEED_MILES_PER_HOUR, ) diff --git a/homeassistant/const.py b/homeassistant/const.py index 7b91973a930..698f6bee240 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -608,10 +608,12 @@ 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" # Signal_strength units diff --git a/homeassistant/util/speed.py b/homeassistant/util/speed.py index 14b28bde676..12618e020f8 100644 --- a/homeassistant/util/speed.py +++ b/homeassistant/util/speed.py @@ -5,9 +5,11 @@ from numbers import Number from homeassistant.const import ( SPEED, + 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, @@ -15,24 +17,30 @@ from homeassistant.const import ( ) VALID_UNITS: tuple[str, ...] = ( + 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, ) +FOOT_TO_M = 0.3048 HRS_TO_SECS = 60 * 60 # 1 hr = 3600 seconds IN_TO_M = 0.0254 KM_TO_M = 1000 # 1 km = 1000 m MILE_TO_M = 1609.344 +NAUTICAL_MILE_TO_M = 1852 # 1 nautical mile = 1852 m # Units in terms of m/s UNIT_CONVERSION: dict[str, float] = { + SPEED_FEET_PER_SECOND: 1 / FOOT_TO_M, SPEED_INCHES_PER_DAY: (24 * HRS_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: (24 * HRS_TO_SECS) * 1000, diff --git a/tests/util/test_speed.py b/tests/util/test_speed.py index f0a17e6ae15..9c7fd070313 100644 --- a/tests/util/test_speed.py +++ b/tests/util/test_speed.py @@ -2,9 +2,11 @@ import pytest from homeassistant.const import ( + 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, @@ -61,6 +63,10 @@ def test_convert_nonnumeric_value(): (5, SPEED_METERS_PER_SECOND, 708661, SPEED_INCHES_PER_HOUR), # 5000 in/h / 39.3701 in/m / 3600 s/h = 0.03528 m/s (5000, SPEED_INCHES_PER_HOUR, 0.03528, SPEED_METERS_PER_SECOND), + # 5 kt * 1852 m/nmi / 3600 s/h = 2.5722 m/s + (5, SPEED_KNOTS, 2.5722, SPEED_METERS_PER_SECOND), + # 5 ft/s * 0.3048 m/ft = 1.524 m/s + (5, SPEED_FEET_PER_SECOND, 1.524, SPEED_METERS_PER_SECOND), ], ) def test_convert_different_units(from_value, from_unit, expected, to_unit):