Obtenint dades de la polsera Fitbit mitjançant Python i mostrant gràfiques a Grafana
Que tal? Avui anem amb un document que segur us interessarà a tots aquells que tingues una polsera Fitbit, amb les quals ja sabeu que podem obtenir dades sobre el nostre estil de vida i tal… bo, si us plau explotar aquesta info i veure-la en precioses gràfiques, aquest és el teu document! Mitjançant un script a Python obtindrem les mesures que ens interessin i els emmagatzemarem en una BD MySQL, per després amb Grafana pintar les gràfiques que ens interessi!
Como supongo habrá muchos fan por aquí de Raspberry Pi y demás fricadas, imaginaros que tenéis un MagicMirror muntat, ya sabéis un espejo con monitores detrás 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, calorias quemadas, gráficas de pulsaciones, pisos subidos… bo… todo lo puedes conseguir siguiendo estos pasos, un día ya os pondré proyectos interesantes que tengo montados en casa 🙂
El que s'ha dit, qué necesitaremos? Un servidor con Apache y MySQL instalado, crearemos una BD donde almacenaremos lo que nos interese (veremos un par de ejemplos), nos registraremos en la web de fitbit para crear una App y veremos cómo obtenir el Access Token que usaremos en un script de python para chupar la info de la nube de Fitbit en un fichero json que guardaremos en local para posteriormente exportarlo a la BD. Tras eso ya está chupado, como seguro que ya tienes Grafana instalado (y si no hecha un vistazo aki), lo que haremos farà consultas MySQL a la BD per obtenir el que ens interessa ver!
El escenario es muy sencillo, una Raspberry Pi que cada dia a las 23:55h executa un script de python que hace lo comentado, almacena los dades de cada dia en les taules de la BD de MySQL y se accederà des d'on tengamos el Grafana instal·lat, mar en la mateixa Raspberry Pi, en una altra màquina… Como siempre ya os digo, no soy programador ni desarrollador, solo os muestro la forma de com lo he conseguido por si alguno està interessat de fer coses chules! Seguro que hay altres métodos, pero este no és tan complicat!
El primer de tot serà accedir a la web de https://dev.fitbit.com i crearem una compte si és que no la tenem, després d'això, accedem a https://dev.fitbit.com/apps/new i creamos una aplicació nova seguint aquests pasos:
- Application Name: Indicamos un nombre descriptivo, en mi caso Python Pi 197
- Description: Escribimos algo que nos associe esta app al projecte con el que andamos.
- Application Website: Ponemos una URL, per exemple http://www.bujarra.com
- Organization: Nombre de la organización, p. ex: Bujarra
- Organization Website: Indicamos de nuevo la URL, 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'.
Agafem l'app i sobre les seves propietats ya podremos ver cual es nuestro Client ID y nuestro Client Secret que anotaremos por ahí ya que lo vamos a necessitar.
Accedim a https://dev.fitbit.com/apps/oauthinteractivetutorial para generar el access token que serà lo que necessitem per validarnos i fer les consultes des de python. Así que cumplimentamos los dades del apartado 1, on indicarem nuestro Client ID, nuestro Client Secret i indicem que ens rediriem a qualsevol web, marcem la informació de la nostra salut que volem tenir accés i importància, hem d'indicar el temps de caducidad per el token (86400 per a 1 dia 604800 per a 1 setmana 2592000 per a 30 dias 31536000 per a 1 any), el normal serà posar el valor de 1 any para no tenir que renovar el token. Pulsem en l'enllaç que ens mostra i obrim en una pestaña nova, copiamos la URL.
Y en la Parte 2 pegamos la respuesta y verificamos que los dades són correctes, si es així tendremos ya por fín nuestro token!
Así que mismamente si volem validar que podem accedir ja a les dades des de la nostra Raspberry podrem executar el següent comandament per visualizar les dades de la distància recorrida l'últim dia cada minuto, si tot es correcte lo mostrarà en format json. Executem:
[sourcecode]curl -H "Authorization: Bearer NUESTRO_TOKEN" https://api.fitbit.com/1/user/-/activities/distance/date/today/1d.json[/sourcecode]
En esta web tenéis más ejemplos para ver más information de otros valores u otros periodos: https://dev.fitbit.com/reference/web-api/activity/#get-daily-activity-summary.
Y si todo es correcte podremos crear un pequeño script que yo le llamaré 'fitbit_carga_datos.sh‘ que obtendrá los datos del darrer dia de Fitbit, tanto la distancia recorrida, els passos fets, els pisos pujats, els batecs del cor o el temps dormit entre altra informació. Cada tipus d'informació la guardaré en un fitxer json que deixaré al directori d'Apache, ja que després ho necessitarem. Aquest seria l'script que carrega les dades a BD:
[sourcecode]# DISTÀNCIA
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
# PASSOS
curl -H "Authorization: Bearer eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/activities/steps/date/today/1d.json > /var/www/html/fitbit_passos.json
/usr/bin/python /home/pi/fitbit_passos.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
# COR
curl -H "Authorization: Bearer eyJhbGxxxxxxLzI2II0" https://api.fitbit.com/1/user/-/activities/heart/date/today/1d.json > /var/www/html/fitbit_cor.json
/usr/bin/python /home/pi/fitbit_cor.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[/sourcecode]
Com veiem, tendremos que cambiar y poner bien nuestro token, tras descargarse los dades de la web los guarda en el fichero json com dijimos y a posteriori executa un fichero en python que coge cada json i lo insereix en distinta base de dades.
Lo guardamos y lo hacemos executable!
Per tant, deberemos crear tantos script de python com mètriques vayamos a analitzar, pero antes de seguir vamos a fer un alt en el camí y vamos a crear las bases de dades y les tablas que necessitemos, que será donde el fichero python importará cada json en la TABLA correspondiente. Podem hacerlo mediante un gestor de MySQL como es HeidiSQL o directament des de 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_dormir… y son muy sencillas, tienen 2 columnes, una llamada 'kilometros’ (FLOAT) i una altra llamada 'fecha’ (DATE) en el cas de la BD de distancia; en el de fitbit_pasos serán 2 columnes: pasos y fecha, para fitbit_pisos: pisos y fecha… i així el resto, si? Podríem crear una sola taula amb més columnes també, però vam cada uno como quiera. Exemple para crear la tabla:
[sourcecode]CREATE TABLE 'fitbit_distancia' (
'kilometros' FLOAT NOT NULL,
fecha' date not null
)
COLLATE =' latin1_swedish_ci’
ENGINE = InnoDB
;[/sourcecode]
Tras define donde se almacenan los datos, el que farem és crear els fitxers Python que llegiran els fitxers JSON amb les dades i després tractaran el seu contingut cercant el valor que ens interessi i inserint-lo a la taula corresponent, i jo és la manera com ho vaig aconseguir, m'imagino que dit això hi haurà millors maneres.. Us deixo un exemple d'un dels fitxers Python, serà l'encarregat en aquest cas de llegir els quilòmetres i introduir-los a la BD:
fitbit_distancia.py
[sourcecode]import urllib
import json
import MySQLdb
db = MySQLdb.connect("localhost","root","CONTRASEÑA","NOMBRE_BASE_DATOS")
cursor = db.cursor()
url = ‘http://IP_RASPBERRY/fitbit_distancia.json’
urllib.urlopen(url).read()
response = urllib.urlopen(url).read()
json_obj = json.loads(response)
for product in json_obj["activities-distance"]:
VALOR = product["value"]
FECHA = product["dateTime"]
cursor.execute("""INSERT INTO fitbit_distancia (quilòmetres,data) VALUES (%s,%s) """,(VALOR,FECHA))
db.commit()[/sourcecode]
Així que, el primer script 'fitbit_carga_datos.sh’ se bajará las estadísticas de la web de Fitbit en un JSON, y cada script de Python leerá dit JSON y lo meterá en la tabla correspondiente. Para más comodidad, o por si tenéis dudas, os dejo mis scripts en este enlace, sólo tendréis que poner vuestro Token y crear las tables que necessitéis! Y programem per que cada dia l'execute a las 23:59h, així obtindrà totes les mètriques del dia. En 'crontab-e’ hi afegim:
[sourcecode]59 23 * * * /home/pi/fitbit_carga_datos.sh[/sourcecode]
Ara el malo… bé, esto que hace? Obtén només lo de hoy, no? Y qué pasa si no hem sincronitzat? o si la última vez ha estat fa 4h? Doncs sí, perdem les dades no sincronitzades, així que un rollo, no? Bien esto que os puse arriba es para comprendre com funciona. Realmente qué hago yo? Pues similar a esto, pero en vez de obtenir las metricas de hoy, a Ftibit le pido las métricas de la última setmana! Y así, si por exemple ayer, o hace 2 dies que no tenemos la pulsera sincronizada, no passa res, ya que cada nit em baixo les mètriques de los últims 7 dies i les machacos en la BD, así cada dia, se baixa los últims 7 i problema solucionat. Si?
Así que os dejo aquí los scripts que estoy utilizando, por si lo que t'interessa es sincronizar sólo hoy i obtenir amb més detalle de cada minuto… o por si te interessa únicament el total de cada dia!
Y ya nada, nos quedará hacer nuestros Dashboards com ens gusten! El que s'ha dit, usaremos un Grafana que ya tengamos. No es més que añadir como fuente de origen MySQL y hacer las consultas que ens interessen. Podrem afegir panells i afegir els plugins de tipus Graph para hacer las típicas gràfiques… o de Singlestat per mostrar valors (resultats de consultes MySQL)… Si os fijáis en aquest pantallazo, estic mostrando dades de 2 polseres, azul soy yo y rosa es la txabala (i fa poques setmanes que la tiene), així que es fer cada uno lo que le guste, si? La idea final de tot esto serà plasmarlo en un espejo màgico que un dia os lo enseñare =)
Os dejo algunas consultas d'exemple que usé en Grafana por si os son de alguna utilitat:
Gràfica de pasos:
[sourcecode]SELECT pasos as value, "Pasos Hector" as metric, UNIX_TIMESTAMP(data) com time_sec DE fitbit_pasos ON $__timeFilter(data) ordre per fecha asc[/sourcecode]
Gràfica de distancia (km):
[sourcecode]SELECCIONA quilòmetres com a valor, "Hector" as metric, UNIX_TIMESTAMP(data) com time_sec DES de fitbit_distancia ON $__timeFilter(data) ordre per fecha asc[/sourcecode]
Singlestat que mostra los Kilometros que hice esta semana:
[sourcecode]selecciona suma(quilòmetres) des de fitbit_distancia ON DATE(data) >= CURDATE() – INTERVAL 7 DAY[/sourcecode]
Utilizar Grafana es muy muy muy sencillo, por lo que de verdad, si no el tens instal·lat, hazlo siguiendo estas instrucciones i després prova a crear un Dashboard, añades Paneles y los edites (des del seu títol), veràs que tienes muchas opcions y totes elles muy senzilles de entendre, para que te les personalitats a tu gust totalment! Ale, tenemos el nostre cos totalment controlat! Emmagatzemarem en base de dades todos los passos que damos, los kilòmetres que fèiem, els latidos del nostre cor, les hores que dormimos, els pisos que subimos… toca explotarlo!
Seguim un altre dia amb més, ya veréis que cosas más cuquis podem ir controlando de la nostra vida..














































