Abrufen von Daten vom Fitbit-Armband mit Python und Anzeigen von Diagrammen in Grafana

Wie geht es? Heute stellen wir Ihnen ein Dokument vor, das sicherlich für alle interessant sein wird, die ein Fitbit-Armband besitzen, mit denen Sie bereits wissen, dass wir Daten über unseren Lebensstil und dergleichen erhalten können… Brunnen, wenn Sie diese Informationen ausnutzen und in schönen Grafiken sehen möchten, Das ist Ihr Dokument! Mit einem Python-Skript erhalten wir die Messungen, die uns interessieren, und speichern sie in einer MySQL-Datenbank, und dann mit Grafana die Grafiken malen, die uns interessieren!

Como supongo habrá muchos fan por aquí de Raspberry Pi y demás fricadas, imaginaros que tenéis un Magischer Spiegel ausgerüstet, 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… Brunnen… todo lo puedes conseguir siguiendo estos pasos, un día ya os pondré proyectos interesantes que tengo montados en casa 🙂

 

Was ich gesagt habe, 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 obtener 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 Hier), lo que haremos será hacer consultas MySQL a la BD para obtener lo que nos interese ver!

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, Danach, 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
  • Beschreibung: Escribimos algo que nos asocie esta app al proyecto con el que andamos.
  • Application Website: Ponemos una URL, por ejemplo http://www.bujarra.com
  • Organisation: Nombre de la organización, p. zum Beispiel: Bujarra
  • Organization Website: Indicamos de nuevo la URL, HTTP (Englisch)://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.

 

Wir greifen zu 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 Zeichen (86400 für 1 dia 604800 für 1 Woche 2592000 für 30 Tage 31536000 für 1 Jahr), lo normal será poner el valor de 1 año para no tener que renovar el Zeichen. 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 Zeichen!

 

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

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

 

En esta web tenéis más ejemplos para ver más información de otros valores u otros periodos: https://dev.fitbit.com/reference/web-api/activity/#get-daily-activity-summary.

 

Y si todo es correcto podremos crear un pequeño script que yo le llamaré ‘fitbit_carga_datos.shque obtendrá los datos del último dia de Fitbit, tanto la distancia recorrida, los pasos dados, los pisos subidos, los latidos del corazón o el tiempo dormido entre otra info. Cada tipo de info la guardaré en un fichero json que dejaré en el directorio de Apache, ya que luego lo necesitaremos. Este sería el script que carga los datos en BD:

[Quellcode]# DISTANCIA
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

# PASOS
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[/Quellcode]

 

Wie wir sehen können, tendremos que cambiar y poner bien nuestro token, tras descargarse los datos de la web los guarda en el fichero json como dijimos y a posteriori ejecuta un fichero en python que coge cada json y lo inserta en distinta base de datos.

Lo guardamos y lo hacemos ejecutable!

 

Deshalb, 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 que necesitemos, 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 Spalten, 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 Spalten: pasos y fecha, para fitbit_pisos: pisos y fechay así el resto, Ja? Podríamos crear una sola tabla con más columnas también, pero vamos cada uno como quiera. Ejemplo para crear la tabla:

[Quellcode]CREATE TABLE `fitbit_distancia` (
`kilometros` FLOAT NOT NULL,
`fecha` DATE NOT NULL
)
COLLATE='latin1_swedish_ci’
ENGINE=InnoDB
;[/Quellcode]

 

Tras definir donde se almacenan los datos, lo que haremos es crear los ficheros python que leerán los fichero JSON con los datos y luego tratarán su contenido buscando el valor que nos interese e insertándolo en la tabla correspondiente, y yo es la manera como lo conseguí, me imagino que lo dicho habrán mejores formas.. Os dejo un ejemplo de uno de los ficheros Python, será el encargado en este caso de leer los kilometros e introducirlos en la BD:

 

fitbit_distancia.py

[Quellcode]urllib importieren
JSON importieren
MySQLdb importieren
db = MySQLdb.connect("localhost","Wurzel","PASSWORT","NOMBRE_BASE_DATOS")
cursor = db.cursor()

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

json_obj = json.loads(Antwort)

for product in json_obj["activities-distance"]:
VALOR = product["value"]
FECHA = product["dateTime"]
cursor.execute("""INSERT INTO fitbit_distancia (kilometros,Datum) WERTE (%s,%s) """,(VALOR,FECHA))
db.commit()[/Quellcode]

Also, el primer script ‘fitbit_carga_datos.shse bajará las estadísticas de la web de Fitbit en un JSON, y cada script de Python leerá dicho 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 tablas que necesitéis! Y programamos para que cada día lo ejecute a las 23:59h, así obtendrá todas las métricas del día. En ‘crontab -e’ Hinzufügen:

[Quellcode]59 23 * * * /home/pi/fitbit_carga_datos.sh[/Quellcode]

 

Ahora lo malo… Nicht schlecht, esto que hace? Obtiene sólo lo de hoy, Nein? Y qué pasa si no hemos sincronizado? o si la última vez fue hace 4h? Nun, ja, perderíamos los datos no sincronizados, así que un rollo, Nein? Bien esto que os puse arriba es para comprender cómo funciona. Realmente qué hago yo? Pues similar a esto, pero en vez de obtener las metricas de hoy, a Ftibit le pido las métricas de la última semana! Und so weiter, si por ejemplo ayer, o hace 2 días que no tenemos la pulsera sincronizada, no pasa nada, ya que cada noche me bajo las métricas de los últimos 7 días y las machaco en la BD, así cada día, se baja los últimos 7 y problema solucionado. Ja?

Así que os dejo aquí los scripts que estoy utilizando, por si lo que te interesa es sincronizar sólo hoy y obtener con más detalle de cada minutoo por si te interesa únicamente el total de cada día!

 

Y ya nada, nos quedará hacer nuestros Dashboards como nos gusten! Was ich gesagt habe, 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 añadir paneles y añadir los plugins de tipo Graph para hacer las típicas gráficas… oder Singlestat para mostrar valores (resultados de consultas MySQL)… Si os fijáis en este pantallazo, estoy mostrando datos de 2 Armbänder, azul soy yo y rosa es la txabala (y hace pocas semanas que la tiene), así que es hacer cada uno lo que le guste, Ja? La idea final de todo esto será plasmarlo en un espejo mágico que un día os lo enseñare =)

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

Grafica de pasos:

[Quellcode]SELECT pasos as value, "Pasos Hector" als Metrik, UNIX_TIMESTAMP(Datum) as time_sec FROM fitbit_pasos WHERE $__timeFilter(Datum) order by fecha asc[/Quellcode]

Gráfica de distancia (km):

[Quellcode]SELECT kilometros as value, "Hector" als Metrik, UNIX_TIMESTAMP(Datum) as time_sec FROM fitbit_distancia WHERE $__timeFilter(Datum) order by fecha asc[/Quellcode]

Singlestat que muestra los Kilometros que hice esta semana:

[Quellcode]select sum(kilometros) from fitbit_distancia WHERE DATE(Datum) >= CURDATE() – INTERVAL 7 DAY[/Quellcode]

 

Utilizar Grafana es muy muy muy sencillo, por lo que de verdad, Wenn Sie es nicht installiert haben, hazlo siguiendo estas instrucciones y luego prueba a crear un Dashboard, añades Paneles y los editas (desde su título), verás que tienes muchas opciones y todas ellas muy sencillas de entender, para que te lo personalices a tu gusto totalmente! Ale, tenemos nuestro cuerpo totalmente controlado! Almacenaremos en base de datos todos los pasos que damos, los kilometros que hacemos, los latidos de nuestro corazón, las horas que dormimos, los pisos que subimostoca explotarlo!

 

Wir setzen einen weiteren Tag mit mehr fort, ya veréis que cosas más cuquis podemos ir controlando de nuestra vida..

 

Empfohlene Beiträge

Verfasser

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, Zögern Sie nicht, mich zu kontaktieren, Ich werde versuchen, dir zu helfen, wann immer ich kann, Teilen ist Leben ;) . Genießen Sie Dokumente!!!