Programação YAML - Automação

Boa noite

Depois de muito bater cabeça, estou iniciando nesse mundo do Home Assistant :slight_smile:

No momento, meu interesse é usar as automações para criar uma rotina que me avise se está chovendo, e se existem janelas abertas. Para isso estou usando sensores da sonoff…

Consegui fazer uma rotina bem básica, mas gostaria de incrementá-la em dois pontos: o primeiro é emitir avisos na alexa com intervalos mínimos de seis horas. O segundo, é personalizar as mensagens, dizendo por exemplo a quantidade de janelas abertas, ou quais são as janelas abertas. Para isso, estou me arriscando nessa linguagem (se é que é uma linguagem) YAML…

Sem delongas, o seguinte script funciona:

description: Sensor de chuva fechou
trigger:

  • type: not_opened
    platform: device
    device_id: 04976678046cecc4161bec1384795a19
    entity_id: binary_sensor.sonoff_10011a2f5c
    domain: binary_sensor
    condition:
    action:
  • if:
    • condition: state
      entity_id: binary_sensor.janelas_e_portas_externas
      state: “on”
      then:
    • service: notify.alexa_media
      data:
      target:
      - media_player.echo_dot_da_suite
      - media_player.echo_dot_da_cozinha
      data:
      type: announce
      message: >-
      {{ MsgInicial }} Está chovendo, e existem janelas e portas abertas
      variables:
      MsgInicial: Atenção.
      mode: single

Percebam que eu criei uma variável chamada “MsgInicial”, cujo conteúdo é só um mero “Atenção”, apenas para ver se consigo trabalhar com variáveis

Tentei, então, incrementar o código, incluindo um novo “Service” no qual eu tento incluir uma nova variável em tempo de execução, no código. Esse infelizmente não funcionou.

description: Sensor de chuva fechou
trigger:

  • type: not_opened
    platform: device
    device_id: 04976678046cecc4161bec1384795a19
    entity_id: binary_sensor.sonoff_10011a2f5c
    domain: binary_sensor
    condition:
    action:
  • if:
    • condition: state
      entity_id: binary_sensor.janelas_e_portas_externas
      state: “on”
      then:
      > - service: variable.set_variable
      > data:
      > variable: QuantidadeJanelas
      > value: 5

    • service: notify.alexa_media
      data:
      target:
      - media_player.echo_dot_da_suite
      - media_player.echo_dot_da_cozinha
      data:
      type: announce
      message: >-
      {{ MsgInicial }} Está chovendo, e existem {{ QuantidadeJanelas }}
      janelas e portas abertas
      variables:
      MsgInicial: Atenção.
      mode: single

Alguém poderia ajudar?

1 curtida

@carlosead boa noite, você não usa o Nodered ? É muito simples e prático, com certeza poderá fazer o que está planejando de maneira mais facil e muito mais completa. (minha opinião, usuário de HA e Nodered há 5 anos) :wink:

1 curtida

Até tentei… mas não consegui fazer rodar…

Sempre vem a mensagem de erro “502 - Bad Gateway”. Já tentei configurar e nada…

image

Na configuração do addon do nodered tem uma opção ssl que você precisa desativar.

Segue as minhas configs:



credential_secret: suacredencial
theme: midnight-red
http_node:
  username: seuusr
  password: suasenha
http_static:
  username: seuusr
  password: suasenha
ssl: false
certfile: fullchain.pem
keyfile: privkey.pem
system_packages: []
npm_packages: []
init_commands: []
require_ssl: false
contextStorage:
  default: Memory
  Memory:
    module: memory
  File:
    module: localfilesystem


1 curtida

olá…

Deu certo. Agora é aprender a usar… hehe

Obrigado

1 curtida

@carlosead boa noite, para dicas muito legais e simples de Nodered, recomento o canal Youtube: Neway Automações - YouTube

template:
  - sensor:
      - name: Possible open windows
        unique_id: possible_open_windows
        attributes:
          friendly_name: Possíveis janelas abertas
          open_areas: >-
            {%- set sensors = {
              "binary_sensor.janela_da_varanda": ("varanda", "cover.cortina_da_varanda"),
              "binary_sensor.janela_da_suite": ("suíte", "cover.cortina_da_suite"),
              "binary_sensor.janela_do_quarto": ("quarto", "cover.cortina_do_quarto")
            } -%}
            {%- set open_sensors = expand(sensors.keys()) | selectattr("state", "eq", "on") | map(attribute = "entity_id") | list -%}
            {{- sensors.items() | selectattr("0", "in", open_sensors) | map(attribute = "1.0") | list }}
          unavailable_areas: >-
            {%- set sensors = {
              "binary_sensor.janela_da_varanda": ("varanda", "cover.cortina_da_varanda"),
              "binary_sensor.janela_da_suite": ("suíte", "cover.cortina_da_suite"),
              "binary_sensor.janela_do_quarto": ("quarto", "cover.cortina_do_quarto")
            } -%}
            {%- set open_covers = expand(sensors.items() | map(attribute = "1.1")) | selectattr("state", "eq", "open") | map(attribute = "entity_id") | list -%}
            {%- set possible_open_windows = expand(sensors.items() | selectattr("1.1", "in", open_covers) | map(attribute = "0")) | selectattr("state", "eq", "unavailable") | map(attribute = "entity_id") | list -%}
            {%- set possible_open_areas = sensors.items() | selectattr("0", "in", possible_open_windows) | map(attribute = "1.0") | list %}
            {{- possible_open_areas -}}
        state: "{{- this.attributes.open_areas | count + this.attributes.unavailable_areas | count -}}"

Tenho esse sensor que uso como base pra obter as informações que preciso pra montar as automações.

O status em si só me diz a quantidade de janelas abertas ou possivelmente abertas.
Ainda possui 2 atributos que guardam o nome dos cômodos cuja janela está aberta ou possivelmente aberta, isso me facilita na hora de colocar pra Alexa falar ou mandar notificação pro celular.

Esse “possivelmente aberta” é quando o sensor está indisponível e a cortina está aberta.
Caso a cortina esteja fechada, ele presume que a janela tb está fechada.

No meu caso, uso em 2 situações:

  • ao falar “Alexa, até mais tarde”
  • ao apertar um interruptor que coloquei bem na saída de casa

Daí ativa a automação e ela me fala quais cômodos estão com as janelas abertas, quais ela não conseguiu avaliar e eu vou precisar olhar por conta própria ou, caso esteja tudo fechado, ela só responde até mais tarde.

- alias: Executar cena de sair de casa
  trigger:
  - platform: state
    entity_id:
    - switch.botao_3_da_entrada
    from: 'off'
    to: 'on'
  condition: []
  action:
  - service: script.run_alexa_custom_skill_notification
    data:
      speech: !include /config/templates/open_windows_alexa.yaml
      event_id: saindo_de_casa
      target:
      - media_player.echo_dot_da_sala
  - service: script.desligar_tudo_sair_casa
  mode: single

Também uso quando a previsão é de chuva.

Daí recebo uma notificação no celular avisando quais janelas estão abertas ou possivelmente abertas.

Coloquei apenas essas pq são as únicas que me dão problema se chover e pq moro em apt. As outras que ficarem abertas, não tem problema.

- alias: Notificar situação das janelas ao identificar chuva
  trigger:
  - platform: state
    entity_id:
    - binary_sensor.raining
    from: 'off'
    to: 'on'
  condition:
  - condition: numeric_state
    entity_id: sensor.possible_open_windows
    above: '0'
  action:
  - service: notify.wesley
    data:
      title: Clima chuvoso
      message: !include /config/templates/open_windows_telegram.yaml
  mode: single

Não dá pra copiar e colar as automações pq vai faltar um monte de coisa, a ideia é só tomar por base.
Além do mais, como possuem !include, não podem ficar juntas com as outras no arquivo automations.yaml senão você perde a funcionalidade da edição de automação pela UI do HA de todas as demais automações.

# open_windows_alexa.yaml
>-
  {%- set sensors = {
    "varanda": "da varanda",
    "suíte": "da suíte",
    "quarto": "do quarto"
  } -%}
  {%- set unavailable_areas = sensors.items() | selectattr("0", "in", state_attr("sensor.possible_open_windows", "unavailable_areas")) | map(attribute = "1") | list -%}
  {%- set open_areas = sensors.items() | selectattr("0", "in", state_attr("sensor.possible_open_windows", "open_areas")) | map(attribute = "1") | list -%}
  {%- macro print_unknown(items) -%}
    {%- if items | count > 1 -%}
      Não sei como estão as janelas {{ items[:-1] | join(', ') }} e {{ items[-1] }}.
    {%- elif items | count == 1 -%}
      Não sei como está a janela {{ items[0] }}.
    {%- endif -%}
  {%- endmacro -%}
  {%- if open_areas | count > 1 -%}
    As janelas {{ open_areas[:-1] | join(', ') }} e {{ open_areas[-1] }} estão abertas {{- ", e " if unavailable_areas | count > 0 -}}{{ print_unknown(unavailable_areas) | lower }}
  {%- elif open_areas | count == 1 -%}
    A janela {{ open_areas[0] }} está aberta {{- ", e " if unavailable_areas | count > 0 -}}{{ print_unknown(unavailable_areas) | lower }}
  {%- elif unavailable_areas | count > 0 -%}
    Wesley, {{ print_unknown(unavailable_areas) | lower }} Precisará verificar por conta própria.
  {%- else -%}
    {{- [
      "Até mais tarde para todos vocês.",
      "Até mais tarde.",
      "Até logo.",
      "Até!"
    ]|random -}}
  {%- endif -%}
# open_windows_telegram.yaml
>-
  {%- set sensors = {
    "varanda": "da varanda",
    "suíte": "da suíte",
    "quarto": "do quarto"
  } -%}
  {%- set unavailable_areas = sensors.items() | selectattr("0", "in", state_attr("sensor.possible_open_windows", "unavailable_areas")) | map(attribute = "1") | list -%}
  {%- set open_areas = sensors.items() | selectattr("0", "in", state_attr("sensor.possible_open_windows", "open_areas")) | map(attribute = "1") | list -%}
  {%- set break = "" -%}
  {%- macro print_list(items, sing, plur, prefix = false) -%}
    {%- if items | count > 1 -%}
    As{{- " janelas" if prefix }} {{ items[:-1] | join(", ") }}{{ break }} e {{ items[-1] }} estão {{ plur }}
    {%- else -%}
    A{{- " janela" if prefix }} {{ items[-1] }} está {{ sing }}
    {%- endif -%}
  {%- endmacro -%}
  {%- if open_areas | count and unavailable_areas | count -%}
    {{- print_list(open_areas, "aberta", "abertas", true) -}}
    {{- break+" e " if unavailable_areas | count and open_areas | count -}}
    {{- print_list(unavailable_areas, "indisponível", "indisponíveis") | lower -}}
  {%- elif open_areas | count -%}
    {{- print_list(open_areas, "aberta", "abertas", true) -}}
  {%- elif unavailable_areas | count -%}
    {{- print_list(unavailable_areas, "indisponível", "indisponíveis", true) -}}
  {%- endif -%}
  {{- ", ou seja, precisará verificar por conta própria." if unavailable_areas | count -}}