/ iPhoneのヘルスケアのデータをNotionに記録する

Created Sun, 08 Jan 2023 00:00:13 +0000
2974 Words

概要

下記ブログでも書いたのだが、Anker Eufy Smart Scale Pro2 を購入した。

2022年買って良かったもの

  <div class="naaa-product naaa-product-h">
    <div class="naaa-product-thumb">
      <img decoding="async" class="naaa-product-img-h" src="https://i0.wp.com/m.media-amazon.com/images/I/318EIYK9lOL._AC_AC_SR250,250_.jpg?w=750&#038;ssl=1" alt="Anker Eufy (ユーフィ) Smart Scale P2 Pro(体重体組成計)【アプリ対応 / Fitbit連携 / 体脂肪率 / BMI / 心拍数 / 筋肉量 / 基礎代謝量 / 水分量 / 体脂肪量 / 骨量 / 内臓脂肪 / タンパク質 / 骨格筋量 / 皮下脂肪 / 体内年齢 / ボディタイプ】" data-recalc-dims="1" />
    </div>
    
    <div class="naaa-product-title naaa-product-title-h">
      Anker Eufy (ユーフィ) Smart Scale P2 Pro(体重体組成計)【アプリ対応 / Fitbit連携 / 体脂肪率 / BMI / 心拍数 / 筋肉量 / 基礎代謝量 / 水分量 / 体脂肪量 / 骨量 / 内臓脂肪 / タンパク質 / 骨格筋量 / 皮下脂肪 / 体内年齢 / ボディタイプ】
    </div>
    
    <div class="naaa-product-price">
      <div class="naaa-product-price-h">
      </div>
    </div>
    
    <div>
      <div class="naaa-product-action">
        <div class="naaa-product-button naaa-product-button-border">
          見てみる
        </div>
      </div>
    </div>
    
    <div class="naaa-rating-and-review-h">
      <span class="naaa-product-rating">
      
      <fieldset class="naaa-rating" id="6686b530c4fdb">
        <input type="radio" class="naaa-input-star" name="6686b530c4fdb" value="10" /><label class="naaa-full naaa-label-star" title="4.4 de 5"></label><input type="radio" class="naaa-input-star" name="6686b530c4fdb" value="9"  checked='checked' /><label class="naaa-half naaa-label-star" title="4.4 de 5"></label><input type="radio" class="naaa-input-star" name="6686b530c4fdb" value="8" /><label class="naaa-full naaa-label-star" title="4.4 de 5"></label><input type="radio" class="naaa-input-star" name="6686b530c4fdb" value="7" /><label class="naaa-half naaa-label-star" title="4.4 de 5"></label><input type="radio" class="naaa-input-star" name="6686b530c4fdb" value="6" /><label class="naaa-full naaa-label-star" title="4.4 de 5"></label><input type="radio" class="naaa-input-star" name="6686b530c4fdb" value="5" /><label class="naaa-half naaa-label-star" title="4.4 de 5"></label><input type="radio" class="naaa-input-star" name="6686b530c4fdb" value="4" /><label class="naaa-full naaa-label-star" title="4.4 de 5"></label><input type="radio" class="naaa-input-star" name="6686b530c4fdb" value="3" /><label class="naaa-half naaa-label-star" title="4.4 de 5"></label><input type="radio" class="naaa-input-star" name="6686b530c4fdb" value="2" /><label class="naaa-full naaa-label-star" title="4.4 de 5"></label>
      </fieldset>
      
      <span class="naaa-product-rating-value-h" title="4.4 de 5">&nbsp;</span></span>
    </div>
  </div></a>
</div>

これには専用のアプリがあるので、日々の記録はアプリで確認はできるし、iPhoneのヘルスケアアプリとも同期が取れる。

が、ヘルスケアアプリもこのEufyにも外部公開APIが無い。
ここでいう外部公開APIというのは、ユーザーがAPIトークンなどを使って、REST APIなどで保存した値を手軽に取得することを意味する。
開発者登録してまで取りたいという話では無し。

いくつかのスマート体重計を調べたけどどこも公開していなかった。
そのため、記録はアプリにロックインされることになる。
自分としては見返すのにスプレッドシート使ったり、ブログで書いたり、なにかしら別の形でデータを加工したいと思っているので、iPhoneのヘルスケアアプリだと勝手が悪い。

そこで色々検討した結果、iPhoneの ショートカット を使って、Notionに記録することにした。

iPhoneのショートカット

使ったことがある人にはとても便利なツールの ショートカット アプリ。
私もいくつか作ってきたものがある。
例えば、自分の睡眠記録をヘルスケアアプリから取って、メモアプリに登録するショートカット、音声入力で作ったタスクをTodoistへ登録するショートカット、Googleカレンダーの直近の予定と天気とTodoistのタスクを通知するショートカットなどがそうだ。
これらは今は使っていないが、唯一、寝る前にKindleを読み上げしてくれるショートカットだけは使ってる。

単純にKindleを開いて、3秒待機して(待機しないと読み上げ機能に至らないことが頻発したので)、読み上げ機能をオンにするだけのショートカットだ。
kindleの対象の本は直前に読んでいた本のみとなるし、読み上げのオフは手動だし、iPhoneのスリープ(画面オフじゃないレベル)?で15分くらいで終了するし、固定レイアウトは無理だが、それでもこれのおかげで寝る前にちょいAudible的なことができるようになった。
シンプルだがとても重宝している。

これらで培った方法を使えば、ショートカットでできることがわかってたのでトライすることにした。

Notion API

まずは何はともあれ、NotionのAPIを理解するところから始めた。

APIの超基本的な使い方(対象DBへPOSTする方法)は下記を参照してほしい。

NotionのAPI操作

APIトークンを取って、対象のDBのエンドポイントへ、決まった形でREST APIでPOSTするというシンプルなものである。
唯一、JSONのネストが深いのが難点であるくらい。

ショートカット:ヘルスケアからデータの取得

ショートカットから直接ヘルスケアアプリのデータは取得することができる。
なんとなく触りながら、どんなデータが取得できるかはデバッグしながらやる必要があるが、下記方法を使えば条件の範囲でデータを取って、変数に突っ込むことができる。
わざわざ変数にしているのはあとでJSONに突っ込む必要があるからである。

なお、ショートカットの正しいデバッグの方法は私は分からないが、基本的にはPrintデバッグでやってる(アラート機能を使って変数を表示するというクソ地味な作業である)。

ヘルスケアデータはよく出来ていて、例えば体重なんかはシンプルに今日同期したデータを1つ分とれば良いとなるが、ヘルスケアデータとしては複数あったりする。
確かに一日で複数取ることもあるし、特に歩数なんかはバッファリングされているので、今日は○○歩でしたというのはアプリで合算しているだけであり、データとしては 10,7,15,20,45... のようなデータ形式になっている。
なので、歩数については日付を指定して合算用の関数を使ってあげるなどの加工が必要である。
あと、残念ながら ショートカット のデータをまとめて取得するというのができないので、体重以外にBMIとか筋肉量とか色々取れるのだけど、上記のような変数を取りたい値だけ設定する必要があるし、全部iPhoneでやるので滅茶苦茶面倒。
私は結局、体重、BFP(体脂肪率)、BMI、LBM(体脂肪を除いた体重)と歩数だけにした。

ショートカット:REST APIの実行

取りたい値が変数化できたらあとはAPIを叩くだけである。
ショートカット にはcurlのような機能があるので、それでヘッダーとメソッド指定して、指定したJSONを投げることができる。便利。

しかし、JSONの加工はなかなか大変だったのでMacでやることにした。

JSONのkey,valueを登録するならショートカット.appを使うが良い

Macには ショートカット.app というアプリがある。
そのアプリを使えば、ショートカットを作成することができるし、iPhoneのショートカットも修正することができる。

このアプリにも良いところ、悪いところがある。

良いところ

  1. iPhoneとリアルタイムで同期される
  2. iPhoneよりも一部のアクションは修正しやすい

悪いところ

  1. iPhoneと一緒に開いていると、iPhone側で不整合を検知するのはいいが、何が不整合になったかよくわからない(なので実質ちょっとだけロールバックする)
  2. ヘルスケアのアプリ等、iPhoneじゃないと動かないアクションがあるので、iPhone用に作っているものは結局iPhoneでしか動作確認ができない
  3. 動作が若干もっさりしている(多分リアルタイム同期によるもの)
  4. そもそもアプリが独特で慣れが必要

結局のところ、JSONの値に関してはショートカット.appで作業したが、それ以外はiPhoneで作業を進めた。

実行はオートメーションで

オートメーションを使うとcronのような定期実行ができる上に、Yes/Noのような分岐も入れることができる。
体重計に乗った乗っていないをここで分岐して、乗ったときだけ実行するようにした。

出来上がり

Notionにはこんな感じで記録されるようになっている。

私は大学生の時、スポーツジムで一番初回のチェックのときに、体脂肪7%で筋肉量も身長に対して100%より多く、ジムの人に褒められたくらいだったのだけど時の経過とは実に残酷である。
エンジニアらしく、計測して数値を起こした結果がこれである。
しかし、数値と向き合うことが大事だと思っているのでこれからやっていこうと思う。

俺たちの戦いはこれからだ。

<p style='padding: 5px;'>