HomeKit: Fix setting light brightness (#13518)

* Added test
This commit is contained in:
cdce8p 2018-03-29 18:35:57 +02:00 committed by GitHub
parent 3b537f6e2a
commit cea2de5eb5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 27 deletions

View File

@ -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:

View File

@ -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)})