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って出るんだと思う。)
    • 2022/02/02追記, 最大10000回になってた。
  • 自動実行シーンの設定は出来ない。
  • Plugの消費電力が見えない。
  • Plugの遅延実行の設定は出来ない。
    • 2022/09/06追記, プラグミニだとAPIから消費電力見れるし、シーンに遅延実行設定することも出来るようになってた。Plugはダメ。
SwitchBot プラグミニ。プラグと何が違うのか比較してみる。
(旧)プラグと(新)プラグミニの比較。   プラグ プラグミニ   製品型番 SP11 W2001400 価格 1980円 ← 奥行き × 幅 × 高さ 7.6 x 3.8 x 4.7 cm ‎7 x 3.9 x 5.9 cm 重量 86 ...
  • 人感センサー(モーションセンサー)や開閉センサーなどは、まだ対応してない。
    • 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 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, アルジュイノ、ラズベリーパイ、ラズパイ

コメント

  1. とし より:

    トークンは13桁ですか?
    トークンを取得してみたのですが、トークンをリセットというボタンがトークンの表示欄を隠しているようにも見えておりまして。回転やスクロールはできませんでした。

PAGE TOP
Ads Block Detector Powered by codehelppro.com
Ads Blocker Detected!!!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました