からめもぶろぐ。

俺たちは雰囲気で OAuth をやっている

Power Automate と Power BI を使って Fitbit の睡眠データをビジュアル化する

睡眠の健康状態を測るために Fitbit を使い始めて 1 年以上になります。Fitbit では睡眠ステージの推移などある程度のグラフはアプリで見られるのですが、睡眠中に起きた回数 (Fitbit によると健康な人でも 1 回の睡眠で 10~30 回は起きているそうです) を見たいと思ったので、Fitbit の API を使ってデータを取り出して SharePoint リストに格納し Power BI から見られるようにしました。

実際に作ったレポートはこんな感じになります。

f:id:karamem0:20200716093728p:plain

Power Automate の全体像はこんな感じです。ちょっと長いので画面を分割しています。

f:id:karamem0:20200716093742p:plain

f:id:karamem0:20200716093756p:plain

f:id:karamem0:20200716093809p:plain

Fitbit への API へのアクセスは OAuth を使うことになりますが、Fitbit では Client Credentials によるフローがサポートされていないので、事前に Authorization Code で Refresh Token を取得しておいて、Power Automate では Refresh Token から Access Token を取り直す形になります。*1 Fitbit の Authorization Code Flow は以下の記事が参考になります。

qiita.com

Refresh Token は OneDrive for Business に JSON ファイルとして保存しておいてそこから読み出します。OneDrive for Business から読み込んだコンテンツはコンテンツ タイプと Base64 エンコードされたコンテンツを持つ JSON として取得されるので、JSON を解析するときは $content を decodeBase64 する必要があります。

f:id:karamem0:20200716095007p:plain

Refresh Token からの Access Token の取得は HTTP アクションで POST 呼び出しを行います。ClientId と ClientSecret は Body のパラメーターではなく Basic 認証で送るそうで、変数として定義した ClientId と ClientSecret をコロン区切りでくっつけて Base64 でエンコードしています。

f:id:karamem0:20200716095733p:plain

Access Token を取得したら Sleep API を呼び出します。データは日付ごとに取れるので今日の日付を指定します。

f:id:karamem0:20200716110821p:plain

睡眠は複数回行われることがあるのでデータは配列になっています。配列を回してそれぞれの起きた回数を加算します。

f:id:karamem0:20200716111244p:plain

最後に日付と回数を SharePoint のリストに追加して Power Automate は完成です。

Power BI ではあまり大したことはしていませんが、たまに Fitbit でデータの取り忘れがあったりうまく計測されなかったりで値が 0 になることがあり、平均を出すときに余計なデータになってしまうので、グラフとのモデルと平均を出すモデルは別にしています。

実際のレポートを埋め込んでみました。あまりよく眠れていないんじゃない?

*1:厳密には Client Credentials でトークンそのものは取ってこられますが API を呼び出すとアクセス許可がないといってエラーになります。