前回の続き。
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に保存するところです。 その続きはまた今度。