Recupero di dati dal braccialetto Fitbit utilizzando Python e visualizzazione di grafici in Grafana

Que tal? Hoy vamos con un documento que seguro os interesará a todos quelli que tengáis una pulsera Fitbit, con las que ya sabéis que podemos obtener datos sobre nuestro estilo de vida y tal… Bene, si os apetece explotar dicha info y verla en preciosas gráficas, Questo è il tuo documento! Mediante un script en Python obtendremos las misure que nos interesen y los almacenaremos en una BD MySQL, para luego con Grafana pintar las gráficas que nos interese!

Como supongo habrá muchos fan por here de Raspberry Pi y demás fricadas, imaginaros que tenéis un Specchio magico montato, ya sabéis un espejo con monitores behind y queréis domotizar vuestra casa dándole otro toque adicional y al veros en un espejo conocer vuestro avance, los kilomentros recorridos, pasos andados, calorie bruciate, grafici del battito cardiaco, Piani saliti… Bene… puoi ottenere tutto seguendo questi passaggi, un giorno vi mostrerò progetti interessanti che ho realizzato a casa 🙂

 

Cosa ho detto, cosa ci servirà? Un server con Apache e MySQL installati, creeremo un database dove memorizzeremo quello che ci interessa (vedremo un paio di esempi), ci registreremo sul sito di Fitbit per creare un'app e vedremo come ottenere l'Access Token che useremo in uno script Python per prendere le informazioni dal cloud di Fitbit in un file JSON che salveremo in locale per poi esportarlo nel database. Dopo questo è facile, dato che sicuramente hai già installato Grafana (e se no dai un'occhiata aki), quello che faremo sarà eseguire query MySQL sul database per ottenere quello che ci interessa vedere!

El escenario es muy sencillo, una Raspberry Pi que cada día a las 23:55h ejecuta un script de python que hace lo comentado, almacena los datos de cada día en las tablas de la BD de MySQL y se accederá desde donde tengamos el Grafana instalado, sea en la misma Raspberry Pi, en otra máquinaComo siempre ya os digo, no soy programador ni desarrollador, sólo os muestro la forma de cómo lo he conseguido por si alguno está interesado de hacer cosas chulas! Seguro que hay otros métodos, pero este no es tan complicado!

 

Lo primero de todo será acceder a la web de https://dev.fitbit.com y crearnos una cuenta si es que no la tenemos, Dopo di che, accedemos a https://dev.fitbit.com/apps/new y creamos una aplicación nueva siguiendo estos pasos:

  • Application Name: Indicamos un nombre descriptivo, en mi caso Python Pi 197
  • Descrizione: Escribimos algo que nos asocie esta app al proyecto con el que andamos.
  • Application Website: Ponemos una URL, por ejemplo http://www.bujarra.com
  • Organizzazione: Nombre de la organización, p. ad es: Bujarra
  • Organization Website: Indicamos de nuevo la URL, Protocollo HTTP://www.bujarra.com
  • OAuth 2.0 Application Type: Seleccionamos ‘Personal
  • Callback URL: Dejamos http://google.com
  • Default Access Type: Confirmamos que queda como ‘Read Only’.

 

Grabamos la app y sobre sus propiedades ya podremos ver cual es nuestro Client ID y nuestro Client Secret que anotaremos por ahí ya que lo vamos a necesitar.

 

Accediamo a https://dev.fitbit.com/apps/oauthinteractivetutorial para generar el access token que será lo que necesitemos para validarnos al hacer las consultas desde python. Así que cumplimentamos los datos del apartado 1, donde indicaremos nuestro Client ID, nuestro Client Secret e indicamos que nos redirija a cualquier web, marcamos la información de nuestra salud que queremos dar acceso e importante, debemos indicar el tiempo de caducidad para el token (86400 per 1 dia 604800 per 1 settimana 2592000 per 30 Giorni 31536000 per 1 anno), lo normal será poner el valor de 1 año para no tener que renovar el token. Pulsamos en el enlace que nos muestra y lo abrimos en una pestaña nueva, copiamos la URL.

 

Y en la Parte 2 pegamos la respuesta y verificamos que los datos son correctos, si es así tendremos ya por fín nuestro token!

 

Así que mismamente si queremos validar que podemos acceder ya a los datos desde nuestra Raspberry podremos ejecutar el siguiente comando para visualizar los datos de la distancia recorrida el último día cada minuto, si todo es correcto lo mostrará en formato json. Correre:

[Codice sorgente]curl -H "Authorization: Bearer NUESTRO_TOKEN" https://api.fitbit.com/1/user/-/activities/distance/date/today/1d.json[/Codice sorgente]

 

Su questo sito web trovate più esempi per vedere ulteriori informazioni su altri valori o altri periodi: https://dev.fitbit.com/reference/web-api/activity/#get-daily-activity-summary.

 

E se tutto è corretto potremo creare un piccolo script che io chiamerò ‘fitbit_carga_dati.sh‘ che otterrà i dati dell'ultimo giorno da Fitbit, sia la distanza percorsa, i passi fatti, i piani saliti, i battiti cardiaci o il tempo di sonno tra le altre informazioni. Ogni tipo di informazione la salverò in un file json che lascerò nella directory di Apache, perché poi ne avremo bisogno. Questo sarebbe lo script che carica i dati nel DB:

[Codice sorgente]# DISTANZA
curl -H "Authorization: Bearer eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/activities/distance/date/today/1d.json > /var/www/temp/fitbit_distancia.json

/usr/bin/python /home/pi/fitbit_distancia.py

# PASSI
curl -H "Authorization: Bearer eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/activities/steps/date/today/1d.json > /var/www/html/fitbit_pasos.json

/usr/bin/python /home/pi/fitbit_pasos.py

# PISOS
curl -H "Authorization: Bearer eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/activities/floors/date/today/1d.json > /var/www/html/fitbit_pisos.json

/usr/bin/python /home/pi/fitbit_pisos.py

# CORAZON
curl -H "Authorization: Bearer eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/activities/heart/date/today/1d.json > /var/www/html/fitbit_corazon.json

/usr/bin/python /home/pi/fitbit_corazon.py

# DORMIR
FETXA=`date +"%Y-%m-%d"`
curl -H "Authorization: Bearer eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/sleep/date/$FETXA.json > /var/www/html/fitbit_dormir.json

/usr/bin/python /home/pi/fitbit_dormir.py[/Codice sorgente]

 

Come possiamo vedere, tendremos que changer y poner bien nuestro token, tras descargarse los datos de la web los guarda en el fichero json como dijimos y a posteriori executa un fichero en python que coge cada json y lo inserta en distinta base de datos.

Lo guardamos y lo hacemos ejecutable!

 

Pertanto, deberemos crear tantos script de python como métricas vayamos a analizar, pero antes de seguir vamos a hacer un alto en el camino y vamos a crear las base de datos y las tablas che necessitiamo, que será donde el fichero python importará cada json en la TABLA correspondiente. Podemos hacerlo mediante un gestor de MySQL como es HeidiSQL o directamente desde la shell de linux conectadonos por shell. Creamos una TABLA para cada medida, en mi caso se llaman las tablas: fitbit_distancia, fitbit_pasos, fitbit_dormiry son muy sencillas, tienen 2 Colonne, una llamada ‘kilometros’ (FLOAT) y otra llamada ‘fecha’ (DATE) en el caso de la BD de distancia; en el de fitbit_pasos serán 2 Colonne: pasos y fecha, para fitbit_pisos: pisos y fechay así el resto, Sì? Potremmo creare un'unica tabella con più colonne anche, ma andiamo ciascuno come vuole. Esempio per creare la tabella:

[Codice sorgente]CREATE TABLE `fitbit_distancia` (
`kilometri` FLOAT NOT NULL,
`data` DATE NOT NULL
)
COLLATE='latin1_swedish_ci’
ENGINE=InnoDB
;[/Codice sorgente]

 

Dopo aver definito dove vengono archiviati i dati, quello che faremo è creare i file Python che leggeranno i file JSON con i dati e poi ne tratteranno il contenuto cercando il valore che ci interessa e inserendolo nella tabella corrispondente, e questo è il modo in cui ci sono riuscito, immagino che ci siano modi migliori delle solite cose dette.. Vi lascio un esempio di uno dei file Python, in questo caso sarà responsabile di leggere i chilometri e inserirli nel DB:

 

fitbit_distancia.py

[Codice sorgente]Importa urllib
Importare JSON
importare MySQLdb
db = MySQLdb.connect("localhost","root","CONTRASEÑA","NOMBRE_BASE_DATOS")
cursore = db.cursore()

url = ‘http://IP_RASPBERRY/fitbit_distancia.json’
urllib.urlopen(URL).leggere()
response = urllib.urlopen(URL).leggere()

json_obj = json.loads(risposta)

for product in json_obj["activities-distance"]:
VALORE = product["value"]
DATA = product["dateTime"]
cursore.execute("""INSERT INTO fitbit_distancia (chilometri,dattero) VALORI (%s,%s) """,(VALORE,DATA))
db.commit()[/Codice sorgente]

Così, il primo script ‘fitbit_carga_dati.sh’ scaricherà le statistiche dal sito web di Fitbit in un JSON, e ogni script Python leggerà questo JSON e lo inserirà nella tabella corrispondente. Per maggiore comodità, o se avete dubbi, vi lascio i miei script a questo link, dovrete solo inserire il vostro Token e creare le tabelle necessarie! E programmiamo in modo che ogni giorno venga eseguito alle 23:59h, così otterrà tutte le metriche del giorno. In ‘crontab -e’ Aggiungere:

[Codice sorgente]59 23 * * * /home/pi/fitbit_carga_dati.sh[/Codice sorgente]

 

Ora la parte negativa… Non male, questo è ciò che fa? Obtiene sólo lo de hoy, No? Y qué pasa si no hemos sincronizado? o si la última vez fue hace 4h? Beh, sì, perderíamos los datos no sincronizados, así que un rollo, No? Bien esto que os puse arriba es para comprender cómo funciona. Realmente qué hago yo? Pues simile a esto, pero in una volta di ottenere le metriche di hoy, a Ftibit le pido las métricas de la última semana! Y así, si por ejemplo ayer, o hace 2 días que no tenemos la pulsera sincronizada, Va bene, ya que cada night me bajo las métricas de los ultims 7 días y las machaco en la BD, así cada día, se baja los últimos 7 y problema solucionado. Sì?

Así que os dejo aquí los scripts que estoy utilizando, por si lo che te interesa es sincronizar solo hoy y ottenere con più dettaglie de cada minuto… o por si te interesa únicamente el total de cada día!

 

Y ya nada, nos quedará hacer nuestros Dashboard como nos gusten! Cosa ho detto, usaremos un Grafana que ya tengamos. No es más que añadir como fuente de origen MySQL y hacer las consultas que nos interesen. Podremos aggiungere paneles y añadir los plugins de tipo Graph para hacer las típicas gráficas… o Singlestat para mostrar valores (resultados de consultas MySQL)… Si os fijáis en este pantallazo, estoy mostrando datos de 2 Bracciali, azul soy yo y rosa es la txabala (y hace pocas semanas que la tiene), así que es hacer cada uno lo che le guste, Sì? La idea finale de todo esto será plasmarlo en un espejo mágico que un giorno os lo insegnare =)

Os dejo algunas consultas de ejemplo que usé en Grafana por si os son de alguna utilidad:

Grafico dei passi:

[Codice sorgente]SELECT passi as value, "Pasos Hector" come metrico, UNIX_TIMESTAMP(dattero) as time_sec FROM fitbit_pasos WHERE $__timeFilter(dattero) order by fecha asc[/Codice sorgente]

Grafico della distanza (km):

[Codice sorgente]SELECT kilometri as value, "Hector" come metrico, UNIX_TIMESTAMP(dattero) as time_sec FROM fitbit_distancia WHERE $__timeFilter(dattero) order by fecha asc[/Codice sorgente]

Singlestat che mostra i chilometri fatti questa settimana:

[Codice sorgente]select sum(chilometri) from fitbit_distancia WHERE DATE(dattero) >= CURDATE() – INTERVALLO 7 DAY[/Codice sorgente]

 

Usare Grafana è molto molto molto semplice, quindi davvero, se non lo hai installato, fallo seguendo queste istruzioni e poi prova a creare un Dashboard, aggiungi Pannelli e modificali (dal loro titolo), vedrai che hai molte opzioni e tutte molto facili da capire, così puoi personalizzarlo completamente a tuo piacimento! Birra, abbiamo il nostro corpo completamente sotto controllo! Memorizzeremo nel database tutti i passi che facciamo, i chilometri che percorriamo, i battiti del nostro cuore, las horas que dormimos, los pisos que subimostoca explotarlo!

 

Continuiamo un altro giorno con altro, ya veréis que cosas más cuquis podemos ir controlando de nuestra vida..

 

Post consigliati

Autore

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, Non esitate a contattarmi, Cercherò di aiutarti ogni volta che potrò, Condividere è vivere ;) . Goditi i documenti!!!