📑 Detecção de presenças com funções extra


(Jorge Assunção) #1

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.


Criar a 1 Automação
Detecção de presenças com funções extra
(Jorge Assunção) #2

(system) #3

Para comentar este tópico, por favor utilizem o tópico abaixo.