Obtendo dados da pulseira Fitbit usando Python e exibindo gráficos no Grafana

Como está indo? Hoje vamos com um documento que certamente será do interesse de todos aqueles que possuem uma pulseira Fitbit, com o qual você já sabe que podemos obter dados sobre nosso estilo de vida e tal… Poço, se você quiser explorar essas informações e vê-las em belos gráficos, Este é o seu documento! Usando um script Python, obteremos as medidas que nos interessam e as armazenaremos em um banco de dados MySQL, e depois com Grafana pinte os gráficos que nos interessam!

Como supongo habrá muchos fan por aqui de Raspberry Pi y demás fricadas, imaginaros que tenéis un Espelho Mágico configurado, ya sabéis un espejo con monitores atrás y queréis domotizar vuestra casa dándole outro toque adicional y al veros en un espejo conhecer vuestro avance, los kilomentros recorridos, pasos andados, calorias quemadas, gráficas de pulsaciones, pisos subidos… Poço… todo o que podes conseguir seguir estes pasos, un dia ya os pondré projetos interessantes que tenho montados em casa 🙂

 

O que eu disse, qué necesitaremos? Un servidor con Apache y MySQL instalado, criaremos um BD onde armazenaremos o que nos interessa (veremos um par de exemplos), nos registraremos na web de fitbit para criar uma App y veremos como obter 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 será fazer consultas MySQL a la BD para obter lo que nos 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 dados de cada dia nas tablas de la BD de MySQL y se accederá desde onde tengamos el Grafana instalado, sea en la misma Raspberry Pi, en otra máquina… Como 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, Depois disso, 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
  • Descrição: Escribimos algo que nos asocie esta app al proyecto con el que andamos.
  • Application Website: Ponemos una URL, por ejemplo http://www.bujarra.com
  • Organization: Nombre de la organización, p. ej: Bujarra
  • Organization Website: Indicamos de nuevo la URL, Referências 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.

 

Accedemos 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 Símbolo (86400 durante 1 dia 604800 durante 1 semana 2592000 durante 30 dias 31536000 durante 1 ano), lo normal será poner el valor de 1 año para no tener que renovar el Símbolo. 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 Símbolo!

 

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

[Código-fonte]curl -H "Authorization: Bearer NUESTRO_TOKEN" https (em inglês)://api.fitbit.com/1/user/-/activities/distance/date/today/1d.json[/Código-fonte]

 

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, os passos dados, os pisos subidos, os batimentos do coração ou o tempo de sono entre outras informações. Cada tipo de informação guardá-la-ei num ficheiro json que deixarei no diretório do Apache, já que depois iremos precisar dela. Este seria o script que carrega os dados na BD:

[Código-fonte]# DISTÂNCIA
curl -H "Authorization: Bearer eyJhbGxxxxxxLzI2II0" https (em inglês)://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 (em inglês)://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 (em inglês)://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

# CORAÇÃO
curl -H "Authorization: Bearer eyJhbGxxxxxxLzI2II0" https (em inglês)://api.fitbit.com/1/user/-/activities/heart/date/today/1d.json > /var/www/html/fitbit_coracao.json

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

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

/usr/bin/python /home/pi/fitbit_dormir.py[/Código-fonte]

 

Como podemos ver, teremos de mudar e colocar corretamente o nosso token, após descarregar os dados da web, guarda-os no ficheiro json como dissemos e posteriormente executa um ficheiro em python que pega em cada json e insere-o em diferentes bases de dados.

Guardamo-lo e tornamo-lo executável!

 

Portanto, teremos de criar tantos scripts em python quanto métricas formos analisar, mas antes de continuar vamos fazer uma pausa no caminho e vamos criar as bases de dados e as tabelas que precisarmos, que será onde o ficheiro python importará cada json na TABELA correspondente. 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 columnas, 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 columnas: pasos y fecha, para fitbit_pisos: pisos y fechay así el resto, Sim? Podríamos crear una sola tabla con más columnas también, pero vamos cada uno como quiera. Ejemplo para crear la tabla:

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

 

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

[Código-fonte]Importar urllib
Importar JSON
importar 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(resposta)

for product in json_obj["activities-distance"]:
VALOR = product["value"]
FECHA = product["dateTime"]
cursor.execute("""INSERT INTO fitbit_distancia (kilometros,data) VALORES (%s,%s) """,(VALOR,FECHA))
db.commit()[/Código-fonte]

Então, 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’ Adicionar:

[Código-fonte]59 23 * * * /home/pi/fitbit_carga_datos.sh[/Código-fonte]

 

Ahora lo malo… Nada mau, esto que hace? Obtiene sólo lo de hoy, Não? Y qué pasa si no hemos sincronizado? o si la última vez fue hace 4h? Bem, sim, perderíamos los datos no sincronizados, así que un rollo, Não? 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! E assim, si por ejemplo ayer, o hace 2 días que no tenemos la pulsera sincronizada, não há problema, 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. Sim?

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! O que eu disse, 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… o de Singlestat para mostrar valores (resultados de consultas MySQL)… Si os fijáis en este pantallazo, estoy mostrando datos de 2 Pulseiras, 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, Sim? 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:

[Código-fonte]SELECT pasos as value, "Pasos Hector" como métrica, UNIX_TIMESTAMP(data) as time_sec FROM fitbit_pasos WHERE $__timeFilter(data) order by fecha asc[/Código-fonte]

Gráfica de distancia (km):

[Código-fonte]SELECT kilometros as value, "Hector" como métrica, UNIX_TIMESTAMP(data) as time_sec FROM fitbit_distancia WHERE $__timeFilter(data) order by fecha asc[/Código-fonte]

Singlestat que muestra los Kilometros que hice esta semana:

[Código-fonte]select sum(kilometros) from fitbit_distancia WHERE DATE(data) >= CURDATE() – INTERVAL 7 DAY[/Código-fonte]

 

Utilizar Grafana es muy muy muy sencillo, por lo que de verdad, se não o tiver instalado, 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! Cerveja, 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!

 

Continuamos mais um dia com mais, ya veréis que cosas más cuquis podemos ir controlando de nuestra vida..

 

Postagens recomendadas

Autor

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, Não hesite em contactar-me, Vou tentar ajudá-lo sempre que puder, Compartilhar é viver ;) . Desfrute de documentos!!!