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á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, 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 'Persönlich’
- Rückruf-URL: Dejamos http://google.com
- Standardzugriffstyp: 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 in a a 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.sh‘ que obtendrá los datos del último dia de Fitbit, tanto la distancia recorrida, die zurückgelegten Schritte, die erklommenen Stockwerke, die Herzschläge oder die Schlafzeit neben anderen Infos. Jede Art von Info werde ich in einer JSON-Datei speichern, die ich im Apache-Verzeichnis ablege, da wir sie später brauchen werden. Dies wäre das Skript, das die Daten in die Datenbank lädt:
[Quellcode]# DISTANZ
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
# SCHRITTE
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
# STOCKWERKE
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
# HERZ
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
# SCHLAF
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, wir müssen unser Token ändern und korrekt einfügen, nachdem die Daten von der Website heruntergeladen wurden, speichert er sie wie gesagt in der JSON-Datei und anschließend führt er eine Python-Datei aus, die jedes JSON nimmt und in verschiedenen Datenbanken einfügt.
Wir speichern es und machen es ausführbar!
Deshalb, wir müssen so viele Python-Skripte erstellen, wie Metriken wir analysieren wollen, aber bevor wir weitermachen, machen wir eine Pause und werden die Datenbanken und Tabellen erstellen die wir benötigen, in die die Python-Datei jede JSON in die entsprechende TABELLE importieren wird. Wir können dies über einen MySQL-Manager wie HeidiSQL oder direkt über die Linux-Shell tun, indem wir uns per Shell verbinden. Wir erstellen eine TABELLE für jede Messung, In meinem Fall heißen die Tabellen: fitbit_distancia, fitbit_pasos, fitbit_dormir… und sie sind sehr einfach, Sie haben 2 Spalten, eine Spalte namens 'kilometros'’ (FLOAT) und eine andere namens 'fecha'’ (DATE) im Fall der Distanz-Datenbank; bei fitbit_pasos werden es 2 Spalten: pasos und fecha, bei fitbit_pisos: pisos und fecha… und so weiter, Ja? Wir könnten auch eine einzige Tabelle mit mehr Spalten erstellen, aber jeder kann es so machen, wie er möchte. Beispiel zur Erstellung der Tabelle:
[Quellcode]CREATE TABLE `fitbit_distancia` (
`kilometros` FLOAT NOT NULL,
`fecha` DATE NOT NULL
)
COLLATE='latin1_swedish_ci’
ENGINE=InnoDB
;[/Quellcode]
Nachdem definiert wurde, wo die Daten gespeichert werden, Was wir tun werden, ist, die Python-Dateien zu erstellen, die die JSON-Dateien mit den Daten lesen und dann deren Inhalt verarbeiten, um den Wert zu finden, der uns interessiert, und ihn in die entsprechende Tabelle einzufügen, Und so habe ich es geschafft, Ich stelle mir vor, dass es bessere Wege als den genannten gibt.. Hier ist ein Beispiel einer der Python-Dateien, Sie wird in diesem Fall dafür zuständig sein, die Kilometer zu lesen und in die Datenbank einzufügen:
fitbit_distancia.py
[Quellcode]urllib importieren
JSON importieren
MySQLdb importieren
db = MySQLdb.connect("localhost","root","CONTRASEÑA","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"]:
WERT = product["value"]
DATUM = product["dateTime"]
cursor.execute("""INSERT INTO fitbit_distancia (Kilometer,Datum) WERTE (%s,%s) """,(WERT,DATUM))
db.commit()[/Quellcode]
Also, 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á 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 tease la pulsera inincronizada, no pasa nada, ya que cada noche me bajo las métricas de los últimos 7 días y las machaco in 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 solo hoy y obtener con más detalle de cada minuto… o 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. Es ist nichts weiter, als MySQL als Datenquelle hinzuzufügen und die Abfragen zu machen, die uns interessieren. Wir können Panels hinzufügen und Plugins vom Typ Graph um die typischen Grafiken zu erstellen… oder Singlestat um Werte anzuzeigen (Ergebnisse von MySQL-Abfragen)… Wenn ihr euch diesen Screenshot anschaut, zeige ich Daten von 2 Armbänder, blau bin ich und rosa ist die Txabala (und sie hat sie erst vor ein paar Wochen erhalten), also kann jeder machen, was ihm gefällt, Ja? Die endgültige Idee von all dem wird sein, es in einem magischen Spiegel zu verewigen, den ich euch eines Tages zeigen werde =)
Ich lasse euch einige Beispielabfragen da, die ich in Grafana verwendet habe, falls sie euch nützlich sind:
Schrittgrafik:
[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]
Entfernungsdiagramm (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(Kilometer) 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, Die Latidos des Nuestro Corazón, Las Horas que dormimos, Los Pisos que Subimos… Toca Explotarlo!
Wir setzen einen weiteren Tag mit mehr fort, ya veréis que cosas más cuquis podemos ir controlando de nuestra vida..














































