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, сделал три скрина, вставил в чат по одному. Так было раньше.

Сейчас пишу боту «как прошла неделя» и получаю ответ по своим настоящим данным. Без переписывания.

Разница не в том, что ответ красивее оформлен. Разница в том, что бот сам решает, куда за ним лезть. Спросил про последнюю тренировку, он сам понял, какая это была тренировка, вытащил пульс, длительность, калории, разбил силовую по подходам и сказал, какие группы мышц работали:

Telegram-бот отвечает на вопрос о последней тренировке: тип, длительность, пульс, упражнения по подходам и задействованные группы мышц
Telegram-бот отвечает на вопрос о последней тренировке: тип, длительность, пульс, упражнения по подходам и задействованные группы мышц

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

Тренировку можно попросить словами

В приложении Garmin есть конструктор тренировок: шаги, пульсовые зоны, сохранить, отправить на часы. Сам я туда почти не заходил. Открывать конструктор ради одной пробежки с интервалами всегда казалось лишней задачей поверх основной.

Оказалось, что если у бота есть доступ не только читать, но и писать в Garmin, работает это не только для меня. Написал боту, что хочу интервальную тренировку на велосипеде по образцу последней реальной поездки, с алертом по пульсу на спринтах. Он собрал шаги, выставил зоны, отправил. Тренировка появилась на часах.

Для силовых устроено иначе: не разминка и заминка, а конкретные упражнения, подходы, повторы, вес. Попросил тренировку на кор и ягодицы, два подхода по двадцать повторений, тридцать секунд отдыха между подходами. Собралась и легла в библиотеку.

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

Telegram-бот получает команду удалить тренировку по id и показывает кнопки Подтвердить/Отменить вместо мгновенного удаления
Telegram-бот получает команду удалить тренировку по id и показывает кнопки Подтвердить/Отменить вместо мгновенного удаления

Данные твои

Тут можно было сделать закрытое приложение с подпиской. Такие сервисы в России уже есть: платишь, получаешь отчёты, а что происходит на чужом сервере с твоим сном, не знаешь.

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

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

Завести это несложно

Скачал архив, распаковал, дважды кликнул по иконке. Всё. Открывается страница настройки в браузере, на своём же компьютере. Вписал почту и пароль от Garmin, вставил ключ от LLM или выбрал локальную модель, добавил токен бота от @BotFather. Сохранил, и всё, окно можно закрывать: пайплайн работает сам, а разговор с ним идёт в Телеграме с телефона.

Собрано под Windows и под macOS. Код руками трогать не нужно вообще.

Веб-мастер настройки /setup: статусы Garmin/LLM/Telegram/Ollama, поля логина и BYOK/BYOM-провайдера
Веб-мастер настройки /setup: статусы Garmin/LLM/Telegram/Ollama, поля логина и BYOK/BYOM-провайдера

Если у тебя не Garmin

Работает всё это только с Garmin. Причина простая: на руке у меня Garmin, и весь разбор начался именно с него.

У кого-то другой велостанок, другие часы, другой источник данных о сне, и разрыв между этим устройством и ИИ точно такой же. Если это твой случай, напиши. Каталог всех брендов заранее не обещаю, разбор конкретной ситуации обещаю.

Если хочется разобраться, как это работает под капотом

Отдельная статья с кодом и архитектурой: https://habr.com/ru/articles/1071224/. Здесь её не пересказываю.

Репозиторий открыт: github.com/TolmachevKirill/garmin_ai. Готовая версия лежит в релизах.

Комментарии (29)


  1. sstas
    20.08.2026 04:17

    Как мне кажется, не долго осталось до того момента, когда появятся "личные" ии-агенты, которые будут с рождения отслеживать и состояние здоровья, и активность и всё остальное прочее у конкретного человека, что-то вроде личной няньки. А всего каких-то лет 15 назад в такое даже верилось с трудом.


    1. vaslobas
      20.08.2026 04:17

      Основная проблема то не в анализе данных, а получить эти самые данные точно.

      Фитнес-часы и браслеты не самые точные штуки и часто я себя чувствую отлично, а часы говорят, что я истощен. Делаю 2-3 часа трени и все отлично. То есть часы врали.


      1. randomsimplenumber
        20.08.2026 04:17

        Основная проблема в том, что никто не понимает какая задача решается, и зачем ее воще нужно решать. Что это воще такое? Генератор отчетов о тренировках? Кому его показывать? Персональный тренер? Непохоже.


        1. vaslobas
          20.08.2026 04:17

          Для меня геймификация. Тренируюсь и смотрю как растут графики и цифры тренированности. Больше никакой пользы не нашел.


          1. randomsimplenumber
            20.08.2026 04:17

            Спорт сам по себе геймификация.


          1. Babaji Автор
            20.08.2026 04:17

            Геймификация это не вся польза, а один из сценариев, и не самый интересный. Можно спросить не «как растёт график», а «почему нагрузка растёт, а восстановление нет», и это уже не про красивые цифры, а про риск перетрена. Просто это другой вопрос, чем тот, который ты задавал.


        1. Babaji Автор
          20.08.2026 04:17

          Конкретно: это агент, который отвечает по твоим собственным данным Garmin в диалоге, а не общими фразами. Закрывает несколько задач:

          Тренер: разбирает пульс, зоны, восстановление, историю тренировок, может сам создать и запланировать тренировку в Garmin по запросу.

          Аналитик: отвечает на разовые вопросы типа «сколько я пробежал в мае» или «сравни эту неделю с прошлой по пульсу», без ручного копания в приложении.

          Нутрициолог, но только если сам расскажешь ему, что ел, тогда сопоставит с тренировками и калориями. Само по себе питание не трекает.

          Память: держит контекст за месяцы, а не только последний скрин, который принёс в чат.

          Это не диагностика и не медицинский совет, просто разбор твоих же цифр вместо ручного анализа.


        1. Almaz-kh
          20.08.2026 04:17

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


          1. Babaji Автор
            20.08.2026 04:17

            Согласен, разумная позиция. У меня инструмент не про то, чтобы жить по графику или гнаться за цифрами. Он вообще не про мотивацию и не про план. Просто чтобы не листать самому экраны в Garmin Connect и не скидывать скрины в чат по одному, когда хочется спросить что-то про свои же данные.


            1. Almaz-kh
              20.08.2026 04:17

              сама по себе реализация описанная в статье прикольная. как умная система для сбора данных в одном месте выглядит интересно.


              1. Babaji Автор
                20.08.2026 04:17

                Благодарю!


      1. Babaji Автор
        20.08.2026 04:17

        Тут соглашусь наполовину. Часы не идеальны, это правда. У меня кроме часов ещё нагрудный датчик пульса, который включаю именно на тренировках, для пульса это точнее часов. А вот сон, HRV, стресс, Body Battery всё равно только с часов, там альтернативы нет. Так что часть данных надёжнее часов, часть завязана на них полностью, и это ограничение я не скрываю.


  1. Kwisatz
    20.08.2026 04:17

    Как именно вы получаете доступ к данным гармин? Я не нашел нормального способа выцарапать их


    1. Babaji Автор
      20.08.2026 04:17

      Через python-garminconnect (cyberjunky на GitHub) неофициальную библиотеку, которая имитирует запросы из веб-версии Garmin Connect: логинишься своей учёткой, дальше через неё дёргаешь эндпоинты, которые обычно ходят из браузера. Официального публичного API у Garmin для такого нет, поэтому это ровно reverse-engineered доступ, а не что-то задокументированное самим Garmin.

      Про архитектуру и детали, что конкретно тянется и как кэшируется, у меня отдельная статья, там технически: https://habr.com/ru/articles/1071224/.


      1. Kwisatz
        20.08.2026 04:17

        пасиб


  1. Syzd
    20.08.2026 04:17

    Я не могу понять, вот ИИ скажет вам завтра бегать с 19:00 до 19:30 и вы побежите? Т.е. не вы принимаете решение, а ИИ? А может вам с 19:30 удобнее?


    1. Babaji Автор
      20.08.2026 04:17

      Не так. ИИ ничего не решает и не навязывает. Он делает то, что я попросил словами, показывает план и ждёт подтверждения, прежде чем что-то уйдёт в Garmin. Решение всегда моё.

      И тренировка привязана к дате, не к конкретному часу. 19:00 или 19:30 бежать, решаю я сам, глядя на часы, а не бот.


  1. vaslobas
    20.08.2026 04:17

    А чего не поставить https://www.bevel.health/ и там все эти данные подтянутся из часов скорее всего и будет тоже какая никакая аналитика типа вупа.


    1. Babaji Автор
      20.08.2026 04:17

      Bevel реальный, по отзывам неплохой. Но у меня другая задача: важно было именно свои данные из Garmin донести до моего ChatGPT, у меня там переписка с 2023 года, ещё с версией GPT-3.5, и весь контекст моего образа жизни уже накоплен в ней. Заводить отдельного встроенного коуча в новом закрытом приложении смысла не было, хотелось кормить данными именно этот чат.

      Плюс Bevel облачная подписка, закрытый код, только iOS, и по Garmin историю тянет всего месяц (ограничение самого Garmin API, в их же фидбеке люди жалуются и ссылаются на ту же библиотеку, что у меня, как на обходной путь). У меня открытый код, локальный кэш без такого ограничения, и агент, который не только показывает цифры, но может создать тренировку прямо в Garmin.


      1. Kwisatz
        20.08.2026 04:17

        А вот эта вот чехарда она везде. У гармин еще совершенно лайтовая версия. Бытует мнение что все самозабвенно делают дурные деньги на продажи массивов данных и потому везде так.


        1. randomsimplenumber
          20.08.2026 04:17

          все самозабвенно делают дурные деньги на продажи массивов данных

          Готов продать массив данных со своих часов. К кому обратиться за дурными деньгами? Могу и на вторую руку поцепить ;)


  1. yujinn
    20.08.2026 04:17

    Спасибо что поделились своим опытом. Даже задумался над тем, чтобы и свои данные покрутить с ИИшкой.
    Радует, что у меня Polar, который предоставляет API для доступа к данным (и для желающих - SDK для работы со своими датчиками по Bluetooth):

    https://github.com/polarofficial


    1. Babaji Автор
      20.08.2026 04:17

      Polar с официальным API это прямо тот случай про открытость к другим устройствам: если данные можно получить легально через API, а не выцарапывать руками, задача сильно проще, чем то, что было с Garmin.

      Готов посмотреть на Polar AccessLink и попробовать собрать под него ту же логику: кэш, отчёты, бот. Но у меня самого нет Polar, вслепую писать интеграцию рискованно, легко сделать то, что выглядит правильно в коде, но ломается на реальных данных. Если вы готовы потестировать на своём аккаунте, получить токены, прогнать пару запросов, проверить, что реально приходит, можно собрать рабочий прототип. Пиши, договоримся, как организовать.


  1. ikeima
    20.08.2026 04:17

    А поддержка часов серии CMF рассматривается? Как я понимаю с их приложения Nothing X без костылей данные вообще никак не вытащить.


    1. Babaji Автор
      20.08.2026 04:17

      Сомнительно, у CMF/Nothing X закрыто, публичного API не нашёл. Данные с часов уходят в Apple Health на iOS и в Health Connect на Android через само приложение, но это не облачный API, который можно дёргать с сервера, а хранилище на самом телефоне. Чтобы забрать оттуда данные, нужен не скрипт, а отдельное мобильное приложение с разрешением на чтение Health Connect/HealthKit, это совсем другая по объёму задача, чем с Garmin или Polar, где есть облачный API.

      Единственный официальный путь без костылей, письмо на privacy@nothing.tech с запросом выгрузки по EU Data Act, но это разовый архив, а не что-то, что можно синхронизировать регулярно.

      Так что пока не обещаю, слишком другая архитектура интеграции.


      1. vikarti
        20.08.2026 04:17

        Чтобы забрать оттуда данные, нужен не скрипт, а отдельное мобильное приложение с разрешением на чтение Health Connect/HealthKit, это совсем другая по объёму задача, чем с Garmin или Polar, где есть облачный API.

        А не надо его делать - тот же rouse context можно использовать(если что - он в исходниках, с openwebui интеграции делается гдето за полчаса, с chatgpt free/plus(именно Plus) НЕ делается, вроде Pro надо, с Claude Free - ограничено).


        1. Babaji Автор
          20.08.2026 04:17

          Спасибо, не знал про Rouse Context,гляну. Действительно закрывает именно ту часть, о которой я писал: не нужно самому писать Android-приложение для чтения Health Connect, кто-то уже это сделал и раздаёт как MCP-сервер.

          Но тут есть нюанс, который сам же и назвал: это решает задачу "достать данные", только если у пользователя вообще есть AI-клиент с поддержкой произвольных MCP-серверов. С ChatGPT Free/Plus, как понимаю, не заведётся вообще, с Claude Free ограниченно, нормально работает с openwebui/Cursor/Claude Pro. У меня в проекте задача была прямо противоположная: чтобы человек без всякого MCP и без платных тарифов просто поставил бота в Telegram и написал ему текстом. Rouse Context, получается, отличный вариант для тех, кто уже сидит в экосистеме MCP-клиентов, но не отменяет отдельную задачу для тех, кто в неё не встроен.

          Для CMF/Nothing X всё равно придётся смотреть отдельно, сам факт, что данные лежат в Health Connect, не значит, что телефон должен быть постоянно доступен как сервер, плюс не проверял, что там по факту приходит от CMF конкретно. Но как отправная точка, спасибо, буду иметь в виду


  1. Ksandr73
    20.08.2026 04:17

    Интересный кейс. А где у вас сейчас проходит граница между решениями LLM и обычной детерминированной логикой?

    Например, когда бот собирает интервальную тренировку: модель непосредственно формирует структуру шагов/зон/повторов, которая потом уходит в Garmin, или LLM только переводит запрос пользователя в промежуточную модель, а уже её отдельно валидирует код?

    История с 30-минутной тренировкой, превратившейся в четырёхчасовую, как раз заставляет задуматься, насколько далеко вообще безопасно пускать LLM в write-операции :)


    1. Babaji Автор
      20.08.2026 04:17

      Модель придумывает саму тренировку какие шаги, сколько интервалов, какие пульсовые зоны. Но записать это в Garmin напрямую она не может. Между её ответом и реальной записью стоит обычный код с жёсткими проверками: если суммарная длительность выходит за разумные границы или структура похожа на тот самый баг (когда одна тренировка на 30 минут превращается в повторяющийся блок на 4 часа) код просто отказывается отправлять план дальше, до Garmin он не доходит вообще.

      И даже если проверки пройдены, бот не отправляет тренировку сразу. Он показывает мне готовый план текстом (сколько по времени, что за шаги, какие зоны) и ждёт, что я нажму подтвердить или отменить. То есть модель придумывает содержание, а решение "действительно отправлять или нет" всегда остаётся за проверкой кода и за мной, а не за LLM.