Présentation
Les gens portent des bracelets de fitness pour diverses raisons, je peux en supposer certains:
- Afin de rester en forme et d'atteindre les objectifs de l'activité;
- Parce que c'est une petite chose à la mode;
- Expérimenter avec soi-même ou mieux se connaître.
Je porte un bracelet de fitness pour la raison numéro 3. Dans cet article, je veux vous expliquer comment extraire des données d'un bracelet et essayer d'obtenir des dépendances.
Les méthodes d'extraction de ces données fonctionnent pour Mi Band 1 , 1S et éventuellement 2 (l'application pour 2 semble être la même).
Extraction de données
Pour extraire les données du bracelet, tout d'abord, vous devez obtenir la base de données du téléphone SQLite dans lequel les métriques collectées sont stockées. Dans le cas d'Android, cela se fait extrêmement simplement, voir le sujet sur le forum des développeurs xda , scripts pour la base de données actuelle :
- Nous connectons un téléphone Android avec le débogage USB activé à un ordinateur;
- Nous faisons une sauvegarde de l'application:
adb backup -f mi.ab -noapk -noshared com.xiaomi.hm.health
; - Créer
dd if=mi.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" > mi.tar
dd if=mi.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" > mi.tar
; - Décompressez l'archive de la base de données:
tar xvf mi.tar apps/com.xiaomi.hm.health/db/ 2>&1 | tee -a log
tar xvf mi.tar apps/com.xiaomi.hm.health/db/ 2>&1 | tee -a log
; - Copiez la base de données:
cp -f apps/com.xiaomi.hm.health/db/origin_db* ./db/
.
En conséquence, nous obtenons une base de données SQLite avec le nom de fichier db/origin_db_[0-9]+$
, qui stocke les métriques Mi Band.
Chargement et analyse des données
Pour étudier les données, à mon avis, il est pratique d'utiliser le bloc-notes IPython: Xiaomi_Mifit_miband_data.ipynb
Les métriques sont stockées dans la table DATE_DATA:
df = pd.read_sql_query("SELECT * from DATE_DATA", con)
Colonnes du tableau qui vous intéressent:
Données agrégées quotidiennes
Les données agrégées sont stockées au format JSON:
{"slp":{"usrEd":-1440,"lt":457,"st":1464376080,"wk":15,"dp":30,"usrSt":-1440,"ed":1464406200},"v":5,"goal":8000,"stp":{"rn":2,"cal":257,"runDist":256,"wk":69,"ttl":5244,"runCal":13,"dis":3817}}
Les données sont divisées en 2 parties: sommeil ( slp ) et activité ( stp ). Pour le sommeil, l'heure de début et de fin est stockée - st, ed , ainsi que l'heure du sommeil profond et léger en minutes - lt, dp . Le temps de veille entre le début et la fin du sommeil est également enregistré - sem . Pour l'activité, le nombre total de "pas" ttl est stocké - la somme des lectures du capteur primaire pour le jour et d'autres quantités dérivées func(ttl, , )
.
Données brutes d'activité et de fréquence cardiaque
Les données brutes d'activité sont stockées toutes les minutes (par jour 1440) et représentent 3 valeurs par minute. La première valeur est un rêve et une valeur de 0 à 127 (mais dans mon cas un maximum de 126), la deuxième et la troisième sont des activités avec une valeur de 0 à 255 (j'ai un maximum d'activité2 - 189, activité3 - 240).
L'impulsion est stockée toutes les minutes et varie de 0 à 255.
Comment les données brutes sont agrégées par jour
L'agrégat le plus simple est le nombre de pas par jour - la somme des valeurs d'activité3 par jour. Il est plus difficile de dormir: je n'ai jamais appris à transformer des données brutes de sommeil en données agrégées. Sur les forums, l'idée a été exprimée que la valeur de activity1 == 4 est un sommeil profond et 5 est léger, mais c'est aussi simple qu'avec des étapes pour établir une relation entre des données agrégées et des données brutes.
Analyse des données
Tout d'abord, combien j'ai dormi pendant l'année. Cette valeur s'est avérée être de ~ (7 + - 1) heures. Tout semble aller pour le mieux.

Une autre chose évidente - je dors suffisamment le week-end:

Et si vous appelez la relation entre le sommeil profond et la qualité de la lumière, il s'avère que j'ai la meilleure qualité de sommeil jeudi, et en même temps, le sommeil profond représente 23% du temps de sommeil total. Et vendredi - la pire qualité de sommeil, j'ai même peur de deviner pourquoi.

Le nombre maximum de «pas» que je fais vendredi et samedi:

En même temps, mon environnement est le jour où je dors peu et marche peu, il n'y a pas d'explications évidentes dans la catégorie "je travaille à domicile", donc c'est quelque chose de nouveau pour moi.
J'espère que quelqu'un des propriétaires des bracelets Mi Band populaires voudra également étudier lui-même et parler de leurs caractéristiques.