SwitchBotの温湿度計(switchbot-meter)を使って、PythonとSwitchBot APIにて温度と湿度のデータを取得します。MQTT(Message Queuing Telemetry Transport)を活用することで、IoTデバイス間で効率的に送受信することも可能です。

SwitchBot 温湿度計(switchbot-meter)、SwitchBot 温湿度計プラス(switchbot-meter)、SwitchBot 防水温湿度計(switchbot-indoor-outdoor-meter)は、同じようにデータを取得できるはずです。温湿度計と防水温湿度計で動作を確認しています。

SwitchBot温湿度計のデバイスIDが分かれば、SwitchBot APIでデータを取得できます。ネットワーク経由で温度と湿度を取り出せるようになります。ほかのIoTデバイスとPythonを組み合わせることでいろいろできそうですね。

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

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

 

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

pip install requests pandas

 

以下Pythonプログラムは、トークン、シークレットトークン、デバイスIDは、ご自身の環境の数値を入れてください。get_device_list() 関数を通じてデバイスのリストを取得し、指定されたデバイスの詳細情報を取得します。またget_device_status() 関数を使用してデバイスの温度、湿度、バッテリーレベルを取得し、表示します。

 

switchbot_meter_data_retriever.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 get_device_list(api_token, secret_token):
    url = "https://api.switch-bot.com/v1.1/devices"
    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

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

device_list_data = get_device_list(api_token, secret_token)

if isinstance(device_list_data, dict) and device_list_data.get('statusCode') == 100:
    device_list = device_list_data['body']['deviceList']
    for device in device_list:
        if device['deviceId'] == device_id:
            device_info = {
                "Device ID": device.get('deviceId', 'N/A'),
                "Device Name": device.get('deviceName', 'N/A'),
                "Device Type": device.get('deviceType', 'N/A'),
                "Cloud Service Enabled": device.get('enableCloudService', 'N/A'),
                "Hub Device ID": device.get('hubDeviceId', 'N/A')
            }
            for key, value in device_info.items():
                print(f"{key}: {value}")

            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']
                if 'temperature' in body:
                    print(f"Temperature: {body['temperature']}°C")
                if 'humidity' in body:
                    print(f"Humidity: {body['humidity']}%")
                if 'battery' in body:
                    print(f"Battery Level: {body['battery']}%")
else:
    print("デバイスリストの取得に失敗しました。")

SwitchBot APIを使用してデバイスの状態データを取得し表示します。必要なライブラリをインポートします。requestsはHTTPリクエストを送信するため、timeは時間関連の操作のため、uuidは一意の識別子を生成するため、hmacはHMAC署名を生成するため、hashlibはハッシュ関数を提供するため、base64はBase64エンコードとデコードを行うために使用されます。

get_device_status 関数は、指定されたデバイスのステータスを取得します。最初にAPIエンドポイントのURLを設定し、次に現在のタイムスタンプをミリ秒単位で取得します。一意の識別子としてUUIDを生成し、署名生成用の文字列を作成します。この文字列をHMAC-SHA256で署名し、署名をBase64エンコードします。その後、ヘッダーを設定し、HTTP GETリクエストを送信します。レスポンスが成功した場合、JSON形式のデータを返します。成功しなかった場合は、ステータスコードとレスポンスのテキストを返します。

get_device_list 関数は、デバイスリストを取得します。get_device_status関数と同様に、APIエンドポイントのURLを設定し、タイムスタンプ、一意の識別子、署名を生成します。次に、ヘッダーを設定し、HTTP GETリクエストを送信します。レスポンスが成功した場合、JSON形式のデータを返します。成功しなかった場合は、ステータスコードとレスポンスのテキストを返します。

取得したデバイスリストの中から指定されたデバイスIDに一致するデバイスを検索します。見つかったデバイスの詳細情報を取得し、表示します。その後、get_device_status関数を呼び出してデバイスのステータスを取得し、温度、湿度、バッテリーレベルを表示します。もしデバイスリストの取得に失敗した場合は、”デバイスリストの取得に失敗しました。”というメッセージを表示します。

 

以上を実行するとこのようにデータが取得できます。取れるデータはこれで全部だと思います。

python hoguhogu.py
Device ID: ABCDABCDABCD
Device Name: 温湿度計 FA
Device Type: Meter
Cloud Service Enabled: True
Hub Device ID: ABCDABCDABCD
Temperature: 25.2°C
Humidity: 65%
Battery Level: 100%