引言
人们出于各种原因佩戴健身手镯,我可以假设其中一些:
- 为了保持健康并实现活动目标;
- 因为这是一件时髦的小事;
- 尝试自己或更好地了解自己。
我佩戴健身手镯的原因是3。在本文中,我想谈一谈如何从手镯中提取数据并尝试获取一些依赖关系。
提取此数据的方法适用于Mi Band 1、1S以及可能的2 ( 2的应用程序似乎相同)。
数据提取
要从手镯中提取数据,首先,您需要从存储所收集指标的SQLite手机中获取数据库。 对于Android,这非常简单, 请参阅xda-developers论坛上的主题 , 当前数据库的脚本 :
- 我们将启用USB调试的Android手机连接到计算机;
- 我们对应用程序进行备份:
adb backup -f mi.ab -noapk -noshared com.xiaomi.hm.health
; - 创建
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
; - 从数据库解压缩存档文件:
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
; - 复制数据库:
cp -f apps/com.xiaomi.hm.health/db/origin_db* ./db/
。
结果,我们得到了一个SQLite数据库,其文件名为db/origin_db_[0-9]+$
,用于存储Mi Band指标。
数据加载与分析
我认为,要研究数据,可以使用IPython笔记本方便: Xiaomi_Mifit_miband_data.ipynb
指标存储在DATE_DATA表中:
df = pd.read_sql_query("SELECT * from DATE_DATA", con)
表中感兴趣的列:
每日汇总数据
汇总数据存储为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}}
数据分为两部分:睡眠( slp )和活动( stp )。 对于睡眠,将存储开始和结束时间-st,ed ,以及深度睡眠和浅睡眠时间(以分钟为单位) -lt,dp 。 睡眠开始和结束之间的唤醒时间也被存储-wk 。 对于活动,存储“步数” ttl的总数-当天的主要传感器读数和其他导出的量func(ttl, , )
的总和。
原始活动和心率数据
原始活动数据每分钟(每天1440)存储一次,代表每分钟3个值。 第一个值是一个梦,值是0到127(但在我的情况下,最大值是126),第二个和第三个值是活动,值是0到255(我的活动最大值是2-189,activity3-240)。
脉冲每分钟存储一次,范围从0到255。
每天如何汇总原始数据
最简单的汇总是每天的步骤数-每天的activity3值的总和。 睡眠更困难:我从未学习过如何将原始睡眠数据转换为聚合数据。 在论坛上表达了这个想法,即activity1 == 4的值表示深度睡眠,而5表示轻度,但它不像在聚合数据和原始数据之间建立关系的步骤那样简单。
资料分析
首先,我一年中睡了多少。 原来,该值为〜(7 +1)小时。 一切似乎都可以。

另一个明显的事情-周末我有足够的睡眠:

如果您将深度睡眠与光线质量的关系称为“最佳睡眠质量”,那么在同一时间,深度睡眠占总睡眠时间的23%。 而在星期五-最糟糕的睡眠质量,我什至都不敢猜出为什么。

我在星期五和星期六执行的“步骤”的最大数量:

同时,我的环境是我很少睡觉和很少走路的日子,“我在家工作”类别中没有明显的解释,所以这对我来说是新事物。
我希望来自流行的Mi乐队手镯的拥有者也想研究一下自己并讲述其功能。