はじめに#
SwitchBotは、照明、カーテン、エアコンなどを制御できる人気のスマートホームプラットフォームです。あまり知られていませんが、SwitchBotはオープンAPIを提供しており、デバイスをプログラムで制御できます。
この記事では、PythonでSwitchBot API v1.1をセットアップする方法を解説します。
前提条件#
- SwitchBotアカウント(デバイスが1台以上あること)
- Python 3.8以上
requestsとpython-dotenvパッケージ
pip install requests python-dotenvステップ1:APIクレデンシャルの取得#
- スマートフォンでSwitchBotアプリを開く
- プロフィール → 設定 に移動
- アプリバージョンを10回タップして開発者オプションを有効化
- 開発者オプションに移動
- トークンとシークレットキーをコピー
ステップ2:クレデンシャルの安全な保管#
プロジェクトディレクトリに .env ファイルを作成:
SWITCHBOT_TOKEN=あなたのトークン
SWITCHBOT_SECRET=あなたのシークレットキー重要: このファイルは絶対にgitにコミットしないこと!
.gitignoreに.envを追加してください。
ステップ3:認証#
SwitchBot API v1.1はHMAC-SHA256を使用して認証します。すべてのリクエストには、トークン、タイムスタンプ、ノンス、署名を含むヘッダーが必要です。
認証関数:
import hashlib
import hmac
import base64
import time
import uuid
import os
import requests
from dotenv import load_dotenv
load_dotenv()
API_BASE = "https://api.switch-bot.com/v1.1"
TOKEN = os.getenv("SWITCHBOT_TOKEN", "")
SECRET = os.getenv("SWITCHBOT_SECRET", "")
def generate_headers(token: str, secret: str) -> dict:
"""SwitchBot API v1.1の認証ヘッダーを生成"""
nonce = str(uuid.uuid4())
t = str(int(time.time() * 1000))
string_to_sign = f"{token}{t}{nonce}"
sign = base64.b64encode(
hmac.new(
secret.encode("utf-8"),
string_to_sign.encode("utf-8"),
hashlib.sha256,
).digest()
).decode("utf-8")
return {
"Authorization": token,
"sign": sign,
"nonce": nonce,
"t": t,
"Content-Type": "application/json; charset=utf8",
}仕組み:#
- ランダムなノンス(UUID)とタイムスタンプ(ミリ秒)を生成
- 文字列を作成:
トークン + タイムスタンプ + ノンス - シークレットキーでHMAC-SHA256署名
- 署名をBase64エンコード
- すべての値をリクエストヘッダーに含めて送信
ステップ4:デバイス一覧の取得#
def get_devices(token: str, secret: str) -> dict:
"""すべてのSwitchBotデバイスを取得"""
headers = generate_headers(token, secret)
response = requests.get(f"{API_BASE}/devices", headers=headers)
response.raise_for_status()
return response.json()
# 全デバイスを表示
result = get_devices(TOKEN, SECRET)
for device in result["body"]["deviceList"]:
print(f"{device['deviceName']} ({device['deviceType']}) - {device['deviceId']}")出力例:
リビング照明 (Color Bulb) - ABCDEF123456
寝室カーテン (Curtain3) - 123456ABCDEFステップ5:デバイスステータスの取得#
def get_device_status(token: str, secret: str, device_id: str) -> dict:
"""特定デバイスのステータスを取得"""
headers = generate_headers(token, secret)
response = requests.get(
f"{API_BASE}/devices/{device_id}/status", headers=headers
)
response.raise_for_status()
return response.json()
status = get_device_status(TOKEN, SECRET, "デバイスID")
print(status)ステップ6:コマンドの送信#
def send_device_command(token: str, secret: str, device_id: str,
command: str, parameter: str = "default",
command_type: str = "command") -> dict:
"""デバイスにコマンドを送信"""
headers = generate_headers(token, secret)
payload = {
"command": command,
"parameter": parameter,
"commandType": command_type,
}
response = requests.post(
f"{API_BASE}/devices/{device_id}/commands",
headers=headers,
json=payload,
)
response.raise_for_status()
return response.json()
# 照明をオンにする
send_device_command(TOKEN, SECRET, "DEVICE_ID", "turnOn")
# 明るさを50%に設定
send_device_command(TOKEN, SECRET, "DEVICE_ID", "setBrightness", "50")
# 色を設定(RGB)
send_device_command(TOKEN, SECRET, "DEVICE_ID", "setColor", "255:100:0")よく使うデバイスコマンド#
| デバイスタイプ | コマンド | パラメータ |
|---|---|---|
| Color Bulb | turnOn / turnOff | default |
| Color Bulb | setBrightness | 1-100 |
| Color Bulb | setColor | R:G:B (0-255) |
| カーテン | turnOn(開)/ turnOff(閉) | default |
| カーテン | setPosition | 0-100 |
| Bot | turnOn / turnOff / press | default |
次のステップ#
次回の記事では以下を解説予定です:
- Webhookを使ったリアルタイムデバイス更新の受信
- TkinterでGUIコントローラーを構築
- APIによるシーンとオートメーションの作成
ソースコードはGitHubで公開しています。
Happy automating!