読者です 読者をやめる 読者になる 読者になる

INPUTしたらOUTPUT!

忘れっぽいんでメモっとく

RでSony Lifelog APIを叩く(2/3) Lifelogの取得

R

estrellita.hatenablog.com

の続き。

1年半ほど前に携帯電話をXperia Z3に変更してからSmartband SWR10を身に付けている。

睡眠時間や歩数、消費カロリーなどが取得できるのでそれぞれ試して見る。


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 \times Hours
}のようだ。

BMRhttps://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なのでランニングや自転車の運動ログは別で取得した方が良さそう。

f:id:tak95:20160712201724p:plain:w200 f:id:tak95:20160712201733p:plain:w200


  • 日々のデータが蓄積できそうなので次はflexdashboardで可視化してみる。