diff --git a/homeassistant/components/group.py b/homeassistant/components/group.py index 0dfabdd8a35..25aa263d262 100644 --- a/homeassistant/components/group.py +++ b/homeassistant/components/group.py @@ -359,14 +359,16 @@ class Group(Entity): """Start tracking members.""" run_callback_threadsafe(self.hass.loop, self.async_start).result() + @callback def async_start(self): """Start tracking members. This method must be run in the event loop. """ - self._async_unsub_state_changed = async_track_state_change( - self.hass, self.tracking, self._state_changed_listener - ) + if self._async_unsub_state_changed is None: + self._async_unsub_state_changed = async_track_state_change( + self.hass, self.tracking, self._async_state_changed_listener + ) def stop(self): """Unregister the group from Home Assistant.""" @@ -392,20 +394,24 @@ class Group(Entity): This method must be run in the event loop. """ - yield from super().async_remove() - if self._async_unsub_state_changed: self._async_unsub_state_changed() self._async_unsub_state_changed = None - @callback - def _state_changed_listener(self, entity_id, old_state, new_state): + yield from super().async_remove() + + @asyncio.coroutine + def _async_state_changed_listener(self, entity_id, old_state, new_state): """Respond to a member state changing. This method must be run in the event loop. """ + # removed + if self._async_unsub_state_changed is None: + return + self._async_update_group_state(new_state) - self.hass.async_add_job(self.async_update_ha_state()) + yield from self.async_update_ha_state() @property def _tracking_states(self):