This commit is contained in:
monster
2018-12-30 14:13:57 +03:00
parent e311c31b88
commit 2033fe79e4
225 changed files with 6370 additions and 0 deletions
+107
View File
@@ -0,0 +1,107 @@
import globals
from automation import Base
from globals import CONF_PEOPLE
from typing import Any, Tuple, Union
#
# Person
# Script that creates persons with their properties.
#
# Args:
#
# None
#
# Release Notes
#
# Version 1.0:
# Initial Version
class Person(Base):
"""Define a class to represent a person."""
def initialize(self) -> None:
"""Initialize."""
super().initialize()
self._add_person_to_globals()
# Listen for changes to the device trackers (to initiate re-rendering
# if needed):
for tracker in self.device_trackers:
self.listen_state(self._device_tracker_changed_cb, tracker)
@property
def first_name(self) -> str:
"""Return the person's name."""
return self.name.title()
@property
def device_trackers(self) -> list:
"""Return the device trackers associated with the person."""
return self.properties['device_trackers']
@property
def notifiers(self) -> list:
"""Return the notifiers associated with the person."""
return self.properties['notifiers']
@property
def presence_sensor(self) -> str:
"""Return the entity ID of the generated presence status sensor."""
return 'sensor.{0}_presence_status'.format(self.name)
@property
def presence_input_select(self) -> str:
"""Return the input select related to the person's presence."""
return self.properties['presence_input_select']
@property
def location(self) -> str:
"""Get the current location from combined device trackers."""
raw_location = globals.most_common([
self.get_tracker_state(tracker_entity)
for tracker_entity in self.properties['device_trackers']
])
if raw_location not in ('home', 'not_home'):
return raw_location
return self.get_state(self.presence_input_select)
#return raw_location
def _device_tracker_changed_cb( # pylint: disable=too-many-arguments
self, entity: Union[str, dict], attribute: str, old: str, new: str,
kwargs: dict) -> None:
"""Respond when a device tracker changes state."""
if new == old:
return
self._render_presence_status_sensor()
def _add_person_to_globals(self):
self.global_vars.setdefault(CONF_PEOPLE, [])
existing_element = None
for element in self.global_vars[CONF_PEOPLE]:
if element.first_name == self.first_name:
existing_element = element
if existing_element == None:
self.global_vars[CONF_PEOPLE].append(self)
else:
index = self.global_vars[CONF_PEOPLE].index(existing_element)
self.global_vars[CONF_PEOPLE][index] = self
def _render_presence_status_sensor(self):
"""Update the presence status sensor."""
if self.location in ('Home', 'Just Arrived'):
picture_state = 'home'
else:
picture_state = 'away'
self.log('Setting presence sensor {} state to {}.'.format(self.presence_sensor, self.location))
self.set_state(
self.presence_sensor,
state=self.location,
attributes={
'friendly_name':
self.first_name,
'entity_picture':
'/local/{0}-{1}.png'.format(self.name, picture_state),
})