diff --git a/homeassistant/components/light/__init__.py b/homeassistant/components/light/__init__.py index acf95a3c081..7fe7ae343f9 100644 --- a/homeassistant/components/light/__init__.py +++ b/homeassistant/components/light/__init__.py @@ -175,6 +175,17 @@ def preprocess_turn_on_alternatives(params): params[ATTR_HS_COLOR] = color_util.color_RGB_to_hs(*rgb_color) +def preprocess_turn_off(params): + """Process data for turning light off if brightness is 0.""" + if ATTR_BRIGHTNESS in params and params[ATTR_BRIGHTNESS] == 0: + # Zero brightness: Light will be turned off + params = {k: v for k, v in params.items() if k in [ATTR_TRANSITION, + ATTR_FLASH]} + return (True, params) # Light should be turned off + + return (False, None) # Light should be turned on + + class SetIntentHandler(intent.IntentHandler): """Handle set color intents.""" @@ -272,17 +283,24 @@ async def async_setup(hass, config): ) preprocess_turn_on_alternatives(params) + turn_lights_off, off_params = preprocess_turn_off(params) update_tasks = [] for light in target_lights: light.async_set_context(service.context) pars = params + off_pars = off_params + turn_light_off = turn_lights_off if not pars: pars = params.copy() pars[ATTR_PROFILE] = Profiles.get_default(light.entity_id) preprocess_turn_on_alternatives(pars) - await light.async_turn_on(**pars) + turn_light_off, off_pars = preprocess_turn_off(pars) + if turn_light_off: + await light.async_turn_off(**off_pars) + else: + await light.async_turn_on(**pars) if not light.should_poll: continue diff --git a/homeassistant/components/tradfri/light.py b/homeassistant/components/tradfri/light.py index 38ce428b51b..07ab4806dfc 100644 --- a/homeassistant/components/tradfri/light.py +++ b/homeassistant/components/tradfri/light.py @@ -263,8 +263,6 @@ class TradfriLight(Light): brightness = kwargs[ATTR_BRIGHTNESS] if brightness > 254: brightness = 254 - elif brightness < 0: - brightness = 0 dimmer_data = {ATTR_DIMMER: brightness, ATTR_TRANSITION_TIME: transition_time} dimmer_command = self._light_control.set_dimmer(**dimmer_data) diff --git a/tests/components/light/test_init.py b/tests/components/light/test_init.py index 28d688b2080..0025e9bce66 100644 --- a/tests/components/light/test_init.py +++ b/tests/components/light/test_init.py @@ -161,6 +161,19 @@ class TestLight(unittest.TestCase): assert not light.is_on(self.hass, dev2.entity_id) assert not light.is_on(self.hass, dev3.entity_id) + # turn off all lights by setting brightness to 0 + common.turn_on(self.hass) + + self.hass.block_till_done() + + common.turn_on(self.hass, brightness=0) + + self.hass.block_till_done() + + assert not light.is_on(self.hass, dev1.entity_id) + assert not light.is_on(self.hass, dev2.entity_id) + assert not light.is_on(self.hass, dev3.entity_id) + # toggle all lights common.toggle(self.hass) @@ -207,6 +220,32 @@ class TestLight(unittest.TestCase): light.ATTR_HS_COLOR: (71.059, 100), } == data + # Ensure attributes are filtered when light is turned off + common.turn_on(self.hass, dev1.entity_id, + transition=10, brightness=0, color_name='blue') + common.turn_on( + self.hass, dev2.entity_id, brightness=0, rgb_color=(255, 255, 255), + white_value=0) + common.turn_on(self.hass, dev3.entity_id, brightness=0, + xy_color=(.4, .6)) + + self.hass.block_till_done() + + assert not light.is_on(self.hass, dev1.entity_id) + assert not light.is_on(self.hass, dev2.entity_id) + assert not light.is_on(self.hass, dev3.entity_id) + + _, data = dev1.last_call('turn_off') + assert { + light.ATTR_TRANSITION: 10, + } == data + + _, data = dev2.last_call('turn_off') + assert {} == data + + _, data = dev3.last_call('turn_off') + assert {} == data + # One of the light profiles prof_name, prof_h, prof_s, prof_bri = 'relax', 35.932, 69.412, 144 @@ -292,6 +331,7 @@ class TestLight(unittest.TestCase): with open(user_light_file, 'w') as user_file: user_file.write('id,x,y,brightness\n') user_file.write('test,.4,.6,100\n') + user_file.write('test_off,0,0,0\n') assert setup_component( self.hass, light.DOMAIN, {light.DOMAIN: {CONF_PLATFORM: 'test'}} @@ -305,11 +345,21 @@ class TestLight(unittest.TestCase): _, data = dev1.last_call('turn_on') + assert light.is_on(self.hass, dev1.entity_id) assert { light.ATTR_HS_COLOR: (71.059, 100), light.ATTR_BRIGHTNESS: 100 } == data + common.turn_on(self.hass, dev1.entity_id, profile='test_off') + + self.hass.block_till_done() + + _, data = dev1.last_call('turn_off') + + assert not light.is_on(self.hass, dev1.entity_id) + assert {} == data + def test_default_profiles_group(self): """Test default turn-on light profile for all lights.""" platform = loader.get_component(self.hass, 'light.test') diff --git a/tests/components/light/test_tradfri.py b/tests/components/light/test_tradfri.py index 337031cf92c..37d3ec322ff 100644 --- a/tests/components/light/test_tradfri.py +++ b/tests/components/light/test_tradfri.py @@ -35,20 +35,12 @@ TURN_ON_TEST_CASES = [ 'brightness': 100 } ], - # Brightness == 0 + # Brightness == 1 [ {'can_set_dimmer': True}, - {'brightness': 0}, + {'brightness': 1}, { - 'brightness': 0 - } - ], - # Brightness < 0 - [ - {'can_set_dimmer': True}, - {'brightness': -1}, - { - 'brightness': 0 + 'brightness': 1 } ], # Brightness > 254