Philips Hue モーションセンサーに隠された温度計と、SwitchBot APIからのSwitchBot温湿度計のデータをZabbixに入れる

#1 はじめに
瀧澤です。2020年前半からのコロナ禍において、自宅で快適に仕事をするため、[Zabbixでネットワーク品質の可視化・監視](https://qiita.com/yo1t/items/8164f42a4ae1c5c81323) を行ったりしました。その続きで、今回は、**室内の温度や湿度の可視化をZabbixで可視化**したいと思います。
**Philips Hue モーションセンサーには、実は、温度計が内蔵**されています。Philips Hueアプリでは表示されませんが、Hue Bridgeが提供するAPIから値を取得できます。私の家には、1)玄関、2)廊下、3)洗面スペース、4)トイレにHueモーションセンサーがあるので、この温度のデータをAPIで取得したいと思います。
また、1)リビング、2)自分の部屋、3)子供部屋には、**SwitchBotの温湿度計**があり、これも値を取得したいと思います。SwitchBotは、Bluetoothで取得する方法と、2020年12月ごろから?提供された、**SwitchBot APIを使う方法**の２種類がありますが、今回は、SwitchBot APIを使いたいと思います。
というわけで、全部で、玄関、廊下、洗面スペース、トイレ、リビング、自分の部屋、子供部屋の7箇所の温度や湿度を取得して、Zabbixで可視化し、必要に応じて、エアコン、加湿器を動かすタイミングを判断できるようにしたいと思います。別記事で書いた「Zabbixでコロナ禍おける在宅勤務環境のネットワークの遅延」の可視化と合わせて、出来上がりのイメージは下記になります。
![zabbix_temp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61619/30a1f434-17e7-06e0-d255-1b76f3ca391e.png)

#2 方法
### Zabbix
Zabbixがインストール済みであるとしています。Zabbixの導入等は、公式のドキュメント等を参照ください。
https://www.zabbix.com/jp/download

### Hue Bridge API
Philips HueのBridge経由でAPIにアクセス可能です。Bridgeにhttpでアクセスすると簡単なAPIのテストも可能です。
https://developers.meethue.com/develop/get-started-2/

### SwitchBot API
SwitchBot Mini Hub Miniか、SwitchBot Hub Plusが必要になります。APIのドキュメントには、IoTを趣味としている人、開発者、専門家が独自のスマートホームのプログラムやアプリケーションを作成する人向けに、SwitchBot APIメソッド、サンプル、ベストプラクティスのについて説明がされています。
https://github.com/OpenWonderLabs/SwitchBotAPI


#3 環境の説明
Zabbix Serverは、Hue Bridgeと同じサブネットに存在している必要があります。自分の環境は、別のサブネットにZabbix Serverがあったため、CiscoルータのStatic NATでZabbix ServerをHue Bridgeと同じサブネットに見せています。SwitchBot APIのほうは、インターネット経由でアクセスするため、Zabbix Serverはインターネットにhttpsでアクセスできる必要があります。


#4 環境の構築方法
## 1. Philips Hueのモーションセンサーの温度計のデータ取得方法
### 準備
まず、下記にアクセスして、Hue BridgeのIPアドレスを調べます。

```
curl https://discovery.meethue.com/> 
```

そうすると、下記のような内容(internalipaddress)が返ってきて、BridgeのIPアドレスがわかります。

```
[{"id":"XXXXXXXXXXXXXX","internalipaddress":"(bridge_ip_address)"}]
```
そのBridgeのIPアドレスを元にブラウザで下記にアクセスします。
https://(bridge_ip_address)/debug/clip.html

そして、下記の手順に基づき、usernameを取得します。
https://developers.meethue.com/develop/get-started-2/
簡単に説明すると、/debug/clip.htmlにアクセスした先で、GUIに下記を入力し、その後、Hue Bridgeの「リンクボタン」（物理スイッチ）を押すと、APIでアクセスする際に必要なusernameが発行されます。


> URL	/api
> Body	{"devicetype":"my_hue_app#iphone peter"}|
> Method	POST

そして、下記のコマンドを実行すると、Hue Bridge配下のデバイスの一覧が取得できます。この出力結果から「温度センサーのデバイスID」を探します。（この例の場合は、28）

```
curl -X GET -s "http://(bridge_ip_address)/api/(username)/" | jq
```

```:（出力結果）
{
  "lights": {
    （略）
  },
  （略）
  "sensors": {
    （略）
    "26": {
      "state": {
      （略）
      },
      "config": {
      （略）
      },
      "name": "玄関センサー", ← Hue アプリでつけた名前
      （略）
      "uniqueid": "XX:XX:XX:XX:XX:XX:XX:XX-X-0406",  ← ここのIDに着目する。
      "capabilities": {
        （略）
      }
    },
    "27": {
     （略）
    },
    "28": {   ← これが温度センサーのデバイスID
      "state": {
        "temperature": 1880, ←温度データ（実際の摂氏温度にするためには、100で割る）
        "lastupdated": "2021-02-07T13:27:50"
      },
      "swupdate": {
        "state": "noupdates",
        "lastinstall": "2020-03-16T05:38:08"
      },
      "config": {
        "on": true,
        "battery": 100,
        "reachable": true,
        "alert": "none",
        "ledindication": false,
        "usertest": false,
        "pending": []
      },
      "name": "Hue temperature sensor 4",
      "type": "ZLLTemperature",
      "modelid": "SML001",
      "manufacturername": "Signify Netherlands B.V.",
      "productname": "Hue temperature sensor",
      "swversion": "6.1.1.27575",
      "uniqueid": "XX:XX:XX:XX:XX:XX:XX:XX-XX-0402",　←上のIDと前半が同じIDが温度センサーー。
      "capabilities": {
        "certified": true,
        "primary": false
      }
    },
```

### APIのテスト

デバイスIDがわかったら、下記のコマンドを実行します。これで温度計のデータが取れるはずです。出力結果は、実際の温度の100倍の値が返ってきます。

```
curl -X GET -s "http://(bridge_ip_address)/api/(username)/sensors/(温度センサーのデバイスID)" | jq .state.temperature
```

### Zabbixへの設定

Zabbixに設定するには、「/etc/zabbix/zabbix_agentd.conf」の末尾に下記の設定を投入します。
「echo "scale=2;"」はbcを使って値を100で割るのですが、その時、小数点以下を2桁にするという意味があります。

```:/etc/zabbix/zabbix_agentd.conf
# Hue
UserParameter=hue.temperature[*],echo "scale=2;" `curl -s http://(bridge_ip_address)/api/(username)/sensors/$1/ | jq .state.temperature` / 100 | bc
```
その後、zabbix_agentdを再起動し、Zabbixのアイテムの設定をします。「設定」-「ホスト」を選択し、「Zabbix Server」をクリックします。そして、「アイテム」を選択し、右上の「アイテムの作成」をクリックします。そして、下記のように、「hue.temperature[(温度計のデバイスID))」の情報を入力します。
![zabbix_hue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61619/89db0b81-b2db-aa88-081b-34949d2d7f7a.png)



## 2. SwitchBot APIからのSwitchBot温湿度計のデータ取得方法
### 準備
まず、トークンを取得します。iPhoneやAndroidのSwitchBotアプリを開き、「プロフィール」をタップし、「設定」を開きます。そして、「アプリバージョン」を10回タップすると、「開発者向けオプション」が画面に表示され、その画面で「トークン」を取得できます。

次に下記のコマンドを実行し、目的のデバイスのDeviceIdを見つけます。

```
curl -H "Authorization:(トークン)" -X GET "https://api.switch-bot.com/v1.0/devices" | jq
```

```:（出力結果）
{
  "statusCode": 100,
  "body": {
    "deviceList": [
      {
        （略）
      },
      {
        "deviceId": "XXXXXXXXXXX",
        "deviceName": "リビング温湿度計",
        "deviceType": "Meter",
        "enableCloudService": true,
        "hubDeviceId": "YYYYYYYYYYYY"
      },
      （略）
```

### APIのテスト
DeviceIdがわかったら、次に下記のコマンドを実行し、目的のデバイスの温度と湿度のデータを見つけます。

```
curl -H "Authorization:(トークン)" -X GET "https://api.switch-bot.com/v1.0/devices/(DeviceId)/status" | jq
```

```:（出力結果）
{
  "statusCode": 100,
  "body": {
    "deviceId": "XXXXXXXXXXX",
    "deviceType": "Meter",
    "hubDeviceId": "YYYYYYYY",
    "humidity": 38,     ← 湿度
    "temperature": 19　 ← 温度
  },
  "message": "success"
}
```

### Zabbixへの設定

Zabbixに設定するには、「/etc/zabbix/zabbix_agentd.conf」の末尾に下記の設定を投入します。Zabbixの設定画面のほうでは、第1引数に、humidityか、temperatureの文字が入ってくることを期待しています。第2引数はDeviceIdです。

```:/etc/zabbix/zabbix_agentd.conf
# SwitcBot
UserParameter=switchbot.api[*],curl -H "Authorization:(トークン)" -X GET -s "https://api.switch-bot.com/v1.0/devices/$2/status" | jq '.body.$1'
```

その後、zabbix_agentdを再起動し、Zabbixのアイテムの設定をします。「設定」-「ホスト」を選択し、「Zabbix Server」をクリックします。そして、「アイテム」を選択し、右上の「アイテムの作成」をクリックします。そして、下記のように、温度のアイテムを作成します。キーには、「switchbot.api[temperature,(デバイスID-DevideId)]」をセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61619/8729123e-5621-83df-f5d9-253b6b523f2c.png)
続いて、湿度のアイテムも作成します。キーには、「switchbot.api[humidity,(デバイスID-DevideId)]」をセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61619/d57c1a4b-84a1-d332-c428-7eeae2c0104b.png)



## 3. Zabbixのグラフウィジェットの設定方法
左側のY軸を温度にして、-10℃から40℃で設定し、色はオレンジ系。右側のY軸を湿度にして、30%から100%ぐらいに設定し、色は青系。に設定すると、湿度や温度が人間にとって概ね快適な範囲においては、グラフが重ならず、見やすく表示できると思います。
![zabbix_graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61619/57dcc05b-0fa6-cda0-0441-059e41e04626.png)

#5 おわりに

これで、前回の[ネットワークの遅延を継続的に監視できる環境](https://qiita.com/yo1t/items/8164f42a4ae1c5c81323)に加え、室内の温度や湿度が可視化され、快適な在宅勤務環境かどうかを定量的に把握できる環境が構築できました。しばらくの期間、データをとってみましたが、幸い、自宅の環境は、適度にエアコンをつけたり、必要に応じて、時々、加湿器を動かせば、最適な環境になっているようです。
参考ですが、厚生労働省の「建築物環境衛生管理基準について」によると、最適な温度は17℃から28℃、湿度は40%から70%になっているようです。
https://www.mhlw.go.jp/bunya/kenkou/seikatsu-eisei10/

#6 免責
こちらの内容にもとづく環境の構築は、自己の責任でお願いします。Hue BridgeのAPIや、SwtchBot APIの利用に関して、Philips社やSwitchBot社のガイドやAPIの利用条件に従ってください。また、ここに記載の全ての内容については、個人の意見で、所属する企業や団体は関係ありません。