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 -}}