diff --git a/homeassistant/components/homekit/type_lights.py b/homeassistant/components/homekit/type_lights.py index 2415bb1a4df..d88e7100131 100644 --- a/homeassistant/components/homekit/type_lights.py +++ b/homeassistant/components/homekit/type_lights.py @@ -32,6 +32,7 @@ class Light(HomeAccessory): self._flag = {CHAR_ON: False, CHAR_BRIGHTNESS: False, CHAR_HUE: False, CHAR_SATURATION: False, RGB_COLOR: False} + self._state = 0 self.chars = [] self._features = self._hass.states.get(self._entity_id) \ @@ -47,7 +48,7 @@ class Light(HomeAccessory): serv_light = add_preload_service(self, SERV_LIGHTBULB, self.chars) self.char_on = serv_light.get_characteristic(CHAR_ON) self.char_on.setter_callback = self.set_state - self.char_on.value = 0 + self.char_on.value = self._state if CHAR_BRIGHTNESS in self.chars: self.char_brightness = serv_light \ @@ -66,7 +67,7 @@ class Light(HomeAccessory): def set_state(self, value): """Set state if call came from HomeKit.""" - if self._flag[CHAR_BRIGHTNESS]: + if self._state == value: return _LOGGER.debug('%s: Set state to %d', self._entity_id, value) @@ -83,8 +84,11 @@ class Light(HomeAccessory): _LOGGER.debug('%s: Set brightness to %d', self._entity_id, value) self._flag[CHAR_BRIGHTNESS] = True self.char_brightness.set_value(value, should_callback=False) - self._hass.components.light.turn_on( - self._entity_id, brightness_pct=value) + if value != 0: + self._hass.components.light.turn_on( + self._entity_id, brightness_pct=value) + else: + self._hass.components.light.turn_off(self._entity_id) def set_saturation(self, value): """Set saturation if call came from HomeKit.""" @@ -121,10 +125,11 @@ class Light(HomeAccessory): # Handle State state = new_state.state - if not self._flag[CHAR_ON] and state in [STATE_ON, STATE_OFF] and \ - self.char_on.value != (state == STATE_ON): - self.char_on.set_value(state == STATE_ON, should_callback=False) - self._flag[CHAR_ON] = False + if state in (STATE_ON, STATE_OFF): + self._state = 1 if state == STATE_ON else 0 + if not self._flag[CHAR_ON] and self.char_on.value != self._state: + self.char_on.set_value(self._state, should_callback=False) + self._flag[CHAR_ON] = False # Handle Brightness if CHAR_BRIGHTNESS in self.chars: diff --git a/tests/components/homekit/test_type_lights.py b/tests/components/homekit/test_type_lights.py index b4d4d5a5945..ee1900fd7c5 100644 --- a/tests/components/homekit/test_type_lights.py +++ b/tests/components/homekit/test_type_lights.py @@ -57,19 +57,21 @@ class TestHomekitLights(unittest.TestCase): self.assertEqual(acc.char_on.value, 0) # Set from HomeKit - acc.char_on.set_value(True) + acc.char_on.set_value(1) self.hass.block_till_done() - self.assertEqual( - self.events[0].data[ATTR_DOMAIN], DOMAIN) - self.assertEqual( - self.events[0].data[ATTR_SERVICE], SERVICE_TURN_ON) + self.assertEqual(self.events[0].data[ATTR_DOMAIN], DOMAIN) + self.assertEqual(self.events[0].data[ATTR_SERVICE], SERVICE_TURN_ON) - acc.char_on.set_value(False) + self.hass.states.set(entity_id, STATE_ON) + self.hass.block_till_done() + + acc.char_on.set_value(0) + self.hass.block_till_done() + self.assertEqual(self.events[1].data[ATTR_DOMAIN], DOMAIN) + self.assertEqual(self.events[1].data[ATTR_SERVICE], SERVICE_TURN_OFF) + + self.hass.states.set(entity_id, STATE_OFF) self.hass.block_till_done() - self.assertEqual( - self.events[1].data[ATTR_DOMAIN], DOMAIN) - self.assertEqual( - self.events[1].data[ATTR_SERVICE], SERVICE_TURN_OFF) # Remove entity self.hass.states.remove(entity_id) @@ -95,15 +97,27 @@ class TestHomekitLights(unittest.TestCase): acc.char_brightness.set_value(20) acc.char_on.set_value(1) self.hass.block_till_done() - self.assertEqual( - self.events[0].data[ATTR_DOMAIN], DOMAIN) - self.assertEqual( - self.events[0].data[ATTR_SERVICE], SERVICE_TURN_ON) - print(self.events[0].data) + self.assertEqual(self.events[0].data[ATTR_DOMAIN], DOMAIN) + self.assertEqual(self.events[0].data[ATTR_SERVICE], SERVICE_TURN_ON) self.assertEqual( self.events[0].data[ATTR_SERVICE_DATA], { ATTR_ENTITY_ID: entity_id, ATTR_BRIGHTNESS_PCT: 20}) + acc.char_on.set_value(1) + acc.char_brightness.set_value(40) + self.hass.block_till_done() + self.assertEqual(self.events[1].data[ATTR_DOMAIN], DOMAIN) + self.assertEqual(self.events[1].data[ATTR_SERVICE], SERVICE_TURN_ON) + self.assertEqual( + self.events[1].data[ATTR_SERVICE_DATA], { + ATTR_ENTITY_ID: entity_id, ATTR_BRIGHTNESS_PCT: 40}) + + acc.char_on.set_value(1) + acc.char_brightness.set_value(0) + self.hass.block_till_done() + self.assertEqual(self.events[2].data[ATTR_DOMAIN], DOMAIN) + self.assertEqual(self.events[2].data[ATTR_SERVICE], SERVICE_TURN_OFF) + def test_light_rgb_color(self): """Test light with rgb_color.""" entity_id = 'light.demo' @@ -123,10 +137,8 @@ class TestHomekitLights(unittest.TestCase): acc.char_hue.set_value(145) acc.char_saturation.set_value(75) self.hass.block_till_done() - self.assertEqual( - self.events[0].data[ATTR_DOMAIN], DOMAIN) - self.assertEqual( - self.events[0].data[ATTR_SERVICE], SERVICE_TURN_ON) + self.assertEqual(self.events[0].data[ATTR_DOMAIN], DOMAIN) + self.assertEqual(self.events[0].data[ATTR_SERVICE], SERVICE_TURN_ON) self.assertEqual( self.events[0].data[ATTR_SERVICE_DATA], { ATTR_ENTITY_ID: entity_id, ATTR_HS_COLOR: (145, 75)})