SwitchBotのAPIを使ってみる。

我が家のエアコンや換気扇は、温度と湿度に対するマップで動作を定義している。この制御は、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で叩いてみる。

やり方

  1. ウィンドウズのスタートメニューを開いて「cmd」と打つとコマンドプロンプトが表示されるので実行する。
  2. コマンドプロンプトが開いたら、結果ファイルを出力したいディレクトリに移動しておく。
  3. コマンドプロンプトに下記のような感じで打てば変更出来る。
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って出るんだと思う。)
  • 自動実行シーンの設定は出来ない。
  • Plugの消費電力が見えない。
  • Plugの遅延実行の設定は出来ない。
  • 人感センサー(モーションセンサー)や開閉センサーなどは、まだ対応してない。

 

感想

curlコマンド使えば、どの言語からでも簡単にAPIにアクセスできるんで、ちょっとした処理をするだけならこれで十分ですね。
wscript、ahk、VBA、Pythonなど、好きな言語で使えばOK。

問題は、1日1000回しか、call出来ないから、温湿度の取得間隔とか考えないとダメそう。

自動実行シーンがAPIから設定出来れば、問題無かったんだけどね。。。

後、スマートプラグに遅延実行でONを設定すると、Wifiが切れてても電源が入れられる。これを使って、ルーターの再起動をAlexaからしたかったんだけど、遅延実行は手動実行シーンに設定出来なかった。APIからなら、、、と思ったんだけど、こっちもダメで残念。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です