default eye-catch image.

FitbitAPI 心拍数ゾーン毎の滞在時間を取得する

一般的に運動の強度を心拍数の下限と上限の範囲で定義することが多いようだ。Fitbitでは心拍数ゾーンが定義されていて、各ゾーンでの滞在時間数を取得できるようになっている。 API概要 書式は2通り用意されている。 GET /1/user/[user-id]/activities/heart/date/[date]/[period].json GET /1/user/[user-id]/activities/heart/date/[base-date]/[end-date].json parameterformatmeaning dateyyyy-MM-ddperiodパラメータを用いて期間指定する場合にその最終日を指定する period1d, 7d, 30d, 1w, 1m定義された識別子により範囲指定を行う。 base-date]yyyy-MM-dd取得範囲を指定する場合の開始日 end-date]yyyy-MM-dd取得範囲を指定する場合の終了日 他のAPIと同様に1か月を超えて範囲を設定することはできない。 レスポンスのスキーマ heartRateZoneオブジェクト parameterformatmeaning caloriesOutXXX.XXXX該当心拍数ゾーンにおける消費カロリー 有効桁数が考慮されている(と思う) maxXXX該当心拍数ゾーンにおける最大心拍数 minXXX該当心拍数ゾーンにおける最小心拍数 minutesXXX該当心拍数ゾーンにおける滞在時間 nameXXX該当心拍数ゾーンを識別する名称Out of Range,Fat Burn,Cardio,Peakが定義されているようだ。このうち、Fat Burnには脂肪燃焼ゾーン、Cardioには有酸素運動ゾーン、のように日本語訳が付けられている。 restingHeartRate安静時心拍数 その他 parameterformatmeaning dateTimeyyyy-MM-ddデータの日時 restingHeartRate安静時心拍数 実行例 customHeartRateZones という空のオブジェクトが返ってきた。どこかで設定できるのだろうか。 Array ( [activities-heart] => Array ( [0] => Array ( [dateTime] => 2016-06-14 [value] => Array ( [customHeartRateZones] => Array ( ) [heartRateZones] => Array ( [0] => Array ( [caloriesOut] => 1480.75044 [max] => 92 [min] => 30 [minutes] => 1137 [name] => Out of Range ) [1] => Array ( [caloriesOut] => 824.94048 [max] => 128 [min] => 92 [minutes] => 221 [name] => Fat Burn ) [2] => Array ( [caloriesOut] => 585.03432 [max] => 156 [min] => 128 [minutes] => 67 [name] => Cardio ) [3] => Array ( [caloriesOut] => 0 [max] => 220 [min] => 156 [minutes] => 0 [name] => Peak ) ) [restingHeartRate] => 69 ) ) )

default eye-catch image.

FitbitAPI BMI、体重データを取得する

体脂肪率と同様にオプション的な扱いだが、Fitbit では 体重、BMI を記録、閲覧できる。 体脂肪率と体重・BMI の両方を取得するにはそれぞれ異なるAPIを叩く必要があるが、これは計測機器への配慮だろう。体重・BMIと体脂肪率を一度に取得するということは、体重・BMI・体脂肪率が全て揃っていることが前提となり、両方測定できる体組成計があることを前提としなければならない。 体重だけであればかなり安価な計測機器があるはずだ。一方で、安価な体重計とWiFi機能の組み合わせは不釣り合いという事情がある。これもIoTのジレンマかな。 ※実際は、体脂肪率データが一緒に記録された場合、このAPIによって体重、BMI、体脂肪率を1度に取得できる。FitbitAPIは仕様との互換性を保ちつつ便利な方向に拡張される傾向がある。 API概要 体重・BMIを取得するRESTfulAPI は以下の通り3パターン用意されている。 GET /1/user/[user-id]/body/log/weight/date/[date].json GET /1/user/[user-id]/body/log/weight/date/[base-date]/[period].json GET /1/user/[user-id]/body/log/weight/date/[base-date]/[end-date].json parameterformatmeaning dateyyyy-MM-ddデータの日付 base-dateyyyy-MM-dd[period]が指定された場合は指定期間の末尾を指定する。[end-date]が指定された場合は指定期間の最初を指定する。 period1d, 7d, 30d, 1w, 1m取得範囲を指定する。1d=1日, 7d=7日, 30d=30日, 1w=1週間, 1m=1か月。1か月と30日が別に用意されていて親切だ。 end-dateyyyy-MM-dd指定期間の末尾を指定する。 データの取得期間は31日を超えてはならない。単位系はHTTPヘッダに付与したAccept-Languageによる。日本は\"ja-JP\"である。 レスポンス レスポンスのスキーマは以下の通りである。 keyformatmeaning bmiXX.XBMI値、(formatは有効桁数を表すと思われる) dateyyyy-MM-ddデータ日付 weightX.XX体重値 (formatは有効桁数を表すと思われる) logIdログID、ユーザ毎にユニークだが、グローバルにユニークではない timeH:i:s計測時刻 (Time of the mesurement) 計測機器がサポートしない場合は前日の最終時刻。 sourceAria,Withthings,APIなど計測装置、入力経路の識別子、[オプション] API経由で入力すると\"API\"が設定される 1日に数回計測した場合の扱いは計測装置の事情によるようだ。Withthingの場合、複数回計測すると最後の値で上書きされる。朝と夜、2回の計測は必須だと思うが、残念ながら計測装置によって目的を達成できない 実行例 最初の書式を叩いてみた。この日は2回計測したのだがデータは1個だけである。上記で説明したスキーマ以外に体脂肪率も付いてきた。仕様通りbmiとweightについては有効桁数が考慮されている。一方、体脂肪率は考慮されていない。 /1/user/[user-id]/body/log/weight/date/2016-06-14.json Array ( [weight] => Array ( [0] => Array ( [bmi] => 22.01 [date] => 2016-06-14 [fat] => 15.918999671936 [logId] => 1465948799000 [source] => Withings [time] => 23:59:59 [weight] => 67.4 ) ) ) 2個目の書式を叩いてみた。「2016-06-14を末尾として1週間取得する」という意味。 GET /1/user/[user-id]/body/log/weight/date/2016-06-14/1w.json Array ( [weight] => Array ( [0] => Array ( [bmi] => 22.01 [date] => 2016-06-07 [fat] => 14.520999908447 [logId] => 1465343999000 [source] => Withings [time] => 23:59:59 [weight] => 67.4 ) [1] => Array ( [bmi] => 22.27 [date] => 2016-06-08 [fat] => 15.515999794006 [logId] => 1465430399000 [source] => Withings [time] => 23:59:59 [weight] => 68.2 ) [2] => Array ( [bmi] => 22.14 [date] => 2016-06-09 [fat] => 14.659999847412 [logId] => 1465516799000 [source] => Withings [time] => 23:59:59 [weight] => 67.8 ) [3] => Array ( [bmi] => 21.94 [date] => 2016-06-10 [fat] => 14.616000175476 [logId] => 1465603199000 [source] => Withings [time] => 23:59:59 [weight] => 67.2 ) [4] => Array ( [bmi] => 21.94 [date] => 2016-06-11 [fat] => 16.163000106812 [logId] => 1465689599000 [source] => Withings [time] => 23:59:59 [weight] => 67.2 ) [5] => Array ( [bmi] => 22.07 [date] => 2016-06-12 [fat] => 14.592000007629 [logId] => 1465775999000 [source] => Withings [time] => 23:59:59 [weight] => 67.6 ) [6] => Array ( [bmi] => 21.94 [date] => 2016-06-13 [fat] => 14.64999961853 [logId] => 1465862399000 [source] => Withings [time] => 23:59:59 [weight] => 67.2 ) [7] => Array ( [bmi] => 22.01 [date] => 2016-06-14 [fat] => 15.918999671936 [logId] => 1465948799000 [source] => Withings [time] => 23:59:59 [weight] => 67.4 ) ) )