mirror of
https://github.com/home-assistant/core.git
synced 2025-07-24 21:57:51 +00:00
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:
parent
433d3a5106
commit
012291a1f3
@ -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]}
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user