はじめに
SwitchBotの温湿度計、便利ですよね。我が家ではHub 2を3台置いて、部屋ごとの温度・湿度をアプリで眺めています。ただひとつ不満がありました。アプリのグラフ表示が遅いのです。過去データを見ようとするたびに読み込み待ち。「今朝の寝室って何度だった?」を確認するだけで数十秒かかることもあります。
ちょうどSynologyのNASでDockerコンテナを常時稼働できる環境があり、何かに活かしたいと思っていたところでした。そこで、SwitchBot APIからセンサーデータを定期取得してDBに貯め、自前のダッシュボードでサクサク見られるロガーを作りました。
作ったものはGitHubで公開しています。

作ったもの
SwitchBot API v1.1で温湿度計・Hub 2のセンサーデータ(温度・湿度・CO2・照度・電池残量)を5分間隔で取得してDBに保存するロガーと、Chart.jsのWebダッシュボードのセットです。
| 要素 | 内容 |
|---|---|
| ロガー | Python + SQLAlchemy。5分間隔でポーリング |
| Web | Flask。JSON API + Chart.js 4のダッシュボード(ダークテーマ) |
| DB | PostgreSQL(DATABASE_URLを変えればSQLiteにも切替可) |
| コンテナ | docker composeの3サービス構成(ロガー / Web / DB) |
ダッシュボードでは、デバイスごとの最新値カードと時系列グラフを表示し、期間切替(6時間/24時間/7日/30日)と60秒自動更新に対応しています。サーバー側で1デバイス最大500点に間引くので、30日表示でも軽快です。データを手元のDBに持っているので、表示は一瞬。アプリのグラフ待ちから解放されました。
気になるAPIのレート制限は10,000リクエスト/日。1サイクルで「デバイス一覧1回+デバイスごとに1回」なので、Hub 2×3台・5分間隔なら約1,150リクエスト/日と余裕です。
セットアップは3ステップ
詳細はリポジトリのREADMEに譲りますが、流れはシンプルです。
- SwitchBotアプリでトークンとシークレットを取得
.envに記入(cp .env.example .env)docker compose up -d --buildで起動
あとはブラウザで http://<サーバーのIP>:8080 を開くだけです。
つまずいたポイント
ここからが本題です。半日ほどでできましたが、いくつかハマったので共有します。
1. APIトークンの取得場所がネットの情報と違う
多くの解説記事には「プロフィール → 設定 → アプリバージョンを10回タップ」とありますが、現行アプリ(v9.28)ではアプリバージョンの場所が変わっています。正しくは:
プロフィール → 設定 → 基本データ → アプリバージョンを10回タップ → 開発者向けオプション

最初「バージョン表示がない…」としばらく探し回りました。
2. データが1点しかないとグラフに何も表示されない
初回起動直後、最新値カードには値が出るのにグラフが真っ白。原因は、折れ線グラフは2点以上ないと線が描けないうえに、線をすっきり見せるため点の描画を消していた(pointRadius: 0)ので、データ1点の状態では何も見えなかったのでした。
データが溜まるまでの間は点を表示するようにして解決。「起動直後に何も映らない」は自作ダッシュボードあるあるだと思います。
3. PostgreSQLの起動レースで初回クラッシュ
DBコンテナを追加したら、PostgreSQLの準備完了前にアプリが接続しにいって初回起動でクラッシュ。定番の問題ですが、pg_isready のhealthcheckをDBに付けて、アプリ側は depends_on: condition: service_healthy で待たせるのが確実でした。
4. Postgresを起動しただけでは保存先が切り替わらない罠
DBコンテナが動いていても、.env の DATABASE_URL を設定しない限りアプリはデフォルトのSQLiteに書き続けます。「Postgresにデータがない!」と焦ったら、まずここを確認。
DATABASE_URL=postgresql+psycopg2://switchbot:switchbot@db:5432/switchbot
おまけ:外気温も重ねてみた
作っている途中で Open-Meteo という無料の天気API(APIキー不要)を知りました。.env に自宅の緯度・経度を設定するだけで外気温・外気湿度も記録され、ダッシュボードに破線で重なります。

室内と外気の差が見えると、断熱の効きやエアコンの働きぶりが一目瞭然で面白いです。Open-Meteoは気圧や降水量なども取れるので、こちらは別記事で深掘りする予定です。
まとめ
- SwitchBotアプリのグラフ表示が遅いなら、APIでデータを自宅DBに貯めるのが快適
- Dockerが動くマシン(NASでOK)があれば
docker compose upだけで構築できる - APIトークンの取得場所は現行アプリでは「設定 → 基本データ」の中
- DBの起動レースと
DATABASE_URLの設定忘れには注意
データが自分の手元にあると、間引き方も表示期間も思いのまま。同じようにSwitchBotのグラフ表示にモヤモヤしている方の参考になれば嬉しいです。

コメント