Адаптер Zwift для ioBroker
Опрашивает API Zwift для получения данных о тренировках в режиме реального времени и делает их доступными, как указано в описании ioBroker. Отслеживайте свою мощность, частоту сердечных сокращений, частоту вращения педалей, скорость и многое другое в режиме реального времени во время езды на Zwift.
Функции
- Данные о пассажирах обновляются в режиме реального времени каждые 5 секунд (настраивается).
- Расчет зон мощности в реальном времени (6-зонная модель Coggan, FTP автоматически считывается из вашего профиля Zwift).
- Подробные данные профиля Zwift: личность, статистика езды на велосипеде, статистика бега, майки, отрывы, серии побед.
- Индикатор состояния соединения (
info.connection) - Автоматическое обновление токена с резервным вариантом повторной аутентификации.
- Зашифрованное хранилище учетных данных
- Обновления метаданных применяются автоматически при перезапуске адаптера (исправления единиц измерения, добавление новых полей).
Конфигурация
| Параметр | Описание | По умолчанию |
|---|---|---|
| Электронная почта Zwift | Адрес электронной почты вашей учетной записи Zwift | — |
| Пароль Zwift | Пароль от вашей учетной записи Zwift (хранится в зашифрованном виде) | — |
| Интервал опроса | Как часто следует получать данные, в секундах (3–300) | 5 |
Штаты
Данные о пассажирах (обновляются при каждом опросе)
| Состояние | Единица | Описание |
|---|---|---|
isRiding | — | true при активном участии в мире Zwift |
power | В | Текущая выходная мощность |
powerZone | — | Текущая зона мощности (1-6, модель Коггана, см. ниже) |
heartrate | ударов в минуту | Текущая частота сердечных сокращений |
cadence | об/мин | Текущий темп |
speed | км/ч | Текущая скорость |
distance | км | Расстояние, пройденное в ходе текущей активности |
altitude | м | Текущая высота |
climbing | м | Общий набор высоты в ходе текущей активности |
gradient | % | Текущий уклон/градиент (положительное значение = подъем, отрицательное значение = спуск) |
calories | кДж | Количество сожженных калорий (соответствует внутриигровому отображению Zwift) |
time | с | Прошедшее время в пути |
laps | — | Круги завершены |
progress | — | Пройденный маршрут (исходные данные из Zwift) |
sport | — | Вид спорта (0 = велоспорт) |
groupId | — | Идентификатор группы/события (0 = группа отсутствует) |
x ,y | — | Мировые координаты положения |
heading | — | Направление движения |
lean | — | Угол наклона |
watchingRiderId | — | Идентификатор наблюдаемого мотоциклиста |
rideOns | — | Количество поездок |
courseId | — | Текущий идентификатор курса |
roadId | — | Текущий идентификатор дороги |
Зоны мощности
ОнpowerZone В режиме State используется 6-зонная модель Coggan, которая рассчитывается автоматически на основе вашей текущей мощности и FTP. Значение FTP считывается из вашего профиля Zwift — ручная настройка не требуется.
| Зона | Имя | % от FTP |
|---|---|---|
| 1 | Активное восстановление | < 55% |
| 2 | Выносливость | 55-75% |
| 3 | Темп | 76-90% |
| 4 | Лактатный порог | 91-105% |
| 5 | VO2 Max | 106-120% |
| 6 | Анаэробная емкость | > 120% |
Если в вашем профиле Zwift не указан FTP, тоpowerZone Состояние обновляться не будет.
Данные профиля (получаются один раз при подключении)
| Состояние | Единица | Описание |
|---|---|---|
profile.id | — | Идентификатор игрока Zwift |
profile.firstName | — | Имя |
profile.lastName | — | Фамилия |
profile.weight | кг | Масса |
profile.height | см | Высота |
profile.age | — | Возраст |
profile.male | — | Гендерный индикатор |
profile.countryCode | — | Код страны |
profile.ftp | В | Функциональная пороговая мощность |
profile.totalDistance | км | Абсолютная дистанция |
profile.totalDistanceClimbed | м | Абсолютный прирост высоты за все время |
profile.totalTimeInMinutes | мин | Общее время поездки |
profile.totalWattHours | Что | Общее количество ватт-часов за все время |
profile.totalExperiencePoints | — | Общее количество XP |
profile.targetExperiencePoints | — | Для перехода на следующий уровень требуется XP. |
profile.achievementLevel | — | Текущий уровень |
profile.totalGold | — | Общее количество выпавших предметов (внутриигровая валюта) |
profile.totalInKomJersey | — | Футболка KOM, которую носили много раз |
profile.totalInSprintersJersey | — | Футболка команды «Спринтеры», которую носили много раз. |
profile.totalInOrangeJersey | — | Футболка оранжевого цвета, которую носили много раз. |
profile.runAchievementLevel | — | Текущий уровень выполнения |
profile.totalRunDistance | км | Рекордная дистанция за всю историю |
profile.totalRunTimeInMinutes | мин | Общее время выполнения |
profile.totalRunExperiencePoints | — | Общее количество очков опыта за прохождение |
profile.targetRunExperiencePoints | — | Для перехода на следующий уровень требуется опыт за прохождение заданий. |
profile.totalRunCalories | кДж | Калорийность за все время бега |
profile.streaksCurrentLength | — | Текущая длина серии активности |
profile.streaksMaxLength | — | Самая длинная серия активности |
profile.streaksLastRideTimestamp | — | Отметка времени последней поездки в серии |
profile.currentActivityId | — | Идентификатор текущей активности |
profile.powerSource | — | тип источника питания |
Как это работает
Адаптер выполняет аутентификацию в API Zwift, используя ту же конечную точку, что и приложение Zwift Companion.client_id=Zwift_Mobile_Link При запуске он получает ваш профиль Zwift (включая FTP), затем опрашивает статус райдера через игровой релейный сервер, декодирует ответ protobuf, преобразует необработанные значения в удобочитаемые единицы измерения и обновляет дерево состояний ioBroker.
Если в вашем профиле указано значение FTP, адаптер вычисляет значение в реальном времени.powerZone (1-6) при каждом цикле опроса с использованием модели энергетических зон Коггана. Ручная настройка FTP не требуется.
Когда вы не катаетесь активно в Zwift, адаптер комплектуется.isRiding кfalse и продолжает опрос без ошибок.
Техническое примечание: Объекты состояния создаются с помощьюextendObjectAsync скорее, чемsetObjectNotExistsAsync Это означает, что изменения метаданных (исправленные единицы измерения, переименованные состояния, новые поля) применяются автоматически при каждом перезапуске адаптера. Вам не нужно удалять и создавать объекты заново после обновления.
Идеи для «умного дома»
Как заявляет ioBroker, благодаря доступу к данным Zwift вы можете создавать автоматизации, которые позволят вам тренироваться в помещении по всему дому.
Иммерсивное освещение
- Меняйте цвет светодиодных лент или ламп Hue в зависимости от зон сердечного ритма — синий для восстановления, зеленый для выносливости, желтый для темпа, красный для пороговой нагрузки, мигающий красный для VO2max.
- Используйте
powerZoneИспользуйте значения (1-6) для непосредственного управления цветовыми схемами — для самостоятельного расчета зон не требуется никаких скриптов. - Изменяйте цвет подсветки в зависимости от мощности — чем сильнее вы нажимаете, тем интенсивнее свечение.
- Имитируйте высоту с помощью яркости освещения — приглушайте свет при наборе высоты и увеличивайте его при снижении.
- Включите свет в комнате, когда получите Ride On.
Адаптивное аудио
- Автоматическое переключение плейлистов в зависимости от вашей зоны частоты сердечных сокращений или мощности — расслабляющая музыка для разминки, высокий темп для интервальных тренировок.
- При пересечении круга или достижении определенного количества сожженных калорий будет воспроизводиться звуковой эффект.
- Регулярно озвучивайте свои текущие статистические данные с помощью функции преобразования текста в речь.
Приборные панели и дисплеи
- Отображайте в режиме реального времени мощность, частоту сердечных сокращений, скорость и частоту вращения педалей на настенном планшете или смарт-дисплее.
- Отображайте пройденное расстояние, набор высоты и количество сожженных калорий на информационной панели в вашей «зоне боли».
- Создайте панель мониторинга VIS с вашей общей статистикой на основе данных профиля — общее количество километров, общий набор высоты, уровень XP.
Климат-контроль
- Включайте «умный» вентилятор, когда частота сердечных сокращений превышает пороговое значение, и выключайте его во время перерывов между ударами сердца.
- Увеличивайте скорость вращения вентилятора пропорционально потребляемой мощности.
- Включайте кондиционер, когда количество сожженных калорий превысит определенное значение.
Самодельное оборудование
- Используйте данные о высоте/градиенте для управления самодельным механизмом качания или наклона тренажера — создайте свой собственный симулятор подъема в гору, похожий на Wahoo KICKR CLIMB.
- Управляйте сервоприводом или линейным актуатором через ioBroker, чтобы наклонять раму велосипеда в реальном времени в зависимости от изменения градиента в игре.
Мотивация и геймификация
- Запустите машину для конфетти или праздничную подсветку, завершив поездку или установив личный рекорд.
- Отправьте себе уведомление в Telegram или Pushover с кратким описанием поездки, когда
isRidingпереключается наfalse - Отслеживайте пройденное расстояние за неделю на семисегментном дисплее или экране на электронных чернилах в коридоре.
- Загорится индикатор выполнения (светодиодная лента), показывающий процент завершения маршрута.
Семья и домохозяйство
- Включайте индикатор «Не беспокоить» снаружи своей комнаты всякий раз, когда
isRidingявляетсяtrue - Автоматическое отключение звука дверного звонка во время тренировки в Zwift.
- Отправьте сообщение на умную колонку вашей семьи: «Папа катается в Zwift, ориентировочное время финиша: X минут».
Changelog
0.1.3 (2026-04-19)
- Add
gradientstate (current slope in %, computed from altitude/distance deltas with a 5 m threshold, clamped to ±50 %)
0.1.2 (2026-03-03)
- Set up trusted publishing via OIDC for GitHub Actions deploy
0.1.1 (2026-03-03)
- Fix ESLint curly and prettier errors for CI
0.1.0 (2026-03-03)
- Poll Zwift API for live ride data (power, heartrate, cadence, speed, distance, altitude, climbing)
- Zwift profile data (FTP, weight, height, level, total stats)
- Power zone calculation based on FTP (Coggan 6-zone model)
- Configurable polling interval
0.0.1 (2026-03-02)
- (Flixhummel) initial release
License
MIT License
Copyright (c) 2026 Flixhummel hummelimages@googlemail.com
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.