fitbit の睡眠データと気温を可視化してみる


はじめに

株式会社ピー・アール・オーのアドベントカレンダー16日目です。

先月(2019/11)、Googleが買収に乗り出したことでちょっとした話題になっていたfitbitのAPIを使って気温と睡眠の深さに相関はみられるかMetabaseで見よう!というのが今回の投稿です。

気温のデータは、以前投稿した、micro:bit(weather:bit)のセンサーで取得した値を利用します。

アプリの登録

さて、先ずはfitbitのデベロッパーサイトからRegister An Appのページに進んで(右上、メニュー Manage → Register An App)組織・アプリの必要情報を登録します。

登録完了後に表示される[OAuth 2.0 Client ID]、[Client Secret]は、
OAuthと、コーディングのときに使います。

OAuth2.0

お次はOAuthです。
親切にOAuthを実行するためのチュートリアルページが用意されてるので、こちらを使いました。
アプリ登録完了ページの左下にある[OAuth 2.0 tutorial page]から遷移できます。

1: Authorize
Flow type: [Authorization Code Flow] を選択。
OAuth 2.0 Client ID:[先程取得したClient ID] を入力
Client Secret:[先程取得したClient Secret] を入力
Redirect URI:[http://localhost/] を入力

https://www.fitbit.com/oauth2/authorize から始まるURLをクリックすると、
http://localhost/ にコールバックでリダイレクトされるのでGETパラメータに入っているcode=以降の値から #= より前までの値をコピーして、下記入力項目に貼り付けます。
1A Get Code
Code: [8bdXXXXXXXXXXXXXXXXXXXXX] を入力。

上記まで入力するとテキストエリアに、
curlコマンドが表示されるのでコピーしてターミナル等で実行。

2: Parse response
Parse response のテキストエリアに直前で実行したcurlコマンドの実行結果を貼り付けると、整形してくれるので、[Access token:]、[Refresh Token:] に表示された値をメモしておく。
コーディングのときに使います。

OAuth はここまで大丈夫です。

コーディング

これで準備が整ったのでいよいよコーディングです!

sleep.py
import fitbit
import pprint
import datetime
import pymysql.cursors

consumer_key = '22BXXX'
consumer_secret = '1c0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
access_token = "eyJXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
refresh_token = 'e0fXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

now = datetime.datetime.now()
yesterday = now - datetime.timedelta(days=1)
# 取得する日付(前日)
DATE = yesterday.strftime('%Y-%m-%d')

client = fitbit.Fitbit(consumer_key, consumer_secret, access_token, refresh_token)
sleeps = client.sleep(DATE)

# 起点日時('startTime': '2019-12-12T23:29:30.000')
date_time = datetime.datetime.fromisoformat(sleeps['sleep'][0]['startTime'])

sql = "INSERT INTO sleeps(stage, date_time) VALUES (%s, %s)"
values = []

for item in sleeps['sleep'][0]['minuteData']:
    values.append([item['value'], date_time.strftime('%Y-%m-%d %H:%M:%S')])
    # 1分間隔なので決め打ちで+1分
    date_time += datetime.timedelta(minutes=1)

conn = pymysql.connect(host='127.0.0.1',
                    db='sandbox_db',
                    user='root',
                    charset='utf8mb4',
                    cursorclass=pymysql.cursors.DictCursor)

pprint.pprint(values)
cur = conn.cursor()
cur.executemany(sql, values)
conn.commit()

コードはこれだけです。sleepのAPIを実行した結果をMySQLに入れてます。
これをcronに仕込んで毎日お昼頃あたりに流せば睡眠データが蓄積されます。

結果

さぁ、Metabaseで可視化していきましょう!
先ずは睡眠データのみで見てみます。

うーん。。。fitbit上の下記のグラフと同じような感じで表示される予定でしたが微妙な感じですね。

とりあえず、このままmicro:bitで取っていた気温データも併せて見てみましょう!
このような結果となりました。

本当は2つのグラフを重ねて見たかったのですがデータの持ち方にもう少し工夫が必要ですね。
サンプルが1日分しかないので相関もよく分からない…

蓄積されてきたら改めて分析してみたいと思います!以上です!