Fitbit

FitbitAPI 詳細な心拍数データを時系列で取得する

投稿日:

FitbitAPI 詳細な心拍数データを時系列で取得する

おそらく、Fitbitに蓄えられているデータのうち最も利用価値が高いであろう、詳細な心拍数データを取得してみる。ドキュメントの先頭に以下の記述があり、Personal としてアプリを登録した場合にのみ利用できる。

Access to the Intraday Time Series for personal use (accessing your own data) is available through the "Personal" App Type.

このデータを使うアプリケーションは、ユーザにとってFitbitに代えがたい価値を提供しなければならない。としている。心拍数データがあってもなくても良いようなクソアプリには使うなよ、ということだろう。非営利目的ならOKとのこと。24時間心拍数を計測可能なウェラブルデバイスが何に応用できるのか、Fitbitもこうして一般に門戸を開いて研究中ということか。超絶便利で画期的なアプリやシステムを考案したら、case-by-caseで商用利用可能の許可が下りるそうだ。
Fitbitという会社の価値は24時間心拍数データの保存にあるということはわかった。

Access to the Intraday Time Series for all other uses is currently granted on a case-by-case basis. Applications must demonstrate necessity to create a great user experience. Fitbit is very supportive of non-profit research and personal projects. Commercial applications require thorough review and are subject to additional requirements. Only select applications are granted access and Fitbit reserves the right to limit this access. To request access, email api@fitbit.com.

実際、データ量が大きいので、現実的な問題としてリソース負荷も大きな理由の一つだろう

API概要

RESTfulAPI は以下の通り用意されている。何故か dateとend-dateを両方指定できる書式があるが、以下の通り 1日以上のデータを取得することはできない。これはimplicitに"超絶凄いアプリを考え付いたら複数日分取得できるようにするよ"ということなのかもしれない。

If your application has the appropriate access, your calls to a time series endpoint for a specific day (by using start and end dates on the same day or a period of 1d), the response will include extended intraday values with a one-minute detail level for that day.

GET /1/user/-/activities/heart/date/[date]/[end-date]/[detail-level].json
GET /1/user/-/activities/heart/date/[date]/[end-date]/[detail-level]/time/[start-time]/[end-time].json
GET /1/user/-/activities/heart/date/[date]/1d/[detail-level].json
GET /1/user/-/activities/heart/date/[date]/1d/[detail-level]/time/[start-time]/[end-time].json
parameter format meanings
date yyyy-MM-dd データを取得したい日付
end-date yyyy-MM-dd データを取得したい日付(dateと同じである必要がある...)
start-time HH:mm (オプション)取得時間を範囲指定する場合、開始時刻を指定できる
end-time HH:mm (オプション)取得時間を範囲指定する場合、終了時刻を指定できる
detail-level 1sec or 1min データを1秒区切りで取得するか1分区切りで取得するか。1日は24*60*60=86400秒だ。巨大なレスポンスとなる。

解像度と精度

脈波から心拍数を推測しているとはいえ、心拍数はだいたい1分間に60から120くらいの数値だ。1秒に1回か2回、1Hzか2Hzか、そんな程度の頻度で出現するデータだ。「1秒毎の心拍数」というのは一体どう解釈すれば良いのだろうか。
実際に計測しているのは腕の血流量だが、もしかしたら血流量の変動は心拍数を推測する以上に高頻度に変動する量なのかもしれない。実際、本エントリの末尾に「1秒毎の心拍数」をプロットして貼ってみたが、同一時間でかなりの幅をもっている。単なる歪みなのか、それとも...。detail-level = 1sec を許す fitbit の狙いが知りたい

レスポンス概要

activities-heart-intradayの下にdatasetという名前で、時刻と心拍数のセットが永遠に繰り返される。

実行例

レスポンスが巨大すぎて実行結果をWordPressのエディタに貼り付けたら編集できなくなった。。代わりにデータをプロットしたので貼っておく。
hr

本当に24時間分の心拍数を1秒区切りで返してくる。ときどき1.5秒になったりする。APIサーバの応答は早い。APIサーバとクライアントの間のネットワーク帯域に依存しそう。PHPがjsonをパースして配列に格納する処理の時間も無視できなさそう。
こんなデータを24時間記録するのにバッテリーが5日も持つなんて!面白くないが最初の2分を載せてみる。こんな調子で24時間心拍数データを記録できるFitbitChargeHRに感謝

 [activities-heart-intraday] => Array
        (
            [dataset] => Array
                (
                    [0] => Array
                        (
                            [time] => 00:00:05
                            [value] => 73
                        )

                    [1] => Array
                        (
                            [time] => 00:00:20
                            [value] => 74
                        )

                    [2] => Array
                        (
                            [time] => 00:00:30
                            [value] => 76
                        )

                    [3] => Array
                        (
                            [time] => 00:00:45
                            [value] => 76
                        )

                    [4] => Array
                        (
                            [time] => 00:00:50
                            [value] => 74
                        )

                    [5] => Array
                        (
                            [time] => 00:01:05
                            [value] => 74
                        )

                    [6] => Array
                        (
                            [time] => 00:01:10
                            [value] => 73
                        )

                    [7] => Array
                        (
                            [time] => 00:01:20
                            [value] => 72
                        )

                    [8] => Array
                        (
                            [time] => 00:01:30
                            [value] => 74
                        )

                    [9] => Array
                        (
                            [time] => 00:01:40
                            [value] => 75
                        )

                    [10] => Array
                        (
                            [time] => 00:01:55
                            [value] => 75
                        )

-Fitbit
-,

Copyright© ikuty.com , 2018 AllRights Reserved Powered by AFFINGER4.