def _whos_relative_to_home(self, *states: Enum) -> list: """Return a list people who are in a certain set of states.""" state_list = [state.value for state in states] return [ name for name, attrs in PEOPLE.items() if self.get_state( attrs['presence_manager_input_select']) in state_list ]
def get_target_from_push_id(push_id: UUID) -> Union[str, None]: """Return a person from a provided permanent device ID.""" try: [target] = [ k for k, v in PEOPLE.items() if v['push_device_id'] == push_id ] except ValueError: target = None return target
def _get_targets(self, target: str) -> list: """Get a list of targets based on input string.""" # 1. target='not Person' split = target.split(' ') if split[0] == 'not' and split[1] in PEOPLE: return [ notifier for name, attrs in PEOPLE.items() if name != split[1] for notifier in attrs['notifiers'] ] # 2. target='Person' if split[0] in PEOPLE: return PEOPLE[target]['notifiers'] try: # 3. target='home' return [ notifier for name in getattr(self.presence_manager, 'whos_{0}'.format(target))() for notifier in PEOPLE[name]['notifiers'] ] except AttributeError: all_targets = [ notifier for attrs in PEOPLE.values() for notifier in attrs['notifiers'] ] # 4. target='everyone' if target == 'everyone': return all_targets # 5. target='person_iphone' if target in all_targets: return [target] self.error('Unknown notifier target: {0}'.format(target)) return []
def initialize(self) -> None: """Initialize.""" super().initialize() if self.proximity == self.HOME_THRESHOLD: self.state = self.ProximityStates.home elif self.HOME_THRESHOLD < self.proximity <= self.NEARBY_THRESHOLD: self.state = self.ProximityStates.nearby else: self.state = self.ProximityStates.away self.listen_state(self._proximity_change_cb, self.PROXIMITY_SENSOR, attribute='all', duration=60) for person, attrs in PEOPLE.items(): # Set initial presence (so a restart can unstick it): if self.get_state(attrs['device_tracker']) == 'home': self._set_input_select(attrs['presence_manager_input_select'], self.HomeStates.home) else: self._set_input_select(attrs['presence_manager_input_select'], self.HomeStates.away) # Fire events when presence changes: self.listen_state(self._presence_change_cb, attrs['presence_manager_input_select'], person=person) # (Extended) Away -> Just Arrived self.listen_state( self._change_input_select_cb, attrs['device_tracker'], old='not_home', new='home', input_select=attrs['presence_manager_input_select'], target_state=self.HomeStates.just_arrived) # Just Arrived -> Home self.listen_state( self._change_input_select_cb, attrs['presence_manager_input_select'], new=self.HomeStates.just_arrived.value, duration=60 * 5, input_select=attrs['presence_manager_input_select'], target_state=self.HomeStates.home) # Just Left -> Just Arrived = Home self.listen_state( self._change_input_select_cb, attrs['presence_manager_input_select'], old=self.HomeStates.just_left.value, new=self.HomeStates.just_arrived.value, input_select=attrs['presence_manager_input_select'], target_state=self.HomeStates.home) # Home -> Just Left self.listen_state( self._change_input_select_cb, attrs['device_tracker'], old='home', new='not_home', input_select=attrs['presence_manager_input_select'], target_state=self.HomeStates.just_left) # Just Left -> Away self.listen_state( self._change_input_select_cb, attrs['presence_manager_input_select'], new=self.HomeStates.just_left.value, duration=60 * 5, input_select=attrs['presence_manager_input_select'], target_state=self.HomeStates.away) # Away -> Extended Away self.listen_state( self._change_input_select_cb, attrs['presence_manager_input_select'], new=self.HomeStates.away.value, duration=60 * 60 * 24, input_select=attrs['presence_manager_input_select'], target_state=self.HomeStates.extended_away)