RでSony Lifelog APIを叩く(2/3) Lifelogの取得
の続き。
1年半ほど前に携帯電話をXperia Z3に変更してからSmartband SWR10を身に付けている。

SONY ソニー スマートバンド SmartBand SWR10 【並行輸入品】
- 出版社/メーカー: SONY
- メディア: 付属品
- この商品を含むブログ (1件) を見る
睡眠時間や歩数、消費カロリーなどが取得できるのでそれぞれ試して見る。
1. 睡眠ログの取得
Lifelog APIのRequest, ResponseはRequests and responses | Sony Developer Worldに記載されている。
睡眠ログを取得するにはhttps://platform.lifelog.sonymobile.com/v1/users/me/activitiesのリクエストパラメータtypeにsleepを指定する。
library(httr) library(dplyr) library(jsonlite) sleep <- GET("https://platform.lifelog.sonymobile.com/v1/users/me/activity", add_headers(Authorization = paste0("Bearer ", access_token)), query=list( start_time="2016-07-10T00:00:00.000+0900", end_time="2016-07-11T00:00:00.000+0900", type="sleep") ) %>% content("text") %>% fromJSON(flatten = TRUE) str(sleep) List of 1 $ result:'data.frame': 1 obs. of 6 variables: ..$ id : chr "467cb49d-20d5-4d6e-9271-c433654a7a93-2016-07-09" ..$ type : chr "sleep" ..$ sources :List of 1 .. ..$ :'data.frame': 1 obs. of 3 variables: .. .. ..$ name: chr "swr10" .. .. ..$ id : chr "2463b7784d015639/68:76:4F:E9:C6:7A" .. .. ..$ type: chr "smartband" ..$ startTime : chr "2016-07-10T01:47:00.000+09:00" ..$ endTime : chr "2016-07-10T09:21:00.000+09:00" ..$ details.state:List of 1 .. ..$ : chr [1:454] "awake" "awake" "awake" "awake" ...
睡眠の状態はsleep$result$details.stateに含まれており以下の3種類がある。
- awake
- light
- deep
入眠後3時間以内の深い睡眠の割合を返す関数を以下のように定義し、sleep$result$details.stateに適用してみる。
# x: result$details.stateのlist # y: 入眠後y分以内の深い睡眠の割合を返すか getDeepSleepRate <- function(x, y){ deep_sleep_rate <- x %>% unlist() %>% data.frame(state = .) %>% mutate(is.deep = ifelse(state == "deep", 1, 0), no = row_number()) %>% filter(no <= y) %>% summarise(deep_sleep_rate=mean(is.deep)) return(deep_sleep_rate) } map(sleep$result$details.state, getDeepSleepRate, 180) [[1]] deep_sleep_rate 1 0.4555556
1日の睡眠時間はlubridate::ymd_hmsを使用すると簡単に計算できる。
library(lubridate) sleeping_time <- ymd_hms(sleep$result$endTime) - ymd_hms(sleep$result$startTime) sleeping_time Time difference of 7.566667 hours
2. 歩数データの取得
歩数データを取得するにはhttps://platform.lifelog.sonymobile.com/v1/users/me/activitiesのリクエストパラメータtypeにphysicalを指定する。
physical <- GET("https://platform.lifelog.sonymobile.com/v1/users/me/activity", add_headers(Authorization = paste0("Bearer ", access_token)), query=list( start_time="2016-07-10T00:00:00.000+0900", end_time="2016-07-11T00:00:00.000+0900", type="physical") ) %>% content("text") %>% fromJSON(flatten = TRUE)
result$details.stepsにlistで格納されるのでunlist()してsum()で簡単に歩数が取り出せる。
steps <- physical$result$details.steps %>% unlist() %>% sum() steps [1] 8551
3. 消費カロリーの取得
消費カロリーには以下の2つがある。
- 運動で消費したカロリー
- 安静時に消費したカロリー
運動で消費したカロリー
運動で消費したカロリーは歩数と同じようにresult$details.aeeで取得できる。
aee <- activities$result %>% select(details.aee) %>% unlist() %>% sum() aee [1] 1144.062
安静時に消費したカロリー
安静時に消費したカロリーはHow to calculate calories | Sony Developer Worldを見る限りのようだ。
BMRはhttps://platform.lifelog.sonymobile.com/v1/users/meから取得できる。
me <- GET("https://platform.lifelog.sonymobile.com/v1/users/me/", add_headers(Authorization = paste0("Bearer ", access_token)) ) %>% content("text") %>% fromJSON(flatten = TRUE) me$result$bmr * 24 1581.997
一応、上記の計算でlifelogアプリで表示される値とは一致した。(physicalで取得できるaeeはなんだろう。。。)
4. ランニング時間と距離
/me/activityのtype=physicalにはsubtypeもあり、"walk", "run", "bicycle", "other"などがある。
ランニングの時間は以下のように取得できる。
running_time <- physical$result %>% filter(subtype == "run") %>% mutate(difftime = ymd_hms(endTime)-ymd_hms(startTime)) %>% select(difftime) %>% unlist() %>% sum() running_time [1] 48
ランニングの距離はdetails.distanceで取得できるが精度が微妙。
running_distance <- physical$result %>% filter(subtype == "run") %>% select(details.distance) %>% unlist() %>% sum() running_distance [1] 6974.224
Run Keeperだと7.91kmなのでランニングや自転車の運動ログは別で取得した方が良さそう。
- 日々のデータが蓄積できそうなので次はflexdashboardで可視化してみる。