Help us understand the problem. What is going on with this article?

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と、コーディングのときに使います。
CAA1AF1C-D92E-455D-B726-9CB7553F7DDF.jpeg

OAuth2.0

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

screencapture-dev-fitbit-apps-oauthinteractivetutorial-2019-12-16-15_56_46.png

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で可視化していきましょう!
先ずは睡眠データのみで見てみます。
スクリーンショット 2019-12-16 7.27.32.png

うーん。。。fitbit上の下記のグラフと同じような感じで表示される予定でしたが微妙な感じですね。
116BE966-157D-4967-B246-13BB5D431F2C.png

とりあえず、このままmicro:bitで取っていた気温データも併せて見てみましょう!
このような結果となりました。
スクリーンショット 2019-12-16 1.47.59.png
本当は2つのグラフを重ねて見たかったのですがデータの持ち方にもう少し工夫が必要ですね。
サンプルが1日分しかないので相関もよく分からない…

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした