From 039cc98278612cbfc08d2c242ba6182a0f399a4d Mon Sep 17 00:00:00 2001 From: Joakim Plate Date: Mon, 16 Dec 2019 08:04:59 +0100 Subject: [PATCH] Support case of unknown/unavailable temperature/humidity (#29959) * Support case of unknown/unavailable temperature/humidity State is never None, just a string. * Lint suggestion --- .../components/google_assistant/trait.py | 5 +-- .../components/google_assistant/test_trait.py | 36 +++++++++++++++---- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/google_assistant/trait.py b/homeassistant/components/google_assistant/trait.py index 40def0cb464..d49632755cd 100644 --- a/homeassistant/components/google_assistant/trait.py +++ b/homeassistant/components/google_assistant/trait.py @@ -44,6 +44,7 @@ from homeassistant.const import ( STATE_LOCKED, STATE_OFF, STATE_ON, + STATE_UNAVAILABLE, STATE_UNKNOWN, TEMP_CELSIUS, TEMP_FAHRENHEIT, @@ -666,7 +667,7 @@ class TemperatureSettingTrait(_Trait): device_class = attrs.get(ATTR_DEVICE_CLASS) if device_class == sensor.DEVICE_CLASS_TEMPERATURE: current_temp = self.state.state - if current_temp is not None: + if current_temp not in (STATE_UNKNOWN, STATE_UNAVAILABLE): response["thermostatTemperatureAmbient"] = round( temp_util.convert(float(current_temp), unit, TEMP_CELSIUS), 1 ) @@ -887,7 +888,7 @@ class HumiditySettingTrait(_Trait): device_class = attrs.get(ATTR_DEVICE_CLASS) if device_class == sensor.DEVICE_CLASS_HUMIDITY: current_humidity = self.state.state - if current_humidity is not None: + if current_humidity not in (STATE_UNKNOWN, STATE_UNAVAILABLE): response["humidityAmbientPercent"] = round(float(current_humidity)) return response diff --git a/tests/components/google_assistant/test_trait.py b/tests/components/google_assistant/test_trait.py index 8a1d7384729..98e5149de1d 100644 --- a/tests/components/google_assistant/test_trait.py +++ b/tests/components/google_assistant/test_trait.py @@ -1615,22 +1615,37 @@ async def test_temperature_setting_sensor(hass): sensor.DOMAIN, 0, sensor.DEVICE_CLASS_TEMPERATURE ) - hass.config.units.temperature_unit = TEMP_FAHRENHEIT + +@pytest.mark.parametrize( + "unit_in,unit_out,state,ambient", + [ + (TEMP_FAHRENHEIT, "F", "70", 21.1), + (TEMP_CELSIUS, "C", "21.1", 21.1), + (TEMP_FAHRENHEIT, "F", "unavailable", None), + (TEMP_FAHRENHEIT, "F", "unknown", None), + ], +) +async def test_temperature_setting_sensor_data(hass, unit_in, unit_out, state, ambient): + """Test TemperatureSetting trait support for temperature sensor.""" + hass.config.units.temperature_unit = unit_in trt = trait.TemperatureSettingTrait( hass, State( - "sensor.test", "70", {ATTR_DEVICE_CLASS: sensor.DEVICE_CLASS_TEMPERATURE} + "sensor.test", state, {ATTR_DEVICE_CLASS: sensor.DEVICE_CLASS_TEMPERATURE} ), BASIC_CONFIG, ) assert trt.sync_attributes() == { "queryOnlyTemperatureSetting": True, - "thermostatTemperatureUnit": "F", + "thermostatTemperatureUnit": unit_out, } - assert trt.query_attributes() == {"thermostatTemperatureAmbient": 21.1} + if ambient: + assert trt.query_attributes() == {"thermostatTemperatureAmbient": ambient} + else: + assert trt.query_attributes() == {} hass.config.units.temperature_unit = TEMP_CELSIUS @@ -1646,14 +1661,23 @@ async def test_humidity_setting_sensor(hass): sensor.DOMAIN, 0, sensor.DEVICE_CLASS_HUMIDITY ) + +@pytest.mark.parametrize( + "state,ambient", [("70", 70), ("unavailable", None), ("unknown", None)] +) +async def test_humidity_setting_sensor_data(hass, state, ambient): + """Test HumiditySetting trait support for humidity sensor.""" trt = trait.HumiditySettingTrait( hass, - State("sensor.test", "70", {ATTR_DEVICE_CLASS: sensor.DEVICE_CLASS_HUMIDITY}), + State("sensor.test", state, {ATTR_DEVICE_CLASS: sensor.DEVICE_CLASS_HUMIDITY}), BASIC_CONFIG, ) assert trt.sync_attributes() == {"queryOnlyHumiditySetting": True} - assert trt.query_attributes() == {"humidityAmbientPercent": 70} + if ambient: + assert trt.query_attributes() == {"humidityAmbientPercent": ambient} + else: + assert trt.query_attributes() == {} with pytest.raises(helpers.SmartHomeError) as err: await trt.execute(trait.COMMAND_ONOFF, BASIC_DATA, {"on": False}, {})