📝 はじめに
この記事では、SwitchBotプラグミニから消費電力を定期的に自動取得するための方法を解説します。
今回は準備編として取得するまでの流れの記事になります。
この記事の対象読者
- IoTデバイスのデータ取得に興味がある方
- スマートホームシステムを構築したい方
- Python/JavaScriptでのAPI連携を学びたい方
- 電力監視システムを自宅に導入したい方
前提条件
- SwitchBotプラグミニを所有していること
- 基本的なプログラミング知識(Python)
- SwitchBotアプリのインストール済み
🎯 背景・動機
なぜ消費電力の定期取得が必要か?
- 電気代の可視化: リアルタイムで電力使用量を把握
- 省エネ効果: 無駄な電力消耗を発見
- 機器の異常検知: 消費電力の急変で故障を早期発見
- 自動化システム: 電力データに基づく家電制御
昨今の電気代高騰から、自宅サーバーの電力監視のためにSwitchBotプラグミニを導入し、
可視化してみようと思いました。
🔧 技術的基礎知識
SwitchBot API v1.1の仕組み
SwitchBot API v1.1では、以下の4つの認証情報が必要です:
# 認証ヘッダーの生成例
import time
import hashlib
import hmac
import base64
import uuid
def generate_auth_headers(token, secret):
t = str(int(time.time() * 1000)) # 13桁のタイムスタンプ
nonce = str(uuid.uuid4()) # UUID
data = token + t + nonce # 結合データ
# HMAC-SHA256署名生成
sign = base64.b64encode(
hmac.new(secret.encode(), data.encode(), hashlib.sha256).digest()
).decode()
return {
"Authorization": token,
"sign": sign,
"t": t,
"nonce": nonce,
"Content-Type": "application/json"
}
取得可能な電力データ
| 項目 | 単位 | 説明 |
|---|---|---|
| electricCurrent | mA | リアルタイム電流値 |
| voltage | V | 電圧 |
| power | W | 消費電力 |
| electricityOfDay | kWh | 1日の消費電力量 |
🛠️ 実装手順
Step 1: 認証情報の取得
まず、SwitchBotアプリでトークンを取得します:
- SwitchBotアプリを開く
- プロフィール → 設定
- 「アプリのバージョン」を10回連続でタップ
- 「開発者向けオプション」が表示される
- 「トークンを取得」でトークンとクライアントシークレットを取得
Step 2: Pythonでの実装
import requests
import time
import hashlib
import hmac
import base64
import uuid
from datetime import datetime
class SwitchBotPowerMonitor:
def __init__(self, token, secret):
self.token = token
self.secret = secret
self.base_url = "https://api.switch-bot.com/v1.1"
def generate_auth_headers(self):
"""認証ヘッダー生成"""
t = str(int(time.time() * 1000))
nonce = str(uuid.uuid4())
data = self.token + t + nonce
sign = base64.b64encode(
hmac.new(self.secret.encode(), data.encode(), hashlib.sha256).digest()
).decode()
return {
"Authorization": self.token,
"sign": sign,
"t": t,
"nonce": nonce,
"Content-Type": "application/json"
}
def get_device_status(self, device_id):
"""デバイス状態取得"""
url = f"{self.base_url}/devices/{device_id}/status"
headers = self.generate_auth_headers()
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.json()
return None
def get_power_data(self, device_id):
"""電力データ取得"""
status = self.get_device_status(device_id)
if status and status.get("status_code") == 100:
body = status.get("body", {})
return {
"power": body.get("power", 0),
"voltage": body.get("voltage", 0),
"electric_current": body.get("electricCurrent", 0),
"electricity_of_day": body.get("electricityOfDay", 0),
"timestamp": datetime.now().isoformat()
}
return None
# 使用例
monitor = SwitchBotPowerMonitor("your_token", "your_secret")
data = monitor.get_power_data("your_device_id")
print(data)
Step 3: デバイスIDの取得
def get_device_list(self):
"""デバイス一覧取得"""
url = f"{self.base_url}/devices"
headers = self.generate_auth_headers()
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
if data.get("status_code") == 100:
return data.get("body", {}).get("deviceList", [])
return []
# 使用例
devices = monitor.get_device_list()
for device in devices:
if device.get("deviceType") == "Plug Mini (US)":
device_id = device.get("deviceId")
print(f"デバイスID: {device_id} - {device.get('deviceName')}")
📊 実行結果と可視化
データ収集結果の例
{
"power": 45.2,
"voltage": 119.8,
"electric_current": 377,
"electricity_of_day": 0.324,
"timestamp": "2025-01-07T12:30:00.123456"
}
⚠️ トラブルシューティング
よくある問題と解決策
| エラー | 原因 | 解決方法 |
|---|---|---|
| 401 Unauthorized | トークンが間違っている | 再度トークンを取得し直す |
| 403 Forbidden | API制限超過 | 1日10,000回以内に収める |
| デバイスが見つからない | device_idが間違っている | デバイス一覧を再度取得する |
| データがnull | デバイスがオフライン | Wi-Fi接続を確認する |
準備編 は以上です。