もみあげあしめ

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

Windows で Fitbit の心拍数データを取得する

前回は UNIX 環境を前提に記事を書いていましたが、Windows10 にPython2.7を入れてみたので
Windows 環境でも同じようにスクリプトが使えるか、試してみました。

準備するものは Python 2.7 以上がインストールされた Windows PC のみです。
ちなみに、Python のインストールは10分あれば終わります。

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

とりあえずクライアントをダウンロード(Clone or Download ⇒ DownLoad Zipを選択)
f:id:shima_nigoro:20160717121639p:plain:w450

ダウンロードした zip は任意のディレクトリに展開する

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

pip install -r requirements/base.txt

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

pip install cherrypy

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
から取得して、スクリプトコマンドプロンプトから実行

python 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勉強中であるので、ツッコミは受け付けます。

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 download_hr.py 2016-07-15 > nul 2>&1

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

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

おまけ

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

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

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