Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Как и многие программисты, я страдал от сидячего образа жизни и низкой физической активности. Для решения этой проблемы занялся бегом, сначала на улице, потом в спортзале, затем перешёл к более интенсивным силовым упражнениям. Но как отслеживать свой прогресс и повышать мотивацию? Конечно, тут поможет IT.
В ходе увлечения спортзалом сформировался следующий набор данных, которые можно проанализировать:
Данные из дневника тренировок. Дневник это Андроид приложение, куда записываются вручную выполненные упражнения (вес, количество, время, дистанция). Позволяет выгрузить данные в виде CSV файла.
Данные с умных весов Xiaomi. Показатели: Вес, ИМТ, иные параметры.
Данные с умных часов -тоже Xiaomi Amazfit. Много разных показателей, в их числе расстояние и время пробежек и поездок, пульс, показатель МПК (максимального потребления кислорода).
После обдумываний и пробных вариантов собрались следующие требования к системе: Во-первых, дать статистику "широким взглядом". Данные за неделю- месяц можно посмотреть в приложении, но статистика должна показывать интервалы месяцев, лет. Во вторых, хотелось собрать на одном дашборде данные из всех источников. В результате ожидается повышение мотивации, когда глядишь на повышение своих результатов и более рациональная постановка целей и планирование занятий.
Нулевым этапом была собственноручно сделанная база на платформе 1С. Функциональность была совсем базовая, прожила система недолго и в какой-то момент просто пропала по причине сбоя в базе.
Про этапы дальнейшей эволюции анализа расскажу подробнее:
1. Pix BI и ручной перенос таблиц
Проект начался, когда по работе пересекся с системой аналитики Pix BI. В качестве тестового проекта как раз и использовал выше указанные данные. Как выглядел workflow на этом этапе: Запросил в Amazfit файлы статистики - загрузил в таблицы вручную. В самом начале загружал CSV таблицы в хранилище Pix BI напрямую, но потом перенес на облачный Posgres, что добавило гибкости в обработке.
Почему отказался:
Pix BI мне показался недружелюбным. Не было удобной работы с датами, хотя фильтр по датам удобен. Многое приходилось настраивать вручную. Не очень был удобен интерфейс. Важное примечание: на данный момент эти претензии могут быть неактуальные, т.к. тестирование проходило давно, систему разработчики постоянно развивают.
У Pix BI нет открытого сервера в облаке, который можно использовать как хочешь, его надо разворачивать на своих мощностях.
Был закрыт облачный сервер Posgres, который позволял удобно конвертитровать CSV в базу данных.
2. Datalens и полуручной перенос из таблиц
Через некоторое время решил восстановить уже на другой платформе. Выбрал Yandex datalens. Из преимуществ: он бесплатно доступен в облаке. Имеет красивый интерфейс, прост и гибок в настройке. Поддерживает много разных видов подключений, в том числе к таблицам Google (Странно, что не документам Яндекс), и к базам данных Postgres.
На первом этапе для исследования подключался к Google документам, куда загружал CSV.
Позже нашёл новый бесплатный хостинг для базы данных, но он не поддерживал автоматический импорт из CSV. В результате для обработки данных был использован Python и родился блокнот в Google Colab, читающий файлы и загружающий их в Postgres. Удобство главным образом было опять в облачной обработке: я мог загрузить файлы и запустить обработку из любого места.
На этом этапе стали актуальны проблемы с выгруженными файлами: Во первых, ограниченное количество записей. Статистика отдавала 300-500 последних записей, что было неудобно. В некоторых файлах (С данными статистики сна, например), были откровенно мусорные и непонятные записи за совсем давние периоды.
3. Datalens и автоматическое заполнение данных из API
Наконец, однажды мне пришла идея посмотреть, нельзя ли как-то обойти вариант с файлами. После небольших поисков наткнулся на статью Export Mi Fit and Zepp workout data, показывающую как получить необходимые ключи доступа и выгрузить данные через веб в формате json. В тот же вечер была готова загрузка одной таблицы. Но тут встретил еще кучу проблем: АПИ не официальный и не документированный, Роланд получил доступ путем реверс-инжинеринга приложения. Мне же нужны были данные еще как минимум из одной таблицы и за максимальный период, их я получил после короткой переписки с коллегой. В анализе приложения основной проблемой стал Certificate Pinning: удалось перехватить сайт, на который идет запрос, но сами запросы и их параметры зашифрованы. Есть пара вариантов как решить эту проблему, но пока не занимался этим вопросом. Еще одним вариантом было дизассемблирование приложения, но оно тоже не дало положительных результатов, параметры запросов там явным образом не прописаны.
Получение данных оформлено в отдельную Python библиотеку. На данный момент версия уже более-менее работоспособная, но есть куда расширяться, что документировать и рефакторить. Например, заметил что обработка не учитывает часовой пояс активности, но не считаю это проблемой: не в своем часовом поясе была только пара занятий, да и статистика собирается за месяц.
4. Планы на будущее
На данный момент реализованы только базовые функции работы с АПИ. Нужно победить защиту приложения, чтобы получить все данные за весь период. Конечно, требуется документирование на английском языке. Единственная функция, которую не планирую реализовывать - получение данных в формате файлов GPX, которая уже реализована изначальным автором.
В библиотеке используются только синхронные методы. Пока не вижу необходимости в асинхронном получении данных (не сильно тормозит обработку, всего пара запросов на одну загрузку). Но в голове держу, что как-нибудь надо будет пересмотреть этот момент.
Одна таблица с дневником тренировок не из экосистемы Amazfit и не доступна через API. Тут следующий план: создать Telegram бот для ее обработки и загрузки, и выводить через телегу какую-нибудь статистику и напоминания.
5. Результаты и выводы
В текущей версии дашборд показывает следующий набор данных:
Статистика кардио-упражнений.
Статистика упражнений со свободными весами и на тренажёрах, рекорды по весу и количеству повторений.
Статистика физической формы (ИМТ, вес- максимальное, минимальное, среднее значение и изменение за месяц), параметры мышечной массы с весов.
Время на упражнения и затраченные калории.
С точки зрения программирования новых навыков я не получил, ничего нового и необычного в коде нет. Как пет-проект в резюме может быть показательно вероятно, плюс в копилку.
Как Система аналитики проект реально дает результаты. За прошедший год она позволила поставить рекорд по суммарному расстоянию бега за год, рекорд по темпу бега на 10 км, преодолеть полумарафон, повысить раза в полтора результаты в силовых упражнениях и упражнениях с собственным весом.