Esempio n. 1
0
 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
     ]
Esempio n. 2
0
    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
Esempio n. 3
0
    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 []
Esempio n. 4
0
    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)