SwitchBotの防水温湿度計のデータをS3に保存(その3)

前回の続き。

センサーの値をWebhookで通知してもらえるようになったので、Webhookの受け口を作ります。SwitchBotのAPIは下を参照。

GitHub - OpenWonderLabs/SwitchBotAPI: SwitchBot Open API Documents

上のSwitchBotのWebhookによってセンサーの情報がjsonでPOSTされてくるので、それの受け口をAWSAPI 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されてきます。 めでたしめでたし。