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%