332 lines
9.0 KiB
YAML
332 lines
9.0 KiB
YAML
# Presence Detection Package
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Person Setup (handled by UI)
|
|
person:
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Person/Device Tracker Customization
|
|
homeassistant:
|
|
customize:
|
|
person.jpk:
|
|
entity_picture: https://gravatar.com/avatar/e78e623948f3675cf1c51544f9bec928
|
|
|
|
sensor.jp_presence_status:
|
|
entity_picture: https://gravatar.com/avatar/e78e623948f3675cf1c51544f9bec928
|
|
|
|
device_tracker.jp_p3a_gps:
|
|
friendly_name: J.P. Pixel 3a
|
|
icon: mdi:map-marker
|
|
device_tracker.jp_p3a_ip:
|
|
friendly_name: J.P. Pixel 3a
|
|
icon: mdi:wifi
|
|
device_tracker.jp_p3a_bt_entry:
|
|
friendly_name: J.P. Pixel 3a
|
|
source_type: bluetooth
|
|
icon: mdi:bluetooth
|
|
|
|
device_tracker.jp_gs8_ap:
|
|
friendly_name: J.P. Galaxy S8
|
|
icon: mdi:wifi
|
|
|
|
device_tracker.jen_iphone_ip:
|
|
friendly_name: Jen iPhone
|
|
icon: mdi:wifi
|
|
device_tracker.jen_iphone_bt_entry:
|
|
friendly_name: Jen iPhone
|
|
source_type: bluetooth
|
|
icon: mdi:bluetooth
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Manual Setup Device Trackers
|
|
device_tracker:
|
|
|
|
# Ping Platform
|
|
- platform: ping
|
|
hosts:
|
|
jp_p3a_ip: !secret jp_p3a_ip
|
|
jp_gs8_ip: !secret jp_gs8_ip
|
|
jen_iphone_ip: !secret jen_iphone_ip
|
|
|
|
# MQTT Platform (Bluetooth Presence Sensor)
|
|
- platform: mqtt
|
|
devices:
|
|
jp_gs8_bt_entry: monitor/entry/jp_gs8/device_tracker
|
|
jp_p3a_bt_entry: monitor/entry/jp_p3a/device_tracker
|
|
jen_iphone_bt_entry: monitor/entry/jen_iphone/device_tracker
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Proximity Sensors for Zones
|
|
proximity:
|
|
home:
|
|
devices:
|
|
- device_tracker.jen_iphone
|
|
- device_tracker.jp_iphone
|
|
tolerance: 50
|
|
unit_of_measurement: km
|
|
|
|
jp:
|
|
devices:
|
|
- device_tracker.jp_iphone
|
|
tolerance: 50
|
|
unit_of_measurement: km
|
|
|
|
jen:
|
|
devices:
|
|
- device_tracker.jen_iphone
|
|
tolerance: 50
|
|
unit_of_measurement: km
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Extended Presence States
|
|
input_select:
|
|
jp_presence_state:
|
|
name: J.P.
|
|
options:
|
|
- Home
|
|
- Just Arrived
|
|
- Just Left
|
|
- Away
|
|
- Extended Away
|
|
|
|
jen_presence_state:
|
|
name: Jen
|
|
options:
|
|
- Home
|
|
- Just Arrived
|
|
- Just Left
|
|
- Away
|
|
- Extended Away
|
|
|
|
house_presence_state:
|
|
name: House Occupancy
|
|
options:
|
|
- Home
|
|
- Just Arrived
|
|
- Just Left
|
|
- Away
|
|
- Extended Away
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Extended Presence Sensors
|
|
binary_sensor:
|
|
|
|
# Home / Not-Home Sensors
|
|
- platform: template
|
|
sensors:
|
|
jp_presence:
|
|
friendly_name: J.P.
|
|
device_class: presence
|
|
value_template: "{{ is_state('person.jpk', 'home') }}"
|
|
|
|
jen_presence:
|
|
friendly_name: Jen
|
|
device_class: presence
|
|
value_template: "{{ is_state('person.jen', 'home') }}"
|
|
|
|
house_presence:
|
|
friendly_name: House
|
|
device_class: presence
|
|
value_template: >-
|
|
{{ is_state('person.jpk', 'home')
|
|
or is_state('person.jen', 'home') }}
|
|
|
|
sensor:
|
|
|
|
# Extended Presence Status
|
|
- platform: template
|
|
sensors:
|
|
jp_presence_status:
|
|
value_template: '{{ states.input_select.jp_presence_state.state }}'
|
|
friendly_name_template: 'J.P. Presence Status'
|
|
|
|
- platform: template
|
|
sensors:
|
|
jen_presence_status:
|
|
value_template: '{{ states.input_select.jen_presence_state.state }}'
|
|
friendly_name_template: 'Jen Presence Status'
|
|
|
|
- platform: template
|
|
sensors:
|
|
house_presence_status:
|
|
value_template: '{{ states.input_select.house_presence_state.state }}'
|
|
friendly_name_template: 'House Presence Status'
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Automations for Presence Detection
|
|
automation:
|
|
|
|
# Run Bluetooth Arrival Scan at Home Assistant startup
|
|
- alias: Startup Arrival Scan
|
|
trigger:
|
|
- platform: homeassistant
|
|
event: start
|
|
mode: queued
|
|
action:
|
|
- service: mqtt.publish
|
|
data:
|
|
topic: monitor/scan/arrive
|
|
payload: scan
|
|
|
|
# Run Bluetooth Departure Scan if a Ping Device Tracker goes Away
|
|
- alias: Bluetooth Departure Scan
|
|
trigger:
|
|
- platform: homeassistant
|
|
event: start
|
|
- platform: state
|
|
entity_id: binary_sensor.front_door_sensor
|
|
- platform: time_pattern
|
|
minutes: "/10"
|
|
mode: single
|
|
action:
|
|
- service: mqtt.publish
|
|
data:
|
|
topic: monitor/scan/depart
|
|
payload: scan
|
|
|
|
# Handle Just Arrived/Just Left State Transitions
|
|
- alias: Mark Person as Just Arrived
|
|
trigger:
|
|
- platform: state
|
|
entity_id: person.jpk
|
|
to: 'home'
|
|
- platform: state
|
|
entity_id: person.jen
|
|
to: 'home'
|
|
- platform: state
|
|
entity_id: binary_sensor.house_presence
|
|
to: 'on'
|
|
mode: queued
|
|
action:
|
|
- service: input_select.select_option
|
|
data_template:
|
|
entity_id: >
|
|
{% if trigger.entity_id == 'person.jpk' %}
|
|
input_select.jp_presence_state
|
|
{% elif trigger.entity_id == 'person.jen' %}
|
|
input_select.jen_presence_state
|
|
{% elif trigger.entity_id == 'binary_sensor.house_presence' %}
|
|
input_select.house_presence_state
|
|
{% else %}
|
|
{% endif %}
|
|
option: >
|
|
{% if trigger.entity_id == 'person.jpk' %}
|
|
{% if states.input_select.jp_presence_state == 'Just Left' %}
|
|
Home
|
|
{% else %}
|
|
Just Arrived
|
|
{% endif %}
|
|
{% elif trigger.entity_id == 'person.jen' %}
|
|
{% if states.input_select.jen_presence_state == 'Just Left' %}
|
|
Home
|
|
{% else %}
|
|
Just Arrived
|
|
{% endif %}
|
|
{% elif trigger.entity_id == 'binary_sensor.house_presence' %}
|
|
{% if states.input_select.house_presence_state == 'Just Left' %}
|
|
Home
|
|
{% else %}
|
|
Just Arrived
|
|
{% endif %}
|
|
{% else %}
|
|
{% endif %}
|
|
|
|
- alias: Mark Person as Just Left
|
|
trigger:
|
|
- platform: state
|
|
entity_id: person.jpk
|
|
from: 'home'
|
|
- platform: state
|
|
entity_id: person.jen
|
|
from: 'home'
|
|
- platform: state
|
|
entity_id: binary_sensor.house_presence
|
|
from: 'on'
|
|
mode: queued
|
|
action:
|
|
- service: input_select.select_option
|
|
data_template:
|
|
entity_id: >
|
|
{% if trigger.entity_id == 'person.jpk' %}
|
|
input_select.jp_presence_state
|
|
{% elif trigger.entity_id == 'person.jen' %}
|
|
input_select.jen_presence_state
|
|
{% elif trigger.entity_id == 'binary_sensor.house_presence' %}
|
|
input_select.house_presence_state
|
|
{% else %}
|
|
{% endif %}
|
|
option: 'Just Left'
|
|
|
|
# Handle Timed State Changes to Home/Away/Extended Away
|
|
- alias: Mark Person as Home
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_select.jp_presence_state
|
|
to: 'Just Arrived'
|
|
for:
|
|
minutes: 5
|
|
- platform: state
|
|
entity_id: input_select.jen_presence_state
|
|
to: 'Just Arrived'
|
|
for:
|
|
minutes: 5
|
|
- platform: state
|
|
entity_id: input_select.house_presence_state
|
|
to: 'Just Arrived'
|
|
for:
|
|
minutes: 5
|
|
mode: queued
|
|
action:
|
|
- service: input_select.select_option
|
|
data_template:
|
|
entity_id: '{{ trigger.entity_id }}'
|
|
option: 'Home'
|
|
|
|
- alias: Mark Person as Away
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_select.jp_presence_state
|
|
to: 'Just Left'
|
|
for:
|
|
minutes: 5
|
|
- platform: state
|
|
entity_id: input_select.jen_presence_state
|
|
to: 'Just Left'
|
|
for:
|
|
minutes: 5
|
|
- platform: state
|
|
entity_id: input_select.house_presence_state
|
|
to: 'Just Left'
|
|
for:
|
|
minutes: 5
|
|
mode: queued
|
|
action:
|
|
- service: input_select.select_option
|
|
data_template:
|
|
entity_id: '{{ trigger.entity_id }}'
|
|
option: 'Away'
|
|
|
|
- alias: Mark Person as Extended Away
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_select.jp_presence_state
|
|
to: 'Away'
|
|
for:
|
|
hours: 24
|
|
- platform: state
|
|
entity_id: input_select.jen_presence_state
|
|
to: 'Away'
|
|
for:
|
|
hours: 24
|
|
- platform: state
|
|
entity_id: input_select.house_presence_state
|
|
to: 'Away'
|
|
for:
|
|
hours: 24
|
|
mode: queued
|
|
action:
|
|
- service: input_select.select_option
|
|
data_template:
|
|
entity_id: '{{ trigger.entity_id }}'
|
|
option: 'Extended Away'
|