Garmin у меня на руке два года. Сон, пульс, HRV, стресс, Body Battery, каждая тренировка по секундам, каждый подход в зале. Всё это оседает в Garmin Connect и там же и остаётся.
Хотелось просто спросить у ChatGPT, как прошла неделя. По своим цифрам, а не общими словами про сон вообще. ChatGPT их не видит, поэтому спрашивал по-другому: открывал Garmin Connect, скринил график сна, скринил HRV, скринил тренировку, кидал скрины в чат один за другим. Работало, но криво. На одном скрине сон, на другом HRV, а связать их между собой должен был я сам, руками, в голове. ChatGPT видел кусок картинки, а не то, что происходило со мной за неделю целиком.
Задолбался. Написал скрипт, который сам забирает сон и HRV за сегодня и складывает в файл. Без плана на будущее, просто чтобы не переписывать руками. А дальше пошло по накатанной: файла быстро стало мало, появился отчёт за неделю, потом бот в Телеграме, потом бот научился не только отвечать, но и сам создавать тренировки в Garmin. Сейчас это открытый проект. Ставится на свою машину.
Про архитектуру и код у меня отдельная статья, там кэш и все технические подробности. Здесь про другое: что реально можно спросить и зачем вообще этим заниматься.
Цифра без разбора ничего не значит
Garmin честно всё считает. HRV 47 мс, статус UNBALANCED. Body Battery упала с 83 до 10 за день. Sleep score 83 из 100. Цифры настоящие, часы их реально насчитали по мне. Что с ними делать, часы не говорят.
Можно погуглить, что вообще такое HRV. Можно вставить скрин в ChatGPT, только он видит одну цифру без истории: не знает, какой у меня HRV обычно и что изменилось за неделю. Разбираться, что нормально конкретно для меня, приходилось самому, за пару лет ношения часов методом накопленного опыта.
У бота есть история моих же данных: какой HRV был на прошлой неделе, какой обычно RHR, сколько в среднем сна. Спрашиваю не «что такое HRV», а «почему сегодня ниже». Ответ строится по моим цифрам за предыдущие недели, не по общей статье про HRV из интернета.
Это не диагноз и не замена врача. Это просто разбор того, что уже насчитали часы, с оглядкой на то, что было у меня раньше.
Просто спросить
Открыл Garmin, сделал три скрина, вставил в чат по одному. Так было раньше.
Сейчас пишу боту «как прошла неделя» и получаю ответ по своим настоящим данным. Без переписывания.
Разница не в том, что ответ красивее оформлен. Разница в том, что бот сам решает, куда за ним лезть. Спросил про последнюю тренировку, он сам понял, какая это была тренировка, вытащил пульс, длительность, калории, разбил силовую по подходам и сказал, какие группы мышц работали:

Мышечные группы Garmin сам наружу не отдаёт, официального доступа к этому нет. Пришлось отдельно разбираться, какая категория упражнения относится к какой группе мышц, и собрать таблицу самому. Для того, кто просто пишет боту, вся эта возня не видна вообще. Видно только ответ.
Тренировку можно попросить словами
В приложении Garmin есть конструктор тренировок: шаги, пульсовые зоны, сохранить, отправить на часы. Сам я туда почти не заходил. Открывать конструктор ради одной пробежки с интервалами всегда казалось лишней задачей поверх основной.
Оказалось, что если у бота есть доступ не только читать, но и писать в Garmin, работает это не только для меня. Написал боту, что хочу интервальную тренировку на велосипеде по образцу последней реальной поездки, с алертом по пульсу на спринтах. Он собрал шаги, выставил зоны, отправил. Тренировка появилась на часах.
Для силовых устроено иначе: не разминка и заминка, а конкретные упражнения, подходы, повторы, вес. Попросил тренировку на кор и ягодицы, два подхода по двадцать повторений, тридцать секунд отдыха между подходами. Собралась и легла в библиотеку.
Перед тем как что-то реально уходит в Garmin, бот показывает план и просит подтвердить: сколько шагов, сколько минут, какие зоны. Не из-за недоверия к себе, а потому что один раз модель перепутала логику интервалов, и обычная тридцатиминутная тренировка превратилась в четырёхчасовую. С подтверждением такую вещь видно сразу, а не после того, как она уже легла на часы.

Данные твои
Тут можно было сделать закрытое приложение с подпиской. Такие сервисы в России уже есть: платишь, получаешь отчёты, а что происходит на чужом сервере с твоим сном, не знаешь.
Не стал так делать. Свой сон и свой пульс не хочется класть в коробку, которую нельзя открыть и посмотреть внутрь.
Весь пайплайн ставится на своей машине. Данные попадают в двух местах: в Garmin, откуда их и забираем, и там, куда сам укажешь для анализа, обычный ключ от провайдера или локальная модель на своём же компьютере через Ollama. С локальной моделью цифры вообще не выходят из дома.
Завести это несложно
Скачал архив, распаковал, дважды кликнул по иконке. Всё. Открывается страница настройки в браузере, на своём же компьютере. Вписал почту и пароль от Garmin, вставил ключ от LLM или выбрал локальную модель, добавил токен бота от @BotFather. Сохранил, и всё, окно можно закрывать: пайплайн работает сам, а разговор с ним идёт в Телеграме с телефона.
Собрано под Windows и под macOS. Код руками трогать не нужно вообще.

Если у тебя не Garmin
Работает всё это только с Garmin. Причина простая: на руке у меня Garmin, и весь разбор начался именно с него.
У кого-то другой велостанок, другие часы, другой источник данных о сне, и разрыв между этим устройством и ИИ точно такой же. Если это твой случай, напиши. Каталог всех брендов заранее не обещаю, разбор конкретной ситуации обещаю.
Если хочется разобраться, как это работает под капотом
Отдельная статья с кодом и архитектурой: https://habr.com/ru/articles/1071224/. Здесь её не пересказываю.
Репозиторий открыт: github.com/TolmachevKirill/garmin_ai. Готовая версия лежит в релизах.