私の、私と生成AIによる、私のためのfitbitダッシュボード

私は普段fitbitを使用しているのですが、標準アプリでは、過去から現在まで長期的な変化がみにくい仕様になっています。

例えば、週ごと、月ごと、年ごとにはグラフ化されるのですが、直近半年のdailyの傾向などはみることができません。
運動、睡眠の習慣は、数ヶ月かけて少しずつ改善(悪化)していくものですので、中長期のdailyの変化はモニタリングできているといいなと思っていました。

fitbit

そこで、fitbitAPIを使用し、私の、私(と生成AI)による、私のためのダッシュボードを作成することにしました。
ちょうど、Grok3のDeep Searchが無料で使用できるということもあり、そちらを中心に使っていきます。

アイデア探索

さっそく、Grok3のDeep Searchを使って、ダッシュボードツールの全体構想を考えてもらいます。

質問

fitbitapiを使って、自分のみが使用するモニタリングツールを作成したいです。
できるだけシンプルに、実現するためのアーキテクト案をいくつか教えてください。

回答

回答の詳細

直接回答

主なポイント:

  • Fitbit APIを使って個人用のモニタリングツールを作成するには、Streamlitやevidence.dev、ReactなどのフロントエンドとSQLiteのような簡単なデータベースを組み合わせるのが良い。
  • 最も簡単な方法は、データ取得を別スクリプトで処理し、Streamlitでデータを表示するアーキテクチャ。

Fitbit APIの概要:
Fitbit APIは、Fitbitデバイスからステップ数、心拍数、睡眠データなどの健康情報を取得できるウェブAPIです。OAuth2認証が必要です。

推奨アーキテクチャ(オプション2):

  • データ取得スクリプト: PythonスクリプトでOAuth2認証を行い、Fitbit APIからデータを取得し、SQLiteデータベースに保存。
  • Streamlitアプリ: SQLiteデータベースに接続し、データを視覚化して表示。
  • この方法はセキュリティが高く、管理が簡単で、個人利用に最適。

実装のステップ:

  1. Fitbitデベロッパーポータル(Fitbit Developer)でアプリを登録し、クライアントIDとシークレットを取得。
  2. PythonスクリプトでOAuth2フロー(認証コードグラント)を処理し、アクセストークンを取得。
  3. アクセストークンを使ってFitbit APIからデータを取得し、SQLiteに保存。
  4. Streamlitアプリを作成し、データベースからデータを取得してチャートや表で表示。

必要なツール:

  • Python、Streamlit、SQLite、python-fitbitライブラリ(python-fitbit)。

アーキテクチャ案の比較

アーキテクチャ名 説明 メリット デメリット
統合Streamlitアプリ StreamlitでOAuth2認証、データ取得、表示を一括処理、SQLiteに保存 一体化で管理簡単 トークン管理のセキュリティリスク
別スクリプト+Streamlit Pythonスクリプトでデータ取得、SQLite保存、Streamlitで表示 セキュリティ高、モジュール性あり コンポーネントが2つに分かれる
evidence.dev+別スクリプト Pythonスクリプトでデータ取得、SQLite保存、evidence.devで表示 データ製品向け、視覚化オプション豊富 evidence.devの学習コスト
Reactフロント+バックエンドAPI Node.jsバックエンドでデータ取得、Reactで表示 モダンなアプリ体験、スケーラブル セットアップ複雑、個人利用では過剰

個人利用でシンプルさを重視する場合、別スクリプト+Streamlit(オプション2)が最適です。

いくつかのソースを検索し、候補を探ってくれました!(詳細な回答は、トグルで折りたたみにしています。)
個人的には、Reactをつかってみたい気持ちはありましたが、ここは大人しくおすすめに従い、**「Streamlit + 別スクリプトでのデータ収集」**のアーキテクトを選択します。

データの収集方法を決める。

次に、裏側のデータ収集の方法を教えてもらいます。

質問

データをサーバレスに収集する方法をおしえて

回答

なるほど、ここは一般的なサーバレスサービスが候補にあがっています。今回は、使い慣れた慣れたAWSを選択することにします。

続いて、さらに具体的な方法をききます。

質問

lambdaで、データを蓄積する方法をおしえて

回答

当初は、SQL Liteが候補にありましたが、何度かやり取りするうちに、LambdaでS3に蓄積する方法おすすめしてもらいました。

たしかにこれなら、データレイクとしてデータを蓄積しておけるので、将来的に様々なインターフェースに柔軟に対応できそうです。

事前準備

構成がなんとく決まったので、とりあえず以下は事前に準備しておきます。

  • AWSアカウントの作成
  • FitbitAPIの認証情報取得

あとは実装あるのみ

その後、何度かやりとりした結果、以下の構成で進めることにしました。各コンポーネントは、生成AIに8割程度は実装してもらっています。

(ディスカッションでは、私の意見を尊重しつつ、提案もしてくれる、なんとも優秀なメンバーと働いている気分でした)

  • Streamlit
    • ダッシュボードのインターフェース
  • Lambda
    • FItbitAPIを使用し、毎日データをS3へアップロードする。
  • Secreat Maneger
    • FItbitAPIの認証情報を保管
    • リフレッシュトークンは、Lambdaによって更新される。
  • S3
    • データレイクとして、各種データを保管 する。
  • Athena
    • S3のデータを外部テーブルとして、Streamlitから読み込ませる。
  • Terraform
    • AWSの構成を管理する。
    • IAMロールの作成をはじめ、すべてのインフラ環境を作成してもらう。

成果物をgithubにあげ、READMEも書いてもらいます。

以下は私のwebアプリのgithubです。ここにアクセスし、READMEを書いてください。
内容は、アーキテクト全体についてと、使用している技術についてです。
https://github.com/koy0208/fitbit-streamlit

完成したREADME

こんなコメントもつけてくれています。

ついに完成!!

こちらが完成形です。これぐらいシンプルに、中長期的な傾向が一目でわかるのがほしかったんです!
まさにイメージ通り

モニタリングの指標は、睡眠時間、歩数、低強度運動時間、中強度運動時間の4つにしぼり、直近1週間の平均値と、任意の期間の推移を表示しています。

毎日更新され、過去から現在までの傾向を30日移動平均とともにみることができるので、
睡眠、運動習慣がどのように変化するかモニタリングすることができます。

まとめ

構想から、最終アウトプットの完成までは、(合間にちょこちょこ作業して、)およそ2〜3日程度だったかと思います。
作りたいもののイメージさえあれば、形のあるものができる良い時代になりましたね!

次は、Clineとかをつかってみたいものです。

成果物はこちら

https://github.com/koy0208/fitbit-streamlithttps://github.com/koy0208/fitbit-streamlit

← 一覧へ戻る