SwitchBot プラグ(switchbot-plug)、SwitchBotプラグミニ(switchbot-plug-mini)をPythonとSwitchBot APIを使って状態の情報と電源をONOFF操作してみます。

デバイスID取得方法は過去の記事を参考してください。
https://riragon.com/switchbot-api-python/

SwitchBot API v1.1
https://github.com/OpenWonderLabs/SwitchBotAPI

 

以下Pythonプログラムは、トークン、シークレットトークン、デバイスIDは、ご自身の環境の数値を入れてください。このPythonスクリプトは、SwitchBot APIを使用してデバイスの状態を確認し、電源がオンならオフに、オフならオンに切り替えるコマンドを送信します。

必要な環境はPython 3.6以降で、インストールや仮想環境の準備など適宜に、requestsのパッケージも必要です。requestsのパッケージのインストール例です。Python の環境は適宜に適宜してください。

pip install requests

 

switchbot_plug_control.py

import requests
import time
import uuid
import hmac
import hashlib
import base64

def get_device_status(api_token, secret_token, device_id):
    url = f"https://api.switch-bot.com/v1.1/devices/{device_id}/status"
    t = int(time.time() * 1000)
    nonce = str(uuid.uuid4())
    string_to_sign = f"{api_token}{t}{nonce}".encode('utf-8')
    secret_key = secret_token.encode('utf-8')
    signature = hmac.new(secret_key, string_to_sign, hashlib.sha256).digest()
    sign = base64.b64encode(signature).decode('utf-8').upper()

    headers = {
        "Authorization": api_token,
        "Content-Type": "application/json",
        "t": str(t),
        "nonce": nonce,
        "sign": sign
    }

    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.json()
    else:
        return response.status_code, response.text

def send_command(api_token, secret_token, device_id, command):
    url = f"https://api.switch-bot.com/v1.1/devices/{device_id}/commands"
    t = int(time.time() * 1000)
    nonce = str(uuid.uuid4())
    string_to_sign = f"{api_token}{t}{nonce}".encode('utf-8')
    secret_key = secret_token.encode('utf-8')
    signature = hmac.new(secret_key, string_to_sign, hashlib.sha256).digest()
    sign = base64.b64encode(signature).decode('utf-8').upper()

    headers = {
        "Authorization": api_token,
        "Content-Type": "application/json",
        "t": str(t),
        "nonce": nonce,
        "sign": sign
    }

    body = {
        "command": command,
        "parameter": "default",
        "commandType": "command"
    }

    response = requests.post(url, headers=headers, json=body)
    print(f"Sending {command} command: {response.text}")
    time.sleep(5)  
    return get_device_status(api_token, secret_token, device_id)  

# トークンとシークレットキーを設定
api_token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
secret_token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
device_id = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

device_status = get_device_status(api_token, secret_token, device_id)
if isinstance(device_status, dict) and device_status.get('statusCode') == 100:
    body = device_status['body']
    print(f"Device ID: {body.get('deviceId')}")
    print(f"Device Type: {body.get('deviceType')}")
    print(f"Hub Device ID: {body.get('hubDeviceId')}")
    print(f"Power Status: {body.get('power')}")
    print(f"Version: {body.get('version')}")


    if body.get('power') == 'on':
        updated_status = send_command(api_token, secret_token, device_id, "turnOff")
        print("Power Status: off - Turned off the device successfully.")
    elif body.get('power') == 'off':
        updated_status = send_command(api_token, secret_token, device_id, "turnOn")
        print("Power Status: on - Turned on the device successfully.")
else:
    print("Failed to retrieve device status. Error:", device_status)

HTTP GETリクエストを送信し、成功すればJSON形式でデバイス情報を返し、失敗した場合はステータスコードとエラーメッセージを返します。

指定したデバイスに対して操作コマンド(オンまたはオフ)を送信します。HTTP POSTリクエストを使ってコマンドを送り、その結果を表示します。その後、デバイスの状態が更新されるのを待つために10秒間待機し、再度デバイスのステータスを取得します。

取得したデバイスステータスに基づき、デバイスID、タイプ、ハブデバイスID、電源ステータス、バージョンを表示します。その後、現在の電源状態(オンまたはオフ)に基づいて適切なコマンドを送信します。コマンドの結果としてデバイスがオフまたはオンになったことを確認し、成功した場合はその旨を出力します。

以上を実行するとこのように動作します。

Device ID: XXXXXXXXX
Device Type: Plug
Hub Device ID: XXXXXXXXX
Power Status: off
Version: V1.7
Sending turnOn command: {"statusCode":100,"body":{"items":[{"deviceID":"XXXXXXXXX","code":100,"status":{"timeStamp":"XXXXXXXXX","wattage":"0","current":"0","consume":"35","state":"0","power":"on","ipAddr":"XXXXXXXXX","mac":"XXXXXXXXX","voltage":"995"},"message":"success"}]},"message":"success"}
Power Status: on - Turned on the device successfully.