2026年4月29日水曜日

【2026年版】SwitchBot API × Raspberry Pi 5 で部屋のエアコンを自動制御する

※Claude Codeで記事の自動更新お試し中

この記事は、SwitchBot Hub 2 でエアコンを温度連動で自動制御したいエンジニア向けです。Python スクリプトと cron を使って、室温に応じてエアコンを自動でオン・オフする仕組みを Raspberry Pi 5 上に構築します。

3つのアプローチ比較

同じことを実現する方法は3つあります。この記事では Raspberry Pi + Python + cron の方法を解説します。

(1) Raspberry Pi
+ cron
(本記事)
(2) SwitchBot
オートメーション
(3) IFTTT
連携
追加ハードRaspberry Pi 必要不要不要
セットアップPython 実装
+ cron 設定
アプリのみ
(最も簡単)
IFTTTアカウント
+アプレット設定
トリガー制限なし
(Python で自由に)
温度・時刻・
在宅検知など
GPS・天気・
他サービス連携が強み
コストPi の電気代のみ
(約1〜2W)
無料無料プランは
2アプレットまで
ロジックの複雑さヒステリシス・ログ・
拡張など自由
AND/OR 程度IF→THEN の
単純なルール
クラウド依存SwitchBot API のみSwitchBot
クラウドのみ
IFTTT +
SwitchBot クラウド

「アプリだけで済ませたい」なら SwitchBot オートメーション版、「GPS 連動や外部サービス連携」なら IFTTT 版も参照してください(記事末のシリーズ一覧)。

この記事でできること

  • SwitchBot API v1.1 を Python から叩いてデバイスを操作できる
  • Raspberry Pi 5 上で室温を5分ごとに取得し、条件分岐でエアコンを制御できる
  • ヒステリシスつきの温度制御で、頻繁なオン・オフを防げる

使ったもの

構成の概要

Raspberry Pi 自体には赤外線モジュールは不要です。Pi は SwitchBot API に HTTPS でコマンドを送るだけで、実際に赤外線を飛ばすのは SwitchBot Hub 2 が担います。

Raspberry Pi 5

HTTPS(SwitchBot API v1.1)
SwitchBot Hub 2

赤外線
エアコン

事前準備:SwitchBot アプリでエアコンを登録する

Hub 2 でエアコンを操作するには、まずアプリでエアコンの赤外線コードを学習させます。

  1. SwitchBot アプリ → ホーム右上の「+」→「赤外線リモコンを追加」
  2. 「エアコン」→ メーカーを選択(プリセットにあればそのまま使用)
  3. プリセットにない場合は「学習リモコン」で実機リモコンの信号を取り込む
  4. アプリからオン・オフできることを確認する

この操作でエアコンが SwitchBot クラウドに「仮想赤外線リモコン」として登録されます。どの方法でもこの準備は共通で必要です。

事前準備②:SwitchBot API トークンの取得

SwitchBot アプリのバージョン表示を 10回タップ するとデベロッパーオプションが開きます。

  1. SwitchBot アプリ → プロフィール → 設定
  2. 「アプリバージョン」を10回タップ
  3. 「開発者向けオプション」→「トークンを取得」
  4. Token と Client Secret をメモする
export SWITCHBOT_TOKEN="your_token_here"
export SWITCHBOT_SECRET="your_secret_here"

デバイス一覧の取得

エアコンは通常の deviceList ではなく infraredRemoteList に入っています。まず両方を確認します。

import hashlib, hmac, base64, time, uuid, requests, os

TOKEN  = os.environ["SWITCHBOT_TOKEN"]
SECRET = os.environ["SWITCHBOT_SECRET"]

def get_headers():
    t   = str(round(time.time() * 1000))
    n   = str(uuid.uuid4())
    msg = TOKEN + t + n
    sig = base64.b64encode(
        hmac.new(SECRET.encode(), msg.encode(), hashlib.sha256).digest()
    ).decode()
    return {
        "Authorization": TOKEN,
        "t": t, "nonce": n, "sign": sig,
        "Content-Type": "application/json",
    }

r = requests.get("https://api.switch-bot.com/v1.1/devices", headers=get_headers())
body = r.json()["body"]

print("--- 物理デバイス(Hub 2 等)---")
for d in body["deviceList"]:
    print(d["deviceId"], d["deviceName"], d["deviceType"])

print("--- 赤外線リモコン(エアコン等)---")
for d in body["infraredRemoteList"]:
    print(d["deviceId"], d["deviceName"], d["remoteType"])

出力例:

--- 物理デバイス ---
YYYYYYYY  リビングHub2        Hub 2

--- 赤外線リモコン ---
XXXXXXXX  リビングのエアコン   Air Conditioner

室温の取得

def get_temperature(device_id):
    url = f"https://api.switch-bot.com/v1.1/devices/{device_id}/status"
    r = requests.get(url, headers=get_headers())
    body = r.json()["body"]
    return body["temperature"], body["humidity"]

temp, hum = get_temperature("YYYYYYYY")  # Hub 2 のデバイスID
print(f"室温: {temp}℃  湿度: {hum}%")

エアコンの操作

def control_ac(device_id, command):
    url = f"https://api.switch-bot.com/v1.1/devices/{device_id}/commands"
    payload = {
        "command": command,       # "turnOn" or "turnOff"
        "parameter": "default",
        "commandType": "command",
    }
    r = requests.post(url, headers=get_headers(), json=payload)
    return r.json()["statusCode"]

AC_ID    = "XXXXXXXX"   # infraredRemoteList で確認したエアコンの ID
HUB_ID   = "YYYYYYYY"   # deviceList で確認した Hub 2 の ID
ON_TEMP  = 28
OFF_TEMP = 25

temp, _ = get_temperature(HUB_ID)
if temp >= ON_TEMP:
    control_ac(AC_ID, "turnOn")
    print(f"{temp}℃ → エアコン ON")
elif temp <= OFF_TEMP:
    control_ac(AC_ID, "turnOff")
    print(f"{temp}℃ → エアコン OFF")

ON_TEMP と OFF_TEMP に差をつける(ヒステリシス)ことで、28℃ をまたいだだけでエアコンが連続オン・オフするのを防いでいます。

cron で自動実行する

$ crontab -e

# 5分ごとに室温チェック
*/5 * * * * /usr/bin/python3 /home/pi/ac_control.py >> /home/pi/ac_control.log 2>&1

まとめ

SwitchBot Hub 2 があれば Raspberry Pi に赤外線モジュールは不要で、Python から API を叩くだけでエアコンを自動制御できます。ヒステリシス・ログ・時間帯制限など SwitchBot アプリでは難しいロジックが自由に実装できるのが最大のメリットです。

この記事が役に立ったら X(Twitter)でシェアしてもらえると喜びます。

参考

このシリーズの記事

0 件のコメント:

コメントを投稿