SwitchBot/Nature RemoとクラウドAPI経由で接続してみた話

# はじめに

最近買ったRaspberryPiを活用して自宅のスマートホーム化を目指そうと、SwitchBotのセンサーとNature Remo E liteを購入してみました。
ところが、(自分の下調べが不十分だっただけですが)、各センサーデバイスからの情報取得の接続構成がイメージしているものと違っていたので、自身の整理も兼ねて記事にまとめます。


## 本記事の対象機器
* SwitchBot温湿度計
* SwitchBotハブミニ
* SwitchBotプラグ
* Nature Remo E lite (HEMSの読み取り端末)


# 接続構成

勝手なIoTのイメージで、各センサーデバイスからの情報取得はエッジサーバ(RaspberryPi)からセンサーネットワーク内で直接行うものと思い込んでいました。ところが、市販されている多くのセンサーデバイスはそれ自身がクラウドと接続しており、情報取得はクラウドのAPIとやり取りを行う構成となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509771/db9e287e-68df-8217-6106-1fcf19f8e65a.png)

そのためデータを収集するプログラムはクラウドのAPIを会話できればよく、センサーデバイスと直接の接続が不要であることから自宅NW内に配置する必要性はなく、Google Apps Script等を活用しクラウド上に配置することも可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509771/f6b7c5ff-07ea-335c-7658-7e354e2f4fdb.png)

なお、SwitchBotはセンサーネットワーク内で直接取得することも可能ではあるようです。

https://github.com/OpenWonderLabs/python-host/wiki/Meter-BLE-open-API#new-broadcast-message

https://qiita.com/yassy/items/eb462f2da4947d49e15b

Nature Remoも [local API](https://local-swagger.nature.global) というものが提供されているようですが、Nature Remo E liteは使えませんでした。

# SwitchBotAPI
SwitchBotAPIの利用方法は公式のGitに掲載されています。
[SwitchBotAPI公式: https://github.com/OpenWonderLabs/SwitchBotAPI](https://github.com/OpenWonderLabs/SwitchBotAPI)

## デバイス一覧の取得(GET)

```shell:
% curl -X GET "https://api.switch-bot.com/v1.0/devices" -H "Authorization: <token>"
```

* `<token>` はSwitchBotアプリの 「プロフィール」>「設定」の「アプリバージョン」を10回タップすると表示される「開発者向けオプション」から確認できます
* `body.deviceList` に登録済みのSwitchBotデバイスの情報(deviceId、deviceName、deviceName)が表示されます
* `body.deviceList[x].hubDeviceId` にはSwitchBotのクラウドと接続するためのHub端末のIDが入るようですが、 **デバイス一覧の取得** のAPIだと全て「000000000000」と表示されてしまうようです
* 後続の **デバイス情報の取得** のAPIでは正しいHub端末のIDが取得できます

```json:deviceList
{
  "statusCode":100,
  "body":{
    "deviceList":[
      {
        "deviceId":"XXXXXXXXXXXX",
        "deviceName":"Plug 917F",
        "deviceType":"Plug",
        "enableCloudService":true,
        "hubDeviceId":"000000000000"
      },{
        "deviceId":"XXXXXXXXXXXX",
        "deviceName":"書斎温湿度計",
        "deviceType":"Meter",
        "hubDeviceId":"000000000000"
      },{
        "deviceId":"XXXXXXXXXXXX",
        "deviceName":"寝室ハブミニ",
        "deviceType":"Hub Mini",
        "hubDeviceId":"000000000000"
      },{
        "deviceId":"XXXXXXXXXXXX",
        "deviceName":"寝室温湿度計",
        "deviceType":"Meter",
        "hubDeviceId":"000000000000"
      }
    ],
    "infraredRemoteList":[
      {
        "deviceId":"XX-XXXXXXXXXXXX-XXXXXXXX",
        "deviceName":"AS-C22H",
        "remoteType":"DIY Air Conditioner",
        "hubDeviceId":"XXXXXXXXXXXX"
      }
    ]
  },
  "message":"success"
}
```
## デバイス情報の取得(GET)
* デバイス情報の取得は `https://api.switch-bot.com/v1.0/devices/<deviceId>/status` から取得します
* `<deviceId>` は **デバイス一覧の取得** で確認したIDです

```shell:
% curl -X GET "https://api.switch-bot.com/v1.0/devices/<deviceId>/status" -H "Authorization: <token>"
```

* 以下は私が購入したPlugと温湿度計からの取得結果です
  * SwitchBotプラグ
  * SwitchBot温湿度計
  * SwitchBotハブミニ


### (1) SwitchBotプラグの取得結果
* 給電状態(on/off)を取得できます

```json:SwitchBotプラグ
{
  "statusCode":100,
  "body":{
    "deviceId":"XXXXXXXXXXXX",
    "deviceType":"Plug",
    "hubDeviceId":"XXXXXXXXXXXX",
    "power":"on"
  },
  "message":"success"
}
```

### (2) SwitchBot温湿度計の取得結果
* 湿度と温度を取得できます
* `hubDeviceId` には経由しているSwitchBotハブミニのIDが表示されています

```json:SwitchBot温湿度計
{
  "statusCode":100,
  "body":{
    "deviceId":"XXXXXXXXXXXX",
    "deviceType":"Meter",
    "hubDeviceId":"XXXXXXXXXXXX",
    "humidity":52,
    "temperature":14.7
  },
  "message":"success"
}
```

### (3) SwitchBotハブミニの取得結果
* bodyは空です

```json:SwitchBotハブミニ
{
  "statusCode":100,
  "body":{},
  "message":"success"
}
```


# Nature Remo Cloud API
Nature Remo Cloud APIの利用方法は[公式: https://developer.nature.global](https://developer.nature.global)に掲載されています。

## デバイス情報の取得(GET)
* デバイス情報の取得は `https://api.nature.global/1/appliances` から取得します
* `<token>` は http://home.nature.global/ で発行します

```shell:
% curl -X GET "https://api.nature.global/1/appliances" -k --header "Authorization: Bearer <token>"
```

### (1) Nature Remo E liteの取得結果
* 電力情報は `smart_meter.echonetlite_properties` 配下に出力されています
* **電気使用量[kWh]** は取得した各値をもとに算出する必要があります

```json:
[
    {
        "id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "device":{
            "name":"Remo E lite",
            "id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
            "created_at":"2022-01-24T09:46:14Z",
            "updated_at":"2022-01-24T09:46:29Z",
            "mac_address":"xx:xx:xx:xx:xx:xx",
            "bt_mac_address":"xx:xx:xx:xx:xx:xx",
            "serial_number":"xxxxxxxxxxxxxx",
            "firmware_version":"Remo-E-lite/1.3.9",
            "temperature_offset":0,
            "humidity_offset":0
        },
        "model":{
            "id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
            "manufacturer":"",
            "name":"Smart Meter",
            "image":"ico_smartmeter"
        },
        "type":"EL_SMART_METER",
        "nickname":"スマートメーター",
        "image":"ico_smartmeter",
        "settings":null,
        "aircon":null,
        "signals":[],
        "smart_meter":{
            "echonetlite_properties":[
                {
                    "name":"coefficient",
                    "epc":211,
                    "val":"1",
                    "updated_at":"2022-01-29T06:40:35Z"
                },
                {
                    "name":"cumulative_electric_energy_effective_digits",
                    "epc":215,
                    "val":"6",
                    "updated_at":"2022-01-29T06:40:35Z"
                },{
                    "name":"normal_direction_cumulative_electric_energy","epc":224,
                    "val":"14267",
                    "updated_at":"2022-01-29T06:40:35Z"
                },{
                    "name":"cumulative_electric_energy_unit",
                    "epc":225,
                    "val":"1",
                    "updated_at":"2022-01-29T06:40:35Z"
                },{
                    "name":"reverse_direction_cumulative_electric_energy",
                    "epc":227,
                    "val":"22",
                    "updated_at":"2022-01-29T06:40:35Z"
                },{
                    "name":"measured_instantaneous",
                    "epc":231,
                    "val":"1024",
                    "updated_at":"2022-01-29T06:40:35Z"
                }
            ]
        }
    }
]
```

取得された各値の意味合い、電力データの算出の方法は以下の公式情報に記載があります。

https://developer.nature.global/jp/how-to-calculate-energy-data-from-smart-meter-values

**積算電力値[kWh]** は以下の計算式で算出できます。(積算電力量単位が 0~4 の場合)

```
積算電力値[kWh] = 係数 × 積算電力量計測値(正方向) × (1/10)^積算電力量単位
```

* 係数: coefficient
* 積算電力量計測値(正方向): normal_direction_cumulative_electric_energy
* 積算電力量単位: cumulative_electric_energy_unit

上記の出力例だと
* 係数: 1
* 積算電力量計測値(正方向): 14267
* 積算電力量単位: 1
ですので、

```
積算電力値[kWh] = 1 × 14267 × (1/10)^1 = 1426.7kWh
```

となります。
積算電力値[kWh]はメーターが動き始めてからの積算値であるため、ある一定期間の電気使用量[kWh]を求めるには、開始日と終了日の積算電力値の差を計算します。

# おわりに
SwitchBotもNature Remo E liteもRaspberryPiから接続しようと思って買ったものの、クラウドAPIを利用することでRaspberryPiが無くてもデータを収集できることがわかりました。
実際にGoogle Apps ScriptやAWS Lambdaなどでデータ収集のコードを動かし、各センサーデバイスの情報を一元管理できるダッシュボードを作ってみたいと思います。