Amazon タイムセールで、SwitchBot CO2 センサー付き温湿度計の割引がでていたので、Hub mini セットで発注。CO2センサーは以前 CCS811 でモニタリングしていたけど、もともと精度が悪かったし異常値がでるようになってモニタリングをやめてるので、SwitchBot で復活させたくて、買ってしまった。だけど、CO2センサーは発送が始まらず、Hub mini だけが届く。ということで、ひとまず Hub mini で遊ぶ。
curl で switchbot API の情報を取得する
Python などで API をたたく記事が多いけど、もう少しシンプルにできないかということで、手抜き curl で試してみる。
まずは、最もシンプルな、v1.0 で取得する方法。
最初の token, secret には、SwitchBot スマホアプリで入手したものを書き込む。(v1.0では secret 使ってないけど)
#!/bin/bash token="xxxxxx....xxxxxxx" secret="yyyy...yyy" url_list_v10="https://api.switch-bot.com/v1.0/devices" curl -s -H "Authorization:${token}" "${url_list_v10}"
switchbot API v1.1 で取得する
ちょっと面倒だけど、セキュリティ的には v1.1 で取得するのが定番。最初は Unauthorized で失敗して色々と試行錯誤したけど、openssl … -binary がキモだった。(こちらの記事を見て、sha256 のハッシュの形式が違うのに気づけた。)
#!/bin/bash token="xxxxxx....xxxxxxx" secret="yyyy...yyy" t="$(/usr/bin/date +%s%3N)" # time = Epoch time 13桁 nonce="$(/usr/bin/uuidgen)" # uuid sign=$(echo -n "$token$t$nonce" \ | /usr/bin/openssl dgst -sha256 -hmac "$secret" -binary \ | /usr/bin/base64 -w 0) url_list_v11="https://api.switch-bot.com/v1.1/devices" curl -s --request GET \ -H "Content-Type: application/json" \ -H "Authorization: ${token}" \ -H "sign: ${sign}" -H "nonce: ${nonce}" -H "t: ${t}" \ "${url_list_v11}"
取得した json コンテンツから特定のデバイスの情報を抜粋する
結果は、JSON 形式なので、jq を使って必要な場所だけ抜粋する。
$ bash swbot.sh \ | jq '.body.deviceList[] | select( .deviceId == "ZZZZZZZZZZZZZZZZ")'
Switchbot meter plus から温度,湿度を表示
Switchbot Hub mini が無い時は、温湿度計(meter plus)からのデータ取得は Bluetooth 経由で動かしていたので、Raspberry Pi で温度を取得していたが、この方法であれば LAN 接続であればどこからでも取得可能なので便利。
(略) swbot_meter="ZZZZZZZZZZZZZZZZ" url_list_v11_meter="${url_list_v11}/${swbot_meter}/status" curl -s --request GET \ -H "Content-Type: application/json" \ -H "Authorization: ${token}" \ -H "sign: ${sign}" -H "nonce: ${nonce}" -H "t: ${t}" \ "${url_list_v11_meter}" \ | jq -r '.body | "Temperature: " + (.temperature|tostring) + "C\n" \ + "Humidity: " + (.humidity|tostring) + "%"'
これで、温度、湿度がとれる。これなら munin 用のスクリプトも shell で簡単に書けそう。だけど、バッテリー残量(.battery)は 60% 台まで落ちているはずだけど、100% なんだよな。他の SwitchBot Plug でも、電力値が取れなかったりと SwitchBotAPI は、全機能を網羅していない様子。