Fix google_asssistant sensor state reporting (#112838)

* Fix post google_assistant sensor values as float not string

* Fix aqi reporting and improve tests

* Fix _air_quality_description_for_aqi and  test
This commit is contained in:
Jan Bouwhuis 2024-03-12 09:07:20 +01:00 committed by GitHub
parent 433d3a5106
commit 012291a1f3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 35 additions and 20 deletions

View File

@ -2707,10 +2707,9 @@ class SensorStateTrait(_Trait):
name = TRAIT_SENSOR_STATE name = TRAIT_SENSOR_STATE
commands: list[str] = [] commands: list[str] = []
def _air_quality_description_for_aqi(self, aqi): def _air_quality_description_for_aqi(self, aqi: float | None) -> str:
if aqi is None or aqi.isnumeric() is False: if aqi is None or aqi < 0:
return "unknown" return "unknown"
aqi = int(aqi)
if aqi <= 50: if aqi <= 50:
return "healthy" return "healthy"
if aqi <= 100: if aqi <= 100:
@ -2765,11 +2764,17 @@ class SensorStateTrait(_Trait):
if device_class is None or data is None: if device_class is None or data is None:
return {} return {}
sensor_data = {"name": data[0], "rawValue": self.state.state} try:
value = float(self.state.state)
except ValueError:
value = None
if self.state.state == STATE_UNKNOWN:
value = None
sensor_data = {"name": data[0], "rawValue": value}
if device_class == sensor.SensorDeviceClass.AQI: if device_class == sensor.SensorDeviceClass.AQI:
sensor_data["currentSensorState"] = self._air_quality_description_for_aqi( sensor_data["currentSensorState"] = self._air_quality_description_for_aqi(
self.state.state value
) )
return {"currentSensorStateData": [sensor_data]} return {"currentSensorStateData": [sensor_data]}

View File

@ -1,6 +1,7 @@
"""Tests for the Google Assistant traits.""" """Tests for the Google Assistant traits."""
from datetime import datetime, timedelta from datetime import datetime, timedelta
from typing import Any
from unittest.mock import ANY, patch from unittest.mock import ANY, patch
from freezegun.api import FrozenDateTimeFactory from freezegun.api import FrozenDateTimeFactory
@ -3926,16 +3927,15 @@ async def test_air_quality_description_for_aqi(hass: HomeAssistant) -> None:
BASIC_CONFIG, BASIC_CONFIG,
) )
assert trt._air_quality_description_for_aqi("0") == "healthy" assert trt._air_quality_description_for_aqi(0) == "healthy"
assert trt._air_quality_description_for_aqi("75") == "moderate" assert trt._air_quality_description_for_aqi(75) == "moderate"
assert ( assert (
trt._air_quality_description_for_aqi("125") == "unhealthy for sensitive groups" trt._air_quality_description_for_aqi(125.0) == "unhealthy for sensitive groups"
) )
assert trt._air_quality_description_for_aqi("175") == "unhealthy" assert trt._air_quality_description_for_aqi(175) == "unhealthy"
assert trt._air_quality_description_for_aqi("250") == "very unhealthy" assert trt._air_quality_description_for_aqi(250) == "very unhealthy"
assert trt._air_quality_description_for_aqi("350") == "hazardous" assert trt._air_quality_description_for_aqi(350) == "hazardous"
assert trt._air_quality_description_for_aqi("-1") == "unknown" assert trt._air_quality_description_for_aqi(-1) == "unknown"
assert trt._air_quality_description_for_aqi("non-numeric") == "unknown"
async def test_null_device_class(hass: HomeAssistant) -> None: async def test_null_device_class(hass: HomeAssistant) -> None:
@ -3956,7 +3956,19 @@ async def test_null_device_class(hass: HomeAssistant) -> None:
assert trt.query_attributes() == {} assert trt.query_attributes() == {}
async def test_sensorstate(hass: HomeAssistant) -> None: @pytest.mark.parametrize(
("value", "published", "aqi"),
[
(100.0, 100.0, "moderate"),
(10.0, 10.0, "healthy"),
(0, 0.0, "healthy"),
("", None, "unknown"),
("unknown", None, "unknown"),
],
)
async def test_sensorstate(
hass: HomeAssistant, value: Any, published: Any, aqi: Any
) -> None:
"""Test SensorState trait support for sensor domain.""" """Test SensorState trait support for sensor domain."""
sensor_types = { sensor_types = {
sensor.SensorDeviceClass.AQI: ("AirQuality", "AQI"), sensor.SensorDeviceClass.AQI: ("AirQuality", "AQI"),
@ -3978,7 +3990,7 @@ async def test_sensorstate(hass: HomeAssistant) -> None:
hass, hass,
State( State(
"sensor.test", "sensor.test",
100.0, value,
{ {
"device_class": sensor_type, "device_class": sensor_type,
}, },
@ -4024,16 +4036,14 @@ async def test_sensorstate(hass: HomeAssistant) -> None:
"currentSensorStateData": [ "currentSensorStateData": [
{ {
"name": name, "name": name,
"currentSensorState": trt._air_quality_description_for_aqi( "currentSensorState": aqi,
trt.state.state "rawValue": published,
),
"rawValue": trt.state.state,
}, },
] ]
} }
else: else:
assert trt.query_attributes() == { assert trt.query_attributes() == {
"currentSensorStateData": [{"name": name, "rawValue": trt.state.state}] "currentSensorStateData": [{"name": name, "rawValue": published}]
} }
assert helpers.get_google_type(sensor.DOMAIN, None) is not None assert helpers.get_google_type(sensor.DOMAIN, None) is not None