Support fetching/setting humidity of HomeKit controller thermostats (#23040)

* Add support for homekit humidity control

* Add tests
This commit is contained in:
Jc2k authored and Paulus Schoutsen committed 2019-04-17 10:03:32 -07:00
1 parent f7afd9d6bc
commit a97fb8fd10
3 files changed
+88 -7

No files matched your search

@@ -5,7 +5,8 @@ https://github.com/home-assistant/home-assistant/issues/15336
"""
from homeassistant.components.climate.const import (
SUPPORT_TARGET_TEMPERATURE, SUPPORT_OPERATION_MODE)
SUPPORT_TARGET_TEMPERATURE, SUPPORT_TARGET_HUMIDITY,
SUPPORT_OPERATION_MODE)
from tests.components.homekit_controller.common import (
device_config_changed, setup_accessories_from_file, setup_test_accessories,
Helper
@@ -26,7 +27,8 @@ async def test_ecobee3_setup(hass):
climate_state = await climate_helper.poll_and_get_state()
assert climate_state.attributes['friendly_name'] == 'HomeW'
assert climate_state.attributes['supported_features'] == (
SUPPORT_TARGET_TEMPERATURE | SUPPORT_OPERATION_MODE
SUPPORT_TARGET_TEMPERATURE | SUPPORT_TARGET_HUMIDITY |
SUPPORT_OPERATION_MODE
)
occ1 = entity_registry.async_get('binary_sensor.kitchen')
@@ -1,6 +1,7 @@
"""Basic checks for HomeKitclimate."""
from homeassistant.components.climate.const import (
DOMAIN, SERVICE_SET_OPERATION_MODE, SERVICE_SET_TEMPERATURE)
DOMAIN, SERVICE_SET_OPERATION_MODE, SERVICE_SET_TEMPERATURE,
SERVICE_SET_HUMIDITY)
from tests.components.homekit_controller.common import (
FakeService, setup_test_component)
@@ -9,6 +10,33 @@ HEATING_COOLING_TARGET = ('thermostat', 'heating-cooling.target')
HEATING_COOLING_CURRENT = ('thermostat', 'heating-cooling.current')
TEMPERATURE_TARGET = ('thermostat', 'temperature.target')
TEMPERATURE_CURRENT = ('thermostat', 'temperature.current')
HUMIDITY_TARGET = ('thermostat', 'relative-humidity.target')
HUMIDITY_CURRENT = ('thermostat', 'relative-humidity.current')
def create_thermostat_service():
"""Define thermostat characteristics."""
service = FakeService('public.hap.service.thermostat')
char = service.add_characteristic('heating-cooling.target')
char.value = 0
char = service.add_characteristic('heating-cooling.current')
char.value = 0
char = service.add_characteristic('temperature.target')
char.value = 0
char = service.add_characteristic('temperature.current')
char.value = 0
char = service.add_characteristic('relative-humidity.target')
char.value = 0
char = service.add_characteristic('relative-humidity.current')
char.value = 0
return service
async def test_climate_respect_supported_op_modes_1(hass, utcnow):
@@ -77,28 +105,49 @@ async def test_climate_change_thermostat_temperature(hass, utcnow):
assert helper.characteristics[TEMPERATURE_TARGET].value == 25
async def test_climate_change_thermostat_humidity(hass, utcnow):
"""Test that we can turn a HomeKit thermostat on and off again."""
helper = await setup_test_component(hass, [create_thermostat_service()])
await hass.services.async_call(DOMAIN, SERVICE_SET_HUMIDITY, {
'entity_id': 'climate.testdevice',
'humidity': 50,
}, blocking=True)
assert helper.characteristics[HUMIDITY_TARGET].value == 50
await hass.services.async_call(DOMAIN, SERVICE_SET_HUMIDITY, {
'entity_id': 'climate.testdevice',
'humidity': 45,
}, blocking=True)
assert helper.characteristics[HUMIDITY_TARGET].value == 45
async def test_climate_read_thermostat_state(hass, utcnow):
"""Test that we can read the state of a HomeKit thermostat accessory."""
from homekit.model.services import ThermostatService
helper = await setup_test_component(hass, [ThermostatService()])
helper = await setup_test_component(hass, [create_thermostat_service()])
# Simulate that heating is on
helper.characteristics[TEMPERATURE_CURRENT].value = 19
helper.characteristics[TEMPERATURE_TARGET].value = 21
helper.characteristics[HEATING_COOLING_CURRENT].value = 1
helper.characteristics[HEATING_COOLING_TARGET].value = 1
helper.characteristics[HUMIDITY_CURRENT].value = 50
helper.characteristics[HUMIDITY_TARGET].value = 45
state = await helper.poll_and_get_state()
assert state.state == 'heat'
assert state.attributes['current_temperature'] == 19
assert state.attributes['current_humidity'] == 50
# Simulate that cooling is on
helper.characteristics[TEMPERATURE_CURRENT].value = 21
helper.characteristics[TEMPERATURE_TARGET].value = 19
helper.characteristics[HEATING_COOLING_CURRENT].value = 2
helper.characteristics[HEATING_COOLING_TARGET].value = 2
helper.characteristics[HUMIDITY_CURRENT].value = 45
helper.characteristics[HUMIDITY_TARGET].value = 45
state = await helper.poll_and_get_state()
assert state.state == 'cool'
assert state.attributes['current_temperature'] == 21
assert state.attributes['current_humidity'] == 45