From ea7c839423c4fb546e6bd225fae2b8d3588b5942 Mon Sep 17 00:00:00 2001 From: doggkruse <6468053+doggkruse@users.noreply.github.com> Date: Sat, 23 Dec 2023 04:41:15 -0800 Subject: [PATCH] Apply units of measure provided in API when available in LaCrosse View (#106299) * Apply units of measure provided in API when available to avoid mismatch of native units. Improved fix for #106148 * Fix ruff error --- .../components/lacrosse_view/sensor.py | 24 ++++++++++++++++++- tests/components/lacrosse_view/__init__.py | 15 ++++++++++-- tests/components/lacrosse_view/test_sensor.py | 2 ++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/lacrosse_view/sensor.py b/homeassistant/components/lacrosse_view/sensor.py index 16da95ed598..960ab0ff325 100644 --- a/homeassistant/components/lacrosse_view/sensor.py +++ b/homeassistant/components/lacrosse_view/sensor.py @@ -2,7 +2,7 @@ from __future__ import annotations from collections.abc import Callable -from dataclasses import dataclass +from dataclasses import dataclass, replace import logging from lacrosse_view import Sensor @@ -141,6 +141,15 @@ SENSOR_DESCRIPTIONS = { native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT, ), } +# map of API returned unit of measurement strings to their corresponding unit of measurement +UNIT_OF_MEASUREMENT_MAP = { + "degrees_celsius": UnitOfTemperature.CELSIUS, + "degrees_fahrenheit": UnitOfTemperature.FAHRENHEIT, + "inches": UnitOfPrecipitationDepth.INCHES, + "millimeters": UnitOfPrecipitationDepth.MILLIMETERS, + "kilometers_per_hour": UnitOfSpeed.KILOMETERS_PER_HOUR, + "miles_per_hour": UnitOfSpeed.MILES_PER_HOUR, +} async def async_setup_entry( @@ -171,6 +180,19 @@ async def async_setup_entry( _LOGGER.warning(message) continue + + # if the API returns a different unit of measurement from the description, update it + if sensor.data.get(field) is not None: + native_unit_of_measurement = UNIT_OF_MEASUREMENT_MAP.get( + sensor.data[field].get("unit") + ) + + if native_unit_of_measurement is not None: + description = replace( + description, + native_unit_of_measurement=native_unit_of_measurement, + ) + sensor_list.append( LaCrosseViewSensor( coordinator=coordinator, diff --git a/tests/components/lacrosse_view/__init__.py b/tests/components/lacrosse_view/__init__.py index 66789508f05..913f6c72f24 100644 --- a/tests/components/lacrosse_view/__init__.py +++ b/tests/components/lacrosse_view/__init__.py @@ -70,7 +70,7 @@ TEST_ALREADY_FLOAT_SENSOR = Sensor( sensor_id="2", sensor_field_names=["HeatIndex"], location=Location(id="1", name="Test"), - data={"HeatIndex": {"values": [{"s": 2.3}], "unit": "degrees_celsius"}}, + data={"HeatIndex": {"values": [{"s": 2.3}], "unit": "degrees_fahrenheit"}}, permissions={"read": True}, model="Test", ) @@ -81,7 +81,7 @@ TEST_ALREADY_INT_SENSOR = Sensor( sensor_id="2", sensor_field_names=["WindSpeed"], location=Location(id="1", name="Test"), - data={"WindSpeed": {"values": [{"s": 2}], "unit": "degrees_celsius"}}, + data={"WindSpeed": {"values": [{"s": 2}], "unit": "kilometers_per_hour"}}, permissions={"read": True}, model="Test", ) @@ -107,3 +107,14 @@ TEST_MISSING_FIELD_DATA_SENSOR = Sensor( permissions={"read": True}, model="Test", ) +TEST_UNITS_OVERRIDE_SENSOR = Sensor( + name="Test", + device_id="1", + type="Test", + sensor_id="2", + sensor_field_names=["Temperature"], + location=Location(id="1", name="Test"), + data={"Temperature": {"values": [{"s": "2.1"}], "unit": "degrees_fahrenheit"}}, + permissions={"read": True}, + model="Test", +) diff --git a/tests/components/lacrosse_view/test_sensor.py b/tests/components/lacrosse_view/test_sensor.py index 837d13b8a4b..8fc028e2da1 100644 --- a/tests/components/lacrosse_view/test_sensor.py +++ b/tests/components/lacrosse_view/test_sensor.py @@ -19,6 +19,7 @@ from . import ( TEST_NO_PERMISSION_SENSOR, TEST_SENSOR, TEST_STRING_SENSOR, + TEST_UNITS_OVERRIDE_SENSOR, TEST_UNSUPPORTED_SENSOR, ) @@ -94,6 +95,7 @@ async def test_field_not_supported( (TEST_STRING_SENSOR, "dry", "wet_dry"), (TEST_ALREADY_FLOAT_SENSOR, "-16.5", "heat_index"), (TEST_ALREADY_INT_SENSOR, "2", "wind_speed"), + (TEST_UNITS_OVERRIDE_SENSOR, "-16.6", "temperature"), ], ) async def test_field_types(