傀儡子えんじにあ の ぶろぐ

開発や自作PCなんかのやつをのせるやつ

IFTTTimer

Alexaでエアコンタイマーをセットしたいときとかあると思うのですよ。
そういうとき、IFTTTにタイマー機能があればできると思ったのですよ。
でも調べた限りではいまのとこそういうのはないみたいなんですよ。
だから少し作ってみたのですよ。

使い方

  1. IFTTTの"That"のほうでWebhooksのMake a web requestを選択
  2. URLはhttps://opqc356q12.execute-api.ap-northeast-1.amazonaws.com/beta/iftttimer
    MethodはPOST
    Content Typeはapplication/json
    Bodyは
{
    "url":"https://maker.ifttt.com/trigger/{EventName}/with/key/{Your_Key}",
    "time":{minutes}
}

としとくと、EventNameに入れたAppletをminutes分後に実行してくれる
minutes分後ってすごく頭悪そう

仕組み

POSTをAWS API Gatewayで受け取ってLambdaのIFTTTimer_setにポイ
IFTTTimer_setはそれをDynamoDBにPUT

import json
from datetime import datetime
import boto3

def lambda_handler(event, context):
    print(event)
    body=json.loads(event["body"])
    timer_time=int(datetime.now().timestamp())+int(body["time"])
    url=body["url"]
    db = boto3.resource('dynamodb')
    table = db.Table('IFTTTimer_TimeTable')
    response = table.put_item(
        Item={
            "time":timer_time,
            "resource":event['resource'],
            "url":url
        }
    )

1分ごとに定期実行されてるIFTTTimer_mainが毎度DBをチェック
時間を過ぎてるものがあったら指定リンクにPOSTしてDBからレコード削除

import boto3
import requests
import json
from datetime import datetime
from boto3.dynamodb.conditions import Key, Attr


def lambda_handler(event, context):
    db=boto3.resource('dynamodb')
    table=db.Table("IFTTTimer_TimeTable")
    response = table.query(KeyConditionExpression=Key("resource").eq("/iftttimer") & Key("time").lte(int(datetime.now().timestamp())))
    print(response["Items"])
    for x in response["Items"]:
        requests.post(x['url'], data = json.dumps({
                "value1":"test"
            }))
        table.delete_item(Key={
            'time': int(x['time']), 
            'resource': x['resource']
        })

詰まったとこ・現状気に入らないとこ

table.queryはパーティションキーとはeq()でしか比較できないらしい
かといってソートキーのみで検索もできない
データベース全然知らないからわからんけども、これが普通なのでしょうか
解決としてパーティションキーを適当な一意のものにしてソートキーに時刻を入れてlte()使ってます
でも力業過ぎてきたない&気持ち悪いから要改善

そもそもなぜIFTTTにはタイマー処理がないんだ

github.com