Skip to content

About

Change Switchbot light color based on chance of rain.

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Repository files navigation

switchbot-rainylight

【SwitchBot】雨が降りそうなときに廊下ライトの色を変えてお知らせする機能を作る

https://zenn.dev/tanny/articles/808487545eb30f

必要なもの

  • Python 3.13 以上
  • uv
  • SwitchBot アカウントとカラーライト(Color Bulb / Strip Light など)

セットアップ

1. 依存パッケージのインストール

uv sync

2. 環境変数の設定

.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 を参照)

3. デバイスIDの取得

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

Codex で開発する場合

リポジトリ直下の 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への指示やチャットへ値を貼り付けず、ローカル環境変数として管理する。

Cloudflare Workers へのデプロイ

既存のPython/GCP版を残したまま、cloudflare/ にTypeScript版のCloudflare Workerを用意している。Cron Triggerが毎日22:00 UTC(翌日7:00 JST)にWorkerを実行し、天気予報APIの取得結果に応じてSwitchBotカラーライトを操作する。

1. セットアップ

Node.js 20以上とCloudflareアカウントが必要。

cd cloudflare
npm install

cloudflare/wrangler.toml の WEATHER_CITY_CODE を、利用する地域の都市コードへ変更する。

2. ローカル用Secrets

サンプルをコピーし、SwitchBotの認証情報とデバイスIDを設定する。

cp .dev.vars.example .dev.vars

.dev.vars はGit管理対象外。値をリポジトリやチャットへ貼り付けないこと。

3. テストと型チェック

テストはHTTP通信をモックするため、実際の天気予報APIやSwitchBotデバイスには接続しない。

npm test
npm run typecheck
npx wrangler deploy --dry-run

4. 初回デプロイ

Cloudflareへログインし、ローカルの.dev.varsを暗号化されたWorker Secretsとしてアップロードしながらデプロイする。

npx wrangler login
npm run deploy -- --secrets-file .dev.vars

登録されるSecrets:

  • SWITCHBOT_ACCESS_TOKEN
  • SWITCHBOT_SECRET
  • SWITCHBOT_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の反映には時間がかかる場合がある。

5. 既存環境からの切り替え

Cloudflare版の正常実行を確認するまでは、既存のGCP版を残しておく。確認後、二重実行を避けるため、GCP Cloud SchedulerのジョブとGitHub Actionsの定期実行のうち、使用している既存スケジュールを無効化する。

GCP へのデプロイ

このツールは GCP Cloud Functions(Pub/Sub トリガー)でも定期実行できる。

1. デプロイ用 zip をビルド

bash deploy/gcp/build_zip.sh

deploy/gcp/gcp_source.zip が生成される(main.py / requirements.txt / rainylight を含む)。

2. Cloud Console でアップロード

Cloud Functions コンソール で関数を作成(または既存の関数を編集)し、以下を設定する。

項目 値
ランタイム Python 3.13
エントリポイント pubsub_hundler
トリガー Cloud Pub/Sub
ソース 「ZIP アップロード」で deploy/gcp/gcp_source.zip を指定

3. 環境変数の設定

ローカル実行と同じ4つの環境変数(SWITCHBOT_ACCESS_TOKEN / SWITCHBOT_SECRET / SWITCHBOT_DEVICE_ID / WEATHER_CITY_CODE)を、Cloud Functions の「ランタイム環境変数」に登録する。

4. 定期実行

Cloud Scheduler から、トリガーに設定した Pub/Sub トピックへ定期的にメッセージを publish することで実行される。

References

About

Change Switchbot light color based on chance of rain.

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages