Support case of unknown/unavailable temperature/humidity (#29959)

* Support case of unknown/unavailable temperature/humidity

State is never None, just a string.

* Lint suggestion
This commit is contained in:
Joakim Plate 2019-12-16 08:04:59 +01:00 committed by Paulus Schoutsen
parent 445fd15f76
commit 039cc98278
2 changed files with 33 additions and 8 deletions

View File

@ -44,6 +44,7 @@ from homeassistant.const import (
STATE_LOCKED, STATE_LOCKED,
STATE_OFF, STATE_OFF,
STATE_ON, STATE_ON,
STATE_UNAVAILABLE,
STATE_UNKNOWN, STATE_UNKNOWN,
TEMP_CELSIUS, TEMP_CELSIUS,
TEMP_FAHRENHEIT, TEMP_FAHRENHEIT,
@ -666,7 +667,7 @@ class TemperatureSettingTrait(_Trait):
device_class = attrs.get(ATTR_DEVICE_CLASS) device_class = attrs.get(ATTR_DEVICE_CLASS)
if device_class == sensor.DEVICE_CLASS_TEMPERATURE: if device_class == sensor.DEVICE_CLASS_TEMPERATURE:
current_temp = self.state.state current_temp = self.state.state
if current_temp is not None: if current_temp not in (STATE_UNKNOWN, STATE_UNAVAILABLE):
response["thermostatTemperatureAmbient"] = round( response["thermostatTemperatureAmbient"] = round(
temp_util.convert(float(current_temp), unit, TEMP_CELSIUS), 1 temp_util.convert(float(current_temp), unit, TEMP_CELSIUS), 1
) )
@ -887,7 +888,7 @@ class HumiditySettingTrait(_Trait):
device_class = attrs.get(ATTR_DEVICE_CLASS) device_class = attrs.get(ATTR_DEVICE_CLASS)
if device_class == sensor.DEVICE_CLASS_HUMIDITY: if device_class == sensor.DEVICE_CLASS_HUMIDITY:
current_humidity = self.state.state 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)) response["humidityAmbientPercent"] = round(float(current_humidity))
return response return response

View File

@ -1615,22 +1615,37 @@ async def test_temperature_setting_sensor(hass):
sensor.DOMAIN, 0, sensor.DEVICE_CLASS_TEMPERATURE 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( trt = trait.TemperatureSettingTrait(
hass, hass,
State( State(
"sensor.test", "70", {ATTR_DEVICE_CLASS: sensor.DEVICE_CLASS_TEMPERATURE} "sensor.test", state, {ATTR_DEVICE_CLASS: sensor.DEVICE_CLASS_TEMPERATURE}
), ),
BASIC_CONFIG, BASIC_CONFIG,
) )
assert trt.sync_attributes() == { assert trt.sync_attributes() == {
"queryOnlyTemperatureSetting": True, "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 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 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( trt = trait.HumiditySettingTrait(
hass, 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, BASIC_CONFIG,
) )
assert trt.sync_attributes() == {"queryOnlyHumiditySetting": True} 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: with pytest.raises(helpers.SmartHomeError) as err:
await trt.execute(trait.COMMAND_ONOFF, BASIC_DATA, {"on": False}, {}) await trt.execute(trait.COMMAND_ONOFF, BASIC_DATA, {"on": False}, {})