Last active
July 31, 2023 23:21
-
-
Save w35l3y/a74dfdaae4e3e50845a386f8cf90c5f7 to your computer and use it in GitHub Desktop.
Lembretes recorrentes através da integração do Home Assistant com Alexa
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Todas estas automações são genéricas e não precisam entender no detalhe, só se quiser realizar algum ajuste | |
# Executa entre 09h30 e 20h00 caso surja lembretes pendentes | |
- alias: Monitora lembretes recorrentes pendentes | |
description: 'Monitora a situação dos lembretes e executa a fala da Alexa para o 1º lembrete pendente da lista' | |
trigger: | |
- platform: state | |
entity_id: | |
- sensor.lembretes_recorrentes_pendentes | |
not_to: | |
- unavailable | |
- unknown | |
- platform: time | |
at: '09:30:00' | |
condition: | |
- condition: template | |
value_template: '{{ states("sensor.lembretes_recorrentes_pendentes") | int > 0 }}' | |
- condition: time | |
before: '20:00:00' | |
after: '09:30:00' | |
action: | |
- service: script.run_alexa_custom_skill_notification | |
data: | |
reprompt: "Não ouvi. Sim ou não?" | |
target: media_player.echo_dot_do_escritorio | |
fallback: AMAZON.NoIntent | |
event_id: lembrete_recorrente_pendente | |
speech: '{{- state_attr(state_attr("sensor.lembretes_recorrentes_pendentes", "pendencias")[0], "pergunta") -}}' | |
response_resolved: '{% set entity_id = state_attr("sensor.lembretes_recorrentes_pendentes", "pendencias")[0] %}{% set response = state_attr(entity_id, "resposta") %}{{ response if response else "Lembrete ajustado para o próximo dia " + state_attr(entity_id, "vencimento") }}' | |
response_rejected: Lembrete postergado | |
params: | |
key: '{{ state_attr("sensor.lembretes_recorrentes_pendentes", "pendencias")[0] }}' | |
mode: single | |
# Trata resposta negativa | |
- alias: Alexa Intents - Postergar lembrete | |
description: 'Atualiza o lembrete atual para uma situação de falha em caso de resposta negativa ou ausência de resposta' | |
trigger: | |
- platform: event | |
event_type: alexa_custom_skill_notification | |
event_data: | |
event_id: lembrete_recorrente_pendente | |
intent: AMAZON.NoIntent | |
action: | |
- event: update_lembrete_recorrente | |
event_data: | |
key: '{{ trigger.event.data.params.key }}' | |
success: false | |
# Este trecho comentado abaixo é uma integração bônus com o Telegram | |
# Só envia para o Telegram caso não haja resposta | |
# - condition: template | |
# value_template: '{{ trigger.event.data.fallback }}' | |
# - service: notify.meu_telegram | |
# data: | |
# message: '{{ trigger.event.data.speech }}' | |
# data: | |
# keyboard: | |
# - '/pago {{ trigger.event.data.params.key }}' | |
mode: single | |
# Trata resposta positiva | |
- alias: Alexa Intents - Atualiza lembrete para o próximo vencimento | |
description: 'Atualiza o lembrete atual para uma situação de sucesso em caso de resposta positiva' | |
trigger: | |
- platform: event | |
event_type: alexa_custom_skill_notification | |
event_data: | |
event_id: lembrete_recorrente_pendente | |
intent: AMAZON.YesIntent | |
action: | |
- delay: | |
hours: 0 | |
minutes: 0 | |
seconds: 4 | |
milliseconds: 0 | |
- event: update_lembrete_recorrente | |
event_data: | |
key: '{{ trigger.event.data.params.key }}' | |
success: true | |
mode: single | |
# Automação bônus de integração com Telegram | |
# - alias: "Telegram bot atende pelo comando /pago <entity_id>" | |
# trigger: | |
# platform: event | |
# event_type: telegram_command | |
# event_data: | |
# command: /pago | |
# condition: | |
# - condition: template | |
# value_template: '{{ true if state_attr(trigger.event.data.args[0], "friendly_name") else false }}' | |
# action: | |
# - event: update_lembrete_recorrente | |
# event_data: | |
# key: '{{ trigger.event.data.args[0] }}' | |
# success: true |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# https://www.home-assistant.io/integrations/template/ | |
template: | |
# Estes sensores binários abaixo são meros exemplos, variam caso a caso e são os que requerem atenção | |
# Nesta lista de sensores binários que você acrescentaria seus próprios lembretes | |
# As restrições são que as entidades devem ser do tipo "binary_sensor" e o entity_id deve começar com "lembrete_" | |
- binary_sensor: | |
- name: Lembrete Recarga Celular | |
unique_id: lembrete_recarga_celular | |
attributes: | |
recorrencia: 2W | |
pergunta: Já fez a recarga de celular? | |
resposta: Lembrete ajustado para daqui a duas semanas | |
state: > | |
{{ (state_attr("sensor.lembretes_recorrentes", "lembretes") or {}).get(this.entity_id, now().isoformat()) | as_datetime <= now() }} | |
- name: Lembrete Plano de saúde | |
unique_id: lembrete_plano_saude | |
attributes: | |
vencimento: 10 | |
pergunta: Já pagou o plano de saúde? | |
state: > | |
{{ (state_attr("sensor.lembretes_recorrentes", "lembretes") or {}).get(this.entity_id, now().isoformat()) | as_datetime <= now() }} | |
- name: Lembrete Escola das crianças | |
unique_id: lembrete_escola_criancas | |
attributes: | |
vencimento: 30 | |
pergunta: Já pagou a escola das crianças? | |
state: > | |
{{ (state_attr("sensor.lembretes_recorrentes", "lembretes") or {}).get(this.entity_id, now().isoformat()) | as_datetime <= now() }} | |
# Deste trecho em diante, são sensores genéricos e não precisam entendê-los no detalhe, só se quiser realizar algum ajuste | |
# Este sensor baseado em trigger serve para persistir as datas dos lembretes, mesmo que o Home Assistant seja reiniciado. | |
# https://www.home-assistant.io/integrations/template/#trigger-based-template-binary-sensors-buttons-images-numbers-selects-and-sensors | |
# Inicialmente, minha ideia era usar input_datetime, mas não encontrei uma forma de incluir atributos constumizáveis neles. (vencimento, recorrencia, pergunta, resposta) | |
# No momento, este sensor só trabalha com 2 tipos de recorrências: "2W" (2 semanas relativas ao dia atual) e "outros" (mês seguinte) | |
- trigger: | |
- platform: event | |
event_type: update_lembrete_recorrente | |
sensor: | |
- name: Lembretes recorrentes | |
unique_id: lembretes_recorrentes | |
state_class: total | |
attributes: | |
lembretes: > | |
{% set items_found = states.binary_sensor | map(attribute = "entity_id") | select("match", "^binary_sensor\.lembrete_") | list %} | |
{% set current = dict(this.attributes.get("lembretes", {}) | items | selectattr("0", "in", items_found) | list) %} | |
{% set custom_recorrencia = state_attr(trigger.event.data.key, "recorrencia") or {} %} | |
{% set default_recorrencia = {"months":0,"days":14} if custom_recorrencia == "2W" else {"months":1,"days":0} %} | |
{% set recorrencia = dict(default_recorrencia, **custom_recorrencia) if custom_recorrencia is mapping else default_recorrencia %} | |
{% set add_vencimento = state_attr(trigger.event.data.key, "vencimento") | int(1) %} | |
{% set agora = now() %} | |
{% set new = { trigger.event.data.key: ((agora.replace(hour = 0, minute = 0, second = 0, microsecond = 0) + timedelta(days = recorrencia.days + add_vencimento)) if recorrencia.months == 0 else agora.replace(year = agora.year + (((agora.month + recorrencia.months) / 12) | int), month = 1 + ((agora.month - 1 + recorrencia.months) % 12), day = add_vencimento, hour = 0, minute = 0, second = 0, microsecond = 0) + timedelta(days = recorrencia.days) if trigger.event.data.get("success") else (agora + timedelta(hours = 1))).isoformat() } %} | |
{{ dict(current, **new) }} | |
state: > | |
{% set items_found = states.binary_sensor | map(attribute = "entity_id") | select("match", "^binary_sensor\.lembrete_") | list %} | |
{{ this.attributes.get('lembretes', {}) | items | selectattr('0', 'in', items_found) | list | count }} | |
# Este sensor baseado em estado serve para monitorar a situação de todos os lembretes pendentes | |
# https://www.home-assistant.io/integrations/template/#state-based-template-binary-sensors-buttons-images-numbers-selects-and-sensors | |
- sensor: | |
- name: Lembretes recorrentes pendentes | |
unique_id: lembretes_recorrentes_pendentes | |
state_class: total | |
attributes: | |
pendencias: > | |
{{ states.binary_sensor | selectattr("state", "eq", "on") | map(attribute = "entity_id") | select("match", "^binary_sensor\.lembrete_") | list }} | |
state: > | |
{{ (this.attributes.get("pendencias") or []) | count }} | |
# Este sensor abaixo só é usado na integração bônus com Telegram | |
# - name: Lembretes recorrentes postergados | |
# unique_id: lembretes_recorrentes_postergados | |
# state_class: total | |
# attributes: | |
# pendencias: > | |
# {{ (state_attr("sensor.lembretes_recorrentes", "lembretes") or {}) | items | selectattr("1", "<=", (now() + timedelta(hours = 1)).isoformat()) | map(attribute = "0") | list }} | |
# state: > | |
# {{ (this.attributes.get("pendencias") or []) | count }} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment