Live Race Stats — бесплатное приложение (поле данных Connect IQ) для велокомпьютеров Garmin Edge и часов (Fenix, Forerunner, Venu, Instinct и др.). Прямо во время гонки, которую судит наша система хронометража, оно показывает на экране устройства ваше место, отрывы от соперников и круги — по номеру гонки и вашему стартовому номеру. В магазине приложение называется Live Race Stats, в списке полей на устройстве — RaceStats. Разработчик — DenisChernykh.

Что нужно

  • Совместимое устройство Garmin (Edge или часы с Connect IQ).
  • Телефон с интернетом, подключённый к устройству по Bluetooth, — он должен быть с вами во время гонки. Само поле данных не умеет ходить в сеть напрямую, запрос идёт через телефон.
  • Гонка должна судиться нашей системой, и генератор протоколов должен отправлять живую статистику на сайт (это делает организатор).

Установка (с телефона)

  1. Установите на телефон приложение Connect IQ Store (или откройте раздел Connect IQ в приложении Garmin Connect). Войдите тем же аккаунтом Garmin, к которому привязано ваше устройство.
  2. Найдите Live Race Stats (поиск по названию или по разработчику DenisChernykh).
  3. Нажмите Install и выберите ваше устройство. Приложение зальётся на устройство по Bluetooth (устройство должно быть подключено к телефону).

Добавить поле на экран (на устройстве)

На устройстве откройте: профиль активности (например «Велозаезд») → Экраны данных → выберите или добавьте экран → раскладка → в нужную ячейку выберите Connect IQ → RaceStats.

Совет: для красивой таблицы со всеми метриками поставьте раскладку «1 поле» (на весь экран) — тогда приложение рисует сетку в две колонки, как родной экран данных Garmin.

Настройка (в приложении Connect IQ на телефоне)

Поля данных Garmin настраиваются только с телефона: Connect IQ → ваше устройство → Connect IQ Apps → Live Race Stats → Settings.

  • Site URL (адрес сайта): по умолчанию https://universalbicycle.team. Менять не нужно, если ваша гонка на нём; меняйте, только если организатор развернул систему на своём сервере.
  • Competition ID: числовой id из адреса страницы гонки. Пример: если гонка по адресу .../calendar/259/, значит ID = 259.
  • Bib number: ваш стартовый номер.
  • Rows: сколько метрик показывать одновременно (от 1 до 10).
  • Row 1 … Row 10: какую метрику показывать в каждой строке.

Попробовать без гонки (демо): оставьте Site URL по умолчанию, укажите Competition ID 259, Bib number 1, Rows 10 — поле покажет данные демо-гонки («test race»). Цифры статичные, это просто проверка, что всё работает.

Какие метрики можно вывести

Всего 15 метрик на выбор. Подписи короткие, чтобы влезали на экран (слева — при английском языке устройства, справа — при русском):

  • Место / всего: общий зачёт — «Place abs / Место абс»; в группе — «Place gr / Место гр».
  • Отрывы (общий зачёт): к сопернику спереди «Gap ahd abs / Отрыв вп абс», сзади «Gap bhd abs / Отрыв сз абс», от лидера «Gap ldr abs / Отрыв лд абс».
  • Динамика отрывов (общий): спереди «Dynam ah abs / Динам вп абс», сзади «Dynam bh abs / Динам сз абс», к лидеру «Dynam ld abs / Динам лд абс».
  • Отрывы (группа): спереди «Gap ahd gr», сзади «Gap bhd gr», от лидера группы «Gap ldr gr».
  • Динамика отрывов (группа): «Dynam ah gr», «Dynam bh gr», «Dynam ld gr».
  • Круги (пройдено / всего): «Laps / Круги».

Сокращения: ahd/вп — соперник на одно место выше вас; bhd/сз — на одно место ниже; ldr/лд — лидер зачёта; abs/абс — общий зачёт; gr/гр — ваша группа (категория).

Как читать значения

  • Место: «3/4» — вы третий из четырёх участников.
  • Отрыв (Gap): время со знаком, «+M:SS» или «+H:MM:SS». «+» — вы проигрываете этому сопернику (он быстрее по времени), «−» — вы его опережаете. Примеры: «Gap ahd abs +0:22» — отстаёте от соперника спереди на 22 сек; «Gap bhd abs −0:11» — соперник сзади отстаёт от вас на 11 сек; «Gap ldr abs +0:36» — отстаёте от лидера на 36 сек.
  • Динамика (Dynam): на сколько изменился этот отрыв за ваш последний круг. «+» — отрыв вырос, «−» — сократился. Помогает понять, догоняете вы или отваливаетесь.
  • Круги: «3/10» — пройдено 3 из 10 кругов.
  • DSQ: если участник дисквалифицирован, в месте будет «DSQ».
  • «--» (два прочерка): данных пока нет — это не ошибка. Бывает, когда не задан ID гонки или номер, нет телефона/интернета рядом, гонка ещё не началась или первые данные ещё не пришли.

Важно про задержку данных

  • Данные обновляются примерно раз в 5 минут — это ограничение Garmin для фоновых запросов у полей данных, обойти нельзя.
  • Данные меняются только когда участник пересекает финиш круга и информация доходит до сайта. Промежуточные точки не используются — ради надёжности.
  • Поэтому первые цифры появятся не сразу, а в течение ~5 минут после старта, и дальше обновляются с тем же интервалом.
  • Телефон должен быть подключён к устройству и иметь интернет. Если связь пропала — поле держит последнее значение.

Как это устроено

Цепочка данных: (1) хронометристы фиксируют отсечки на финише круга; (2) генератор протоколов считает по ним для каждого номера место, отрывы, круги и динамику и отправляет «снимок» на сайт при каждой перегенерации; (3) сайт хранит снимок по каждому номеру и отдаёт его публично; (4) поле Garmin раз в ~5 минут запрашивает данные своего номера и рисует их.

Технические детали:

  • Поле данных Garmin не может ходить в интернет напрямую. Запрос делает фоновый процесс и только через телефон по Bluetooth; минимальный интервал таких запросов у Garmin — 5 минут.
  • Публичный запрос (авторизация не нужна, статистика открытая): GET https://universalbicycle.team/api/v1/live-stats/{competition_id}/{bib}. Ответ — место, отрывы и т.д. по этому номеру (все значения строки).
  • Если снимка для пары «гонка/номер» ещё нет — сайт возвращает 404, и поле показывает «--», продолжая опрашивать.
  • Поле кэширует последний снимок; отрисовка идёт из кэша. Когда вы завершаете активность, фоновый опрос выключается — чтобы не сажать батарею и сеть после гонки.
  • Отрывы считаются по времени на последнем общем круге двух участников и по личному времени гонщика (корректно для раздельного и группового старта), а не по времени на часах.

Поддерживаемые устройства

Приложение поддерживает 142 устройства Garmin: велокомпьютеры серии Edge и множество часов (Fenix, Forerunner, Venu, Instinct и др.). Локализовано на 10 языков, включая русский. Бесплатно, без рекламы; персональные данные не собирает — передаёт только номер гонки и ваш стартовый номер, чтобы получить открытую статистику.

Частые вопросы

  • Поле пустое / показывает «--». Проверьте по порядку: задан ли Competition ID и Bib; подключён ли телефон к устройству; есть ли на телефоне интернет; прошло ли ~5 минут после старта; есть ли для вашей гонки живая статистика (спросите организатора).
  • Данные не в реальном времени. Так и задумано: обновление раз в ~5 минут и только по финишам кругов.
  • Можно ли настроить прямо на устройстве? Нет, поля данных Garmin настраиваются только с телефона.
  • Сколько метрик можно вывести? До 10 в одном поле. Поле занимает одну ячейку раскладки; сколько строк реально влезет, зависит от размера ячейки.
  • Работает ли на часах? Да — поле доступно и на часах (Fenix, Forerunner и др.), не только на Edge.

Для организаторов

Чтобы статистика работала на вашей гонке: соревнование на сайте должно быть опубликовано (approved), не скрыто и не удалено; в генераторе протоколов включена отправка статистики (общий зачёт и/или по группам) — метрики «abs» появляются при включённой «абсолютной» статистике, «gr» — при «групповой». Если вы разворачиваете систему у себя, приложение можно направить на свой сервер, указав его адрес в поле Site URL. Исходники сайта: github.com/dchernykh1984/cycling-site.

Для владельцев других устройств

Если ваше устройство не Garmin, но поддерживает установку приложений, вы можете написать собственный клиент: данные отдаёт открытый API нашего сайта, авторизация не нужна.

Запрос: GET https://universalbicycle.team/api/v1/live-stats/{competition_id}/{bib}, где competition_id — числовой id гонки из адреса страницы соревнования, bib — стартовый номер (строка).

Ответ — JSON вида {"competition_id": 259, "bib": "1", "updated_at": "…", "stats": {…}}. Поле stats — словарь «ключ → строка»; какого-то ключа может не быть (значит, данных по этой метрике пока нет). Если снимка для пары «гонка/номер» ещё нет, сайт вернёт 404 — просто повторяйте запрос позже. На сайте данные обновляются по мере прохождения кругов, поэтому опрашивать чаще, чем раз в ~30–60 секунд, смысла нет.

Ключи в stats (все значения — строки):

  • place_abs / place_group — место в общем зачёте / в группе (например «3»), либо «DSQ» для дисквалифицированного.
  • qty_abs / qty_group — число участников (общий зачёт / группа).
  • gap_prev_abs / gap_prev_group — отрыв к сопернику спереди (со знаком «+»: вы отстаёте).
  • gap_next_abs / gap_next_group — отрыв к сопернику сзади (со знаком «−»: он отстаёт от вас).
  • gap_leader_abs / gap_leader_group — отрыв от лидера.
  • gap_prev_*_delta, gap_next_*_delta, gap_leader_*_delta — динамика соответствующего отрыва за последний круг («+» вырос, «−» сократился).
  • laps — круги «пройдено/всего» (например «3/10»).

Форматы: отрыв — «+M:SS» или «+H:MM:SS», с долями секунды по числу знаков после запятой из настройки генератора «Digits after decimal» (обычно 1, например «+0:36.1»); место и количество — целое числом-строкой. Все значения считаются только по финишам кругов (промежуточные точки не используются). Подробности — в исходниках сайта: github.com/dchernykh1984/cycling-site.

Написали такое приложение? Дайте нам знать! Оставьте комментарий под этой статьёй, отправьте предложение через форму «Отправить статью» (в базу знаний или как новость) или напишите нам через форму связи с владельцами в вашем личном кабинете на сайте. Будем рады рассказать о нём другим участникам.