Skip to content

Instantly share code, notes, and snippets.

@w35l3y
Last active July 31, 2023 23:21
Show Gist options
  • Save w35l3y/a74dfdaae4e3e50845a386f8cf90c5f7 to your computer and use it in GitHub Desktop.
Save w35l3y/a74dfdaae4e3e50845a386f8cf90c5f7 to your computer and use it in GitHub Desktop.
Lembretes recorrentes através da integração do Home Assistant com Alexa
# 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
# 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