diff --git a/homeassistant/components/homekit_controller/climate.py b/homeassistant/components/homekit_controller/climate.py index dfbd6f68daa..d8bf1359689 100644 --- a/homeassistant/components/homekit_controller/climate.py +++ b/homeassistant/components/homekit_controller/climate.py @@ -36,12 +36,12 @@ class HomeKitClimateDevice(HomeKitEntity, ClimateDevice): def __init__(self, *args): """Initialise the device.""" - super().__init__(*args) self._state = None self._current_mode = None self._valid_modes = [] self._current_temp = None self._target_temp = None + super().__init__(*args) def get_characteristic_types(self): """Define the homekit characteristics the entity cares about.""" @@ -57,10 +57,26 @@ class HomeKitClimateDevice(HomeKitEntity, ClimateDevice): def _setup_heating_cooling_target(self, characteristic): self._features |= SUPPORT_OPERATION_MODE - valid_values = characteristic.get( - 'valid-values', DEFAULT_VALID_MODES) + if 'valid-values' in characteristic: + valid_values = [ + val for val in DEFAULT_VALID_MODES + if val in characteristic['valid-values'] + ] + else: + valid_values = DEFAULT_VALID_MODES + if 'minValue' in characteristic: + valid_values = [ + val for val in valid_values + if val >= characteristic['minValue'] + ] + if 'maxValue' in characteristic: + valid_values = [ + val for val in valid_values + if val <= characteristic['maxValue'] + ] + self._valid_modes = [ - MODE_HOMEKIT_TO_HASS.get(mode) for mode in valid_values + MODE_HOMEKIT_TO_HASS[mode] for mode in valid_values ] def _setup_temperature_target(self, characteristic): diff --git a/tests/components/homekit_controller/test_climate.py b/tests/components/homekit_controller/test_climate.py index b04a57fa967..18e54644b5a 100644 --- a/tests/components/homekit_controller/test_climate.py +++ b/tests/components/homekit_controller/test_climate.py @@ -2,7 +2,7 @@ from homeassistant.components.climate.const import ( DOMAIN, SERVICE_SET_OPERATION_MODE, SERVICE_SET_TEMPERATURE) from tests.components.homekit_controller.common import ( - setup_test_component) + FakeService, setup_test_component) HEATING_COOLING_TARGET = ('thermostat', 'heating-cooling.target') @@ -11,6 +11,33 @@ TEMPERATURE_TARGET = ('thermostat', 'temperature.target') TEMPERATURE_CURRENT = ('thermostat', 'temperature.current') +async def test_climate_respect_supported_op_modes_1(hass, utcnow): + """Test that climate respects minValue/maxValue hints.""" + service = FakeService('public.hap.service.thermostat') + char = service.add_characteristic('heating-cooling.target') + char.value = 0 + char.minValue = 0 + char.maxValue = 1 + + helper = await setup_test_component(hass, [service]) + + state = await helper.poll_and_get_state() + assert state.attributes['operation_list'] == ['off', 'heat'] + + +async def test_climate_respect_supported_op_modes_2(hass, utcnow): + """Test that climate respects validValue hints.""" + service = FakeService('public.hap.service.thermostat') + char = service.add_characteristic('heating-cooling.target') + char.value = 0 + char.validValues = [0, 1, 2] + + helper = await setup_test_component(hass, [service]) + + state = await helper.poll_and_get_state() + assert state.attributes['operation_list'] == ['off', 'heat', 'cool'] + + async def test_climate_change_thermostat_state(hass, utcnow): """Test that we can turn a HomeKit thermostat on and off again.""" from homekit.model.services import ThermostatService