Zwift Setup

31.1.2020 detaillierte Beschreibung des Raspberry Pi Ant+

11.1.2021 Zwift Telemetrie (Home Assistant Instanz)

11.1.2021 Zwift ioBroker Fan-Steuerung

Grundlegend wird auf der Website von Zwift alles beschieben was man braucht, um selber „zwiften“ zu können.

Mein aktuelles Zwift Setup:

Trainingsrolle:

Wahoo Kickr Snap Hersteller Infos

Velo auf der Rolle:

älteres Wheeler Rennvelo, den Rennlenker habe ich durch einen Bikelenker ersetzt

PC:

Mainboard: ASUS PRIME X470-PRO

CPU: AMD Ryzen 7 2700X/3700MHz, AM4 8-Core, 20MB Cache

Grafikkarte: Phoenix Geforce GTX 1080ti 😉

RAM: Kingston DDR4 16GB 2666MHz

SSD: Samsung 970 EVO Plus, 250GB, M.2 2280

Netzteil: Chieftec, BDF-750C, 750W

Case: Cooler Master MasterBoX MB520 black

Lautsprecher: Logitech Z-333

Maus und Tastatur: Logitech wireless Desktop MK270

Monitor:

Samung UJ590 32″ 4K

Fan:

Xiaomi Standing Fan

Gestell für den PC, Monitor und die Lautsprecher:

Das Gestell ist ein Eigenbau aus MDF Platten

Beleuchtung:

Philips Hue Entertainment: 3x Philips Hue Play hinter dem Monitor und 2x Philips Hue White & Color Ambiance an der Decke.

LED Stripe an der Decke.

Weitere Komponenten:

Raspberry PI

Ubunut Server mit ioBrocker Instanz

11.1.2021: Zwift Telemetrie (Home Assistant Instanz)

Beschreibung des Systems:

Das ganze System wird per App, das auf dem Smartphone läuft, gestartet. (GUI in NodeRed programmiert, Logik in ioBroker)

Mit der App kann der Fan manuell, stufenlos gesteuert werden. Im automatischen Modus wird der Fan in Abhängigkeit der getretenen Leistung gesteuert. Die Leistung und Herzfrequenz wir per Ant+ von dem Raspberry empfangen und per MQTT an den ioBroker gesendet. Neu ab 11.1.2021 per Zwift Telemetrie (Home Assistant Instanz).Der ioBroker steuert dann entsprechend den Fan mit der gewünschten Geschwindigkeit an.

Der LED Stipe an der Decke zeigt in verschiedenen Farben die aktuelle Herzfrequenz Zone an. Dieser wird ebenfalls vom ioBroker angesteuert.

Die Philips Hue Lampen an der Decke und hinter dem Monitor passen sich der Farbe dem aktuellen Bild auf dem Monitor an, dies ergibt ein sehr coole Atmosphäre während dem „zwiften“.

Mit diesem Setup kann man bei einer Auflösung von 4K@60FPS zwiften. (Der Monitor begrenzt die Bildwiederholrate auf 60FPS ansonsten wäre mit der Hardware sicher noch mehr möglich)

27 Kommentare

  1. Hallo Freunde,
    wenn ich nach Stryd foot pod und MQTT google, dann finde ich diese Seite. Es gibt in Matlab ein Beispiel, wie man einen BLE Herzfrequenzsensor und and BLE foot pod an einen PC und an Matlab anhängt, und damit Experimente macht. Mich würde interessieren, ob es möglich ist, den hier vorhandenen Code so zu modifizieren, dass man damit auch Sensordaten von einem Stryd foot pod über einen MQTT Brocker zu einer Anwendung streamen kann?

  2. Mit dem Setup könntest du dir auch mal „GT Bike V“ ansehen.
    Ist ein Mod für GTA5 bei dem man mit seinen echten Rad frei durch die Welt fahren kann.
    Ich habe das bei mir laufen und die Grafik ist deutlich besser als bei Zwift.
    Und man kann frei durch die Welt fahren, was ich sehr cool finde.

    Einzig das man die Trainingspläne von Zwift nicht da drinnen hat, finde ich sehr schade.
    Der Entwickler von dem Mod ist ein Garmin Mitarbeiter.
    Sein aktueller Fokus liegt da drauf das man Gruppenfahren machen kann. Alle 3-6 Monate kommt eine neue Version. Ist aber noch ein sehr junges Projekt und leider nicht open Source. Dafür hat man aber keine monatlichen Kosten wie bei Zwift.

    Wie auch immer.
    Ich schaue mal was ich von deinem Projekt verwenden kann.
    Sieht auf jedenfalls gut aus.

  3. Hi,

    habe das genauso aufgebaut mit ant+ und es läuft. Habe 2 xiaomi fans, diese werden per blockly so gesteuert, dass sie immer die Drehzahl anpassen je schneller der Puls. Also Puls 90-100 30% , 100-110 40% usw… Ich trainiere nur mit trainerroad und benötige nur den Puls. Wäre es nicht möglich den Puls per ble auszulesen? So wie es jetzt ist gehts zwar auch aber doch etwas umständlich wenn ich nur den Puls brauche. Ich lese ja auch zb die mi-flora über ble aus. Wäre dankbar für eine Idee

    1. Hi Jakob

      Mir war das über ble einfach viel zu kompliziert und wenig flexibel. Ich verwende im Moment eine Mischung aus HR und Power für den Smart Fan und die Powerzone für die LED Leiste. Ist schon cool, wenn das Ambilight zur passenden Trainingszone passt – gerade bei Intervall-Training.

      Um mich kurz zu halten: ble arbeitet mit Servicedaten, diese können, müssen aber nicht, von Sensor zu Sensor unterschiedlich sein. Natürlich sind die Daten für HR voraussichtlich immer gleich, aber was, wenn du zb mal die Kadenz oder die Geschwindigkeit simulieren möchtest, oder das Powermeter verwenden willst? Siehe mein Beispiel oben. Für mich ist das wenig praktisch und wenig zukunftssicher, ich will mich nicht bei jedem neuen Sensor mit einer neuen Programmierung rumschlagen.

      Ich finde Reto’s Ansatz über Ant+ richtig gut. Der zweite Ant Dongle und der zweite Raspy störten mich aber, so dass ich mir eine andere Lösung gesucht habe. Mein heutiger Ansatz mit der API des jeweiligen Programm finde ich aber noch besser. Ich überlasse das Sensor pairen dem Programm und verwende nur die Daten aus Zwift. Dürfte für Trainerroad wohl auch eine API geben?
      Falls du es trotzdem über ble versuchen möchtest: es gibt unzählige ble Scanner für Android, da siehst du die Daten die übertragen werden. Du brauchst die Geräte ID – ist glaube ich die Mac Adresse und dann die passenden Servicedaten. Für HR gibt’s wenn ich mich recht erinnere auch einen eigenen Service. Aber Achtung, viele ble Sensoren lassen sich nur mit einem Gerät koppeln. Neuere lassen nun teils auch zwei zu. Verwendest du also den HR Gurt bereits in Trainerroad kann es sein, dass sich der Gurt kein zweites mal koppeln lässt. Das kannst du vorher ja mal mit einer Garmin Uhr oder so testen. Hier hat Ant+ klare Vorteile, da es einfach nur Broadcast sendet. So möchte ich mir den ble Kanal für zukünftige Sensoren für Zwift reserviert halten.

      Viel Spass beim stöbern und testen
      LG Stefan

  4. Hallo Reto,

    habe versucht deinen Ansatz zu „kopieren“. Ziel Plattform ist ein Intel NUC mit Proxmox und einer VM mit Linux/Debian. Auf einer weiteren VM läuft ioBroker. NodeJS, NPM und die Libs sind installiert. Jedoch mein USB/ANT+ Stick wird wohl nicht erkannt mit lsusb. Habe den Stick in mein Zwift Rechner gesteckt. Dort wird er sofort in der Systemsteuerung/System erkannt/angezeigt.
    Es werden lediglich zwei Devices angezeigt
    002: ID … Adomax Technology Co., Ltd
    001: ID … Linus Foundation 1.1 root hub
    Habt ihr eine Idee warum der Stick im Windows PC erkannt wird, unter Linux nicht?

    1. Hallo Em,

      Zu deiner Umgebung, nur dass ich es richtig verstehe:

      Du hast Proxmox auf einem Intel NUC am laufen.
      Auf dem Proxmox hast du zwei VMs am laufen, auf der einen VM möchtest du den ANT+ USB-Stick nutzen.
      Den ANT+ USB-Stick hast du physisch am Intel NUC angeschlossen.

      Falls deine Umgebung so aufgebaut ist:

      Hast du den ANT+ USB-Stick an die VM in Proxmos weiter gegeben?
      siehe hier: https://pve.proxmox.com/wiki/USB_Devices_in_Virtual_Machines

      Aus Erfahrung weiss ich aber, dass USB-Sticks je nach Art und Funktion, die in eine VM gereicht werden sollen, da nicht unbedingt auch funktionieren wie an „physischen“ „echten“ Maschinen.

      Gruess Reto

    2. Hallo Reto,

      Ja, meine Konfiguration sieht so aus VM1: ioBroker, läuft schon ne ganze Weile, nunauf einer weiteren „ZwiftApp“. HW/USB Stick ist nun weiter gegeben und erschein bei lsusb Nun geht es weiter..

      Mich würde dennoch der Zugriff direkt auf Zwift mit der api interessieren. Frage ist nur ob und wo man einen Dev Account bekommt.

      Danke und Gruß Em

  5. Hallo Reto
    Hattest du dir auch überlegt, direkt über Tools oder Skripts von thisisant.com über den PC ohne Raspy auf die Ant+ Daten zuzugreifen? Ich überlege mir gerade diesen Ansatz, da ich für den Raspy einen zusätzlichen USB Dongle anschaffen müsste und ohne Raspy auch ein Gerät weniger integriert wäre, was aus meiner Sicht, die Fehlerquellen weiter reduzieren würde. Wie stabil läuft deine Steuerung? Worauf betreibst du iobroker, auch auf einem Raspy?
    PS: Einen Raspy hätte ich zur Verfügung.
    LG Stefan

    1. Hallo Stefan,

      Ich hatte vor der Raspberry-Lösung auch mit Windows rumgespielt, allerdings nicht mit den Tools, Skripts von thisisant.com.
      Sondern mit der Node.js Umgebung auf Win10. Das lief grundsätzlich aber da ich Zwift ebenfalls auf dem gleichen Win10 PC laufen lasse, gab es Probleme mit den Ant+ USB-Sticks.
      Mit einem USB-Stick alleine konnte ich entweder die Ant+ Daten in Zwift reichen oder an die Node.js Anwendung, nicht aber gleichzeitig an beide Anwendungen.
      Mit zwei Ant+ USB-Sticks hatte ich unter Win10 auch kein Erfolg, entweder lief Zwift oder die Node.js Anwendung, daher habe ich für mich jetzt die Raspberry-Lösung am laufen.

      Der ioBroker läuft bei mir in einer VM (Ubuntu Server 18.04.4 LTS), die VM läuft wiederum auf einem ESXi-Host.
      Der ioBroker übernimmt schon seit ein paar Jahren, sehr zuverlässig, viele andere Homeautomatisierungsaufgaben bei uns, daher kam bei mir nie was anders in Frage.

      Die ganze Steuerung ist natürlich für jemanden der viel Freude an solchen Sachen hat gedacht und will mit viel Liebe gehegt und gepflegt werden;-)
      Aber grundsätzlich läuft die Steuerung recht zufriedenstellend.

      Mit sportlichen Grüssen
      Reto

    2. Hoi Reto
      ja der Ant+ Dongle erlaubt nur einer Applikation gleichzeitig darauf aufzubauen, dies hatte ich ein paar Minuten nach dem absenden der Frage an dich auf thisisant irgendwo gelesen. Ich habe nun auch den Umweg über den Raspi gemacht – habe hier auch zwei rumstehen und die Inbetriebnahme des Raspi hat soweit gut funktioniert. ioBroker kenne ich aus früheren Tagen – ich hatte damit vor ein paar Jahren erste Erfahrungen gesammelt.
      Kannst du noch etwas genauer auf die MQTT Schnittstelle eingehen? Ich glaube die funktioniert bei mir nicht sauber, ohne verbunden Sensoren müssten doch einfach die Werte 0 übertragen werden oder nicht? Ich habe auch einen Error in den Log Dateien:
      /home/pi/npm/zwiftapp/node_modules/bindings/bindings.js:121
      throw e;
      ^
      Hast du mir einen Tipp? Muss das bindings.js ausführbar gemacht werden?
      LG Stefan

    3. Hallo Stefan,

      hast du schon mal versucht, die Daten direkt vom Zwift Server über https://github.com/Ogadai/zwift-mobile-api zu holen und dann z.B. per MQTT/ioBroker zur Verfügung zu stellen. Wäre eine elegante Methode – ganz ohne Sensor. Weiterhin stehen auch wesentlich mehr Daten zur Verfügung, siehe API Quellcode „Profile.js“. Aufgrund meiner nicht vorhandenen JavaScript Kenntnisse komme ich nicht an die Daten ran. Ich scheitere bei den paar Demo-Zeilen bzw. ernte nur Fehlermeldungen.

      Gruß Em

    4. Hoi Reto
      der Raspy läuft nun mit der mqtt-Schnittstelle. Ich habe das Image nochmals neu eingespielt. Die SD-Karte hatte zuwenig Speicher, als ich noch zusätzlich den ioBroker drauf packen wollte, dies hat offenbar zu einer defekten nodeJS Installation geführt.

      Dein Vorschlag führte dazu, dass ich mich heute Abend mit der Zwift-Mobile-API auseinandergesetzt habe. Ich kann aber keine Daten abholen. Ich kriege immer ein 403, dies bedeutet wohl in http ein „forbidden“. Der Ansatz hätte mir auch gepasst, aber offenbar benötigt man tatsächlich seit 2018 einen Dev-Account von Zwift.

      Der Umweg über die Ant+ Schnittstelle hat natürlich den Vorteil, dass dies auch ohne Zwift funktioniert. Ist also eigentlich flexibler einsetzbar und dürfte theoretisch mit einem Stryd Power Footpod oder einem HR-Brustgurt auf dem Laufband auch funktionieren. Aktuell bin ich noch am abwägen zwischen Smart Lüfter oder Eigenbau mittels Arduino etc. Was waren deine Beweggründe für den Smartlüfter?
      LG Stefan

    5. Hallo Stefan,

      Nun für den Xiaomi Standing Fan habe ich mich entschieden, weil ich schon andere Geräte von Xiaomi per ioBrocker ansteure. Allerdings ist es nicht ganz einfach, an den zwingend benötigten „API token“ des Xiaomi Standing Fans zu kommen. Wenn man aber mal den „API token“ hat, kann man relativ einfach per ioBroker und dem entsprechenden Adapter im ioBroker, den Fan ansteuern. Eine Lösung mit Arduino oder ähnliches wäre sicher auch möglich.

      Bin gespannt auf deine finale Lösung.

      Gruess Reto

    6. Hoi Reto
      nach etwas Recherche und Nachdenken habe ich die Realisation über die Zwift API definitiv verworfen. Sollte dies später mal offiziell möglich sein, kann ich das Thema wieder aufnehmen. Ich habe aber einen neuen Ansatz, um mir einen zusätzlichen ANT+ Dongle zu ersparen: Ich habe einen Raspi 3 mit WLAN und BLE an Board und versuche nun eine BLE-mqtt Bridge aufzubauen. Einen zweiten Raspi habe ich da. Mit den Einschränkungen, dass ich damit aktuell nur die Powerwerte und Kadenz (Powermeter am Rad, Power von der Smartrolle, Stryd Footpod) auswerten kann reichen mir. Der nächste Brustgurt wird bestimmt auch BLE können. Zuerst hatte ich noch die Idee über ein altes Android Smartphone zu gehen, aber dies stelle ich mir mit den Abdroid Services und dem SDK komplizierter vor als über einen (vorhandenen) Raspi, da ich ja nur den ANT+-Teil durch den BLE ersetzen muss.
      Zuerst muss ich mir aber jetzt den Fan organisieren, kannst du noch ein paar Worte über das API token des Fan verlieren?

      @Em: ich kenne Proxmox nicht, aber könntest du die ANT mqtt Schnittstelle nicht auf der Proxmox Instanz einrichten? Die von dir und Reto besprochene Thematik mit dem weiterleiten ist ja in VM’s jeglicher Plattformen immer wieder ein Problem. Da der ANT+ Dongle tatsächlich nur eine Applikation erlaubt, frage ich mich, ob dies überhaupt problemlos funktionieren würde? Dies ist ja mitunter bei Lizenz Dongles für Software auch so, da behilft man sich ja mit USB-IP Schnittstellen (USBAnywhere etc) wäre ev auch noch einen Versuch wert?

      Gruss Stefan

    7. Hallo Stefan,

      Um den Fan via ioBroker, mit dem Adapter miio https://www.npmjs.com/package/iobroker.miio steuern zu können, braucht man den API token des Fans.
      Um an diesen API token zu kommen, gibt es anscheinend verschiedene Möglichkeiten.
      Ich kam per spez. App für Android (natürlich nur für Testzwecke) an den API token heran.
      Diesen API token kann man dann im miio Adapter im ioBroker eintagen und der Fan nimmt ab sofort Befehle vom ioBroker an.

      Gruess Reto

    8. Hallo Reto
      nach unzähligen frustrierten Versuchen das BLE Protokoll inkl. der richtigen Services in Betrieb zu nehmen, bin ich jetzt trotz allem bei deiner Lösung gelandet. Gegen das BLE Protokoll spricht, dass einige Sensoren ebenfalls nur eine Verbindung gleichzeitig zulassen, was zwar aktuell kein Problem darstellen würde, aber langfristig eines werden könnte. Sofern mal eine Zwift API für „normalos“ verfügbar wäre, könnten die Daten direkt aus Zwift abgegriffen werden, bis dahin halt über mqtt. Ich werde dann später ev auf HomeAssistant wechseln, da mir dort einige Sachen besser gefallen, aber die mqtt Integration ist auf den ersten Blick unter ioBroker schon viel besser und einfacher gelöst. Auf einem Pi läuft nun der ioBroker auf dem anderen der Fancontroller. Die mqtt Schnittstelle und den Xiaomi Fan ist in ioBroker eingebunden, was noch fehlt, ist die Berechnung und Steuerung der Modi und Integration des Xiaomi LED Strips am Boden. Das ist ja jetzt aber nur noch reines doing. Herzlichen Dank für deine Unterstützung und Freigabe deiner Konfig.

    9. Hallo Stefan,

      Danke für deine Rückmeldung, ich wünsche dir viel Spass mit deinem Setup.
      HomeAssistant muss ich mir mal genauer anschauen.

      Mit sportlichen Grüssen
      Reto

    10. Hoi Reto
      ich bin nun seit ein paar Wochen mit HomeAssistant unterwegs. Für Konfiguration, Versionisierung und GUI finde ich die YAML Files schon besser als ioBroker. Die gesamte Automatisierung ist aber noch etwas rudimentär, Andere lösen das Problem aber offenbar direkt über nodeRed und verwenden HomeAssistant nur für Steuerung und Anzeige. Ich habe mit der Automatisierung aber noch nicht viel umgesetzt und kann daher noch kein Fazit ziehen.
      Aber nun zum wichtigsten Punkt: es gibt eine Zwift Integration, welche direkt mit Username und Passwort die gewünschten Daten für uns anzeigt. Ich habe sie soeben installiert und hoffe, dass dies morgen bei einem Test auch brauchbare Resultate in Echtzeit liefert. Um diese Tageszeit mag ich nicht mehr auf die Rolle sitzen 😉
      Hier mal die verfügbaren Daten:
      – Höhe
      – Kadenz
      – Distanz
      – Steigung
      – Puls
      – Leistung
      – Geschwindigkeit
      Zusätzlich noch das Zwift Level und der aktuellen Online Status. Wenn das aber klappt, sollte eine entsprechende Anpassung auch für ioBroker möglich sein.
      LG Stefan

    11. Hallo Em
      ja den Adapter Request hatte ich während meinen Tests auch gefunden. Ich habe auch unzählige andere Arten versucht, aber irgendwie hat nichts geklappt. Ich vermute nun aber teilweise den Grund nach meinen heutigen Tests zu kennen: Die Onlinedaten aus Zwift sind offenbar wirklich erst verfügbar, wenn man mit dem Rad und steuerbarer Rolle trainiert.
      Ich hatte jeweils nur eine HR Verbindung auf dem stehenden Avatar vor dem PC getestet. Ich bin davon ausgegangen, dass ab dem Moment, wo die Strecke geladen wurde, mindestens die HR-Werte durch die Adapter übermittelt werden. Dies ist aber offenbar nicht der Fall. Erst wenn auch die gesteuerte Rolle mit im Spiel ist, schient es zu funktionieren.
      Ich kann jedenfalls sagen, dass ich heute erstmals Live Werte gesehen habe und es über HomeAssistant mit dem entsprechenden Adapter problemlos funktioniert: https://github.com/snicker/zwift_hass
      Hier noch die entsprechende Community: https://community.home-assistant.io/t/zwift-sensor-component-feedback-and-testers-needed/87512
      Abschliessend gilt festzuhalten, dass es definitiv keinen Developer Account bei Zwift benötigt und ich nun die Steuerung des Xiaomi Fan und des LED Strip noch programmieren muss. Eine Portierung nach ioBroker sollte mit den Daten des HomeAssistant Adapters auch möglich sein. Ich werde aber bei HomeAssistant bleiben.

    12. Hallo Stefan,

      Vielen Dank für deine sehr interessanten Erkenntnisse und Inputs.

      Im Moment werde ich aber noch meine Lösung so weiter betreiben, allenfalls befasse ich mich später nochmals damit.

      Mit sportlichen Grüssen
      Reto

  6. Hallo Em,

    Die Beleuchtungsfarben werden mit dem Philips Hue Entertainment System, 3x Philips Hue Play hinter dem Monitor und 2x Philips Hue White & Color Ambiance an der Decke, realisiert.

    Es gibt eine App von Philips für den PC, die dann die Farben auf dem Bildschirm erfasst und an die Philips-Huebridge weiterleitet.
    Die Huebridge wiederum steuert dann die Lampen mit den entsprechenden Farben an.
    https://www2.meethue.com/de-ch/entertainment/sync-with-pc

    Die Herzfrequenz wie auch der Wattwert werden per Ant+ vom Raspberry empfangen und per MQTT an den ioBroker gesendet.

    Vor der Lösung mit dem Raspberry hatte ich natürlich die zwift-mobile-api getestet.
    Meines Wissens braucht es aber ein spezielles Entwicklerkonto um die API von Zwift zu benutzen (Stand 27.01.2020)
    Daher habe ich diesen Ansatz wieder verworfen und habe es mit dem Raspberry umgesetzt.

    Den Code dazu werde ich hier später veröffentlichen.

    Ein Adapter für den ioBroker wäre natürlich der Hammer, aber ich habe zur Zeit keine freien Ressourcen um einen entsprechenden Adapter zu schreiben.

    Mit sportlichen Grüssen
    Reto

  7. Hallo,
    cool umgesetzt. Bin auch Zwifter. Lüftersteuerung erfolgt manuell über Drehencoder, siehe
    https://forum.arduino.cc/index.php?topic=372623.msg4206739#msg4206739
    Stellst du auch den Code vom Raspi bereit? Wie erfasst du die „Farbe“ des aktuellen Bildschirminhalt?
    Wenn ich richtig verstehe, kommt Herzfrequenz über ANT+. Hast du dir auch mal überlegt, die Daten direkt aus Zwift zu übernehmen und per MQTT bereitzustellen. Damit könnten vielfältige Daten für Lüfter, Licht etc. verwendet werden (Watt, …) https://www.npmjs.com/package/zwift-mobile-api
    Habe jedoch keine JS Erfahrung. Eine Portierung in einen ioBroker Adapter wäre super flexibel.
    Freue mich auf Antwort

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert