もみあげあしめ

組み込みとかIoTとか、いろいろ

Fitbit Charge HRの心拍数データを取得する

Fitbit Charge HR を使い始めて約半年、以前に増して健康的な生活を送っている私です。

f:id:shima_nigoro:20160529001941p:plain:w300

嘘です。ウェアラブル端末つけただけで健康になるなら、誰も苦労しません。

前置きはここまでにしておいて、今回はクラウドにアップロードされた
データをスマホアプリなしで取得する方法をまとめます。

準備するものは Python 2.7 以上がインストールされた UNIX PC( VM でも可)のみです。
Windows環境で使いたいという場合は、下記の記事をどうぞ。

1. Fitbitの開発者向けサイトでアプリケーションを登録する

データを取得するAPIを使うためには dev.fitbit.com でアプリケーションの登録が必要。

アプリケーションを登録するといっても、個人で利用するだけなので項目は
適当に入れても問題ないと思われる。#Organizationとか特にないし

ただし、「Callback URL」と「OAuth 2.0 Application Type」は、下記を入力。

項目 設定値 備考
Callback URL http://127.0.0.1:8080/ ポートがぶつかるならば変更必要
OAuth 2.0 Application Type Personal -

ちなみに、後で自由に変えられるし、消したりもできるので間違っても問題なし。

2. データ取得用のクライアントをインストールする

Pythonで実装されたFitbit向けのAPIを利用します。
GitHub - orcasgit/python-fitbit: Fitbit API Python Client Implementation

とりあえずクライアントをダウンロード

git clone https://github.com/orcasgit/python-fitbit

READMEに追加のパッケージをインストールするよう書いているので、下記コマンドを実行

sudo pip install -r requirements/base.txt

pip が使えなかった方は下記コマンドでインストール
#ちゃっかりcurlもインストールしていますが

sudo apt-get install curl
sudo curl -kL https://bootstrap.pypa.io/get-pip.py | python

cherrypy が必要となるので、インストールしておく。

sudo pip install cherrypy

#なぜかREADMEには必要と書かれていないが…
requirements/base.txt にもありますが、tox もインストールされるみたいなのでお好みでどうぞ。

3. APIを利用するための認証を行う

アプリケーション登録時に設定した「Callback URL」を http://127.0.0.1:8080/ 以外
にした場合は3.1から、そうでなければ3.2から。

3.1 「Callback URL」の設定を反映する。

gather_keys_oauth2.py を下記のように修正します。

#!/usr/bin/env python
import cherrypy
cherrypy.config.update({'server.socket_host':'hoge','server.socket_port':1234})
'''#途中省略'''
class OAuth2Server:
    def __init__(self, client_id, client_secret,
                 redirect_uri='http://hoge:1234/'):

※「Callback URL」を http://hoge:1234/ とした場合

3.2 ACCESS_TOKENとREFRESH_TOKENの取得

自分の登録したアプリケーションの「OAuth 2.0 Client ID」と「Client Secret」を dev.fitbit.com/apps
から取得して、下記コマンドを実行

./gather_keys_oauth2.py hoge fuga

※「OAuth 2.0 Client ID」を hoge 、「Client Secret」を fuga とした場合

コマンドを実行するとブラウザが立ち上がるので、そのままログインする。
ログイン後はAPIで利用する項目を選択できるので必要な項目にチェックを入れて進む

認証に成功するとブラウザ上に「You are now wuthorized to access the Fitbit API!」と表示される。
この操作は初回のみで、以降はブラウザ上の操作は不要になります。

4. データを取得する(1日分の1分単位の心拍数を取得するサンプル)

下記のコードを適当な名前のファイル(save_hr.py)等で保存する。※こちらを参考にしました。
Python勉強中(16年5月29日時点で約1日)であるので、ツッコミは受け付けます。

import sys
import fitbit
import gather_keys_oauth2 as Oauth2

if (len(sys.argv) < 2):
    print 'Usage: # python %s YYYY-MM-DD' % sys.argv[0]
    quit()

"""for Save file."""
BASE_DATE = sys.argv[1]
OUTPUT_FILE = "HR_%s.csv" % BASE_DATE

"""for OAuth2.0"""
USER_ID = 'hoge'
CLIENT_SECRET = 'fuga'
 
"""for obtaining Access-token and Refresh-token"""
server = Oauth2.OAuth2Server(USER_ID, CLIENT_SECRET)
server.browser_authorize()
 
"""Authorization"""
auth2_client = fitbit.Fitbit(USER_ID, CLIENT_SECRET, oauth2=True, access_token=server.oauth.token['access_token'], refresh_token=server.oauth.token['refresh_token'])
 
"""Getting data"""
fitbit_stats = auth2_client.intraday_time_series('activities/heart', BASE_DATE, detail_level='1min')
 
"""Getting only 'heartrate' and 'time'"""
stats = fitbit_stats['activities-heart-intraday']['dataset']
 
"""Timeseries data of Heartrate"""
csv_file = open(OUTPUT_FILE, 'w')
for var in range(0, len(stats)):
    csv_file.write(stats[var]['time'])
    csv_file.write(",")
    csv_file.write(str(stats[var]['value']))
    csv_file.write("\n")
csv_file.close()

※「OAuth 2.0 Client ID」を hoge 、「Client Secret」を fuga とした場合

下記のように実行すると受信データをCSV形式のファイル(HR_YYYY-MM-DD.csv
に変換して実行ディレクトリに保存するようにしています。

python save_hr.py YYYY-MM-DD > /dev/null

#YYYY-MM-DD は 2016-05-29 などです。誤った場合は取得できないと思います。

その他のAPIの詳細は Overview — Python-Fitbit 0.2.2 documentation

おまけ

ちなみに表計算ソフトを使ってプロットするとこんな感じになります。
f:id:shima_nigoro:20160529171437p:plain
#4時くらいにめっちゃ心拍数落ちてるけど、これって…。

ほかにも、眠りの浅い深いなどが取れるらしいので、レム睡眠とノンレム睡眠の間隔を
明らかにできればベストな睡眠時間がわかるかもしれないですね。これで健康まっしぐらです!

参考:Fitbit APIとPythonで心拍数時系列データの取得方法 | ミスターだけどドクターの頭の中