Изучаем данные, собранные Xiaomi Mi Band за год

Введение


Люди носят фитнес-браслеты по разным причинам, я могу предположить некоторые из них:


  1. Для того, чтобы поддерживать себя в форме и выполнять цели по активности;
  2. Потому что это некая модная штучка;
  3. Чтобы ставить над собой эксперименты или узнать себя лучше.

Я ношу фитнес браслет по причине номер 3. В этой заметке я хочу рассказать о том, как можно извлечь данные из браслета и попробовать получить некоторые зависимости.


Методы для извлечения этих данных работают для Mi Band 1, 1S и, возможно, 2 (приложение для 2, кажется, такое же).


Извлечение данных


Для извлечения данных с браслета в первую очередь надо достать с телефона SQLite базу данных, в которой хранятся собираемые метрики. В случае Android'a делается это предельно просто см. топик на форуме xda-developers, скрипты под актуальную базу:


  1. Подключаем Android телефон с включенным режимом отладки по USB к компьютеру;
  2. Делаем бэкап приложения: adb backup -f mi.ab -noapk -noshared com.xiaomi.hm.health;
  3. Создаем dd if=mi.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" > mi.tar;
  4. Распаковываем архив с БД: tar xvf mi.tar apps/com.xiaomi.hm.health/db/ 2>&1 | tee -a log;
  5. Копируем БД: 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) час. Кажется, с этим все ок.


sleep time


Другая очевидная вещь — высыпаюсь я по выходным:


sleep vs week day


А если назвать отношение глубокого сна к легкому качеством, то выяснится, что лучшее качество сна у меня в четверг, и при этом глубой сон составляет 23% от всего времени сна. А в пятницу — самое плохое качество сна, боюсь даже предположить почему.


activity vs week day


Максимальное количество "шагов" я совершаю в пятницу и субботу:


activity vs week day


При этом среда у меня — день, когда я мало сплю и мало хожу, очевидных объяснений из разряда "я работаю из дома" — нет, поэтому это что-то новое для меня.


Надеюсь, что кто-нибудь из обладателей популярных браслетов Mi band тоже захочет поизучать себя и расскажет о своих особенностях.

Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 74

    –6

    "Экспертменты над собой" это шаги и сон? Что там про частоту секса в зависимости от дня недели? И количество сожженных калорий за год в сравнении с обедами в Макдаке?

      +4

      (к слову, секс в фитнес-браслетах уже стал мемом. Называется "500 шагов")

        +1
        у друга уборщицы моего кузена всего 100…
        но тут дело конечно же в сенсорах, они бывают точные и нет :D
      +1
      Инструкция с известного сайта по извлечению данных с аккаунта Xiaomi, проверено — рабочая. Где -то месяц назад пользовался — в ответ приходят несколько таблиц.
      Инструкция
      1. Откройте mifit.huami.com/t/account_mifit или api-mifit.huami.com/t/account_mifit (если что, через VPN)
      2. Выберите «Экспорт данных», потом «Определить»
      3. Вверху выберите тип вашего Mi-аккаунта (игнорируйте поля внизу)
      4. Введите логин и пароль к аккаунту, который используется в Mi Fit
      5. Разрешите доступ к аккаунту нажав «Sign in»
      6. Отметьте галочками интересующие вас данные: «Активность», «Сон», «Пульс», «Вес», «Тренировки»
      7. В полях «От» и «До» выберите самые крайние даты
      8. Нажмите «Определить»
      9. Введите любой доступный вам e-mail, вовсе необязательно тот, на который аккаунт
      10. Также введите капчу и нажмите «Определить»
      11. Через минут 10 проверьте почтовый ящик указанный выше
      12. Перейдите по ссылке в письме от Xiaomi
      13. Скопируйте указанный пароль и нажмите «Загрузка»
      14. Извлеките все файлы из скачанного архива и когда спросит вставьте тот пароль
      15. Открывайте файлы в Excel / Open Office через «Открыть» > «Все файлы» указав в качестве разделителя запятую или же просто в Блокноте как текст


      Пример

        +5
        Что это за сайт? Как-то боязно давать доступ к своему аккаунту неизвестно кому.
          +2
          Вроде как разработчики же браслета (HUAMI Amazefit).
            0

            "Вроде бы", пожалуй откажусь

              +4
              Не вроде бы, а точно.
                0

                Спасибо, было интересно вас читать!

            +3
            Эм, а зачем какой-то сайт если всё уже есть в приложени Mi Fit?
            Profile -> Settings -> About -> Exercising user rights -> Export data и уже там залогиниться. Не исключаю, что там открывается та же страничка, но всё это в рамках приложения остаётся.
              +2

              Браслеты Xiaomi можно к Google Fit, у которого есть History API, который можно использовать потоково, т.е. без ручного экспорта откуда бы то ни было.

              +1
              Люди носят фитнес-браслеты по разным причинам

              Ещё в копилку отличный будильник и способ не пропускать звонки с телефона, но это больше ко второй версии(есть такая проблема).
              Касательно графиков.
              Чем меньше спите(от вашей нормы) тем меньше активность в течении дня, визуально это нормальная оптимизация организма. Касательно отношения периодов сна то у вас прямо полноценный ритм получился и скорее там суббота имелась ввиду.
                –1
                Сон же оно неправильно определяет: проснулся в пять утра в туалет, лёг, поспал еще несколько часов, но оно об этом уже не догадывается, думает, что в 5 ты проснулся окончательно
                  0
                  нет. хотя может если только по большому…
                    0
                    Уже на моменте «лег» сяоми неправильно определяет сон)
                    Если быть точным, то мибенд измеряет не сон, а «время покоя».
                      0
                      Браслеты и часы Xiaomi сами вообще ничего не определяют, они хранят сырые данные, которые уже обрабатывает приложение в телефоне. Официальное приложение делает это так, как захотели его разработчики.

                      Есть неофициальные приложения для данных устройств, в том числе великолепные от отечественных разработчиков, которые таких ошибок не допускают и определяют верно даже дневной сон.
                        0
                        О каком приложении от отечественных разработчиков идёт речь?
                          +2
                          На 4pda же легкой найти, я пользуюсь Amazfit Master для часов.
                        0
                        Это не так — короткие пробуждения так и записываются в виде пробуждений. По-моему (из опыта), до получаса могут быть. То есть, я временами успеваю нормально пожрать, и приложение считает продолжение сна а сон, как и положено.

                        Вот то, что оно не умеет в дневной или просто слишком поздний сон, это минус.
                        0
                        Кто-нибудь использует приложение Pacer? Есть ли опыт выгрузки данных с этого сервиса? Я так понимаю, штатных способов нет.
                          0
                          Мне лень выдирать данные вручную, когда можно посмотреть в приложении.
                          В Mi band master можно смотреть данные за длительные промежутки. Со вторым бандом оно работает, с первым — фиг знает.
                          У меня практически всегда фаза глубокого сна — 3.5 часа.
                            0

                            Вау, расскажите про свой типичный день?
                            Когда у меня глубокий сон 2 часа — это успех, бывает может раз в месяц, а обычное значение — 1 час 20 мин

                              +1
                              Особого распорядка дня у меня нет.
                              Просыпаюсь около полудня, засыпаю около 4 часов утра, потому что по-другому не высыпаюсь.
                              Большую часть дня провожу за ПК — моделирование, рисование, чтение. Из физических нагрузок — приседания, пресс, пешие прогулки, иногда велотренажер, опять же, без особого распорядка, по настроению.
                              Обычно на улицу выхожу после 19, из-за особенностей зрения.

                              Что интересно, если урезать длительность сна — урезается в основном длительность легкого сна. Правда, если долго не высыпаться — начинает глючить вестибулярный аппарат.
                            +3
                            Существуют ли фитнес трекеры которые бы гарантированно не сливали активность владельца в веб, храня данные только локально на телефоне (или вообще в себе?).

                              +1

                              Возможно, вот этот вот скоро будет подходящим выбором: https://habr.com/en/news/t/463521/

                                0
                                Протокол Mi Band открыт, можно пользоваться сторонними приложениями, например опенсорсным Gadgetbridge.
                                  +2
                                  А где он открыт? Есть какие-то официальные документы, разве?
                                    +2
                                    Хм, а может и не открыт, но в любом случае сторонних приложений хватает.
                                    0
                                    Он где-нибудь описан? Хочу к своему приложению третью ми-банду подцепить. С пульсометром проблем нет — он там по стандарту работает, число шагов тоже вроде бы понятно, а вот расстояние и, особенно, каденс хотелось бы поиметь в реальном времени.
                                      0
                                      Расстояние просто вычисляется по длине шага, которая из роста берётся, а каденс как раз в числе шагов в минуту и мерятся.
                                        0
                                        Датчики на ногу дают каденс ежесекундно или даже чаще. Mi Band, насколько я понял, даёт шаги как попало: то молчит, то сразу десяток накинет. А насчёт расстояния — это предположение или есть проверенная информация?
                                          0
                                          Он их буферизует. Это нужно для функции сглаживания и защиты (хоть какой-то) от ложных срабатываний типа поездки в транспорте. Это же универсальный датчик для круглосуточного применения в рандомных условиях, а не спортивный.
                                            0
                                            А без буферизации никак? Может, отдельная характеристика какая есть? На странице тренировки в приложении Mi Fit каденс есть, причём чаще, чем поминутный. К сожалению, полные данные о тренировке мне выгрузить не удалось.
                                              0
                                              А без буферизации никак?
                                              Эмм, а зачем? Там буфер шагов 10. После начала ходьбы в ровном темпе он начинает стабильно добавлять пошагово. В начале же он не знает, то ли вы со стула упали то ли пошли куда-то. Потому последовательность «предположительно шагов» буферизуется, пока не наберется некоторое окно, достаточное для обработки сигнала (частотный анализ, корреляционный или хз, какие там алгоритмы). Если после анализа паттерн признан похожим на ходьбу, то дальше окно просто скользит по выборке без дополнительных задержек.
                                              Может, отдельная характеристика какая есть?
                                              Отдельная характеристика чего?
                                              К сожалению, полные данные о тренировке мне выгрузить не удалось.
                                              Честно говоря, тоже не понятен смысл. Он выдает все нужные для анализа метрики и графики.
                                              Типа таких
                                              image
                                                0
                                                Эмм, а зачем? Там буфер шагов 10. После начала ходьбы в ровном темпе он начинает стабильно добавлять пошагово.
                                                Чтобы иметь в треке каденс на данную секунду, а не за 5-10 до этого. В отличие от трекера, я знаю, что уже иду или бегу, а не делаю что-то другое, поэтому мне его сомнения ни к чему.
                                                Отдельная характеристика чего?
                                                Bluetooth LE, точнее GATT characteristics.
                                                Честно говоря, тоже не понятен смысл. Он выдает все нужные для анализа метрики и графики.
                                                Не выдаёт, а показывает в приложении. Причём там даже зума нет. И, например, в Страву не выгрузить.
                                                У меня же мысль была в том, чтобы использовать Mi Band вместо датчика на ногу в своём приложении.
                                                  0
                                                  Bluetooth LE, точнее GATT characteristics.
                                                  Так это приложение так обрабатывает и отображает. Сами-то данные нормально передаются сплошным потоком, вроде (впрочем, не знаю, можно ли их выгрузить. но думаю, что можно). Или нет?.. Еще это от прошивок зависит — в старых этой буферизации не было, но суточное число шагов стабильно завышалось в поездках.
                                                    0
                                                    Нет, передаётся ровно то же, что и на экране, и в приложении. Может быть, и ещё что-то есть — глубоко я пока не копал. Поэтому я и спросил: описан ли где-нибудь протокол. У человека, который его вообще открытым обозвал. Ну, чтобы самому не реверсить и по году GadgetBridge не восстанавливать, если всё есть.
                                                      0
                                                      Хмм, my bad. Почему-то думал иначе. Впрочем, у меня и браслет 1s, а не третий. Я исходил из того, что эффект обнаружился, когда я поставил новое приложение на новом телефоне. Прошивка, судя по версии, старая (не новее 17 года, а телефон я менял в 18). Но будем честны, в данные BT я не лез, хоть и имею такую возможность (но мне правда лень).
                                                    0
                                                    иметь в треке каденс на данную секунду, а не за 5-10 до этого.


                                                    Чисто для интереса: вы, наверное, знаете, в каких единицах измеряют этот самый каденс? ;) Что там в знаменателе за единица времени?
                                                      0
                                                      Каденс измеряется в количестве шагов в минуту, соответственно в знаменателе там минута. Также, как и у ЧСС. И оба этих показателя обычно записывается в трек посекундно, поскольку в течение минуты могут изменяться, иногда значительно.
                                                        0

                                                        Вот именно. Показатель, интегрированный поминутно, пересчитывать ежесекундно — только полюбоваться на скачущие цифры.

                                                          0
                                                          Ага. И на спидометр чаще одного раза в час смотреть не надо. Ведь он скорость в километрах в час показывает.
                                                            +1
                                                            Поларовский датчик передаёт каденс каждую секунду. Гарминовский — три раза в секунду. И ничего не скачет. Объясните, зачем Вы лезете в тему, в которой не разбираетесь?
                                                              +1

                                                              Вот, к примеру, человек идёт со скоростью 121 шаг в минуту. Сколько это шагов за секунду?

                                                                0
                                                                Не объяснили.

                                                                Поделите 121 на 60, если надо. Но такая единица не используется, т.к. неудобна. 121 шаг в минуту в данный момент (моментальная величина) означает, что, если человек будет идти в этом темпе, за минуту он сделает 121 шаг, и это уже будет величина средняя за минуту. В этом смысле каденс, несмотря на дискретность шагов, полностью аналогичен скорости.
                                                                  +1
                                                                  Нет. Скорость — процесс непрерывный. Смысл ее не меняется, измерена она в км/ч, м/с или в других единицах, на интервале в 1с, 1мс… Все упирается в погрешность измерения.
                                                                  Ходьба — процесс изначально дискретный. Нельзя сделать 1/1000 шага. Да, по интервалу времени между 2 шагами можно проэкстраполировать, сколько шагов получится на 1 мин. Но шаги у человека не одинаковые, даже шаг левой и правой ногой отличаются. Чем меньше интервал измерения, тем больше будет разброс результатов. Вот и принято усреднять это значение на интервале в 1 мин. Ну и какой смысл обновлять это значение чаще?

                                                                  моментальная величина означает, что, если человек будет идти в этом темпе, за минуту он сделает 121 шаг,


                                                                  Человек 30 сек идет, 30 отдыхает. (поднимается в гору, к примеру). Моментальный темп может оказаться как 0, так и максимальный. Среднее значение за минуту — оно более осмысленно.
                                                                    –1
                                                                    Ходьба — процесс непрерывный. Сделав один шаг, человек сразу же начинает следующий. Шаги устройства часто считают парами — под одну ногу, потом умножают на два. Но, например, велокомпьютер скорость тоже обычно считает по оборотам колеса, и это не делает её дискретной.
                                                                    Зачем нужен моментальный каденс я написал чуть ниже. А вот средний как раз не настолько интересен.
                                                                      +1
                                                                      велокомпьютер скорость тоже обычно считает по оборотам колеса, и это не делает её дискретной.


                                                                      велокомп исходит из того, что обод колеса катится достаточно равномерно. Ноги у человека устроены иначе ;)

                                                                      Зачем нужен моментальный каденс я написал чуть ниже


                                                                      Нужен, и ладно. Одной бессмыссленной цифрой больше, одной меньше… ;)
                                                                      математика, бессердечная с***а
                                                                      Мгновенная скорость – это скорость тела в данный момент времени или в данной точке траектории. Это векторная физическая величина, численно равная пределу, к которому стремится средняя скорость за бесконечно малый промежуток времени

                                                                      Скорость за бесконечно малый промежуток времени я могу представить (с трудом). Чтобы измерить скорость, нужно выполнять наблюдение в течение некоторого (>0) интервала времени.
                                                                      Число шагов за бесконечно малый промежуток времени — никак не представляется :(
                                                                        0
                                                                        «Скорость за промежуток времени» это бессмысленная фраза. Мгновенная скорость это производная от радиус-вектора (или от пути, если скалярную брать).

                                                                        Тем не менее, вы правы, что ее смысл для дискретной величины она тоже бессмысленна.
                                                                          0
                                                                          Велокомп и каденс постоянно считает, в оборотах педалей в минуту. При том, что на пересечёнке это куда менее равномерная величина, чем шаги.
                                                                            0
                                                                            Ну дробные обороты это нормально в отличие от шагов. Неравномерная на каком масштабе?
                                                                      0
                                                                      А зачем ват такие мелкие нюансы динамики?
                                                                        0
                                                                        Мне это нужно для улучшения техники бега. При работе над каденсом удобнее знать его прямо сейчас, чтобы уменьшать или увеличивать по мере необходимости. Кроме того, интересно просматривать трек после пробежки по пересечённой местности, как менялся характер бега, что-то менять. Есть ещё мысль автоматически отслеживать СБУ, но тут, боюсь, датчик на руке не очень полезен — лучше акселерометр на ноге. Может, и до этого дойдёт.
                                                                          0
                                                                          Не думаю, что вы можете контролировать каждый шаг в реалтайме. И собеседник выше совершенно прав про бессмысленность ежесекундных показаний. Если каденс в секунду не целый, то у вас будут выбросы. А тк обычно это числа меньше 10, то выбросы могут достигать 50% от среднего иногда просто из-за дискретизации. Вы можете возразить, что нет проблемы считать его дробным, но при малом окне сглаживания такая проблема как раз есть.

                                                                          Для анализа же темпа показаний ми бэнда достаточно, имхо. Он имеет небольшой лаг, но это именно потому, что мгновенный каденс без сглаживания бессмысленен.
                                                                            0
                                                                            Задача не в том, чтобы контролировать каждый шаг, а в том, чтобы оперативно контролировать ритм. Используется число шагов в минуту, поэтому дроби не нужны. Я так понимаю, спортивные устройства применяют для расчёта что-то вроде 2*60/t, где t-время между шагами одной ноги. Некоторое сглаживание есть, но значительные изменения определяются быстро.
                                                                              0
                                                                              Ну лаг в 3-5 секунд вам ничего не испортит.
                                                      0
                                                      Он, кстати, совсем не работает на танцах: за 2 часа мастер-классов показывает пару десятков шагов ( ну да, ты ровно ведёшь партнёршу, крайне редко помахивая руками)
                                                      Huawei при этом определяет шаги. GPS?
                                                        0
                                                        Махать руками не обязательно. Когда идешь, смотря в телефон (также ровно его держа), шаги все равно считаются. Дело скорее в замираниях и тд. При сильно активных танцах может за пару часов суточную норму шагов легко насчитать.
                                                          0
                                                          Я сейчас про кизомбу, где мягкое ведение и мягкие шаги — это MiBand 3 плохо отслеживал, huawei справляется лучше.
                                                            0
                                                            Не, я понимаю механизм и верю вам) Просто не стоит об этом париться вообще.
                                                          0
                                                          А ещё не считает шаги, когда он на руке и коляску везёшь. Но если везти коляску одной рукой (не той, разумеется, на которой браслет), то считает правильно.
                                                          А ещё часто не считает шаги по квартире, особенно, неспешные. Иногда считает, а иногда нет.
                                                        0
                                                        Mi Band дает не как попало, а используя алгоритм исключения лишних шагов. При начале движения первые шаги он держит «в уме», и прибавляет в копилку, только если движение продолжается. А расстояние ему больше просто неоткуда брать, длина шага из профиля умножается на количество. А каденс в реальном времени — это или надо брать сырые данные акселерометра и самому считать, или подключаться к браслету в режиме «Беговая дорожка».
                                                  +2
                                                  Клиент gadgetbridge.org действительно неплох. Работает оффлайн, поддерживает кучу разных девайсов и в нём есть возможность экспорта/импорта данных без поясок с бубном:
                                                  Заголовок спойлера

                                                  0

                                                  А кто в курсе, официальное приложение как-то нормально стало выглядеть или после последнего редизайна так и осталось в своём ужасном виде (шрифты, реклама)? Обновляться страшно.

                                                    +2
                                                    Шрифты починены, реклама на месте.
                                                      0

                                                      Оно ещё и тормозит ужасно, по крайней мере когда синхронизируется с МБ3. Такое чувство что они в UI-потоке это делают.

                                                        0
                                                        Хмм, у меня всё нормально. Xiaomi Redmi Pro 6 + Mi Band 3.
                                                          0

                                                          Xiaomi Mi4c + Mi Band 3 — при открытии приложения оно начинает синхронизироваться с браслетом, и пока не закончит — пользоваться им практически невозможно, интерфейс висит. Только из-за этого плюнул и вернул старую версию, она — работает шустро.
                                                          Ещё у меня весы есть (первая версия), но не думаю что они как-то влияют.

                                                          0
                                                          По-моему после гарминовского просто летает.
                                                        0

                                                        У меня приложение не очень точно определяет начало сна, она в него может просто записать то время, что я перед сном лежал и читал книгу или же смотрел фильм.

                                                          0
                                                          По моему, этот браслет позволяет следить за событиями, связанными с телом. И заботится о своём теле.
                                                            0
                                                            Максимальное количество "шагов" я совершаю в пятницу и субботу

                                                            лучшее качество сна у меня в четверг, и при этом глубой сон составляет 23% от всего времени сна. А в пятницу — самое плохое качество сна

                                                            Начав, нумеровать дни недели с нуля, вы в итоге сами запутались.
                                                            Если 3 — это четверг, то 5 — это суббота. А кол-во шагов максимальное в субботу и воскресенье.


                                                            И, кстати, почему ось Y не с нуля начинается? Чтобы разброс показаний выглядел более эпичным?


                                                            P.S. А вообще интересная идея собрать такую статистику, спасибо.

                                                              –1
                                                              0-воскресенье, суббота — 6, все ОК
                                                                +1
                                                                Только не сходится с текстом поста.

                                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                            Самое читаемое