A detecção de presenças do Home Assistant limita-se a informar se uma pessoa ou dispositivo está em casa ou não. Mas existem situações em que apenas esses dois estados não são suficientes.
Embora este exemplo seja um pouco extremo, existem várias situações do dia-a-dia em que este tutorial pode ser aplicado.
Por exemplo, se tiverem uma automação que desligue o vosso computador quando saem casa e vocês quiserem ir beber café, o que vai acontecer é que embora só estejam 5 ou 10 minutos fora de casa o computador se vai desligar.
A que vamos fazer é criar novos estados de presença para, a partir desses novos estados, controlarmos as nossas automações.
Primeiro vamos criar um input_select
:
input_select:
#### Novos Estados de presença - Jorge
jorge_status_dropdown:
name: Jorge
options:
- Home
- Just Arrived
- Just Left
- Away
- Extended Away
- Escola
- Ginásio
Depois criamos as automações que vão criar os novos estados:
automation:
## INITIAL STATE
- alias: Jorge initial state
trigger:
- platform: homeassistant
event: start
action:
- delay:
seconds: 20
- service: input_select.select_option
data_template:
entity_id: input_select.jorge_status_dropdown
option: '{{ states("device_tracker.jmra") }}'
#### HOME STATES
## JUST ARRIVED
- alias: Jorge has just arrived Home
trigger:
- platform: state
entity_id: device_tracker.jmra
from: 'not_home'
to: 'home'
action:
- service: input_select.select_option
data:
entity_id: input_select.jorge_status_dropdown
option: Just Arrived
- service: script.notify_zanzito_jorge
data:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge acabou de chegar a casa'
- service: script.notify_html5
data_template:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge acabou de chegar a casa'
data:
renotify: '1'
- service: mqtt.publish
data:
topic: "tasker/exec"
payload: "wifi_on"
## HOME
- alias: Jorge is Home
trigger:
- platform: state
entity_id: input_select.jorge_status_dropdown
to: 'Just Arrived'
for:
minutes: 10
- platform: state
entity_id: input_select.jorge_status_dropdown
from: 'Just Left'
to: 'Just Arrived'
action:
- service: input_select.select_option
data:
entity_id: input_select.jorge_status_dropdown
option: Home
- service: script.notify_zanzito_jorge
data:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge está em casa'
- service: script.notify_html5
data_template:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge está em casa'
data:
renotify: '1'
## JUST LEFT
- alias: Jorge has just left home
trigger:
- platform: state
entity_id: device_tracker.jmra
from: 'home'
to: 'not_home'
action:
- service: input_select.select_option
data:
entity_id: input_select.jorge_status_dropdown
option: Just Left
- service: script.notify_zanzito_jorge
data:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge acabou de sair de casa'
- service: script.notify_html5
data_template:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge acabou de sair de casa'
data:
renotify: '1'
## AWAY
- alias: Jorge is away
trigger:
- platform: state
entity_id: input_select.jorge_status_dropdown
to: 'Just Left'
for:
minutes: 10
action:
- service: input_select.select_option
data:
entity_id: input_select.jorge_status_dropdown
option: Away
- service: script.notify_zanzito_jorge
data:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge está fora de casa'
- service: script.notify_html5
data_template:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge está fora de casa'
data:
renotify: '1'
#### NOT_HOME STATES
## ESCOLA - IN
- alias: Jorge has just arrived at Escola
trigger:
- platform: state
entity_id: device_tracker.jmra
from: 'not_home'
to: 'Escola'
action:
- service: input_select.select_option
data:
entity_id: input_select.jorge_status_dropdown
option: Escola
- service: script.notify_zanzito_jorge
data:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge acabou de chegar à Escola'
- service: script.notify_html5
data_template:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge acabou de chegar à Escola'
data:
renotify: '1'
## ESCOLA - OUT
- alias: Jorge has just left Escola
trigger:
- platform: state
entity_id: device_tracker.jmra
from: 'Escola'
to: 'not_home'
action:
- service: input_select.select_option
data:
entity_id: input_select.jorge_status_dropdown
option: Away
- service: script.notify_zanzito_jorge
data:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge acabou de sair da Escola'
- service: script.notify_html5
data_template:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge acabou de sair da Escola'
data:
renotify: '1'
## GINÁSIO - IN
- alias: Jorge has just arrived at Ginásio
trigger:
- platform: state
entity_id: device_tracker.jmra
from: 'not_home'
to: 'Ginásio'
action:
- service: input_select.select_option
data:
entity_id: input_select.jorge_status_dropdown
option: Ginásio
- service: script.notify_zanzito_jorge
data:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge acabou de chegar ao Ginásio'
- service: script.notify_html5
data_template:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge acabou de chegar ao Ginásio'
data:
renotify: '1'
## GINÁSIO - OUT
- alias: Jorge has just left Ginásio
trigger:
- platform: state
entity_id: device_tracker.jmra
from: 'Ginásio'
to: 'not_home'
action:
- service: input_select.select_option
data:
entity_id: input_select.jorge_status_dropdown
option: Away
- service: script.notify_html5
data:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge acabou de sair do Ginásio'
- service: script.notify_html5
data_template:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge acabou de sair do Ginásio'
data:
renotify: '1'
## EXTENDED AWAY
- alias: Jorge is extended away
trigger:
- platform: state
entity_id: input_select.jorge_status_dropdown
to: 'Away'
for:
hours: 24
action:
- service: input_select.select_option
data:
entity_id: input_select.jorge_status_dropdown
option: Extended Away
- service: script.notify_zanzito_jorge
data:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge está em ausência prolongada'
- service: script.notify_html5
data_template:
title: '{{ as_timestamp (now()) | timestamp_custom("%d/%b/%Y %T") }}'
message: 'O Jorge está em ausência prolongada'
data:
renotify: '1'
Criam as zonas pretendidas:
zone:
#### Home (override)
- name: Home
latitude: !secret zones_home_latitude
longitude: !secret zones_home_longitude
radius: 50
icon: mdi:home-assistant
#### Escola
- zone:
name: Escola
latitude: !secret zones_escola_latitude
longitude: !secret zones_escola_longitude
radius: 150
icon: mdi:school
#### Ginásio
- zone:
name: Ginásio
latitude: !secret zones_ginasio_latitude
longitude: !secret zones_ginasio_longitude
radius: 50
icon: mdi:dumbbell
E por fim o sensor:
sensor:
#### PRESENÇAS
- platform: template
sensors:
## JORGE
jorge_status:
value_template: '{{ states.input_select.jorge_status_dropdown.state }}'
friendly_name: 'Jorge'
Para mostrarem no frontend do HA estes novos estados, devem usar sensor.jorge_status
dentro do separador onde quiserem mostrar a informação.
Os valores que devem alterar são:
-
jorge_status_dropdown
: Dêem o nome que quiserem ao dropdown -
device_tracker.jmra
: O nome do vosso device_tracker -
input_select.jorge_status_dropdown
: o nome que deram ao dropdown
NOTA: O código publicado inclui diversas acções de notificação pois eu posso controlar quais as notificações que recebo (Zanzito, Telegram, HTML5, etc.). Basta porem apenas uma ou se não quiserem notificações podes apagá-las todas, ficando apenas o service: input_select.select_option
.