17
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

はじめに

株式会社ピー・アール・オーのアドベントカレンダー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日分しかないので相関もよく分からない…

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

17
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?