Neil Carvalho

Desenvolvimento, lifehacks e outras coisas


Usando AWS Lambda e IFTTT para dormir melhor

19 Jul 2019

Nesses dias eu percebi que, nessa época do ano, o nascer do Sol aqui em Americana está bem próximo das 7 da manhã. 6:48 da manhã, pra ser mais preciso. E 7h é a hora que meu despertador está configurado. Dormir com a janela aberta, sendo lentamente despertado pelo Sol e depois só recebendo o último empurrãozinho do despertador tem deixado meu começo de dia muito mais agradável.

Então, tive uma ideia: e se eu configurar meu despertador sempre para o nascer do Sol? E tivesse também acesso fácil ao melhor horário para dormir? Busquei uma solução no IFTTT e não encontrei nada do jeito que eu queria. Então resolvi fazer a minha. Vamos lá pra receita:

Ingredientes:

Passo 1: Criando um applet no IFTTT

TL/DR sobre o IFTTT: É um serviço que permite a conexão de dois serviços diferentes. Você pode configurar toda foto onde você é marcado no Facebook para ser enviada por e-mail, por exemplo.

IFTTT significa if this, then that. E é exatamente assim que os applets são criados.

Criei um applet em que o this é Webhooks. Isso precisa de uma chave de API, que pode ser criada no site deles. Chamei meu evento de tomorrows_sunrise, e é isso a configuração do this.

Já o that é o Notifications. Os webhooks do IFTTT podem receber até três parâmetros: Value1, Value2 e Value3. Eles serão passados pela função Lambda, descrita em seguida. Ah, como vou enviar Value1 como a hora do nascer do Sol e Value2 como a melhor hora para dormir, minha mensagem de notificação ficou exatamente:

Prepare-se para dormir às . O sol vai nascer às .

Passo 2: Criando a função do Lambda

TL/DR sobre o Lambda: É um serviço da Amazon onde você pode programar funções e plugar em outros serviços. Você não precisa se preocupar com o servidor e será cobrado apenas pelos segundos em que a função executar. Há uma quantidade mensal que é gratuita, e essa função está com uma enorme folga.

O propósito da função do Lambda é ser executada todos os dias, às 20h, ver a hora do nascer do Sol no OpenWeather e finalmente passar o bastão pro IFTTT completar o serviço.

O trigger da função é o CloudWatch Events. Criei uma regra do tipo Schedule expression, cofigurado assim:

cron(0 23 * * ? *)

Essa expressão de cronjob vai executar todos os dias, às 23:00 UTC, que equivale às 20:00 no horário de Brasília.

Finalmente, a função em Ruby:

require 'json'
require 'net/http'

IFTTT_KEY          = "SUA_CHAVE_DO_IFTTT"
CITY_ID            = 3472343 # Este é o id de Americana-SP - busque em openweathermap.org
OPENWEATHERMAP_KEY = "SUA_CHAVE_DO_OPENWEATHERMAP"
URL_IFTTT          = URI("https://maker.ifttt.com/trigger/tomorrows_sunrise/with/key/#{IFTTT_KEY}")
URL_WEATHER        = URI("https://api.openweathermap.org/data/2.5/weather?id=#{CITY_ID}&appid=#{OPENWEATHERMAP_KEY}")
TIMEZONE           = "-03:00"
SLEEPING_TIME      = 8*60*60 # 8 horas, em segundos

def lambda_handler(event:, context:)
    json          = JSON.parse(Net::HTTP.get(URL_WEATHER))
    sunrise       = json["sys"]["sunrise"]
    time_to_sleep = sunrise - SLEEPING_TIME

    formatted_sunrise       = Time.at(sunrise).getlocal(TIMEZONE).strftime("%H:%M")
    formatted_time_to_sleep = Time.at(time_to_sleep).getlocal(TIMEZONE).strftime("%H:%M")

    response = Net::HTTP.post_form(URL_IFTTT, value1: formatted_sunrise, value2: formatted_time_to_sleep)

    { statusCode: 200, body: response.body }
end

E é isso. Pretendo melhorar a notificação, enviando também a previsão do tempo pro dia seguinte. Ou simplesmente utilizarei uma receita já pronta do IFTTT, com uma nova notificação.

comments powered by Disqus