KUSONEKOの見る世界

SwitchBot温湿度計の値をZabbixでAPI 1.1で取得しグラフ化

今まで、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回なので、まず問題にはならないかと思います。