default eye-catch image.

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 parameterformatmeanings dateyyyy-MM-ddデータを取得したい日付 end-dateyyyy-MM-ddデータを取得したい日付(dateと同じである必要がある...) start-timeHH:mm(オプション)取得時間を範囲指定する場合、開始時刻を指定できる end-timeHH:mm(オプション)取得時間を範囲指定する場合、終了時刻を指定できる detail-level1sec 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のエディタに貼り付けたら編集できなくなった。。代わりにデータをプロットしたので貼っておく。 本当に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 )

default eye-catch image.

FitbitAPI Activityデータを時系列で取得する

API概要 ドキュメントはこちら。このAPIを使用することで、Fitbitが管理している各種Activityデータを時系列に取得できる。取得できるActivityデータは大きくactivity系とtracker系の2種類に分類され、それぞれ以下のように分類されている。 Fitbitデバイスの運動計測機能をtrackerと呼び、純粋に運動計測機能により取得したデータをtracker系で取得するようだ。また、その上位層として、手動入力値等の追加データを含むデータをactivity系で取得するようだ。 activity系 keymeans of value activities/calories消費カロリーの集計値。基礎代謝(BMR)とtracker系消費カロリー、および手動入力された消費カロリーの合計 activities/caloriesBMR基礎代謝(BMR)の集計値。Fitbitデバイスが計測したデータに基づき計算された値 activities/steps歩数 activities/distance距離 activities/floors縦方向の移動の階数表現 activities/elevation縦方向の移動距離 activities/minutesSedentary強度により4個に分類された運動強度のうち1レベル目(最弱)の運動時間 activities/minutesLightlyActive2レベル目の運動時間 activities/minutesFairlyActive3レベル目の運動時間 activities/minutesVeryActive4レベル目の運動時間(最強) activities/activityCaloriesSedentaryレベル以上の運動強度について1分毎に計算された消費カロリー。基礎代謝(BMR)や手動入力を含む。 tracker系 keymeans of value activities/tracker/caloriesFitbit trackerにより計測された基礎代謝を含む消費カロリー。手動入力は含まない。 activities/tracker/stepsFitbit trackerにより計測された歩数 activities/tracker/distanceFitbit trackerにより計測された距離 activities/tracker/floorsFitbit trackerにより計測された縦方向の移動の階数表現 activities/tracker/elevationFitbit trackerにより計測された縦方向の移動距離 activities/tracker/minutesSedentary強度により4個に分類された運動強度のうち1レベル目(最弱)の運動時間 activities/tracker/minutesLightlyActive2レベル目の運動時間 activities/tracker/minutesFairlyActive3レベル目の運動時間 activities/tracker/minutesVeryActive4レベル目の運動時間(最強) activities/tracker/activityCaloriesFitbit trackerにより計測されたSedentaryレベル以上の運動強度について1分毎に計算された消費カロリー。基礎代謝(BMR)を含む。手動入力は含まない。 Fitbit Charge/Fitbit Charge HR 保護カバー (Dark Purple) API詳細 RESTfulAPIの書式は2通りある。以下は取得日付が1日のみの場合。 GET /1/user/[user-id]/[resource-path]/date/[date]/[period].json 開始日時、終了日時を指定し、2日以上の時系列データを取得することもできる。 GET /1/user/[user-id]/[resource-path]/date/[base-date]/[end-date].json いずれの形式ともに、resource-pathとして、API概要にて示した key 値を指定する。 実行例 それでは実行例を紹介する。まず、今日(today, 2016/06/09) の activities/calories を取得してみる。 activities-calories-intraday という1日分の非常に詳細なデータも付いてくるが本エントリでは省略する。次回紹介。 /1/user/-/activities/calories/date/today/1d.json Array ( [activities-calories] => Array ( [0] => Array ( [dateTime] => 2016-06-09 [value] => 1082 ) ) [activities-calories-intraday] => Array ( [dataset] => Array ( … ) ) ) 次に、今日(today)と、1週間(1w) を合わせて activities/calories を取得してみる。すると、今日を末日とする1週間分の消費カロリーを取得できた。1w を指定した場合、1日分の詳細データ activities-calories-intraday は出力されなかった。 /1/user/-/activities/calories/date/today/1w.json Array ( [activities-calories] => Array ( [0] => Array ( [dateTime] => 2016-06-03 [value] => 2805 ) [1] => Array ( [dateTime] => 2016-06-04 [value] => 2653 ) [2] => Array ( [dateTime] => 2016-06-05 [value] => 2834 ) [3] => Array ( [dateTime] => 2016-06-06 [value] => 2734 ) [4] => Array ( [dateTime] => 2016-06-07 [value] => 2822 ) [5] => Array ( [dateTime] => 2016-06-08 [value] => 2652 ) [6] => Array ( [dateTime] => 2016-06-09 [value] => 1098 ) ) ) 基礎代謝(BMR)を期間を指定して取得してみる。一定値ではなかった!。Fitbitはtrackerから基礎代謝を計算で求めているということのようだ。すごいすごい。 /1/user/-/activities/tracker/calories/date/2016-06-05/2016-06-06.json Array ( [activities-caloriesBMR] => Array ( [0] => Array ( [dateTime] => 2016-06-05 [value] => 1603 ) [1] => Array ( [dateTime] => 2016-06-06 [value] => 1604 ) [2] => Array ( [dateTime] => 2016-06-07 [value] => 1594 ) [3] => Array ( [dateTime] => 2016-06-08 [value] => 1603 ) ) ) activities/tracker/calories を1日だけ取得してみる。today を指定すると1日分の詳細データが含まれていたが、期間指定により1日分を指定すると詳細データが含まれない。今回のケースでは、activities/calories と activities/tracker/calories は同一値(2834)である。 /1/user/-/activities/tracker/calories/date/2016-06-05/2016-06-05.json Array ( [activities-tracker-calories] => Array ( [0] => Array ( [dateTime] => 2016-06-05 [value] => 2834 ) ) )