SwitchBot温湿度計のデータを自宅サーバーに記録する【アプリのグラフが遅いので自作した】

スマートホーム

はじめに

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に譲りますが、流れはシンプルです。

  1. SwitchBotアプリでトークンとシークレットを取得
  2. .env に記入(cp .env.example .env
  3. docker compose up -d --build で起動

あとはブラウザで http://<サーバーのIP>:8080 を開くだけです。

つまずいたポイント

ここからが本題です。半日ほどでできましたが、いくつかハマったので共有します。

1. APIトークンの取得場所がネットの情報と違う

多くの解説記事には「プロフィール → 設定 → アプリバージョンを10回タップ」とありますが、現行アプリ(v9.28)ではアプリバージョンの場所が変わっています。正しくは:

プロフィール → 設定 → 基本データ → アプリバージョンを10回タップ → 開発者向けオプション

SwitchBotアプリの開発者向けオプション画面

最初「バージョン表示がない…」としばらく探し回りました。

2. データが1点しかないとグラフに何も表示されない

初回起動直後、最新値カードには値が出るのにグラフが真っ白。原因は、折れ線グラフは2点以上ないと線が描けないうえに、線をすっきり見せるため点の描画を消していた(pointRadius: 0)ので、データ1点の状態では何も見えなかったのでした。

データが溜まるまでの間は点を表示するようにして解決。「起動直後に何も映らない」は自作ダッシュボードあるあるだと思います。

3. PostgreSQLの起動レースで初回クラッシュ

DBコンテナを追加したら、PostgreSQLの準備完了前にアプリが接続しにいって初回起動でクラッシュ。定番の問題ですが、pg_isready のhealthcheckをDBに付けて、アプリ側は depends_on: condition: service_healthy で待たせるのが確実でした。

4. Postgresを起動しただけでは保存先が切り替わらない罠

DBコンテナが動いていても、.envDATABASE_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のグラフ表示にモヤモヤしている方の参考になれば嬉しいです。

参考リンク

コメント

タイトルとURLをコピーしました