Cadastro automático de zonas (ao estacionar)

Eu acho muito bom ter o status exato de onde meu carro está (não apenas status “ausente”). Isto é possível graças as zonas! O grande problema é que é bem chato ficar cadastrando cada lugar que eu costumo frequentar (casa, trabalho, casa da sogra, casa dos meus pais…). Até fiz isto para uns 10 lugares, mas tem lugares que visito com pouca frequência, e aí não consigo nem lembrar dele. Desta forma, achei que seria uma boa que o Home Assistant me perguntasse algo como:
“Ei, cara to vendo que você está parado a 5 minutos em um lugar diferente, longe de casa. Quer que eu cadastre esse lugar como uma nova zona?”

É isso que vou ensinar aqui!

Desafios:

  • Não existem, neste momento, serviços para criar zonas. Dá para fazer pela interface ou por yaml (ou os dois ao mesmo tempo), mas não existe um service zone.add. Desta forma, fiz um “ajuste técnico temporário” que funciona muito bem!
  • A desvantagem é que as zonas só poderão ser reconhecidas a partir do próximo reinício do HA

O que precisamos para rastrear?

De alguma coisa que reporte sua localização para o HA. Se for usar seu celular, o aplicativo do HA já faz isto muito bem. Ou usar o aplicativo life 360, que integra com o HA.
Para carros, é possível instalar o app na central multimidia, mas no meu caso, como uso em moto (e meu carro não tem central multimidia com Android), uso outro esquema:

  • Rastreador chinês GPS (ligado direto a bateria do carro, em qualquer fio 12v que encontre pelo carro)
  • Chip m2m (uso um da vodafone que comprei no ML, me custa 9 reais por mês, apenas fornece internet 3g, nada de sms ou chamadas)
  • Add on Traccar (eu instalei o traccar em outro PC via docker, mas dá no mesmo)

Enfim, não importa qual método usou, o importante é que tenhas alguma entidade do tipo device_tracker, no meu caso se chama device_tracker.carro.

Caso use traccar, fiz um tutorial para resolver um possível probleminha: https://forum.homeassistantbrasil.com.br/t/como-resolver-o-problema-do-carro-eternamente-em-movimento-quando-perde-sinal-de-celular/4442/2

Código da automação das Zonas

Primeiramente, criei uma automação para, toda vez que ela ver que o carro parou por 5 minutos, que ela mande a pergunta para o Telegram – se desejo cadastrar a zona (e, claro, perguntar o nome desta nova zona). Para isto funcionar eu criei de uma entidade para saber se o carro está ou não em movimento (usando os atributos que o traccar oferece de movimento – mas também funciona com a localização do APP ou do life 360). Segue código do sensor:

- platform: template
  sensors:
    carro_status:
      friendly_name: "Estado"
      icon_template: mdi:directions-fork
      value_template: >-
        {% if (states.device_tracker.carro.attributes.motion == true) %}
        Em movimento
        {% elif (states.device_tracker.carro.attributes.motion == false) %}
        Parado
        {% else %}
        Desconhecido
        {% endif %}

Caso não tenha um atributo “motion”, pode ser que tenhas um de speed (velocidade), que funcionaria mais ou menos assim no código acima:

{% if ((states.device_tracker.carro.attributes.speed|int) >= 20) %}

Ponto, agora vamos a primeira automação! Quando o carro ficar parado por 5 minutos, vou salvar a latitude e longitude num input_text, enviar o mapa pelo telegram, enviar o texto da pergunta e por fim ativar a automação coletora de respostas (que estará desligada, por padrão).
Os input_text eu criei assim (direto no configuration.yaml):

input_text:
  nova_zona_latitude:
  nova_zona_longitude:

Aqui está a primeira automação (automation):

- alias: "Perguntar nova zona"
  initial_state: on
  trigger:
    platform: state
    entity_id: sensor.carro_status
    to: "Parado"
    for:
      minutes: 5
  condition:
    - condition: state
      entity_id: device_tracker.carro
      state: "not_home"
  action:
    - service: input_text.set_value
      target:
        entity_id: input_text.nova_zona_latitude
      data:
        value: "{{ states.device_tracker.carro.attributes.latitude }}"
    - service: input_text.set_value
      target:
        entity_id: input_text.nova_zona_longitude
      data:
        value: "{{ states.device_tracker.carro.attributes.longitude }}"
    - service: notify.ari
      data:
        title: Novo local
        message: Localização
        data:
          location:
            latitude: "{{ states('input_text.nova_zona_latitude') }}"
            longitude: "{{ states('input_text.nova_zona_longitude') }}"
    - service: notify.ari
      data_template:
        title: "*Deseja cadastrar este lugar?*"
        message: >
          Informe o nome da nova zona para cadastrar:
    - service: automation.turn_on
      target:
        entity_id: automation.gravar_nova_zona

Aqui está a automação para “ler” a resposta escrita no Telegram.

- alias: "Gravar nova zona"
  initial_state: off
  trigger:
    platform: event
    event_type: telegram_text
  condition:
    - condition: state
      entity_id: device_tracker.carro
      state: "not_home"
  action:
    - service: notify.ari
      data_template:
        title: "*Zona Cadastrada*"
        message: >
          Nome: {{ trigger.event.data.text }}. Estará disponível após reinício do HA.
    - service: notify.novazona
      data:
        message: >-
          - name: {{ trigger.event.data.text }}
            latitude: {{ states('input_text.nova_zona_latitude') }}
            longitude: {{ states('input_text.nova_zona_longitude') }}
            radius: 200
    - service: automation.turn_off
      target:
        entity_id: automation.gravar_nova_zona

Perceba que usei o notify.ari (é para meu Telegram), mas agora usei o notify.novazona. Este comando irá escrever dentro de um arquivo de zonas (por isto que é necessário reiniciar para “fazer valer as novas zonas”.
Tenho um arquivo de zonas chamado “zones.yaml”. Cadastrei ele no configuration.yaml assim:

zone: !include zones.yaml

Então, o que este notify.novazona faz é basicamente “cuspir” um texto de uma zona manual ao final deste arquivo (cumulativo). Veja como ficou meu notify (dentro do configuration.yaml)

notify:
  - name: novazona
    platform: file
    filename: "zones.yaml"

É isto! O resultado é este:

Espero que seja útil para vocês! Grande abraço, fiquem com Deus!

5 Likes

Você é um gênio, um GÊNIO!
Muito top o tuto…
Parabéns!!!