Введение
Люди носят фитнес-браслеты по разным причинам, я могу предположить некоторые из них:
- Для того, чтобы поддерживать себя в форме и выполнять цели по активности;
- Потому что это некая модная штучка;
- Чтобы ставить над собой эксперименты или узнать себя лучше.
Я ношу фитнес браслет по причине номер 3. В этой заметке я хочу рассказать о том, как можно извлечь данные из браслета и попробовать получить некоторые зависимости.
Методы для извлечения этих данных работают для Mi Band 1, 1S и, возможно, 2 (приложение для 2, кажется, такое же).
Извлечение данных
Для извлечения данных с браслета в первую очередь надо достать с телефона SQLite базу данных, в которой хранятся собираемые метрики. В случае Android'a делается это предельно просто см. топик на форуме xda-developers, скрипты под актуальную базу:
- Подключаем Android телефон с включенным режимом отладки по USB к компьютеру;
- Делаем бэкап приложения:
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
; - Распаковываем архив с БД:
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 notebook: Xiaomi_Mifit_miband_data.ipynb
Метрики хранятся в таблице DATE_DATA:
df = pd.read_sql_query("SELECT * from DATE_DATA", con)
Колонки в таблице, которые представляют интерес:
колонка | описание |
---|---|
DATE | дата |
SUMMARY | JSON с обработанными данными за день |
DATA | сырые поминутные данные за сон[активность1], активность2, активность3 |
DATA_HR | сырые поминутные данные пульса |
Агрегированные за день данные
Агрегированные данные хранятся в виде 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}}
Данные делятся на 2 части: сон (slp) и активность (stp). Для сна хранится время начала и окончания — st, ed, а также время глубокого и легкого сна в минутах — lt, dp. Также хранится время просыпания между между началом и окончанием сна — wk. Для активности хранится суммарное количество "шагов" ttl — сумма показаний первичного датчика за день и другие производные величины func(ttl, рост, вес)
.
Сырые данные активности и пульса
Сырые данные активности сохраняются каждую минуту (за сутки 1440), и представляют собой 3 значения за кажду минуту. Первое значение — сон и значение от 0 до 127 (но в моем случае максимум 126), второе и третье — активность со значением от 0 до 255 (у меня максимум activity2 — 189, activity3 — 240).
Пульс сохраняется каждую минуту и имеет значения от 0 до 255.
Как сырые данные превращаются в агрегированные за день
Самый простой агрегат — это количество шагов за день — сумма значений activity3 за день. Со сном сложнее: я так и не научился сырые данные сна превращать в агрегированные. На форумах высказывалась мысль о том, что значение activity1 == 4 глубокий сон, а 5 — легкий, но так же просто, как с шагами, установить взаимосвязь между агрегированными данными и сырыми не получается.
Анализ данных
Во-первых, сколько я спал в течение года. Это значение оказалось ~ (7 +- 1) час. Кажется, с этим все ок.
Другая очевидная вещь — высыпаюсь я по выходным:
А если назвать отношение глубокого сна к легкому качеством, то выяснится, что лучшее качество сна у меня в четверг, и при этом глубой сон составляет 23% от всего времени сна. А в пятницу — самое плохое качество сна, боюсь даже предположить почему.
Максимальное количество "шагов" я совершаю в пятницу и субботу:
При этом среда у меня — день, когда я мало сплю и мало хожу, очевидных объяснений из разряда "я работаю из дома" — нет, поэтому это что-то новое для меня.
Надеюсь, что кто-нибудь из обладателей популярных браслетов Mi band тоже захочет поизучать себя и расскажет о своих особенностях.
Комментарии (73)
ximik666
18.08.2019 09:46Инструкция с известного сайта по извлечению данных с аккаунта Xiaomi, проверено — рабочая. Где -то месяц назад пользовался — в ответ приходят несколько таблиц.
Инструкция- Откройте
mifit.huami.com/t/account_mifitили api-mifit.huami.com/t/account_mifit (если что, через VPN) - Выберите «Экспорт данных», потом «Определить»
- Вверху выберите тип вашего Mi-аккаунта (игнорируйте поля внизу)
- Введите логин и пароль к аккаунту, который используется в Mi Fit
- Разрешите доступ к аккаунту нажав «Sign in»
- Отметьте галочками интересующие вас данные: «Активность», «Сон», «Пульс», «Вес», «Тренировки»
- В полях «От» и «До» выберите самые крайние даты
- Нажмите «Определить»
- Введите любой доступный вам e-mail, вовсе необязательно тот, на который аккаунт
- Также введите капчу и нажмите «Определить»
- Через минут 10 проверьте почтовый ящик указанный выше
- Перейдите по ссылке в письме от Xiaomi
- Скопируйте указанный пароль и нажмите «Загрузка»
- Извлеките все файлы из скачанного архива и когда спросит вставьте тот пароль
- Открывайте файлы в Excel / Open Office через «Открыть» > «Все файлы» указав в качестве разделителя запятую или же просто в Блокноте как текст
wholeman
18.08.2019 10:07Что это за сайт? Как-то боязно давать доступ к своему аккаунту неизвестно кому.
ximik666
18.08.2019 10:14+1Вроде как разработчики же браслета (HUAMI Amazefit).
tmin10
18.08.2019 16:28Эм, а зачем какой-то сайт если всё уже есть в приложени Mi Fit?
Profile -> Settings -> About -> Exercising user rights -> Export data и уже там залогиниться. Не исключаю, что там открывается та же страничка, но всё это в рамках приложения остаётся.
gudvinr
18.08.2019 23:05+1Браслеты Xiaomi можно к Google Fit, у которого есть History API, который можно использовать потоково, т.е. без ручного экспорта откуда бы то ни было.
Andrey_Dolg
18.08.2019 11:00Люди носят фитнес-браслеты по разным причинам
Ещё в копилку отличный будильник и способ не пропускать звонки с телефона, но это больше ко второй версии(есть такая проблема).
Касательно графиков.
Чем меньше спите(от вашей нормы) тем меньше активность в течении дня, визуально это нормальная оптимизация организма. Касательно отношения периодов сна то у вас прямо полноценный ритм получился и скорее там суббота имелась ввиду.
maxzhurkin
18.08.2019 12:49Сон же оно неправильно определяет: проснулся в пять утра в туалет, лёг, поспал еще несколько часов, но оно об этом уже не догадывается, думает, что в 5 ты проснулся окончательно
solver
18.08.2019 17:16Уже на моменте «лег» сяоми неправильно определяет сон)
Если быть точным, то мибенд измеряет не сон, а «время покоя».
iDm1
18.08.2019 21:28Браслеты и часы Xiaomi сами вообще ничего не определяют, они хранят сырые данные, которые уже обрабатывает приложение в телефоне. Официальное приложение делает это так, как захотели его разработчики.
Есть неофициальные приложения для данных устройств, в том числе великолепные от отечественных разработчиков, которые таких ошибок не допускают и определяют верно даже дневной сон.
BigBeaver
18.08.2019 23:20Это не так — короткие пробуждения так и записываются в виде пробуждений. По-моему (из опыта), до получаса могут быть. То есть, я временами успеваю нормально пожрать, и приложение считает продолжение сна а сон, как и положено.
Вот то, что оно не умеет в дневной или просто слишком поздний сон, это минус.
Akr0n
18.08.2019 13:01Кто-нибудь использует приложение Pacer? Есть ли опыт выгрузки данных с этого сервиса? Я так понимаю, штатных способов нет.
strangest
18.08.2019 14:08Мне лень выдирать данные вручную, когда можно посмотреть в приложении.
В Mi band master можно смотреть данные за длительные промежутки. Со вторым бандом оно работает, с первым — фиг знает.
У меня практически всегда фаза глубокого сна — 3.5 часа.undersky
20.08.2019 04:53Вау, расскажите про свой типичный день?
Когда у меня глубокий сон 2 часа — это успех, бывает может раз в месяц, а обычное значение — 1 час 20 минstrangest
20.08.2019 06:51+1Особого распорядка дня у меня нет.
Просыпаюсь около полудня, засыпаю около 4 часов утра, потому что по-другому не высыпаюсь.
Большую часть дня провожу за ПК — моделирование, рисование, чтение. Из физических нагрузок — приседания, пресс, пешие прогулки, иногда велотренажер, опять же, без особого распорядка, по настроению.
Обычно на улицу выхожу после 19, из-за особенностей зрения.
Что интересно, если урезать длительность сна — урезается в основном длительность легкого сна. Правда, если долго не высыпаться — начинает глючить вестибулярный аппарат.
engine9
18.08.2019 14:29+1Существуют ли фитнес трекеры которые бы гарантированно не сливали активность владельца в веб, храня данные только локально на телефоне (или вообще в себе?).
questor
18.08.2019 14:34Возможно, вот этот вот скоро будет подходящим выбором: https://habr.com/en/news/t/463521/
nlykl
18.08.2019 14:41Протокол Mi Band открыт, можно пользоваться сторонними приложениями, например опенсорсным Gadgetbridge.
wholeman
18.08.2019 18:31Он где-нибудь описан? Хочу к своему приложению третью ми-банду подцепить. С пульсометром проблем нет — он там по стандарту работает, число шагов тоже вроде бы понятно, а вот расстояние и, особенно, каденс хотелось бы поиметь в реальном времени.
tmin10
18.08.2019 20:43Расстояние просто вычисляется по длине шага, которая из роста берётся, а каденс как раз в числе шагов в минуту и мерятся.
wholeman
18.08.2019 23:44Датчики на ногу дают каденс ежесекундно или даже чаще. Mi Band, насколько я понял, даёт шаги как попало: то молчит, то сразу десяток накинет. А насчёт расстояния — это предположение или есть проверенная информация?
BigBeaver
19.08.2019 10:59Он их буферизует. Это нужно для функции сглаживания и защиты (хоть какой-то) от ложных срабатываний типа поездки в транспорте. Это же универсальный датчик для круглосуточного применения в рандомных условиях, а не спортивный.
wholeman
19.08.2019 11:13А без буферизации никак? Может, отдельная характеристика какая есть? На странице тренировки в приложении Mi Fit каденс есть, причём чаще, чем поминутный. К сожалению, полные данные о тренировке мне выгрузить не удалось.
BigBeaver
19.08.2019 12:14А без буферизации никак?
Эмм, а зачем? Там буфер шагов 10. После начала ходьбы в ровном темпе он начинает стабильно добавлять пошагово. В начале же он не знает, то ли вы со стула упали то ли пошли куда-то. Потому последовательность «предположительно шагов» буферизуется, пока не наберется некоторое окно, достаточное для обработки сигнала (частотный анализ, корреляционный или хз, какие там алгоритмы). Если после анализа паттерн признан похожим на ходьбу, то дальше окно просто скользит по выборке без дополнительных задержек.Может, отдельная характеристика какая есть?
Отдельная характеристика чего?К сожалению, полные данные о тренировке мне выгрузить не удалось.
Честно говоря, тоже не понятен смысл. Он выдает все нужные для анализа метрики и графики.Типа такихwholeman
19.08.2019 13:35Эмм, а зачем? Там буфер шагов 10. После начала ходьбы в ровном темпе он начинает стабильно добавлять пошагово.
Чтобы иметь в треке каденс на данную секунду, а не за 5-10 до этого. В отличие от трекера, я знаю, что уже иду или бегу, а не делаю что-то другое, поэтому мне его сомнения ни к чему.Отдельная характеристика чего?
Bluetooth LE, точнее GATT characteristics.Честно говоря, тоже не понятен смысл. Он выдает все нужные для анализа метрики и графики.
Не выдаёт, а показывает в приложении. Причём там даже зума нет. И, например, в Страву не выгрузить.
У меня же мысль была в том, чтобы использовать Mi Band вместо датчика на ногу в своём приложении.BigBeaver
19.08.2019 13:38Bluetooth LE, точнее GATT characteristics.
Так это приложение так обрабатывает и отображает. Сами-то данные нормально передаются сплошным потоком, вроде (впрочем, не знаю, можно ли их выгрузить. но думаю, что можно). Или нет?.. Еще это от прошивок зависит — в старых этой буферизации не было, но суточное число шагов стабильно завышалось в поездках.wholeman
19.08.2019 13:43Нет, передаётся ровно то же, что и на экране, и в приложении. Может быть, и ещё что-то есть — глубоко я пока не копал. Поэтому я и спросил: описан ли где-нибудь протокол. У человека, который его вообще открытым обозвал. Ну, чтобы самому не реверсить и по году GadgetBridge не восстанавливать, если всё есть.
BigBeaver
19.08.2019 13:59Хмм, my bad. Почему-то думал иначе. Впрочем, у меня и браслет 1s, а не третий. Я исходил из того, что эффект обнаружился, когда я поставил новое приложение на новом телефоне. Прошивка, судя по версии, старая (не новее 17 года, а телефон я менял в 18). Но будем честны, в данные BT я не лез, хоть и имею такую возможность (но мне правда лень).
iig
19.08.2019 19:39иметь в треке каденс на данную секунду, а не за 5-10 до этого.
Чисто для интереса: вы, наверное, знаете, в каких единицах измеряют этот самый каденс? ;) Что там в знаменателе за единица времени?wholeman
19.08.2019 19:49Каденс измеряется в количестве шагов в минуту, соответственно в знаменателе там минута. Также, как и у ЧСС. И оба этих показателя обычно записывается в трек посекундно, поскольку в течение минуты могут изменяться, иногда значительно.
iig
20.08.2019 00:01Вот именно. Показатель, интегрированный поминутно, пересчитывать ежесекундно — только полюбоваться на скачущие цифры.
wholeman
20.08.2019 00:25Ага. И на спидометр чаще одного раза в час смотреть не надо. Ведь он скорость в километрах в час показывает.
wholeman
20.08.2019 00:33Поларовский датчик передаёт каденс каждую секунду. Гарминовский — три раза в секунду. И ничего не скачет. Объясните, зачем Вы лезете в тему, в которой не разбираетесь?
iig
20.08.2019 07:46Вот, к примеру, человек идёт со скоростью 121 шаг в минуту. Сколько это шагов за секунду?
wholeman
20.08.2019 10:24Не объяснили.
Поделите 121 на 60, если надо. Но такая единица не используется, т.к. неудобна. 121 шаг в минуту в данный момент (моментальная величина) означает, что, если человек будет идти в этом темпе, за минуту он сделает 121 шаг, и это уже будет величина средняя за минуту. В этом смысле каденс, несмотря на дискретность шагов, полностью аналогичен скорости.iig
20.08.2019 11:11Нет. Скорость — процесс непрерывный. Смысл ее не меняется, измерена она в км/ч, м/с или в других единицах, на интервале в 1с, 1мс… Все упирается в погрешность измерения.
Ходьба — процесс изначально дискретный. Нельзя сделать 1/1000 шага. Да, по интервалу времени между 2 шагами можно проэкстраполировать, сколько шагов получится на 1 мин. Но шаги у человека не одинаковые, даже шаг левой и правой ногой отличаются. Чем меньше интервал измерения, тем больше будет разброс результатов. Вот и принято усреднять это значение на интервале в 1 мин. Ну и какой смысл обновлять это значение чаще?
моментальная величина означает, что, если человек будет идти в этом темпе, за минуту он сделает 121 шаг,
Человек 30 сек идет, 30 отдыхает. (поднимается в гору, к примеру). Моментальный темп может оказаться как 0, так и максимальный. Среднее значение за минуту — оно более осмысленно.wholeman
20.08.2019 16:33-1Ходьба — процесс непрерывный. Сделав один шаг, человек сразу же начинает следующий. Шаги устройства часто считают парами — под одну ногу, потом умножают на два. Но, например, велокомпьютер скорость тоже обычно считает по оборотам колеса, и это не делает её дискретной.
Зачем нужен моментальный каденс я написал чуть ниже. А вот средний как раз не настолько интересен.iig
20.08.2019 17:23+1велокомпьютер скорость тоже обычно считает по оборотам колеса, и это не делает её дискретной.
велокомп исходит из того, что обод колеса катится достаточно равномерно. Ноги у человека устроены иначе ;)
Зачем нужен моментальный каденс я написал чуть ниже
Нужен, и ладно. Одной бессмыссленной цифрой больше, одной меньше… ;)
математика, бессердечная с***аМгновенная скорость – это скорость тела в данный момент времени или в данной точке траектории. Это векторная физическая величина, численно равная пределу, к которому стремится средняя скорость за бесконечно малый промежуток времени
Скорость за бесконечно малый промежуток времени я могу представить (с трудом). Чтобы измерить скорость, нужно выполнять наблюдение в течение некоторого (>0) интервала времени.
Число шагов за бесконечно малый промежуток времени — никак не представляется :(BigBeaver
20.08.2019 17:54«Скорость за промежуток времени» это бессмысленная фраза. Мгновенная скорость это производная от радиус-вектора (или от пути, если скалярную брать).
Тем не менее, вы правы, что ее смысл для дискретной величины она тоже бессмысленна.
BigBeaver
20.08.2019 12:04А зачем ват такие мелкие нюансы динамики?
wholeman
20.08.2019 16:26Мне это нужно для улучшения техники бега. При работе над каденсом удобнее знать его прямо сейчас, чтобы уменьшать или увеличивать по мере необходимости. Кроме того, интересно просматривать трек после пробежки по пересечённой местности, как менялся характер бега, что-то менять. Есть ещё мысль автоматически отслеживать СБУ, но тут, боюсь, датчик на руке не очень полезен — лучше акселерометр на ноге. Может, и до этого дойдёт.
BigBeaver
20.08.2019 18:00Не думаю, что вы можете контролировать каждый шаг в реалтайме. И собеседник выше совершенно прав про бессмысленность ежесекундных показаний. Если каденс в секунду не целый, то у вас будут выбросы. А тк обычно это числа меньше 10, то выбросы могут достигать 50% от среднего иногда просто из-за дискретизации. Вы можете возразить, что нет проблемы считать его дробным, но при малом окне сглаживания такая проблема как раз есть.
Для анализа же темпа показаний ми бэнда достаточно, имхо. Он имеет небольшой лаг, но это именно потому, что мгновенный каденс без сглаживания бессмысленен.wholeman
20.08.2019 20:35Задача не в том, чтобы контролировать каждый шаг, а в том, чтобы оперативно контролировать ритм. Используется число шагов в минуту, поэтому дроби не нужны. Я так понимаю, спортивные устройства применяют для расчёта что-то вроде 2*60/t, где t-время между шагами одной ноги. Некоторое сглаживание есть, но значительные изменения определяются быстро.
DrunkBear
19.08.2019 12:10Он, кстати, совсем не работает на танцах: за 2 часа мастер-классов показывает пару десятков шагов ( ну да, ты ровно ведёшь партнёршу, крайне редко помахивая руками)
Huawei при этом определяет шаги. GPS?BigBeaver
19.08.2019 12:17Махать руками не обязательно. Когда идешь, смотря в телефон (также ровно его держа), шаги все равно считаются. Дело скорее в замираниях и тд. При сильно активных танцах может за пару часов суточную норму шагов легко насчитать.
Ktator
19.08.2019 16:01А ещё не считает шаги, когда он на руке и коляску везёшь. Но если везти коляску одной рукой (не той, разумеется, на которой браслет), то считает правильно.
А ещё часто не считает шаги по квартире, особенно, неспешные. Иногда считает, а иногда нет.
Kriminalist
19.08.2019 11:35Mi Band дает не как попало, а используя алгоритм исключения лишних шагов. При начале движения первые шаги он держит «в уме», и прибавляет в копилку, только если движение продолжается. А расстояние ему больше просто неоткуда брать, длина шага из профиля умножается на количество. А каденс в реальном времени — это или надо брать сырые данные акселерометра и самому считать, или подключаться к браслету в режиме «Беговая дорожка».
JTG
18.08.2019 14:55Клиент gadgetbridge.org действительно неплох. Работает оффлайн, поддерживает кучу разных девайсов и в нём есть возможность экспорта/импорта данных без поясок с бубном:
Заголовок спойлераquestor
18.08.2019 14:33А кто в курсе, официальное приложение как-то нормально стало выглядеть или после последнего редизайна так и осталось в своём ужасном виде (шрифты, реклама)? Обновляться страшно.
Magister7
18.08.2019 21:57Оно ещё и тормозит ужасно, по крайней мере когда синхронизируется с МБ3. Такое чувство что они в UI-потоке это делают.
vodopad
18.08.2019 22:34Хмм, у меня всё нормально. Xiaomi Redmi Pro 6 + Mi Band 3.
Magister7
19.08.2019 10:40Xiaomi Mi4c + Mi Band 3 — при открытии приложения оно начинает синхронизироваться с браслетом, и пока не закончит — пользоваться им практически невозможно, интерфейс висит. Только из-за этого плюнул и вернул старую версию, она — работает шустро.
Ещё у меня весы есть (первая версия), но не думаю что они как-то влияют.
Gorthauer87
19.08.2019 09:55У меня приложение не очень точно определяет начало сна, она в него может просто записать то время, что я перед сном лежал и читал книгу или же смотрел фильм.
Green2
19.08.2019 10:48По моему, этот браслет позволяет следить за событиями, связанными с телом. И заботится о своём теле.
Source
19.08.2019 11:35Максимальное количество "шагов" я совершаю в пятницу и субботу
лучшее качество сна у меня в четверг, и при этом глубой сон составляет 23% от всего времени сна. А в пятницу — самое плохое качество снаНачав, нумеровать дни недели с нуля, вы в итоге сами запутались.
Если 3 — это четверг, то 5 — это суббота. А кол-во шагов максимальное в субботу и воскресенье.
И, кстати, почему ось Y не с нуля начинается? Чтобы разброс показаний выглядел более эпичным?
P.S. А вообще интересная идея собрать такую статистику, спасибо.
- Откройте
XLOR
"Экспертменты над собой" это шаги и сон? Что там про частоту секса в зависимости от дня недели? И количество сожженных калорий за год в сравнении с обедами в Макдаке?
klirichek
(к слову, секс в фитнес-браслетах уже стал мемом. Называется "500 шагов")
akdes
у друга уборщицы моего кузена всего 100…
но тут дело конечно же в сенсорах, они бывают точные и нет :D