APIを叩いて家電の遠隔操作をしてみる[SwitchBot]

# はじめに
この記事は[富士通クラウドテクノロジーズ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/fjct)の10日目の記事です。

9日目の記事は @ablengawa の「Blenderでそれなりにフォトリアルな画像を生成する」でした。写真だと見間違えるような画像が3Dモデルからレンダリングされたものだったので驚きました・・・

本日は @Tortoiseshell が自社サービスには関係ないのですが[SwitchBot](https://www.switch-bot.com/)のAPIを使った家電の遠隔操作について書いていこうと思います。

# SwitchBotとは？
SWITCHBOT株式会社が販売するスマートホーム製品のブランドです。様々な用途・家電に対応した製品が販売されていて、スイッチを物理的に押してくれるSwitchBotボット、遠隔でオンオフできるコンセントのSwitchBotプラグ、リモコンでの操作を学習し代わりに行うことができるSwitchBotハブミニなど様々な製品があります。
そして公式からSwitchBotアプリが提供されており、これを使うことでスマートフォンから遠隔でSwitchBot製品を操作し簡単に家の中の一部をスマート化することができます！

# ある日PCから操作したくなった
人間は便利に慣れてしまうとさらに欲張るものです。
そんな便利なSwitchBot製品を使った生活をしているある日こんな事態に陥りました。

* 自分は机に向かってお仕事中
* 寒くなってきてエアコンをつけたい
* スマホはベッドの上
* 本来のリモコンは使わないので行方不明

・・・PCから操作したいなぁ・・・(怠惰の極み)
お、API公開されてるじゃん！やってみるか！

こんな経緯でこの記事を書いています。

# 今回使うもの
* SwitchBotハブミニ
    * リモコン学習機能でエアコンと照明の操作を登録しています
* SwitchBot温湿度計
* SwitchBotスマート加湿器
* 公開されている[SwitchBotAPI](https://github.com/OpenWonderLabs/SwitchBotAPI)

# 事前準備
[SwitchBotAPIが公開されているGitHubページ](https://github.com/OpenWonderLabs/SwitchBotAPI)を参考に進めていきます。
### トークンの取得
SwitchBot公式ページからアプリをDL・インストールします。
ログインなどの設定は省略します。
プロフィールタブ > 設定 と操作しアプリバージョンの欄を10回タップし開発者向けオプションを開放します。Androidユーザーの方はデジャヴなのではないでしょうか。
管理者向けオプションの画面でトークンの取得ができるため、取得し控えておきます。
**他人にバレると家のSwitchBot製品を自由に操作され心霊現象どころではない騒ぎになる危険性があるので丁寧に扱いましょう**
### 各種製品の設定
設定欄に「クラウドサービス」の欄がある製品はオンにする必要があるようです。
私が持っている製品では温湿度計が該当しました。

# 早速APIを使ってみる
### デバイス情報の取得
早速APIを叩いてみましょう！
各種製品の操作には`deviceId`が必要なのでまずはアカウントに紐づけているSwitchBot製品の情報を取得しましょう。
シンプルに`curl`コマンドでやっていきます。
`https://api.switch-bot.com/v1.0/devices`にGETリクエストを送ります。
1日10000回の制限があるみたいなので乱用は避けましょう。

``` shell:curlでのdevice情報の取得
curl --request GET "https://api.switch-bot.com/v1.0/devices" \
  --header "Authorization: ${token}" \
  --header "Content-Type: application/json; charset=utf8"
```

``` json:結果
{
  "statusCode": 100,
  "body": {
    "deviceList": [
      {
        "deviceId": "加湿器のdeviceId",
        "deviceName": "加湿器",
        "deviceType": "Humidifier",
        "enableCloudService": true,
        "hubDeviceId": "000000000000"
      },
      {
        "deviceId": "温湿度計のdeviceId",
        "deviceName": "温湿度計",
        "deviceType": "Meter",
        "enableCloudService": true,
        "hubDeviceId": "温湿度計のハブ内deviceId"
      },
      {
        "deviceId": "ハブミニのdeviceId",
        "deviceName": "Tortoiseshell_Hub_Mini",
        "deviceType": "Hub Mini",
        "enableCloudService": false,
        "hubDeviceId": "000000000000"
      }
    ],
    "infraredRemoteList": [
      {
        "deviceId": "照明のdeviceId",
        "deviceName": "リビングライト",
        "remoteType": "Light",
        "hubDeviceId": "照明のハブ内deviceId"
      },
      {
        "deviceId": "エアコンのdeviceId",
        "deviceName": "リビングエアコン",
        "remoteType": "Air Conditioner",
        "hubDeviceId": "エアコンのハブ内deviceId"
      }
    ]
  },
  "message": "success"
}
```

そのままレスポンスを出力すると残念なことになるので`jq`に整形してもらっています。
ハブミニと加湿器は単独でインターネット接続が可能なため`hubDeviceId`はないようです。
これで製品の`deviceId`が取得できました。
### デバイスの操作
`deviceId`が取得できたので実際に操作をしてみましょう。

``` shell:ライトを点けてみる
curl --request POST "https://api.switch-bot.com/v1.0/devices/${照明のdeviceId}/commands" \
--header "Authorization: ${token}" \
--header "Content-Type: application/json; charset=utf8" \
-d '{
 "command": "turnOn",
 "parameter": "default",
 "commandType": "command"
}'
```

``` json:レスポンス
{
  "statusCode": 100,
  "body": {},
  "message": "success"
}
```
アプリで操作したのと同じように照明をつけることができました。同じようにほかのデバイスを操作することもできそうです。
これで目標達成です！
ですが~~記事的に~~少し物足りないので他のAPIも試してみましょう。
### 状態の取得
対応している製品はAPIから状態を取得することができます。
試してみましょう。

``` shell:温湿度計から情報取得
curl --request GET "https://api.switch-bot.com/v1.0/devices/${温湿度計のdeviceId}/status" \
--header "Authorization: ${token}" \
--header "Content-Type: application/json; charset=utf8"
```

``` json:レスポンス
{
  "statusCode": 100,
  "body": {
    "deviceId": "温湿度計のdeviceId",
    "deviceType": "Meter",
    "hubDeviceId": "温湿度計のハブ内deviceId",
    "humidity": 60,
    "temperature": 21.1
  },
  "message": "success"
}
```
`humidity`, `temperature`の項目で湿度と温度が取得できているのが確認できます。

``` shell:加湿器から情報取得
curl --request GET "https://api.switch-bot.com/v1.0/devices/${加湿器のdeviceId}/status" \
--header "Authorization: ${token}" \
--header "Content-Type: application/json; charset=utf8"
```

``` json:レスポンス
{
  "statusCode": 100,
  "body": {
    "deviceId": "加湿器のdeviceId",
    "deviceType": "Humidifier",
    "hubDeviceId": "加湿器のハブ内deviceId",
    "nebulizationEfficiency": 0,
    "humidity": 41,
    "auto": true,
    "childLock": false,
    "sound": true,
    "power": "on",
    "temperature": 20.2,
    "lackWater": false
  },
  "message": "success"
}
```
稼働しているモード(`auto`)や現在の加湿速度(`nebulizationEfficiency`)など確認できるようです。
加湿機本体に温湿度計が内蔵されているようなレスポンス(`humidity`と`temperature`が存在するの)で驚いています・・・特にそんな情報は見当たらなかったのですが・・・
`lackWater`の部分で水タンクの水不足がわかるのでここを利用して通知を飛ばすなど応用が利きそうです。
いちいちコマンドを打つのは面倒なのでウィジェットなどを作ると便利そうですね・・・

# さいごに
応用先の夢が広がったところで今回はここまでにしようと思います。
実際に便利そうなツールを作った時にはまた記事にしようと考えています！
余談ですが記事作成中に友人にチェックを頼んでいたところうっかり書いてしまっていたトークンを悪用されて書いた通り心霊現象(人災)が起きました・・・コピペ前にきちんとチェックしましょう・・・

冬のボーナスの時期ですしこれを機にSwitchBot製品などで家の中の一部をちょっと便利にしてみてはいかがでしょうか？
今回APIを使う都合上存在を消されていましたがAlexaなどのスマートスピーカーとの連携もとても便利です。(声で家電の操作が可能)

初の記事作成ということでいろいろ至らぬ点もあったかもしれませんがこの記事を見てやってみたいな、導入してみようかな・・・と思った人がいればうれしいです！

明日は @tanopanta の「【Conftest】YAMLを目でレビューするのはもうヤメル【Policy as Code】」です。お楽しみに！

# 参考
SwitchBot公式ホームページ：<https://www.switch-bot.com/>
SwitchBotAPIGitHub：<https://github.com/OpenWonderLabs/SwitchBotAPI>