【SwitchBot】雨が降りそうなときに廊下ライトの色を変えてお知らせする機能を作る
https://zenn.dev/tanny/articles/808487545eb30f
- Python 3.13 以上
- uv
- SwitchBot アカウントとカラーライト(Color Bulb / Strip Light など)
uv sync.env.example を .env にコピーし、以下の値を設定する。
cp .env.example .env| 変数 | 取得方法 |
|---|---|
SWITCHBOT_ACCESS_TOKEN |
SwitchBot アプリ →「プロフィール」→「設定」→「アプリバージョン」を10回タップ →「開発者向けオプション」から取得 |
SWITCHBOT_SECRET |
同上 |
SWITCHBOT_DEVICE_ID |
下記「3. デバイスIDの取得」で取得 |
WEATHER_CITY_CODE |
天気予報 API の地域コード(primary_area.xml を参照) |
SWITCHBOT_ACCESS_TOKEN と SWITCHBOT_SECRET を設定したうえで以下を実行すると、デバイス一覧が device_list.json に出力される。
uv run python scripts/list_devices.py出力された JSON から対象ライトの deviceId を SWITCHBOT_DEVICE_ID に設定する。
uv run python -m rainylightリポジトリ直下の AGENTS.md に、Codex向けのプロジェクト概要、作業方針、検証コマンド、秘密情報の取り扱いを記載している。Codexはこのファイルをプロジェクト指示として自動的に読み込むため、通常はリポジトリ固有の追加設定は不要。
利用者個人の共通設定が必要な場合は、~/.codex/AGENTS.md に全プロジェクト共通の作業方針を記載できる。モデル、承認方法、サンドボックスなどのCodex本体の設定は ~/.codex/config.toml で管理する。これらは端末・利用者ごとの設定なので、このリポジトリにはコミットしない。
このプロジェクトでCodexにコードを変更させた後は、少なくとも以下を実行して結果を確認する。
uv run pytest
uv run ruff check .
uv run ruff format --check .
uv run mypy rainylight/ deploy/gcp/main.py.env にはSwitchBotの認証情報が含まれるため、Codexへの指示やチャットへ値を貼り付けず、ローカル環境変数として管理する。
既存のPython/GCP版を残したまま、cloudflare/ にTypeScript版のCloudflare Workerを用意している。Cron Triggerが毎日22:00 UTC(翌日7:00 JST)にWorkerを実行し、天気予報APIの取得結果に応じてSwitchBotカラーライトを操作する。
Node.js 20以上とCloudflareアカウントが必要。
cd cloudflare
npm installcloudflare/wrangler.toml の WEATHER_CITY_CODE を、利用する地域の都市コードへ変更する。
サンプルをコピーし、SwitchBotの認証情報とデバイスIDを設定する。
cp .dev.vars.example .dev.vars.dev.vars はGit管理対象外。値をリポジトリやチャットへ貼り付けないこと。
テストはHTTP通信をモックするため、実際の天気予報APIやSwitchBotデバイスには接続しない。
npm test
npm run typecheck
npx wrangler deploy --dry-runCloudflareへログインし、ローカルの.dev.varsを暗号化されたWorker Secretsとしてアップロードしながらデプロイする。
npx wrangler login
npm run deploy -- --secrets-file .dev.vars登録されるSecrets:
SWITCHBOT_ACCESS_TOKENSWITCHBOT_SECRETSWITCHBOT_DEVICE_ID
以後、個別のSecretを変更するときは次のコマンドを使用する。
npx wrangler secret put SWITCHBOT_ACCESS_TOKEN
npx wrangler secret put SWITCHBOT_SECRET
npx wrangler secret put SWITCHBOT_DEVICE_IDデプロイ後、Cloudflareダッシュボードの「Workers & Pages」から実行結果とログを確認する。Cron Triggerの反映には時間がかかる場合がある。
Cloudflare版の正常実行を確認するまでは、既存のGCP版を残しておく。確認後、二重実行を避けるため、GCP Cloud SchedulerのジョブとGitHub Actionsの定期実行のうち、使用している既存スケジュールを無効化する。
このツールは GCP Cloud Functions(Pub/Sub トリガー)でも定期実行できる。
bash deploy/gcp/build_zip.shdeploy/gcp/gcp_source.zip が生成される(main.py / requirements.txt / rainylight を含む)。
Cloud Functions コンソール で関数を作成(または既存の関数を編集)し、以下を設定する。
| 項目 | 値 |
|---|---|
| ランタイム | Python 3.13 |
| エントリポイント | pubsub_hundler |
| トリガー | Cloud Pub/Sub |
| ソース | 「ZIP アップロード」で deploy/gcp/gcp_source.zip を指定 |
ローカル実行と同じ4つの環境変数(SWITCHBOT_ACCESS_TOKEN / SWITCHBOT_SECRET / SWITCHBOT_DEVICE_ID / WEATHER_CITY_CODE)を、Cloud Functions の「ランタイム環境変数」に登録する。
Cloud Scheduler から、トリガーに設定した Pub/Sub トピックへ定期的にメッセージを publish することで実行される。
-
SwitchBot API v1.1
-
GitHubActions で定期実行
-
AWS Lambda から SwitchBot を操作する
-
天気予報を取得する