センサーの値をWebhookで通知してもらえるようになったので、Webhookの受け口を作ります。SwitchBotのAPIは下を参照。
GitHub - OpenWonderLabs/SwitchBotAPI: SwitchBot Open API Documents
上のSwitchBotのWebhookによってセンサーの情報がjsonでPOSTされてくるので、それの受け口をAWSのAPI GatewayとLambdaで作り、POSTされたjsonをそのままS3に保存します。
Lambda関数内はPythonで書いてこんな感じ。
import json import boto3 import datetime S3 = boto3.resource('s3') BUCKET_NAME = "バケット名" BUCKET = S3.Bucket(BUCKET_NAME) PATH = "webhook/" # AWS API Gatewayからこの関数が呼び出される。 # API Gatewayの設定で「Lambdaプロキシ統合しない」に設定しておくと、 # 引数eventの中身がWebhookのbodyで来たjsonそのものが渡されてくる。 def lambda_handler(event, context): json_data = event # print(json_data) time_of_sample = json_data["context"]["timeOfSample"] dt = datetime.datetime.fromtimestamp(time_of_sample/1000) object_key_name = PATH + f"{dt.year:02d}/{dt.month:02d}/{dt.day:02d}/{time_of_sample}.json" BUCKET.put_object( Key=object_key_name, Body=json.dumps(json_data, ensure_ascii=False) ) return { 'statusCode': 200, 'body': json_data }
WebhookからPOSTされる中身はこんな感じ。
{ "eventType": "changeReport", "eventVersion": "1", "context": { "deviceType": "WoIOSensor", "deviceMac": "MACアドレス", "temperature": 10.2, "humidity": 76, "battery": 100, "scale": "CELSIUS", "timeOfSample": 1701820882473 } }
WebhookでPOSTされるjson内の"timeOfSample"にepoch時間が入っているので、AWS Lambda関数内でjson内の"timeOfSample"を見て年/月/日のパスに分けてjsonファイルとしてS3に保存しています。
動かしてみると...できた! SwitchBotのWebhookはちゃんとセンサーの値に変化があった時にPOSTされてきます。 めでたしめでたし。