トップ 履歴 一覧 Farm ソース 検索 ヘルプ RSS ログイン

タニタ体組成計からデータを取得する


キーワード

最終更新時間:2018年04月05日 23時43分13秒
アフィリエイト・広告について
プライバシーポリシー

はじめに

私はデブですw もともと、痩せていた時期は人生の中でほとんどなかったと思いますが、特に就職してからは体重の増加ペースが更に加速しました。

そんな中で、いまさらながら、少しは運動して健康体に近づこうと思っています。合わせて、その過程のデータも取得できれば、研修などの場面でネタとしても使えるな、と思い、体重をはじめとした身体データ (バイタルデータ) を収集・蓄積することにしました。

この記事では、ダイエットの経過ではなく、タニタ社の体組成計でバイタルデータを計測し、RでAPIを経由してデータを取得する方法を紹介します。

なお、第54回Tokyo.Rで発表を聞いていたにも関わらず、すっかり忘れていましたが、@teramonagiさんがhealthplanetパッケージを公開されています。なので、以下は車輪の再発明というか、二番煎じというか、取り立てて新規なものではありませんでした。まぁ、自分の検証過程としてはとても勉強になったのでよいのですが。healthplanetパッケージについては、teramonagiさんのTokyo.Rにおけるスライドが参考になります。

タニタ社体組成計とHealthPlanet

タニタ食堂などで有名な、計量器メーカータニタ社はシンプルな体重計から身体の様々な健康状態を測定 (推定?) する体組成計、睡眠計口臭計など多様な商品を販売しています。

また、体組成計などのユーザーを対象に、測定データ等を記録、蓄積し体調管理するためのHealthPlanetというWebサイトを運営しています。


HealthPlanetは、スマートフォン用のアプリも提供しています。

一部の体組成計は、BluetoothやWiFiによる通信機能を有しており、測定値をスマートフォンアプリに転送できます。


また、タニタ社では、HealthPlanetに蓄積されたバイタルデータを取得できるWeb APIを提供しています。

このような仕組みが整っていることから、筆者はタニタ社のBluetooth対応体組成計RD-906を購入し、データを蓄積、収集することにしました。


Amazon.co.jp: タニタ 体重・体組成計 インナースキャンデュアル スマホ対応 レッド RD-906

バイタルデータの測定

まずは、体組成計で体重その他のデータを計測します。基本的には、体組成計の近くでHealthPlanetアプリを起動し、「データを入力」メニューを選択すると、体組成計が起動します。あとは、その上に乗るだけで、計測とスマートフォンへの転送が自動的に行われます。

HealthPlanetアプリを使用してバイタルデータを測定、転送した様子


測定したデータはスマートフォンを経由して、HealthPlanetサイトに蓄積されていきます。HealthPlanetアプリ/サイトにも、数値の推移を確認するグラフ画面などがあり、健康管理だけであれば、これで完結しています。しかし、私はこのデータを取得してRでなんやかんやしたい、という希望も持っていますので、以下ではRを使用してHealthPlanet APIからデータを取得し、可視化等を行う仕組みを紹介します。

HealthPlanet APIの認証キーの取得

HealthPlanet APIには、OAuth 2.0による認証が設定されているため、利用するためには以下の2つのキーが必要です。

  • client_id
  • client_secret

これらのキーは、HealthPlanetサイトの「登録情報の確認・変更」から「サービス連携」メニューを選択し、「アプリ連携」メニューの下にある「アプリケーション開発者の方はこちら」をクリックすることで登録画面に遷移し、取得できます。


ここでは、Web/スマホアプリではなくRからアクセスするため、URL、ドメインは適当な値を指定します。


httrパッケージによるAPIアクセス

RからWeb APIにアクセスするためのパッケージは多数ありますが、ここでは "tidyverse" の一部であり、広く使われているhttrパッケージを使用します。

options(dependencies = TRUE)
install.packages("tidyverse")
install.packages("httr")

httrパッケージの使い方については、以下の記事等が参考になります。


 アプリのアクセス許可を得る

HealthPlanet APIを使用するには、まずアプリへのOAuth認証を行う必要があります。Rから以下のようにブラウザを経由して認証します。

library(httr)

client_id <- "XXXXXXXXXX" # 取得したclient_id
url <- "https://www.healthplanet.jp/oauth/auth"
query <- list(client_id = client_id,
              redirect_uri = "https://www.healthplanet.jp/success.html",
              scope = "innerscan", response_type = "code")
BROWSE(url = url, query = query)

これで、ブラウザが起動し、HealthPlanetの認証画面が開きます。登録済みのHealthPlanetログインIDとパスワードを入力し、「ログインする」を選択します。すると、先ほど作成・登録したアプリにアクセス許可を与えるか聞かれるので、「アクセスを許可」を選択します。これで、RからHealthPlanetにアクセスできるようになりました。


なお、この時redirect_uriに指定したURLにcodeというパラメータが付与されて、ページがリダイレクトされます。このcodeを次のトークンを取得する手順で使用しますので、コピーするなどして控えておきます。


 リクエストトークンを取得する

アプリへのアクセス許可は得られましたが、さらに、データにアクセスするためのトークンを入手する必要があります。なお、トークンの入手は上記のアプリ認証から10分以内に行う必要があります。先程と同様に、Rから以下のようなコードを実行します。

client_secret <- "XXXXXXXXXX" # 取得したclient_secret
code <- "XXXXXXXXXX" # 取得したcode
url <- "https://www.healthplanet.jp/oauth/token."
query <- list(client_id = client_id, client_secret = client_secret,
              redirect_uri = "https://www.healthplanet.jp/success.html",
              code = code, grant_type = "authorization_code")
token <- POST(url = url, query = query)

このAPIアクセスの結果は、JSONとして返ってきますので、jsonliteパッケージのfromJSON関数で読み込みます。なお、10分以内にアクセスしなかった場合は、"{\"error\":\"invalid_grant\"}"という結果が返ってきます。

library(jsonlite)
token_json <- fromJSON(content(token, as = "text"))
token_json
$access_token
[1] "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

$expires_in
[1] 2592000

$refresh_token
[1] "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

 体組成データAPIへのアクセス

さぁ、いよいよバイタルデータを取得します。まずは、体重を取得します。上記のaccess_tokenを使用し、以下のようにAPIにアクセスします。

url <- "https://www.healthplanet.jp/status/innerscan.json" # JSONで結果を得る場合。拡張子をxmlにするとXML形式でも取得可能
query <- list(access_token = token_json$access_token, tag = "6021", date = "1")
vital_data <- GET(url = url, query = query)

このAPIアクセスの結果は、JSONとして返ってきますので、jsonliteパッケージのfromJSON関数で読み込みます。

vital_data_json <- fromJSON(content(vital_data, as = "text"))
vital_data_json
$birth_date
[1] "YYYYMMDD" # 設定した生年月日

$data
          date keydata    model  tag
1 201803061743   85.70 01000122 6021
2 201803061441   85.90 01000122 6021
3 201803061435   85.90 01000122 6021
4 201803061429   85.70 01000122 6021

$height
[1] "XXX.X" # 設定した身長

$sex
[1] "XXXX" # 設定した性別


なお、tagとして指定できるパラメータには以下のようなものがあります。

tagデータ
6021体重 (kg)
6022体脂肪率 (%)
6023筋肉量 (kg)
6024筋肉スコア
6025内臓脂肪レベル2(小数点有り、手入力含まず)
6026内臓脂肪レベル(小数点無し、手入力含む)
6027基礎代謝量 (kcal)
6028体内年齢 (才)
6029推定骨量 (kg)

また、fromパラメータとtoパラメータを指定することで、期間を絞ったデータ取得ができます。デフォルトでは、fromは3ヶ月前、toはクエリ実行時点の時刻が入ります。詳細は、Health Planet API 仕様書 Ver1.0を参照してください。

バイタルデータの可視化

今日体組成計が届いたばかりで、データも溜まってないので、そのうち書きます。そして痩せますw

カテゴリ: [R,データサイエンス]