
Obtenir des données du bracelet Fitbit à l’aide de Python et afficher des graphiques dans Grafana
Comment ça va? Aujourd’hui, nous allons avec un document qui intéressera sûrement tous ceux qui ont un bracelet Fitbit, avec lequel vous savez déjà que nous pouvons obtenir des données sur notre mode de vie et ainsi de suite… Puits, si vous voulez exploiter ces informations et les voir dans de beaux graphiques, Ceci est votre document! À l’aide d’un script Python, nous obtiendrons les mesures qui nous intéressent et les stockerons dans une base de données MySQL, et ensuite avec Grafana peindre les graphiques qui nous intéressent!
Comme je suppose qu’il y aura beaucoup de fans ici de Raspberry Pi et autres fricadas, Imaginez que vous ayez un Miroir magique Monté, Vous connaissez déjà un miroir avec des moniteurs derrière lui et vous souhaitez automatiser votre maison en lui donnant une touche supplémentaire et lorsque vous vous voyez dans un miroir, vous savez où en êtes, Les kilomètres parcourus, Mesures prises, calories brûlées, Graphiques de pulsations, Étages grimpés… Puits… Vous pouvez tout réaliser en suivant ces étapes, Un jour, je mettrai à la maison 🙂 des projets intéressants que j’ai mis en place
Ce que j’ai dit, Ce dont nous aurons besoin? Un serveur avec Apache et MySQL installés, Nous allons créer une base de données où nous stockerons ce qui nous intéresse (Nous allons voir quelques exemples), nous nous inscrirons sur le site Web de Fitbit pour créer une application et nous verrons comment obtenir le jeton d’accès que nous utiliserons dans un script python pour aspirer les informations du cloud Fitbit dans un fichier json que nous enregistrerons localement pour l’exporter plus tard vers la base de données. Après cela, il est déjà sucé, car je suis sûr que vous avez déjà installé Grafana (Et si vous n’y jetez pas un coup d’œil Ici), ce que nous allons faire, c’est faire des requêtes MySQL à la base de données pour obtenir ce qui nous intéresse de voir!
Le scénario est très simple, un Raspberry Pi qui tous les jours à la 23:55h exécute un script python qui fait ce qui précède, stocke les données de chaque jour dans les tables de la base de données MySQL et sera accessible de l’endroit où nous avons installé le Grafana, être sur le même Raspberry Pi, sur une autre machine… Comme toujours je vous le dis, Je ne suis ni programmeur ni développeur, Je vais juste vous montrer comment je l’ai obtenu au cas où quelqu’un serait intéressé à faire des choses cool! Bien sûr, il existe d’autres méthodes, Mais celui-ci n’est pas si compliqué!
La première chose à faire est d’accéder au site web de https://dev.fitbit.com et créer un compte si nous n’en avons pas, Après cela, Nous accédons https://dev.fitbit.com/apps/new et créez une application en procédant comme suit:
- Nom de l’application: Nous indiquons un nom descriptif, dans mon cas, Python Pi 197
- Description: Nous écrivons quelque chose qui associe cette application au projet sur lequel nous travaillons.
- Site web de l’application: Nous mettons une URL, Par exemple : http://www.bujarra.com
- Organisation: Nom de l’organisation, p. Par ex: Bujarra
- Site web de l’organisation: Nous indiquons à nouveau l’URL, HTTP://www.bujarra.com
- OHuth 2.0 Type d’application: Nous sélectionnons 'Personnel’
- URL de rappel: Nous quittons http://google.com
- Type d’accès par défaut: Nous confirmons qu’il reste en « Lecture seule ».
Nous enregistrons l’application et sur ses propriétés, nous pourrons voir quelle est notre Client ID et notre Clé secrète client que nous allons écrire là-bas puisque nous allons en avoir besoin.
Nous accédons https://dev.fitbit.com/apps/oauthinteractivetutorial pour générer le Jeton d’accès Qu’est-ce que nous aurons besoin de valider nous-mêmes lorsque nous ferons des requêtes à partir de Python ?. Nous remplissons donc les données dans la section 1, où nous indiquerons notre Client ID, notre Clé secrète client et nous vous demandons de nous rediriger vers n’importe quel site Web, Nous marquons les informations sur notre santé auxquelles nous voulons donner accès et importantes, Nous devons indiquer le délai d’expiration du Jeton (86400 pour 1 jour 604800 pour 1 semaine 2592000 pour 30 Jours 31536000 pour 1 année), La chose normale sera de mettre la valeur de 1 année afin de ne pas avoir à renouveler le Jeton. Cliquez sur le lien qu’il nous montre et ouvrez-le dans un nouvel onglet, nous copions l’URL.
Et dans le rôle 2 Nous collons la réponse et vérifions que les données sont correctes, Si c’est le cas, nous aurons enfin notre Jeton!
Donc, si nous voulons valider que nous pouvons déjà accéder aux données de notre Raspberry, nous pouvons exécuter la commande suivante pour visualiser les données de la distance parcourue le dernier jour chaque minute, Si tout est correct, il l’affichera au format JSON. Courir:
[Code source]curl -H « Autorisation »: Porteur NUESTRO_TOKEN" https://api.fitbit.com/1/user/-/activities/distance/date/today/1d.json[/Code source]
Sur ce site, vous avez plus d’exemples pour voir plus d’informations sur d’autres valeurs ou d’autres périodes: https://dev.fitbit.com/reference/web-api/activity/#get-daily-activity-summary.
Et si tout est correct, nous pouvons créer un petit script que je vais appeler « fitbit_carga_datos.sh‘ qui obtiendra le dernier jour de données Fitbit, la distance parcourue, Les démarches entreprises, Les étages grimpés, le rythme cardiaque ou le temps de sommeil, entre autres informations. Chaque type d’information que je vais enregistrer dans un fichier json que je vais laisser dans le répertoire Apache, puisque nous en aurons besoin plus tard. Il s’agit du script qui charge les données dans la base de données:
[Code source]# DISTANCE
curl -H « Autorisation »: Porteur eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/activities/distance/date/today/1d.json > /var/www/temp/fitbit_distancia.json
/usr/bin/python /accueil/pi/fitbit_distancia.py
# ESCALIER
curl -H « Autorisation »: Porteur eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/activities/steps/date/today/1d.json > /var/www/html/fitbit_pasos.json
/usr/bin/python /accueil/pi/fitbit_pasos.py
# ÉTAGES
curl -H « Autorisation »: Porteur eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/activities/floors/date/today/1d.json > /var/www/html/fitbit_pisos.json
/usr/bin/python /accueil/pi/fitbit_pisos.py
# CŒUR
curl -H « Autorisation »: Porteur eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/activities/heart/date/today/1d.json > /var/www/html/fitbit_corazon.json
/usr/bin/python /accueil/pi/fitbit_corazon.py
# DORMIR
FETXA='date +"%Y-%m-%d"'
curl -H « Autorisation »: Porteur eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/sleep/date/$FETXA.json > /var/www/html/fitbit_dormir.json
/usr/bin/python /accueil/pi/fitbit_dormir.py[/Code source]
Comme nous pouvons le voir, Nous devrons changer et bien mettre notre jeton, Après avoir téléchargé les données depuis le site Web, il les enregistre dans le fichier JSON comme nous l’avons dit, puis exécute un fichier en Python qui prend chaque JSON et l’insère dans une base de données différente.
Nous l’enregistrons et le rendons exécutable!
Donc, Nous devrons créer autant de scripts Python que de métriques que nous allons analyser, Mais avant d’aller plus loin, nous allons faire une halte en cours de route et nous allons Création des bases de données et des tables dont nous avons besoin, qui sera l’endroit où le fichier python importera chaque json dans la TABLE correspondante. On peut le faire via un gestionnaire MySQL tel que HeidiSQL ou directement depuis le shell linux connecté par shell. Nous créons un TABLEAU pour chaque mesure, Dans mon cas, on les appelle les tables: fitbit_distancia, fitbit_pasos, fitbit_dormir… Et ils sont très simples, Avoir 2 Colonnes, Un appelé « kilomètres »’ (FLOTTER) et un autre appelé 'date’ (DATE) dans le cas de la distance DB; dans le fitbit_pasos sera 2 Colonnes: Étapes et date, pour fitbit_pisos: Sols et date… et ainsi de suite, Oui? Nous pourrions également créer une seule table avec plus de colonnes, mais nous y allons chacun comme nous le voulons. Exemple de création de la table:
[Code source]CRÉER LA TABLE 'fitbit_distancia' (
'kilomètres' FLOAT NOT NULL,
'date' DATE NON NULL
)
COLLATE='latin1_swedish_ci’
MOTEUR=InnoDB
;[/Code source]
Après avoir défini l’emplacement de stockage des données, ce que nous allons faire, c’est créer les fichiers python qui liront le fichier JSON avec les données, puis traiteront son contenu en recherchant la valeur qui nous intéresse et en l’insérant dans la table correspondante, Et je suis comme je l’ai eu, J’imagine que ce qui a été dit là-bas sera meilleur.. Je vous laisse un exemple de l’un des fichiers Python, dans ce cas, il sera chargé de lire les kilomètres et de les saisir dans la DB:
fitbit_distancia.py
[Code source]Importer urllib
Importer JSON
importer MySQLdb
db = MySQLdb.connect(« localhost »,« racine »,« MOT DE PASSE »,« NOMBRE_BASE_DATOS »)
curseur = db.cursor()
url = 'http://IP_RASPBERRY/fitbit_distancia.json’
urllib.urlopenr(URL).lire()
Réponse = urllib.urlopen(URL).lire()
json_obj = json.loads(réponse)
pour produit en json_obj[« activités-distance »]:
VALEUR = produit[« valeur »]
DATE = produit[« dateTime »]
curseur.exécuter(« ""INSÉREZ-LE DANS fitbit_distancia (Kilomètre,date) VALEURS (%s,%s) """,(VALEUR,DATE))
db.commit()[/Code source]
Ainsi, Le premier scénario fitbit_carga_datos.sh’ les statistiques du site Fitbit seront téléchargées dans un format JSON, et chaque script Python lira ce JSON et le mettra dans la table correspondante. Pour plus de confort, ou en cas de doute, Je vous laisse mes scripts à ce lien, vous n’aurez plus qu’à mettre votre Token et à créer les tables dont vous avez besoin! Et nous le programmons pour qu’il s’exécute tous les jours à 23:59h, C’est ainsi que vous obtiendrez toutes les métriques de la journée. En 'crontab -e’ Ajouter:
[Code source]59 23 * * * /Accueil/PI/fitbit_carga_datos.sh[/Code source]
Maintenant, le mauvais… bien, Qu’est-ce que cela fait? Obtenez seulement le, Non? Et que se passe-t-il si nous n’avons pas synchronisé? ou si la dernière fois était il y a 4h? Eh bien, oui, Nous perdrions les données non synchronisées, Alors un rouleau, Non? Eh bien, ce que j’ai mis ci-dessus, c’est de comprendre comment cela fonctionne. Qu’est-ce que je fais vraiment ?? Eh bien, similaire à ceci, mais au lieu d’obtenir les indicateurs d’aujourd’hui, Je demande à Ftibit les indicateurs de la semaine dernière! Et ainsi de suite, Oui, par exemple, hier, Ou est-ce que 2 les jours où nous n’avons pas synchronisé le bracelet, Aucun problème, Parce que chaque nuit, j’abaisse les mesures de la dernière 7 jours et je les écrase dans le BD, Comme ça tous les jours, Les derniers sont en train de descendre 7 et problème résolu. Oui?
Alors je vous laisse Voici les scripts Ce que j’utilise, Au cas où vous seriez intéressé à synchroniser uniquement aujourd’hui et à obtenir plus de détails à chaque minute… ou si vous n’êtes intéressé que par le total de chaque jour!
Et plus rien, Nous devrons faire les nôtres Tableaux comme nous les aimons! Ce que j’ai dit, nous utiliserons un Grafana que nous avons déjà. Il ne s’agit rien d’autre que d’ajouter MySQL comme source d’origine et de faire les requêtes qui nous intéressent. Nous pouvons ajouter des panneaux et ajouter des plugins du type Graphique pour réaliser les graphiques typiques… ou Singlestat Pour afficher des valeurs (Résultats des requêtes MySQL)… Si vous regardez cette capture d’écran, J’affiche les données de 2 Bracelets, Le bleu, c’est moi, et le rose, c’est le txabala (Et il l’a depuis quelques semaines), Il s’agit donc de faire ce que vous aimez, Oui? L’idée finale de tout cela sera de le capturer dans un miroir magique qu’un jour je vous montrerai =)
En voici quelques-uns Exemples de requêtes que j’ai utilisés à Grafana au cas où ils vous seraient d’une quelconque utilité:
Tableau des étapes:
[Code source]SELECT pasos comme valeur, « Pas Hector" en tant que métrique, UNIX_TIMESTAMP(date) COMME time_sec DE fitbit_pasos OÙ __timeFilter $(date) Trier par Date ASC[/Code source]
Graphique de distance (kilomètre):
[Code source]SELECT kilomètres comme valeur, « Hector" en tant que métrique, UNIX_TIMESTAMP(date) COMME time_sec DE fitbit_distancia OÙ __timeFilter $(date) Trier par Date ASC[/Code source]
Singlestat montrant les kilomètres que j’ai parcourus cette semaine:
[Code source]Sélectionnez Somme(Kilomètre) de fitbit_distancia OÙ DATE(date) >= CURDATE() – INTERVALLE 7 JOUR[/Code source]
L’utilisation de Grafana, c’est Très très très simple, Donc, vraiment, si vous ne l’avez pas installé, Faites-le ci-dessous Ces instructions puis essayez de créer un tableau de bord, ajouter des panneaux et les modifier (de son titre), Vous verrez que vous avez de nombreuses options et qu’elles sont toutes très faciles à comprendre, afin que vous puissiez le personnaliser totalement à votre guise! Ale, Nous avons notre corps totalement sous contrôle! Nous stockerons dans une base de données toutes les étapes que nous suivrons, Les kilomètres que nous parcourons, Notre battement de cœur, Les heures où nous dormons, Les étages que nous gravissons… Il est temps de l’exploiter!
Nous continuons une autre journée avec plus, Vous verrez quelles choses mignonnes nous pouvons contrôler dans nos vies..