今まで、SwitchBot温湿度計プラスの値をBluetoothで取得してきましたが、Bluetoothの調子が悪く、値の取得に失敗することが増えてきました。
今回対策として、ハブ2経由で値をクラウドに上げ、クラウドからAPIで値を取得する方法に変更しましたので、メモを残しておきます。
なお、温湿度計プラスだけでなく、防水温湿度計やハブ2も、同様に温湿度の取得が可能です。
SwitchBot APIの準備
トークン、シークレットキー
APIから情報を取得するには、トークンとシークレットキーが必要になります。
その他、Signも必要ですが、それはシェルスクリプトで生成するので今回は気にしません。
トークンとシークレットキーは、スマホアプリから取得します。
iPhone版アプリの場合、まず、[プロフィール]→[設定]でアプリバージョンをタップしまくります。
すると、開発向けオプションという項目が現れます。
それをタップすると、トークンとシークレットキーが表示されますので、それを控えておきます。
デバイスID取得用シェルスクリプトの作成
あとは、シェルスクリプトを作成するだけですが、もう既に公開されている方がいらっしゃったので、こちらを使用させて頂きます。
シェルスクリプトでcurlからSwithBotのAPI v1.1を呼ぶ - Qiita
概要1年前にリリースされた、新バージョンv1.1のSwitchBot APIに、シェルスクリプトでアクセスしたい。リクエストに署名を付加する要件が追加されたため、ちょっと手順が増えたのでそのまと…
switchbot_api_v11.sh というシェルスクリプトにトークンとシークレットキーを代入して、実行すれば、アカウントに登録してある全てのデバイスが表示されます。
ここから温湿度計のデバイスID(MACアドレス)を確認できます。
温湿度計の値取得用シェルスクリプトの作成
こちらも同じ方が作成されていますが、Zabbixに取り込みやすいよう変更させてもらいました。
変更点は、デバイスIDをシェルスクリプトの引数で取得、括弧を一個外しましただけです。
result=($( curl -s "https://api.switch-bot.com/v1.1/devices/<device_id>/status" \ --header "Authorization: ${token}" \ --header "sign: ${sign}" \ --header "t: ${t}" \ --header "nonce: ${nonce}" \ --header "Content-Type: application/json; charset=utf8" \ | jq ".body.humidity, .body.temperature" )) ↓ result=$( curl -s "https://api.switch-bot.com/v1.1/devices/$1/status" \ --header "Authorization: ${token}" \ --header "sign: ${sign}" \ --header "t: ${t}" \ --header "nonce: ${nonce}" \ --header "Content-Type: application/json; charset=utf8" \ | jq ".body.humidity, .body.temperature" )
Zabbix
今回もマスターアイテムで値の取得を行い、依存アイテムで、温度、湿度それぞれを取得します。
アイテム作成(マスター)
[設定]→[ホスト]→[Zabbix server]→[アイテム]
[アイテムの作成]を押下。
名前:SwitchBot Meter Master API
タイプ:Zabbixエージェント
キー:system.run[sh /root/switchbot_api_v11.sh デバイスID]
データ型:文字列
監視間隔:1m
[追加]を押下。
デバイスIDは、お持ちのデバイスのIDを入力してください。
複数デバイスをお持ちの場合は、このデバイスIDを変えたアイテムを複数作ると便利です。
アイテム作成(依存アイテム)温度
[設定]→[ホスト]→[Zabbix server]→[アイテム]
[アイテムの作成]を押下。
名前:SwitchBot Meter Temperature API
タイプ:依存アイテム
キー:switchbot.meter.temperature.api
マスターアイテム:SwitchBot Meter Master API
データ型:数値(浮動小数)
単位:℃
保存前処理
名前:正規表現
パラメータ:(\d.+) (\d.+)
:\2
[追加]を押下。
アイテム作成(依存アイテム)湿度
[設定]→[ホスト]→[Zabbix server]→[アイテム]
[アイテムの作成]を押下。
名前:SwitchBot Meter Humidity API
タイプ:依存アイテム
キー:switchbot.meter.humidity.api
マスターアイテム:SwitchBot Meter Master API
データ型:数値(整数)
単位:%
保存前処理
名前:正規表現
パラメータ:(\d.+) (\d.+)
:\1
[追加]を押下。
グラフ作成
[設定]→[ホスト]→[Zabbix server]→[グラフ]
[グラフの作成]を押下。
名前:SwitchBot Meter
アイテム: Zabbix server: SwitchBot Meter Temperature API と SwitchBot Meter Humidity API を追加する。
[追加]を押下。
アイテムで作成した名前を選択。
グラフの形式:線
Y軸:温度は左、湿度は右
色:お好きな色に
[追加]を押下。
最後に
Bluetoothの状況に左右されず、温度湿度のグラフを生成できるようになりました。
Bluetoothと比べて問題点があるとすれば、1日10000回のAPIの取得制限があることと、インターネットが切れた際は、値が取得できなくなることです。
1日10000回は、 1時間あたり416.6回、 1分あたり6.9回なので、まず問題にはならないかと思います。