Данные о сне, пульсе и тренировках, которые собирают фитнес-трекеры, обычно лежат в фирменных приложениях и редко используются за их пределами. Один разработчик решил это исправить: он написал скрипт, который выгружает данные из Garmin Connect в файл, чтобы затем скормить их ChatGPT. За вечер он создал первую версию, а спустя время проект превратился в открытый пайплайн с Telegram-ботом, локальной моделью и кэшем на SQLite.
Суть проблемы, которую решает автор, проста: Garmin записывает почти всё — сон, HRV, стресс, Body Battery, пульс на тренировке, каждый подход в зале. Но ChatGPT ничего этого не видит. Чтобы спросить у нейросети, как прошла неделя, нужно было вручную открыть Garmin Connect, переписать цифры и вставить их в чат. Это неудобно, и именно раздражение от этого стало триггером для создания автоматизации.
Первый скрипт быстро перестал устраивать. Появился дневной отчёт: сон, HRV, стресс, Body Battery, RHR, шаги. Затем — недельный, со сравнением к прошлой неделе. Дальше возникла потребность в файловой библиотеке на диске, чтобы можно было разобрать тренировку за прошлый вторник, а не только сегодняшнюю. Структура библиотеки включает папки daily, weekly, range и activities, где хранятся markdown-файлы и CSV с деталями тренировок.
Система выросла в открытый пайплайн: локальный кэш, Telegram-бот, Ollama, веб-мастер и Windows-дистрибутив.
Детали, которые на самом деле собирают доверие к цифрам, всплывали по ходу. Продолжительность тренировки сначала печаталась как "58м" — читалось как метры, а не минуты. Исправили на "58:57". Мелочь, но если в отчёте путаются единицы измерения, дальше не веришь и остальным числам. Отдельно пришлось повозиться со сплитами для велосипеда: у бега автоматические километровые отметки почти всегда есть, у велосипеда часто нет ни одной. Пришлось считать сплиты самому, пересчитывая точки трека с переменным интервалом записи в километровые отрезки.
Ключевой момент — кэширование. Сначала каждый повторный запрос отчёта за период снова шёл в Garmin API по каждому дню. Попросил отчёт за две недели, через час попросил снова — опять 14 обращений к API, хотя данные не менялись. Автор задал себе вопрос: почему это не работает как графики в Garmin Connect, где история не пересчитывается при каждом открытии? Решение — локальный SQLite, который хранит сырые ответы API, а не только готовые посчитанные цифры. Это позволяет доставать новые поля из уже сохранённых данных, не долбя Garmin заново. Отчёт за период сначала проверяет, какие дни уже в кэше, и в API летит только недостающий кусок. Фоновая синхронизация через Windows Task Scheduler дополняет картину.
Развилка — закрытый продукт или открытый. Рынок ИИ-фитнес-коучей в России уже не пустой: закрытые сервисы, подписки, чужие серверы, на которых лежат данные о сне и пульсе. Стандартная схема — сделать закрытый продукт и продавать доступ. Автор решил наоборот: открытый код, self-hosted, каждый ставит себе сам. Данные уходят только в Garmin Connect и в тот LLM-провайдер, которого сам укажешь. Если указать локальную модель через Ollama, данные вообще не покидают компьютер. Дело не в том, что бизнес на этом плохая идея, а в том, что для "моего сна и моего пульса" закрытая коробка с чужим сервером внутри доверия не вызывает. Код, который можно прочитать и запустить у себя, — вызывает.
Сейчас проект включает локальный кэш, агентный Telegram-бот, локальную модель на Ollama, веб-мастер настройки, Windows-дистрибутив и заявку на акселератор Sber500. По пути пришлось несколько раз пересобрать саму задачу. Это пример того, как личная автоматизация может вырасти в полноценный инструмент, который другие могут использовать, сохраняя контроль над своими данными.

