前回の続き。
SwitchBotのAPIを調べていたら、なんとWebhookでセンサーの値を任意のWebに通知できるようになっているではないですか。
GitHub - OpenWonderLabs/SwitchBotAPI: SwitchBot Open API Documents
Webhookで通知してもらうにはセンサー単独でなくSwitchBotの"ハブ"が必要とのことでこちらを入手。
SwitchBot ハブミニwww.switchbot.jp
ハブミニと防水温湿度計をSwitchBotアプリで連携とクラウドサービスをオンに。
そしたらセンサーの値を通知してもらうためのWebhook受け口を何らか自分で用意して、そこに通知してもらうようにSwitchBotAPIに登録すればいい。
Webhookの受け口はテスト用に webhook.site を利用しました。便利だ。
上のSwitchBotAPIドキュメントを見ながら、ざっくりこんな感じ。コード継はぎで整ってないのはご容赦を。
apiHeader = {}
access_token = "アクセストークン(これについては上のドキュメントに書いてある)"
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))
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_URL = "自分で用意した通知してほしい先のURL"
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に保存するところです。
その続きはまた今度。