Cela fait presque un an que j'ai commencé à utiliser fitbit, mais je n'ai pas beaucoup touché à l'API car je ne développais que le cadran de l'horloge et les applications, et à cause de mes propres recherches, cette fois, j'ai essayé d'acquérir des données d'activité en temps réel. C'était.
C'était correct d'écrire dans la base de données, mais j'ai choisi d'écrire rapidement sur la feuille parce que mes connaissances sont encore au niveau du bébé. (Je veux étudier bientôt)
La raison pour laquelle (?) Est ajouté après le temps réel sera expliquée plus tard. ..
Divisez grossièrement et suivez la procédure suivante.
Je vais procéder immédiatement!
Ceci est une autre application puissante du début, mais en se référant à l'article ici
Veuillez obtenir et régler. En passant, mes paramètres d'enregistrement d'application sont les suivants.
article | Concents entrés |
---|---|
Application Name | HeartRate Watcher |
Description | watch my heart rate |
Application Website | http://localhost/ |
Organization | personal |
Organization Website | http://localhost/ |
OAuth 2.0 Application Type | Personal |
Callback URL | http://127.0.0.1:8080/ |
Default Access Type | Read-Only |
get_hr.py
import fitbit
from ast import literal_eval
CLIENT_ID = "XXXXXX"
CLIENT_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
TOKEN_FILE = "token.txt" #Dans le même répertoire.Créer un txt
tokens = open(TOKEN_FILE).read()
token_dict = literal_eval(tokens)
access_token = token_dict['access_token']
refresh_token = token_dict['refresh_token']
def updateToken(token):
f = open(TOKEN_FILE, 'w')
f.write(str(token))
f.close()
return
authed_client = fitbit.Fitbit(CLIENT_ID, CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN, refresh_cb=updateToken)
Une fois l'autorisation de ʻauthed_client` terminée, vous pouvez récupérer les données comme vous le souhaitez.
C'est la fin de STEP1.
Puisque Python écrit dans la feuille de calcul, nous enregistrons également l'API ici.
STEP2 a également une explication très très polie sur ici, alors réglez-la pendant la lecture.
get_hr.py
import gspread
import json
from oauth2client.service_account import ServiceAccountCredentials
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('************.json', scope)
gc = gspread.authorize(credentials)
SPREADSHEET_KEY = '******************'
worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1
Une fois que vous avez enregistré les informations ci-dessus, vous pouvez lire et écrire autant que vous le souhaitez!
Je voudrais dire, mais comme il y a une ** limite de demande de 100 pour 100 secondes **, je suis pris de façon inattendue. Elle est considérée comme une seule demande pour chaque acquisition ou mise à jour de valeur de cellule, essayez donc d'éviter autant que possible les emplacements réutilisables et l'écriture supplémentaire. (Je ne sais pas si je vais bien.)
C'est la fin de STEP2.
Après avoir enregistré diverses informations, il est enfin temps d'obtenir les données.
data_sec = authed_client.intraday_time_series('activities/heart', 'YYYY-MM-DD', detail_level='1sec')
heart_sec = data_sec["activities-heart-intraday"]["dataset"]
Définissez la date des données que vous souhaitez acquérir avec AAAA-MM-JJ
et l'intervalle de données avec niveau_détail
.
detail_level
peut être sélectionné parmi [1sec, 1min, 15min].
heart_sec contient la fréquence cardiaque sous la forme de {time: mm: hh: ss, value: **}
.
Vous pouvez le laisser tel quel, mais je voulais ajouter des informations de date, je l'ai donc modifié un peu comme suit avant de le sortir.
def get_heartrate_data(date):
data_sec = authed_client.intraday_time_series('activities/heart', date, detail_level='1sec')
heart_sec = data_sec["activities-heart-intraday"]["dataset"]
for data in heart_sec:
datetime = date + " " + data['time']
data['datetime'] = datetime
del data['time']
return heart_sec
Après cela, je vais le jeter sur la feuille, alors laissez-le au format json.
C'est la fin de STEP3.
Il y a aussi des gens qui ont soigneusement résumé la méthode d'acquisition, donc si vous voulez essayer autre chose que la fréquence cardiaque, veuillez vous référer à ici. ..
La dernière étape consiste à écrire sur la feuille.
Faites une liste des données que vous souhaitez saisir et lancez-les une par une. Il est bon d'utiliser append () pour en écrire un sous la dernière cellule, donc je vous laisse tout.
headers = ['value', 'datetime'] # keys
def set_data_to_sheet(datas):
for data in datas:
column = []
for header in headers:
column.append(data[header])
worksheet.append_row(column)
Après avoir terminé les préparatifs ci-dessus, créez une fonction job () pour une exécution périodique.
def get_latest_data(data):
list_num = len(data)
new_list = []
for i in range(list_num-30, list_num):
new_list.append(data[i])
return new_list
def job():
now = datetime.datetime.now()
date = now.strftime('%Y-%m-%d')
data = get_heartrate_data(date)
latest_data = get_latest_data(data)
set_data_to_sheet(latest_data)
Obtenez simplement les 30 dernières données avec le paramètre de date, get_latest_data
et écrivez-les sur la feuille.
Après cela, afin de réaliser l'acquisition ** en temps réel **, elle est périodiquement exécutée par cron etc. une fois toutes les 30 secondes. La limite de l'API fitbit étant de 150 accès / 1H, elle est définie avec une petite marge.
** La fréquence cardiaque en temps réel peut être obtenue !! **
Cela ne s'est pas bien passé et le résultat a été le suivant. .. (Extrait de 1 exemplaire)
Il devait être mis à jour toutes les 30 secondes, mais il y a un délai d'environ 15 minutes pour mettre à jour les dernières informations. Ce qui est pertinent ici, c'est la spécification concernant le téléchargement des données. Étant donné que vous ne pouvez pas vous connecter au cloud directement depuis fitbit, vous devrez passer par votre smartphone une fois pendant la communication. Cependant, il semble que fitbit et le smartphone ne soient synchronisés qu'à des intervalles d'environ 15 minutes, donc je pense que ce problème se produit. (La synchronisation est toujours activée, mais c'est un équilibre avec différentes batteries)
Comme vous pouvez le voir, l'acquisition en temps réel à 30 secondes d'intervalle à l'aide de l'API semble être difficile jusqu'à présent, je l'ai donc modifiée comme suit.
Si vous organisez la situation
--Mise à jour des dernières informations environ une fois toutes les 15 minutes
--Lorsque vous regardez heart_sec
, la fréquence cardiaque est enregistrée environ une fois toutes les 5 secondes (elle doit être réglée toutes les 1 s, mais elle ne peut pas être aidée fréquemment)
-C'est-à-dire, enregistrez environ 12 fois par minute
Par conséquent, au moment où les dernières informations sont téléchargées, 12 x 15 = environ 180 enregistrements seront accumulés.
Ensuite, écrivez 180 données en exécutant cron toutes les 15 minutes!
J'ai pensé, mais ici je suis coincé avec ** 100 demandes de limite par 100 secondes **.
J'ai essayé d'écrire 180 données à la fois, mais j'ai rencontré une limite. (Bien sûr) Donc, j'ai réussi à dépasser la limite avec la technique de puissance de dormir pendant 1 seconde à chaque fois que j'écrivais. (Cela prend beaucoup de temps) (Lancer vers la base de données est extrêmement intelligent)
Après tout, je ne pouvais pas obtenir et écrire des données immédiatement, alors "Une fois toutes les 15 minutes, 180 données non téléchargées sont écrites sur la feuille en 180 secondes." C'est devenu un système très maladroit.
Cependant, puisque la feuille enregistre les données sans autorisation, il semble qu'elle puisse être utilisée pour une sorte d'analyse.
Tant que vous écrivez sur la feuille, vous pouvez la visualiser immédiatement. Je veux dire, même si vous ne l'écrivez pas, vous pouvez créer un graphique plus facilement en le convertissant en DataFrame, je vais donc omettre les détails ici.
À titre d'exemple, voici un graphique de 24 heures de fréquence cardiaque par jour. Vous pouvez voir que la fréquence cardiaque est faible de minuit au petit matin lorsque le sommeil est profond, et augmente progressivement après le réveil.
Si vous le gérez correctement dans la base de données, vous pourrez créer des graphiques sympas et dynamiques, il s'agit donc d'un problème futur.
Nous avons terminé une série d'étapes telles que la configuration de diverses API, l'acquisition d'informations Fitbit, l'écriture sur une feuille et la visualisation.
Ce n'était pas exactement en temps réel, mais j'aimerais créer un système de visualisation intelligent et des applications intéressantes qui peuvent tolérer même des intervalles de 15 minutes.
En plus de la fréquence cardiaque, vous pouvez enregistrer les calories, les pas, le sommeil, etc., veuillez donc l'essayer pour les utilisateurs fitbit et les utilisateurs non-fitbit!