Lembretes recorrentes através da Alexa

Caso queira usar apenas a lógica dos lembretes sem integrar com Alexa, pode pular a Parte 1 e seguir diretamente para a Parte 2 mais abaixo.
Logicamente, isso vai requerer um pouco mais de conhecimento para adaptar as automações para outra situação que preferir.

Parte 1

Breve explicação sobre a integração com Alexa através de uma skill personalizada

Este tutorial depende da configuração do código abaixo para fazer integração com Alexa:
Alexa Intents - Main file is "examples_request.yaml" · GitHub

Não vou entrar em detalhes a respeito do trecho acima porque é um assunto para outro tutorial completamente diferente.
Mas em resumo, é toda a configuração de uma skill na Alexa capaz de reconhecer respostas positivas e negativas (além de outros detalhes), e repassar o tratamento para o Home Assistant por meio de “intent scripts”.
Já adiantando, o código acima utiliza o tutorial oficial como base, mas possui diversas modificações para atender situações não previstas.

Considerando que a configuração acima foi toda realizada e esteja funcionando plenamente, podemos continuar para o nosso tutorial…

Parte 2

Para facilitar, todo o código da lógica dos lembretes está neste link abaixo:


Esta configuração acima consiste basicamente no seguinte:

Esta parte é uma explicação detalhada do código genérico e que vale a pena ler se quiser entender o funcionamento nos detalhes. Senão, basta copiar e colar…

Explicação detalhada da parte genérica
Sensores
  • 1 template sensor baseado em trigger para persistir as datas dos lembretes ( sensor.lembretes_de_pagamentos )
    • Inicialmente minha ideia era usar input_datetime, mas não encontrei um jeito de definir atributos customizáveis nele (vencimento, recorrencia, pergunta, resposta)
    • Se alguém descobrir um jeito, talvez seja possível eliminar este sensor
    • No momento, só funciona com 2 tipos de recorrências: 2 semanas e 1 mês (padrão)
    • Este sensor atualiza apenas quando há chamada do evento “update_lembrete” (trigger)
    • Não requer modificação, só copiar e colar
  • 1 template sensor baseado em estado para manter a lista de pagamentos pendentes ( sensor.lembretes_de_pagamentos_pendentes )
    • É apenas um sensor totalizador para facilitar a automação sobre os lembretes pendentes
    • Este sensor é calculado e atualizado automaticamente a cada segundo
    • Não requer modificação, só copiar e colar
Automações
  • 1 automação para monitorar a situação do sensor totalizador de lembretes pendentes
    • Faz a chamada do script que inicia o fluxo com a parte 1 do tutorial
    • Executa a partir das 09h30
      • Coloquei esta situação para não fazer Alexa me notificar tão cedo
    • Há uma condição para só executar durante o dia entre 09h30 e 20h00
      • Qualquer lembrete que ultrapassar essa situação, vai ficar pro dia seguinte
    • Responsável por ler alguns atributos fixos (vencimento, pergunta, resposta) e traduzi-los numa chamada de um script que irá chamar Alexa
  • 1 automação para reagendar o lembrete para o próximo vencimento (sucesso)
    • Monitora uma resposta positiva identificada pela Alexa e traduz num comando para ajustar o lembrete para o próximo vencimento
    • Nesta automação, precisei acrescentar um pequeno atraso para dar tempo da Alexa falar a resposta completa antes de iniciar o fluxo do próximo lembrete
  • 1 automação para postergar o lembrete em 1 hora (falha)
    • Monitora uma resposta negativa ou ausência de resposta identificada pela Alexa e traduz num comando para ajustar o lembrete em 1 hora relativo ao horário atual
    • Como a resposta da Alexa numa situação negativa é bem curta, não senti necessidade de acrescentar um comando de atraso, mas caso aconteça com vocês, o ponto de ajuste seria aqui. Talvez um atraso de 1 ou 2 segundos

Todas as 3 automações descritas acima integram-se com a Parte 1 do tutorial.
Caso opte por usar apenas a parte de lembrete e não integrar com Alexa, a ação da primeira automação e os gatilhos das 2 últimas também precisarão ser ajustados para atender ao seu cenário.

Já esta outra parte varia caso a caso e vale a pena entender bem…

  • N sensores binários para representar cada lembrete ( binary_sensor.lembrete_* )
    • São os lembretes propriamente ditos e podem existir quantos forem necessários
    • Precisa ser do tipo “binary_sensor”
    • Precisa que o “entity_id” comece com “lembrete_” para ser reconhecido pelos sensores da parte genérica explicada anteriormente
      • Como o “entity_id” é gerado a partir do “name”, então faz sentido colocar o nome começando com "Lembrete "
      • A não ser que queira modificar o “entity_id” manualmente depois para atender a essa restrição
    • No momento, o atributo “recorrencia” reconhece 3 situações: 2W, 1M e '{{ {"months":x,"days":y} }}'
      • É opcional e o valor padrão é “1M”
      • 2W representa 2 semanas e é relativo em relação a data atual
        • É o mesmo que definir '{{ {"months":0,"days":14} }}'
      • 1M representa 1 mês e é absoluto em relação a data atual
        • É o mesmo que definir '{{ {"months":1,"days":0} }}'
      • Qualquer outro período diferente desses 2 anteriores, precisa informar no formato '{{ {"months":x,"days":y} }}'
        • Informe “months” se a recorrência for contabilizada em meses
        • Informe “days” se a recorrência for contabilizada em dias
    • O atributo “vencimento” depende do atributo “recorrencia”
      • É opcional e o valor padrão é 1
      • Se for 2W, o valor é somado ao dia atual
      • Caso contrário, o valor é o dia absoluto a ser considerado
        • Há uma situação ainda em aberto que dá problema quando o vencimento definido não existe em algum mês. Então, minha sugestão é evitar os dias 29, 30 e 31.
    • O atributo “pergunta” é a fala que Alexa deve fazer quando o lembrete estiver pendente
      • É obrigatório
    • O atributo “resposta” é a fala que Alexa deve fazer quando reconhecer uma resposta positiva
      • É opcional e o valor padrão é “Lembrete ajustado para o próximo dia {vencimento}”
      • Faz sentido ajustar esse atributo caso a recorrência seja 2W
    • Perceba que o “state” é sempre o mesmo
      • Ele é extraído a partir da informação persistida pelo sensor baseado em trigger da parte genérica explicada anteriormente
      • Caso ele tenha sido criado pela primeira vez, o sensor já vai entrar como se estivesse pendente e Alexa já perguntar sobre ele
Bônus

No código, há também um trecho comentado para integração com o Telegram.

Caso não haja resposta, uma mensagem é enviada pelo Telegram com possibilidade de registrar o pagamento via comando /pago <domain.entity_id>
Logicamente, há também uma automação para tratar o comando acima.


Segue o vídeo para exemplificar como ficou o funcionamento na prática deste tutorial:

Bom, é isso.

A medida que forem surgindo perguntas, vou evoluindo esta postagem para contemplar maiores detalhes.

1 curtida