※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分ごとに取得し、条件分岐でエアコンを制御できる
- ヒステリシスつきの温度制御で、頻繁なオン・オフを防げる
使ったもの
- SwitchBot ハブ2(Amazonで確認)— 赤外線送信機 + 温湿度センサー内蔵
- Raspberry Pi 5 スターターキット(8GB)(Amazonで確認)— 常時起動サーバーとして使用
- エアコン(赤外線リモコン対応であればメーカー不問)
構成の概要
Raspberry Pi 自体には赤外線モジュールは不要です。Pi は SwitchBot API に HTTPS でコマンドを送るだけで、実際に赤外線を飛ばすのは SwitchBot Hub 2 が担います。
HTTPS(SwitchBot API v1.1)
赤外線
事前準備:SwitchBot アプリでエアコンを登録する
Hub 2 でエアコンを操作するには、まずアプリでエアコンの赤外線コードを学習させます。
- SwitchBot アプリ → ホーム右上の「+」→「赤外線リモコンを追加」
- 「エアコン」→ メーカーを選択(プリセットにあればそのまま使用)
- プリセットにない場合は「学習リモコン」で実機リモコンの信号を取り込む
- アプリからオン・オフできることを確認する
この操作でエアコンが SwitchBot クラウドに「仮想赤外線リモコン」として登録されます。どの方法でもこの準備は共通で必要です。
事前準備②:SwitchBot API トークンの取得
SwitchBot アプリのバージョン表示を 10回タップ するとデベロッパーオプションが開きます。
- SwitchBot アプリ → プロフィール → 設定
- 「アプリバージョン」を10回タップ
- 「開発者向けオプション」→「トークンを取得」
- 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)でシェアしてもらえると喜びます。
参考
このシリーズの記事
- (1) 【Raspberry Pi版】SwitchBot API × Python で室温連動エアコン自動制御する(本記事)
- (2) 【SwitchBot オートメーション版】室温連動エアコン自動制御をアプリで設定する
- (3) 【IFTTT連携版】SwitchBot × IFTTT で帰宅前にエアコン自動 ON
0 件のコメント:
コメントを投稿