1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SwitchBotプラグミニ 消費電力定期取得 (準備編)

Last updated at Posted at 2026-01-08

📝 はじめに

この記事では、SwitchBotプラグミニから消費電力を定期的に自動取得するための方法を解説します。
今回は準備編として取得するまでの流れの記事になります。

この記事の対象読者

  • IoTデバイスのデータ取得に興味がある方
  • スマートホームシステムを構築したい方
  • Python/JavaScriptでのAPI連携を学びたい方
  • 電力監視システムを自宅に導入したい方

前提条件

  • SwitchBotプラグミニを所有していること
  • 基本的なプログラミング知識(Python)
  • SwitchBotアプリのインストール済み

🎯 背景・動機

なぜ消費電力の定期取得が必要か?

  1. 電気代の可視化: リアルタイムで電力使用量を把握
  2. 省エネ効果: 無駄な電力消耗を発見
  3. 機器の異常検知: 消費電力の急変で故障を早期発見
  4. 自動化システム: 電力データに基づく家電制御

昨今の電気代高騰から、自宅サーバーの電力監視のために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アプリでトークンを取得します:

  1. SwitchBotアプリを開く
  2. プロフィール → 設定
  3. 「アプリのバージョン」を10回連続でタップ
  4. 「開発者向けオプション」が表示される
  5. 「トークンを取得」でトークンクライアントシークレットを取得

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接続を確認する

準備編 は以上です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?