どうも、IT企業に勤めるCHASUKEです。
スマートホームの定番アイテムと言えば、「SwitchBotシリーズ」ですよね。物理ボタンを指の代わりに押すロボットデバイスをはじめ、プラグや加湿器、カーテンとさまざまな製品が揃っています。(→関連デバイスをAmazonでチェックする)
以前に「Bluetooth通信を使うローカルAPI」を使って、一部のSwitchBotデバイスの操作方法を紹介しました。今回は、ネット経由で「SwitchBotサーバーにアクセスするクラウドAPI」を使う方法です。

今回のクラウドAPIを使えば、SwitchBotシリーズの全デバイス、さらになんと、ハブに登録された赤外線リモコンの操作まで可能になります。
前置きが長くなりましたが、本記事では、クラウドAPIをPythonスクリプトで操作する方法を初心者向けに解説します。
Macやラズパイのターミナルを使える環境があれば、簡単に試せるので、ぜひお試しください。

SwitchBotAPIの使い方
SwitchBotAPIを使えば、所有する全SwitchBotデバイス、ハブに登録している赤外線リモコンの操作が可能です。
今回は試しに、下記の2つを動かしてみます
- SwitchBotの操作
- エアコンの操作(赤外線リモコン)

準備やざっくり手順
必要なモノ
- SwitchBotデバイス(SwitchBotなど)
- SwitchBotハブ(Hub Miniなど)
- Pythonやcurl の実行環境(Macやラズパイなど)
今回は、Macのターミナルから操作してます。
全く同じにする必要はないですが、参考にcURLおよびPythonのバージョンはこちらです。
$ /usr/bin/curl -V curl 7.64.1 (x86_64-apple-darwin20.0) libcurl/7.64.1 (SecureTransport) (以下、省略) $ python3 -V Python 3.8.2

また、SwitchBotAPIでは、クラウドサービスを使います。アプリからSwitchBotデバイスのクラウド設定を有効にしておきます。

ざっくり手順はこちら
- 開発者トークンの取得
- デバイスIDの取得(curlコマンド)
- デバイス操作実行(Pythonスクリプト)
では、1つずつやっていきますね。
開発者トークンの取得
開発者トークンは、SwitchBotサーバにアクセスするための鍵です。ユーザーごとに異なります。
▼SwitchBotアプリのプロフィールタブの設定ボタンから取得できます。
アプリバージョンの項目を10回連続でタップすると、トークン取得画面が表示されます。トークンは人にバレないように管理しましょう。

デバイスIDの取得(curlコマンド)
さて続いて、SwitchBotアカウントに紐づくデバイス一覧を取得します。設定内容は、API仕様「Get device list」に書かれてます。
▼curlコマンドをMacのターミナルで実行します。
/usr/bin/curl -X GET "https://api.switch-bot.com/v1.0/devices" -H "Authorization:<開発者トークン>" | python -c 'import sys,json;print json.dumps(json.loads(sys.stdin.read()),indent=4,ensure_ascii=False)'
メモ
上記コマンドの「<開発者トークン>」を全て置き換えてください。また、後半の「| python -c 'import sys,json;print json.dumps(json.loads(sys.stdin.read()),indent=4,ensure_ascii=False)'」は結果を綺麗に出力するために付けてます。
▼うまくいくと、こんなJson形式が出力されます。
"deviceList": [ { "deviceName": "Hub Mini(自宅)", "hubDeviceId": "000000000000", "deviceType": "Hub Mini", "deviceId": "HHHHHHHHHHHH" }, { "deviceName": "温湿度計", "hubDeviceId": "HHHHHHHHHHHH", "deviceType": "Meter", "deviceId": "MMMMMMMMMMMM" "enableCloudService": true }, (中略) { "deviceName": "白スイッチ", "hubDeviceId": "HHHHHHHHHHHH", "deviceType": "Bot", "deviceId": "BBBBBBBBBBBB", "enableCloudService": true } ], "infraredRemoteList": [ { "remoteType": "Air Conditioner", "deviceName": "書斎エアコン", "hubDeviceId": "HHHHHHHHHHHH", "deviceId": "FF-FFFFFF-FFFFFF" } ]
メモ
アプリに登録済みのSwitchBotデバイス(deviceList)と赤外線リモコン(infraredRemoteList)の一覧が全て表示されてます。ちなみに「deviceId」「hubDeviceId」「infraredRemoteList」の内容はマスクしてます。

SwitchBotデバイスのAPI操作(curl, Pythonスクリプト)
さて続いて、SwitchBot(白スイッチ)をAPI実行します。設定内容は、API仕様「Send device control commands」に書かれてます。
▼コマンドを叩いて、こんな風になれば成功です。
▼下記は、SwitchBotを操作するためのcurlコマンドです。ターミナルで実行すればOKです。
/usr/bin/curl -X POST "https://api.switch-bot.com/v1.0/devices/<デバイスID>/commands" \ -H "Content-Type: application/json; charset: utf8" \ -H "Authorization:<開発者トークン>" \ -d {' "command":"turnOn", "parameter":"default", "commandType":"command" }'
メモ
「<開発者トークン>」「<デバイスID>」をこれまでに取得したものに書き換えてください。デバイスごとに設定するパラメータ(commandType, Command, command)が異なります。(API仕様に載ってます)

続いては、これをPythonスクリプトで実行します。
▼作成したスクリプト(switchbot_device_ope.py)がこちら
import requests, json # パラメーター(要書き換え) DEVICEID="<SwitchBotデバイスID>" ACCESS_TOKEN="<開発者トークン>" API_BASE_URL="https://api.switch-bot.com" # Send device control commandsコマンド(POST) def device_control(): headers = { # ヘッダー 'Content-Type': 'application/json; charset: utf8', 'Authorization': ACCESS_TOKEN } url = API_BASE_URL + "/v1.0/devices/" + DEVICEID + "/commands" body = { # 操作内容 "command":"turnOn", "parameter":"default", "commandType":"command" } ddd = json.dumps(body) print(ddd) # 入力 res = requests.post(url, data=ddd, headers=headers) print(res) # 結果 if __name__ == '__main__': # 処理呼び出し device_control()
メモ
内容は先ほどのcurlコマンドと全く同じです。「<開発者トークン>」「<デバイスID>」をこれまで取得したものに書き換えてください。
▼実行する前に、ライブラリが必要です。
pip3 install --upgrade pip --user pip3 install requests
あとは、作成したPythonスクリプトファイルの場所に移動して、実行すれば、動くはずです。
python3 switchbot_device_ope.py

赤外線リモコンのAPI操作(Pythonスクリプト)
さて続いては、Hub Miniに登録しているリモコン家電の操作です。
▼下記のPythonスクリプトでは、エアコンを「23度・暖房・風量オート」に設定しています。
import requests, json # パラメーター(要書き換え) DEVICEID="<SwitchBotデバイスID>" ACCESS_TOKEN="<開発者トークン>" API_BASE_URL="https://api.switch-bot.com" # Send device control commandsコマンド(POST) def device_control(): headers = { # ヘッダー 'Content-Type': 'application/json; charset: utf8', 'Authorization': ACCESS_TOKEN } url = API_BASE_URL + "/v1.0/devices/" + DEVICEID + "/commands" body = { # 操作内容 "command":"setAll", "parameter":"23,5,1,on", "commandType":"command" } ddd = json.dumps(body) print(ddd) # 入力 res = requests.post(url, data=ddd, headers=headers) print(res) # 結果 if __name__ == '__main__': # 処理呼び出し device_control()
メモ
これまで同様、「<開発者トークン>」「<デバイスID>」を書き換えてお試しください。「23,5,1,on」でエアコンの細かい設定(API仕様参照)を指定してます。
「ピッ」とエアコンが動き出し、アプリ側のエアコン設定が変更されてれば成功ですね。

実行前

実行後

最後に
以上、簡単ではありますが、SwitchBotのクラウドAPI「SwitchBotAPI」を試してみました。
SwitchBotデバイスとコマンドが実行できる環境があれば、プログラミング初心者の方でもすぐに試せるように書いてみました。
SwitchBotにはさまざな製品があるので、参考にして楽しんでもらえれば幸いです。内容に間違いや質問、リクエストなどあれば、コメントやメールで連絡いただければと。
