仕組み
形の違う記録を毎日取り込み、読めるかたちにそろえて、ひとつの画面にまとめる。
このサイトは、架空の人物のダミーデータで動かしている公開デモです。
データの流れ
毎日の更新
- Withings の体重・体組成は、毎朝 API から取ってくる。
- Apple ヘルスケアは、iPhone から書き出した zip を共有フォルダに置くと、自動で取り込まれる。
- 取り込み → 集計 → ビルド → 公開は、Linux サーバー(Docker と systemd のタイマー)が実行する。失敗したときはスマートフォンへの通知とメールで知らせる。
そろえていること
記録をそのまま並べると、同じ日に値が二重にあったり、単位が違ったりします。画面に出す前に、次のことをしています。
| 何を | どうそろえるか |
|---|---|
| 出どころが2つある体重・体脂肪率 | Withings を優先し、無い日だけ Apple ヘルスケアで埋めて1本の系列にする |
| 睡眠 | 起きた日の記録として数える。昼寝は除き、1夜につき1つの機器の記録だけを使う |
| 割合(体脂肪率・血中酸素など) | 0〜1 と 0〜100 が混ざっているので、% にそろえる |
| 明らかな誤計測・完全な重複 | 取り除く(例:体脂肪率 75%) |
| 書き出した当日 | 途中までしか記録がないので、日ごとの集計から外す |
| 比べ方 | その日の値ではなく 7日移動平均どうしで比べ、日々のぶれに振り回されないようにする |
使った技術
| 役割 | 使ったもの |
|---|---|
| 取り込み・整形 | Python(標準ライブラリ)、Withings API |
| 画面 | Observable Framework、Observable Plot、D3 |
| 自動更新 | Linux サーバー、Docker、systemd、通知(ntfy・メール) |
| 公開 | Cloudflare Pages・Workers |
このデモのデータ
- 40代の会社員という架空の人物の3年分。1年半前にランニングを始め、体重を約6kg落として、いまは維持している、という筋書きで作っています。
- 乱数から作ったもので、本物の記録を加工したものではありません。
- 最終日は毎日その日になるように作り直しています(この版の生成:
)。
業務のデータにも
形の違うデータを取り込んでそろえ、毎日自動で更新される画面にする、という組み立ては、売上・在庫・アクセスログ・問い合わせの記録などにもそのまま使えます。