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

前回の続き。

SwitchBotのAPIを調べていたら、なんとWebhookでセンサーの値を任意のWebに通知できるようになっているではないですか。

GitHub - OpenWonderLabs/SwitchBotAPI: SwitchBot Open API Documents

Webhookで通知してもらうにはセンサー単独でなくSwitchBotの"ハブ"が必要とのことでこちらを入手。

SwitchBot ハブミニwww.switchbot.jp

ハブミニと防水温湿度計をSwitchBotアプリで連携とクラウドサービスをオンに。

そしたらセンサーの値を通知してもらうためのWebhook受け口を何らか自分で用意して、そこに通知してもらうようにSwitchBotAPIに登録すればいい。

Webhookの受け口はテスト用に webhook.site を利用しました。便利だ。

上のSwitchBotAPIドキュメントを見ながら、ざっくりこんな感じ。コード継はぎで整ってないのはご容赦を。

# Declare empty header dictionary
apiHeader = {}
# open token
access_token =  "アクセストークン(これについては上のドキュメントに書いてある)"
# secret key
secret_key = "シークレットキー(これについても上のドキュメントに書いてある)"
nonce = uuid.uuid4()
t = int(round(time.time() * 1000))
string_to_sign = "{}{}{}".format(access_token, t, nonce)

string_to_sign = bytes(string_to_sign, "utf-8")
secret_key = bytes(secret_key, "utf-8")

sign = base64.b64encode(
    hmac.new(secret_key, msg=string_to_sign, digestmod=hashlib.sha256).digest()
)
print("Authorization: {}".format(access_token))
print("t: {}".format(t))
print("sign: {}".format(str(sign, "utf-8")))
print("nonce: {}".format(nonce))

# Build api header JSON
apiHeader["Authorization"] = access_token
apiHeader["Content-Type"] = "application/json"
apiHeader["charset"] = "utf8"
apiHeader["t"] = str(t)
apiHeader["sign"] = str(sign, "utf-8")
apiHeader["nonce"] = str(nonce)

######################
# Webhook登録

WEBHOOK_URL = "自分で用意した通知してほしい先のURL"

# Request body
req_body_json = {
    "action": "setupWebhook",
    "url": WEBHOOK_URL,
    "deviceList": "ALL",
}
# リクエストを送信
response = requests.post(
    "https://api.switch-bot.com/v1.1/webhook/setupWebhook",
    json=req_body_json,
    headers=apiHeader,
)

# レスポンスを確認
if response.status_code != 200:
    raise ValueError(f"Status code: {response.status_code}")

data = response.json()
print(f"レスポンス:{data}")

そしたら、webhook.site に用意したURLにjsonでセンサーの値がちゃんと通知されました。こんな感じ。

{
    "eventType": "changeReport",
    "eventVersion": "1",
    "context": {
        "deviceType": "WoIOSensor",
        "deviceMac": "MACアドレス",
        "temperature": 10.2,
        "humidity": 76,
        "battery": 100,
        "scale": "CELSIUS",
        "timeOfSample": 1701820882473
    }
}

素晴らしい!やりたいことの半分はこれでできてしまった。あとはWebhookをAWSで受けてjsonをS3に保存するところです。 その続きはまた今度。