Enregistrez votre fréquence cardiaque sur des feuilles de calcul en temps réel (?) En utilisant Python x fitbit API!

introduction

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. ..

Étapes de mise en œuvre

Divisez grossièrement et suivez la procédure suivante.

1. Inscription à l'API fitbit

2. Inscription à Google Cloud Platform (GCP)

3. Appuyez sur l'API pour obtenir des données Fitbit

4. Écrivez sur la feuille

5. Visualisation (facile)

Je vais procéder immédiatement!

ÉTAPE 1: enregistrement de l'utilisation de l'API Fitbit

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

Ce que j'ai fait à cette étape

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.

ÉTAPE 2: paramètres GCP

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.

Ce que j'ai fait à cette étape

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

Remarques

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.

ÉTAPE 3: Hit API pour obtenir des données

Après avoir enregistré diverses informations, il est enfin temps d'obtenir les données.

Méthode d'acquisition

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].

Un peu déformé

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.

Pour ceux qui souhaitent obtenir d'autres informations

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. ..

ÉTAPE 4: Écrire dans des feuilles de calcul

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)

Exécution périodique

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.

Annonce des résultats

** 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) スクリーンショット 2020-06-03 0.20.15.png

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.

Du temps réel au temps à peu près réel (?)

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.

La solution est ...

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)

Résumé de l'étape 4

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.

ÉTAPE 5: Visualisation

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.

Figure_1.png

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.

en conclusion

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!

Recommended Posts

Enregistrez votre fréquence cardiaque sur des feuilles de calcul en temps réel (?) En utilisant Python x fitbit API!
Obtenez votre fréquence cardiaque à partir de l'API fitbit en Python!
Comment écrire en temps réel hors ligne Résolution des problèmes E04 avec Python
Essayez de vous connecter automatiquement à Netflix en utilisant python sur votre PC
[EV3 x Python] Diffusez les images de la caméra sur votre PC en utilisant mjpg-streamer.
J'ai essayé de classer les accords de guitare en temps réel en utilisant l'apprentissage automatique
Essayez d'utiliser l'API Wunderlist en Python
Essayez d'utiliser l'API Kraken avec Python
Tweet à l'aide de l'API Twitter en Python
Connectez-vous à Slack à l'aide de requêtes en Python
Obtenez des données Youtube en Python à l'aide de l'API Youtube Data
Pour envoyer automatiquement des e-mails avec des pièces jointes à l'aide de l'API Gmail en Python
Continuez à récupérer des tweets contenant des mots-clés spécifiques à l'aide de l'API Streaming en Python
3 façons d'analyser les chaînes de temps avec python [Note]
Procédure pour utiliser l'API WEB de TeamGant (en utilisant python)
Pièces jointes par e-mail à l'aide de votre compte gmail avec python.
Essayez d'utiliser l'API BitFlyer Ligntning en Python
Obtenir l'URL de l'image à l'aide de l'API Flickr en Python
Une manière intelligente de chronométrer le traitement avec Python
Jugons les émotions à l'aide de l'API Emotion en Python
Essayez d'utiliser l'API ChatWork et l'API Qiita en Python
Essayez d'utiliser l'API DropBox Core avec Python
Pour représenter la date, l'heure, l'heure et les secondes en Python
Comment tester unitaire une fonction contenant l'heure actuelle à l'aide de Freezegun en Python
Convertir la date et l'heure zonées en temps Unixtime dans Python2.7
Importez un fichier JPG à l'aide de l'API Google Drive en Python
Comment mesurer le temps de traitement avec Python ou Java
Paramètres initiaux lors de l'utilisation de l'API foursquare avec python
Obtenez des données LEAD à l'aide de l'API REST de Marketo en Python
Obtenez une sortie standard en temps réel avec le sous-processus Python
Essayez de supprimer des tweets en masse à l'aide de l'API de Twitter
OpenVINO utilisant l'API Python d'Inference Engine dans un environnement PC
Convertir l'API asynchrone de style callback en async / await en Python
Essayez la détection des visages en temps réel à l'aide d'une webcam
Publiez sur votre compte en utilisant l'API sur Twitter
Créez votre premier fichier GDSII en Python en utilisant gdspy
Comment quitter lors de l'utilisation de Python dans Terminal (Mac)
[Road to Intermediate Python] Définissez dans votre propre classe
Temps de multiplication à plusieurs chiffres jusqu'à 300 millions de chiffres en python
Comment récupérer plusieurs tableaux à l'aide de slice en python.
Utiliser l'API de recherche de la Bibliothèque du Parlement national en Python
Comment exécuter une commande à l'aide d'un sous-processus en Python
J'ai essayé d'automatiser "un cœur même séparé" à l'aide d'un algorithme génétique en Python