はじめに
過去記事にて紹介している通り、私は各部屋や屋外に電子工作した温湿度計を設置してデータをロギングしているのですが、電子工作が苦手な方でも市販のデバイスを使用することで、毎日の温湿度データのロギングを簡単に行う方法をご紹介します。
温湿度計測のデバイスとしては、各種IOTデバイスを発売しているSwitchBot社の製品群は公式にAPIが公開されておりそれぞれの機器の状態を簡単に読み出したり操作したりすることができますので、おススメです。
公開されているAPIとしてVersion1.0と1.1があるのですが、まず手始めに使い方が分かり易いVersion1.0を利用して手持ちの温湿度計とハブ2から温度と湿度を読み取ってみましたのでその手順を公開します。
公式のGitHubの記載内容によると現在Version1.0のサポートは終了となっており、認証が強化されたVersion1.1の使用が推奨されていますが、Version1.0も継続して使用することはできますので試してみてはいかがでしょうか。
SwitchBotAPI/README-v1.0.md at main · OpenWonderLabs/SwitchBotAPI · GitHub
APIを使用する作業フローを以下に記載しますが、「トークンとデバイスIDを取得」後に「GETメソッドでJSON形式のデータを取得する」の2つの作業を行うだけで大丈夫です。
トークンを取得する手順
まず以下の手順でAPIを使用するためにクラウドサービスをオンにすることと、SwitchBotアプリの「開発者向けオプション」で「トークン」を取得する必要があります。
①スイッチボットアプリをApp StoreやGoogle Play Storeからダウンロードします。
②スイッチボットアカウントに登録しログインします。
③設定から「クラウドサービス」をONにします。
④SwitchBotアプリで以下を順番に操作します。
・プロフィールタップする。
・設定をタップする。
・アプリバージョンを10回タップする。
・設定の選択肢に「開発者向けオプション」の項目が追加されるのでタップする。
・「トークンを取得」をタップする。
・トークンが2行表示されるので上段のトークンをコピーして使用します。
※トークンは第三者に絶対に公開してはいけません。
デバイスIDを確認する手順
以降の内容はLinuxコマンドが多少わかることが前提として記載します。
コマンドプロンプトから次のコマンドを入力することによりSwitchBot serverに登録しているデバイスが「デバイスリスト」として出力されます。そのデバイスリストに「デバイスID」が記載されています。
curl -X GET “https://api.switch-bot.com/v1.0/devices” -H “Authorization: {Token}”
{Token}の箇所にswitchBotアプリで取得したトークンを記載します。
コマンドの応答として次のようなデバイスリストが出力されます。
{“statusCode”:100,”body”:{“deviceList”:[{“deviceId”:”************“,”deviceName”:”温湿度計 22 “,”deviceType”:”Meter”,”enableCloudService”:true,”hubDeviceId”:”************”},
{“deviceId”:”************“,”deviceName”:”ハブ2 03“,”enableCloudService”:true,”hubDeviceId”:”000000000000″},
{“deviceId”:”************“,”deviceName”:”防水温湿度計 D8“,”deviceType”:”WoIOSensor”,”enableCloudService”:true,”hubDeviceId”:”************”},
],”infraredRemoteList”:[]},”message”:”success”}
“deviceId”の右側がデバイスIDで、そのIDに対応する機器は”deviceName”の右側に記載があります。上記の場合は、”温湿度計”、”ハブ2″、”防水温湿度計”の3つのデバイスIDを読み取ることができます。
機器のステータスを取得する
トークンとデバイスIDがわかりましたので次のコマンドを入力することで機器の状態を確認することができます。
curl -X GET “https://api.switch-bot.com/v1.0/devices/{deviceId}/status” -H “Authorization:
{Token}“
具体的にはこのように入力します。(※実際のToken部分はもっと長い文字列です)
curl -X GET “https://api.switch-bot.com/v1.0/devices/0123456789AB/status” -H “Authorization:
0123456789ABCDEF0123“
JSON形式のデータを取得する
ステータスの見方について
例えば温湿度計の場合は、コマンドの応答として次のようなステータスが返ってきます。
{“statusCode”:100,”body”:{“deviceId”:”************”,”deviceType”:”Meter”,”hubDeviceId”:”************”,”humidity”:66,”temperature”:21.2},”message”:”success”}
上記の英単語を見てわかると思いますが、”humidity”の横の”66″が現在の湿度66%を示し,”temperature”の横の”21.2″が現在の温度21.2℃を示しています。デバイスからの応答はjson形式で返ってきますので各自のプログラム上での再利用は容易となっています。私はラズパイのcronに次の2つを記載してInfluxDBに蓄積してみました。
測定値をinfluxdbに保存する方法
①ステータスを取得しファイルに保存する下記のようなコマンドをcornで一定時間毎に実行
curl -X GET “https://api.switch-bot.com/v1.0/devices/{deviceId}/status” -H “Authorization:
{Token}” -o /home/pi/任意のデータ保存用フォルダ/meter.txt
②上記で保存したテキストファイルから温度と湿度のデータを抜き出してInfluxDBに保存するスクリプトを作成し、そのスクリプトを実行する下記のようなコマンドをcronで一定時間毎に実行
sh /home/pi/Documents/switchbot_meter.sh /home/pi/Documents/任意のデータ保存用フォルダ/meter.txt
スクリプトの例: switchbot_meter.sh
#!/bin/bash
if [ ! $# -eq 1 ]; then
echo "Useage: `basename $0` JSON"
exit
fi
# influxdb のデータベース名
DBNAME="databasename"
# switchbotAPIで生成したJSONファイルを読み込む
JSON=`cat $1`
# 測定した各要素を変数に代入
deviceID=$(echo ${JSON} | jq ".body" | jq ".deviceId")
temp=$(echo ${JSON} | jq ".body" | jq ".temperature")
humi=$(echo ${JSON} | jq ".body" | jq ".humidity")
# 変数をデータベースに書き込む
curl -i -XPOST "http://localhost:8086/write?db=${DBNAME}&precision=s" \
--data-binary \
"Switchbot,deviceID=${deviceID} \
temp_meter1=${temp},humi_meter1=${humi}"
APIで取得した温度と湿度のデータを紹介
API経由で取得した温湿度計とハブ2のデータを1分間隔でGrafanaでグラフ化してみました。注意点としてAPIは一日当たり10,000回までの呼び出し回数の制限があります。つまり一時間当たり410回、一分当たり6.9回であり、最小で10秒間隔で測定が可能でなので毎日のデータロギングには必要十分と思います。APIを使用するデバイスが増えればそれだけ一台当たりの呼び出し回数は減ることになります。なお、10,000回を超えると “Unauthorized.”が返ってくるようです。
おわりに
公式でAPIを公開していただけると安心して自作のプログラムに組み込む事ができて、メーカに対してとても好感が持てます。API Version1.0の使い方は比較的簡単に理解できましたので次は新しく公開されたVersion1.1の使い方に挑戦していきます。
コメント