Initial work on a presence tracker. Inspired by @helto4real
This commit is contained in:
79
appdaemon/apps/presence.py
Normal file
79
appdaemon/apps/presence.py
Normal file
@@ -0,0 +1,79 @@
|
||||
from entities import Entities
|
||||
from timers import Timers
|
||||
|
||||
class Presence(Timers, Entities):
|
||||
|
||||
HOME = 'home'
|
||||
AWAY = 'not_home'
|
||||
ARRIVED = 'just_arrived'
|
||||
LEFT = 'just_left'
|
||||
TIMEOUT = 300
|
||||
|
||||
def initialize(self):
|
||||
super().initialize()
|
||||
|
||||
attr = self.args.get('attributes', {})
|
||||
|
||||
self.register_entity('tracker', self.args['name'], managed=True, default="not_home", attributes=self.args.get('attributes',{}))
|
||||
self.tracker = self.e['tracker']
|
||||
if(self.tracker.state in [self.ARRIVED, self.LEFT]):
|
||||
self.tracker.state = self.AWAY
|
||||
|
||||
self.devices = []
|
||||
for i,d in enumerate(self.args['devices']):
|
||||
name = f"device{i}"
|
||||
self.register_entity(name, d);
|
||||
self.e[name].listen(self.update, {"name": name})
|
||||
self.devices.append(self.e[name])
|
||||
|
||||
self.update()
|
||||
|
||||
def update(self, old=None, new=None, kwarg=None):
|
||||
if not old or isinstance(old, str):
|
||||
timeout = False
|
||||
elif old is None:
|
||||
timeout = False
|
||||
else:
|
||||
timeout = old.get('trigger', False)
|
||||
new_state = self.is_home()
|
||||
old_state = self.tracker.state
|
||||
if new_state:
|
||||
if old_state == self.AWAY:
|
||||
self.run_in('timeout', self.update, self.TIMEOUT, trigger = "timeout")
|
||||
state = self.ARRIVED
|
||||
elif old_state == self.LEFT:
|
||||
self.cancel_timer('timeout')
|
||||
state = self.HOME
|
||||
elif old_state == self.ARRIVED and timeout:
|
||||
state = self.HOME
|
||||
else:
|
||||
state = old_state
|
||||
else:
|
||||
if old_state == self.HOME:
|
||||
self.run_in('timeout', self.update, self.TIMEOUT, trigger = "timeout")
|
||||
state = self.LEFT
|
||||
elif old_state == self.ARRIVED:
|
||||
self.cancel_timer('timeout')
|
||||
state = self.AWAY
|
||||
elif old_state == self.LEFT and timeout:
|
||||
state = self.AWAY
|
||||
else:
|
||||
state = old_state
|
||||
|
||||
self.tracker.state = state
|
||||
self.tracker.push()
|
||||
|
||||
def is_home(self):
|
||||
for d in self.devices:
|
||||
if d.domain == 'device_tracker':
|
||||
if d.attr['source_type'] in ['router']:
|
||||
if d.state == 'home':
|
||||
return True
|
||||
if d.domain == 'sensor':
|
||||
if d.state != 'unknown' and int(d.state) > 0:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
|
||||
37
appdaemon/apps/presence.yaml
Normal file
37
appdaemon/apps/presence.yaml
Normal file
@@ -0,0 +1,37 @@
|
||||
presence_thomas:
|
||||
module: presence
|
||||
class: Presence
|
||||
global_dependencies:
|
||||
- entities
|
||||
- timers
|
||||
dependencies:
|
||||
- entity_manager
|
||||
|
||||
name: device_tracker.thomas_presence
|
||||
attributes: {}
|
||||
|
||||
devices:
|
||||
- device_tracker.thomas_iphone_beta
|
||||
- device_tracker.thomas_iphone_2
|
||||
- sensor.thomas_iphone_bt
|
||||
- sensor.thomas_iphone_bt2
|
||||
|
||||
presence_anneli:
|
||||
module: presence
|
||||
class: Presence
|
||||
global_depencencies:
|
||||
- entities
|
||||
- timers
|
||||
dependencies:
|
||||
- entity_manager
|
||||
|
||||
name: device_tracker.anneli_presence
|
||||
attributes: {}
|
||||
|
||||
devices:
|
||||
- device_tracker.anneli_lovn
|
||||
- device_tracker.anneli_loven
|
||||
- sensor.anneli_iphone_bt
|
||||
- sensor.anneli_iphone_bt2
|
||||
# - sensor.anneli_klocka_bt
|
||||
# - sensor.anneli_klocka_bt2
|
||||
Reference in New Issue
Block a user