From f5084a5f705b7329cd4b745859d0c955157c53ca Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 8 Feb 2015 22:18:31 -0800 Subject: [PATCH] Have statemachine.track_change work on new states --- homeassistant/__init__.py | 16 +++++++++++----- tests/test_component_group.py | 26 ++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/homeassistant/__init__.py b/homeassistant/__init__.py index 2a72a8ce797..9894626d920 100644 --- a/homeassistant/__init__.py +++ b/homeassistant/__init__.py @@ -614,13 +614,19 @@ class StateMachine(object): @ft.wraps(action) def state_listener(event): """ The listener that listens for specific state changes. """ - if event.data['entity_id'] in entity_ids and \ - 'old_state' in event.data and \ - _matcher(event.data['old_state'].state, from_state) and \ - _matcher(event.data['new_state'].state, to_state): + if event.data['entity_id'] not in entity_ids: + return + + if 'old_state' in event.data: + old_state = event.data['old_state'].state + else: + old_state = None + + if _matcher(old_state, from_state) and \ + _matcher(event.data['new_state'].state, to_state): action(event.data['entity_id'], - event.data['old_state'], + event.data.get('old_state'), event.data['new_state']) self._bus.listen(EVENT_STATE_CHANGED, state_listener) diff --git a/tests/test_component_group.py b/tests/test_component_group.py index 2be58b5acc3..8982bcaec63 100644 --- a/tests/test_component_group.py +++ b/tests/test_component_group.py @@ -146,6 +146,32 @@ class TestComponentsGroup(unittest.TestCase): # Test with non-group state self.assertEqual([], group.get_entity_ids(self.hass, 'switch.AC')) + def test_group_being_init_before_first_tracked_state_is_set_to_on(self): + """ Test if the group turns on if no states existed and now a state it is + tracking is being added as ON. """ + test_group = group.Group( + self.hass, 'test group', ['light.not_there_1']) + + self.hass.states.set('light.not_there_1', STATE_ON) + + self.hass.pool.block_till_done() + + group_state = self.hass.states.get(test_group.entity_id) + self.assertEqual(STATE_ON, group_state.state) + + def test_group_being_init_before_first_tracked_state_is_set_to_off(self): + """ Test if the group turns off if no states existed and now a state it is + tracking is being added as OFF. """ + test_group = group.Group( + self.hass, 'test group', ['light.not_there_1']) + + self.hass.states.set('light.not_there_1', STATE_OFF) + + self.hass.pool.block_till_done() + + group_state = self.hass.states.get(test_group.entity_id) + self.assertEqual(STATE_OFF, group_state.state) + def test_setup(self): """ Test setup method. """ self.assertTrue(