我が家のエアコンや換気扇は、温度と湿度に対するマップで動作を定義している。この制御は、SwitchBotを使っている。
SwitchBotは、温湿度計の状態に応じた動作を、シーンで設定出来る。これを使って設定してたんだけど、暑かったり寒かったりして温湿度条件の範囲を変える時、設定範囲が他のシーンと被らないように複数のシーンを修正しないといけない。また、シーンにはAnd条件とOr条件も設定出来るが、A and B や A or B みたいなのしか設定出来ず、(A and B) or Cのような階層構造のある条件が作れない。
というわけで、SwitchBotのアプリじゃなくて、普通のスクリプト言語で制御したい。何か無いか調べたら、APIが提供されていたので使ってみることにした。
トークンの取得
SwitchBotのAPIを使うにはトークンを取得する必要がある。
取得方法は下記の通り
1. SwitchBotアプリを起動→プロフィール→設定
2. アプリバージョンを10回タップ
3. 開発者向けオプションが表示されるのでタップ
4. トークンを取得(めっちゃ長い英数字の文字列です。)
※取得したトークンは他人に絶対教えないこと。
デバイスの一覧の取得
このAPIはWebAPIとして、GETやPOSTリクエストで操作できるようになってるみたい。
今回は、コマンドプロンプトからcurlで叩いてみる。
やり方
- ウィンドウズのスタートメニューを開いて「cmd」と打つとコマンドプロンプトが表示されるので実行する。
- コマンドプロンプトが開いたら、結果ファイルを出力したいディレクトリに移動しておく。
- コマンドプロンプトに下記のような感じで打てば変更出来る。
cd /d "c:\作業したいディレクトリ"
4. 後は、curlコマンドを実行すると状態の取得や設定が出来る。
例えば、下記のようにコマンドを実行すると、出力ファイル.jsonにSwitchBotのデバイス一覧が出力される。
curl -X GET -H "Authorization: 取得したトークン文字列" https://api.switch-bot.com/v1.0/devices -o 出力ファイル.json
取得結果イメージ
{ "statusCode": 100, "body": { "deviceList": [ { "deviceId": "CCCCCC123456", "deviceName": "換気扇", "deviceType": "Bot", "enableCloudService": true, "hubDeviceId": "HHHHHHH12345" }, { "deviceId": "TTTTTT123456", "deviceName": "温湿度計", "deviceType": "Meter", "enableCloudService": true, "hubDeviceId": "HHHHHHH12345" }, ], "infraredRemoteList": [ { "deviceId": "01-202101010000-12345678", "deviceName": "リビング照明", "remoteType": "DIY Light", "hubDeviceId": "HHHHHHH12345" }, ] }, "message": "success" }
上の出力イメージは整形した形で書いたけど、コマンドプロンプトから出てくる結果は、スペースと改行が無い状態で出力される。
出力結果が見にくいと思ったら、VisualStudioとかインストールして、整形すれば見やすくなる。
VisualStudioだと、拡張子をjsonで保存した結果ファイルを開いて、編集→詳細→ドキュメントのフォーマット ってやると簡単に見やすく出来る。
デバイス状態の取得
下記のような感じで、devices/の後のdeviceIdに取得したいデバイスのIDを指定して実行すると、状態を取得できる。
curl -X GET -H "Authorization: 取得したトークン文字列" https://api.switch-bot.com/v1.0/devices/deviceId/status -o 出力ファイル.json
取得結果イメージ
{ "statusCode": 100, "body": { "deviceId": "TTTTTT123456", "deviceType": "Meter", "hubDeviceId": "HHHHHHH12345", "humidity": 55, "temperature": 23.6 }, "message": "success" }
この例だと、温湿度計のdeviceId: TTTTTT123456を指定して実行した形。
こんな感じで、簡単に現在の温度と湿度が取得できる。
注意点は、hubDeviceIdじゃなくて、deviceIdを指定すること。
(自分は間違えてコピペして、少し悩みました。。。)
デバイスの操作
例えば、plugのスイッチをオンにする場合、下記のような感じでコマンド叩くと、オンになる。
curl -X POST -H "Authorization: 取得したトークン文字列" https://api.switch-bot.com/v1.0/devices/deviceId/commands -H "Content-Type: application/json" -d "{""command"": ""turnOn"",""parameter"": ""default"",""commandType"": ""command""}"
デバイス操作のコマンドは、GETじゃなくてPOSTになってる点は注意。
使えるコマンドは、SwitchBotAPIのSend device control commandsを見ると一覧が載ってるので、同じ感じで動かしたいデバイスのdeviceIdとパラメータを設定すると制御できる。
手動実行シーン一覧の取得
curl -X GET -H "Authorization: 取得したトークン文字列" https://api.switch-bot.com/v1.0/scenes -o "シーン一覧.json"
シーンの実行
下記コマンドの送信先アドレスのsceneIdを、シーン一覧で取得した、T01-202101010000-12345678という感じのsceneIdに書き換えて実行すると、実行される。
curl -X POST -H "Authorization: 取得したトークン文字列" https://api.switch-bot.com/v1.0/scenes/sceneId/execute
API注意点
- 1日のAPI利用可能数は最大
1000回まで。超えたら、Unauthorizedって返ってくるらしい。(多分401って出るんだと思う。)- 2022/02/02追記, 最大10000回になってた。
- 自動実行シーンの設定は出来ない。
- Plugの消費電力が見えない。
- Plugの遅延実行の設定は出来ない。
- 2022/09/06追記, プラグミニだとAPIから消費電力見れるし、シーンに遅延実行設定することも出来るようになってた。Plugはダメ。
人感センサー(モーションセンサー)や開閉センサーなどは、まだ対応してない。- 2022/02/02追記, Motion SensorとContact Sensor の記述が追加されてた。
感想
curlコマンド使えば、どの言語からでも簡単にAPIにアクセスできるんで、ちょっとした処理をするだけならこれで十分ですね。
wscript、ahk、VBA、Pythonなど、好きな言語で使えばOK。
問題は、1日1000回しか、call出来ないから、温湿度の取得間隔とか考えないとダメそう。
2022/02/02追記, 最大10000回になってた。毎分6.9回までOK。これで1分おきでも出来るけど、数が多いと厳しい。。。(家の場合、数えたら40個もあってびっくりした。)
自動実行シーンがAPIから設定出来れば、問題無いんだけどね。。。
後、スマートプラグに遅延実行でONを設定すると、Wifiが切れてても電源が入れられる。これを使って、ルーターの再起動をAlexaからしたかったんだけど、遅延実行は手動実行シーンに設定出来なかった。APIからなら、、、と思ったんだけど、こっちもダメで残念。
これ以上やろうとすると、Arduinoとかベースで自作IoT作るしかないかも。
このOSOYOOのIoTスターターキットだと、日本語マニュアルWebで見れるし、WifiモジュールとかIoT家電自作するのに必要そうなもの一式入ってるんで、非常に良さげ。
もし、Raspberry Pi(ラズパイ)でやるなら、下記のキットとかが良いか。雨検知センサー付いてるのは少し面白いし。
GeeekPi Raspberry Pi Pico WH IoT スターターキット、Raspberry Pi Pico W Ultimate Kit
ただ、IoTデバイス作るときって省電力気にするから、Arduinoの方が良い感じかなー。
まずは、SwitchBotのユニットで構成できるか考えて、どうしても無理なら自作するぐらいが良いと思います。
Bot、Plug、赤外線リモコンで操作出来れば、温湿度計、人感センサー、開閉センサーを組み合わせるとほとんどのことは実現出来ますし、自作って基本的にコスパ悪いですから。
SwitchBot スイッチボット | SwitchBot スマートプラグ プラグミニ | SwitchBot スマートリモコン ハブミニ(Matter対応) | SwitchBot カーテン 第3世代 自動開閉 |
SwitchBot 温湿度計 | SwitchBot 人感センサー | SwitchBot 開閉センサー | SwitchBot 防犯カメラ ソーラーパネル付き 動体検知 双方向音声通話 |
検索用: UWSC, C++, C#, VB, アルジュイノ、ラズベリーパイ、ラズパイ
コメント
トークンは13桁ですか?
トークンを取得してみたのですが、トークンをリセットというボタンがトークンの表示欄を隠しているようにも見えておりまして。回転やスクロールはできませんでした。
自決。BlueStacksで全部見れました。96桁でした。