diff --git a/homeassistant/components/script.py b/homeassistant/components/script.py index dbb145ebb1d..1ad07a9a5bd 100644 --- a/homeassistant/components/script.py +++ b/homeassistant/components/script.py @@ -15,7 +15,7 @@ from itertools import islice import homeassistant.util.dt as date_util from homeassistant.const import ( ATTR_ENTITY_ID, EVENT_TIME_CHANGED, SERVICE_TURN_OFF, SERVICE_TURN_ON, - STATE_ON) + SERVICE_TOGGLE, STATE_ON) from homeassistant.helpers.entity import ToggleEntity, split_entity_id from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers.event import track_point_in_utc_time @@ -61,6 +61,11 @@ def turn_off(hass, entity_id): hass.services.call(DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: entity_id}) +def toggle(hass, entity_id): + """ Toggles script. """ + hass.services.call(DOMAIN, SERVICE_TOGGLE, {ATTR_ENTITY_ID: entity_id}) + + def setup(hass, config): """ Load the scripts from the configuration. """ @@ -103,8 +108,14 @@ def setup(hass, config): for script in component.extract_from_service(service): script.turn_off() + def toggle_service(service): + """ Toggles a script. """ + for script in component.extract_from_service(service): + script.toggle() + hass.services.register(DOMAIN, SERVICE_TURN_ON, turn_on_service) hass.services.register(DOMAIN, SERVICE_TURN_OFF, turn_off_service) + hass.services.register(DOMAIN, SERVICE_TOGGLE, toggle_service) return True diff --git a/tests/components/test_script.py b/tests/components/test_script.py index 3d2c7512ae2..9bc1ff57658 100644 --- a/tests/components/test_script.py +++ b/tests/components/test_script.py @@ -269,3 +269,36 @@ class TestScript(unittest.TestCase): script.turn_on(self.hass, ENTITY_ID) self.hass.pool.block_till_done() self.assertEqual(0, len(calls)) + + def test_toggle_service(self): + event = 'test_event' + calls = [] + + def record_event(event): + calls.append(event) + + self.hass.bus.listen(event, record_event) + + self.assertTrue(script.setup(self.hass, { + 'script': { + 'test': { + 'sequence': [{ + 'delay': { + 'seconds': 5 + } + }, { + 'event': event, + }] + } + } + })) + + script.toggle(self.hass, ENTITY_ID) + self.hass.pool.block_till_done() + self.assertTrue(script.is_on(self.hass, ENTITY_ID)) + self.assertEqual(0, len(calls)) + + script.toggle(self.hass, ENTITY_ID) + self.hass.pool.block_till_done() + self.assertFalse(script.is_on(self.hass, ENTITY_ID)) + self.assertEqual(0, len(calls))