見出し画像

スイッチボットをPythonから操作


スイッチボットに登録したサーキュレータのオンオフをパソコンから操作できないかとぐぐっていたのですが、Swithbot APIというのを使うと簡単そうだったので試してみました。

ドキュメントはこれ

https://github.com/OpenWonderLabs/SwitchBotAPI#readme

最初に、自分の開発者トークンを取得する必要があります。スイッチボットアプリを開いて、プロフィールの設定画面でapp versionを10回タップします。↓参考

https://chasuke.com/switchbotapi/

このトークンを指定して、上のドキュメントに書いてあるURLにアクセスすれば必要な情報の取得、コマンドの実行を行うことができます。

デバイスリストの取得

以下のサンプルプログラムを参考に、自分のスイッチボット(クラウド?)に登録しているデバイス一覧を取得しました。ドキュメントのDevices/Get device list、get-all-devicesあたりが参考になります。

https://github.com/OpenWonderLabs/SwitchBotAPI#get-all-devices

リクエストヘッダの"Authorization"キーの値に、先ほど取得したトークンを指定します。

import requests
import json

url = "https://api.switch-bot.com/v1.0/devices"
headers = {"Authorization": <取得した開発者トークン>}
r = requests.get(url, headers=headers)
print("status=", r.status_code)

json_data = r.json()
s = json.dumps(json_data, indent=2) #jsonデータを整形
print(s)

実行結果は以下のような感じでjson形式のデータが返ってきます。

{
 "statusCode": 100,
 "body": {
   "deviceList": [
     {
       "deviceId": "xxx",
       "deviceName": "Hub Mini CE",
       "deviceType": "Hub Mini",
       "hubDeviceId": "000000000000"
     }
   ],
   "infraredRemoteList": [
     {
       "deviceId": "02-xxxx",
       "deviceName": "light1",
       "remoteType": "Light",
       "hubDeviceId": "xxx"
     },
     {
       "deviceId": "02-xxx",
       "deviceName": "YAMAZEN FAN",
       "remoteType": "Others",
       "hubDeviceId": "xxx"
     },
     {
       "deviceId": "02-xxx",
       "deviceName": "aircon",
       "remoteType": "Air Conditioner",
       "hubDeviceId": "xxx"
     }
   ]
 },
 "message": "success"
}

電気を消す

次にうちのライトを消すコマンドを送ってみました。ドキュメントのSend device control commands、bot-exampleあたりが参考になります。

https://github.com/OpenWonderLabs/SwitchBotAPI#bot-example

こんなプログラムを作りました。

import requests
import json

auth_key = <取得した開発者トークン>
device_id = <ライトのデバイスID>

url = "https://api.switch-bot.com/v1.0/devices/" +device_id+ "/commands"
headers = {
   "Authorization": auth_key,
   "Content-Type" : "application/json; charset=utf8"
}
params = {
   "command": "turnOff",
   "parameter": "default",
   "commandType": "command"
}

r = requests.post(url, headers=headers, data=json.dumps(params))
print(r.text)
json_data = r.json()
print(json.dumps(json_data, indent=2))

コマンド実行用のURLにデバイスIDを指定します。先ほど取得したデバイス一覧の中からライトのIDをコピーしてして指定しました。

今回は値を渡すのでPOSTリクエストを使いました。POSTリクエストに渡すリクエストパラメータの引数名はdataで、値は辞書そのままじゃなくて、json.dumps(params)のように変換して渡します
私はPythonもjsonも実ははじめたばかりであまり慣れてないのですが、こんな感じでやるようです(SwitchbotAPIと直接関係のない謎のエラーで少してこずりました)。

このプログラムを実行すると、うちの天井ライトが消えて、おおお!と少し驚きました。


取得したデバイスのリストから、デバイスの名前でIDを検索して、操作ということも可能です。以下の記事に例がありました。

なお、switchbotAPIとは関係ないPythonの書き方の話ですが、上記記事にある、以下のコードは何だこれ?と思ったのですが、



aircon_id  = [device["deviceId"] for device in devices['body']['infraredRemoteList'] if <your airconditioner name> == device['deviceName']]

リストの内包表現という書き方らしいです。

https://www.yoheim.net/blog.php?q=20150702

少しどんくさく書くとこんな感じになると思います。

device_id_0 : str
for device in js["body"]["infraredRemoteList"]:
   if device["deviceName"] == <デバイスの名前>:
       device_id_0 = device["deviceId"]
       break

サーキュレータの電源オンオフ

次に目的のうちのサーキュレータの電源オンオフですが、基本的には先ほどのライトを消すサンプルと同じです。ドキュメントのTrigger a customized buttonのサンプルが参考になります(サンプルのアクション名が日本語でしたが、日本人の人が関係者なのかな)。

うちのサーキュレータは、その他のデバイスとして登録しているため、以下のようにパラメータのcommandTypeをcustomize、commandに自分がつけたアクションの名前を指定します。

params = {"command": "<コマンドの名前>",
   "parameter": "default",
   "commandType": "customize"
}


以上、SwitchbotAPIを使って、うちのサーキュレータのオンオフができました。

しかし、ふと思ったのですが、うちのサーキュレータ、オンオフボタンが一つになってて・・・これはオンなのかオフなのかわからなくなる・・・↓参考

https://www.teradas.net/archives/28247/

もう、IoTの敵って言うんですかね、今どきの超イケてない家電No1といえば「電源ON/OFFがトグル動作になっている家電」なわけですが、コイツの電源をスマートスピーカーから確実に制御する小技になります。

というわけで、私もスマートプラグを注文しました。


今回、身の回りのスイッチボット製品をパソコンから操作したいと思いぐぐっていて、最初「IFTTT経由」の方法を見つけたのですがやや面倒感がありました。もうちょっとぐぐってて見つけたSwitchbot APIだと簡単ですね!

あと、家の中で完結できるようなことを、インターネットに出てクラウドを経由して操作するのがやや気持ち悪い気もしますが、まぁ最近は何でもかんでもインターネットにつなぎにいかないと始まらない(Microsoftアカウントとか)なので、そういう時代なのでしょう。


この記事が気に入ったらサポートをしてみませんか?