IFTTTimer
Alexaでエアコンタイマーをセットしたいときとかあると思うのですよ。
そういうとき、IFTTTにタイマー機能があればできると思ったのですよ。
でも調べた限りではいまのとこそういうのはないみたいなんですよ。
だから少し作ってみたのですよ。
使い方
- IFTTTの"That"のほうでWebhooksのMake a web requestを選択
- 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にはタイマー処理がないんだ