Support for old, non-ANT+ trainers and bikes

(Paul Stewart) #1

I was one of the founders of FitCentric/WebRacing and was the primary software engineer for all of our products. Zwift looks sooo much cooler than NetAthlon ever was, so I’m very excited to try it! But I didn’t want to spring for another interactive trainer, especially since I have a perfectly awesome Schwinn Velodyne. I worked extensively with the ANT+ protocol for NetAthlon, but hadn’t looked at it in years. I started poking around and I saw that there are several new types of ANT+ devices, most importantly, the FE-C. I was thinking I could use this to write an app to make my Velodyne appear to be an FE-C device so that Zwift could recognize and interact with it.


The goal was to first make an Android device app. Unfortunately, the ANT+ SDK for Android doesn’t directly support the ability to make an Android device emulate an ANT+ device. But I was able to make a Windows app that can “talk” to the NetAthlon 2 XF dll that handles exercise equipment communications and interface with an ANT+ stick. That is, my app can get power/speed/HR from a legacy NA2XF-supported device and send it to Zwift. It can also get the percent grade from Zwift and sent it to the legacy device.


I still have some work to do, so I haven’t yet actually attempted to do a Zwift ride with my Velodyne. I should have my app ready in the next couple of days.


I’m wondering if there is anyone out there who would be interested in this app. It will support any legacy bike device that NetAthlon 2 XF supports. Here’s the list:


  • Axiom PowerTrain
  • Axiom PowerTrain II
  • Axiom PowerTrain 3
  • Axiom (all others)
  • Blackburn Exerscape
  • Cateye w/ RS232C Kit
  • Christopeit Sport ET 6 VR (USB)
  • Computrainer ‘Anytrainer’
  • Computrainer (v25.41 or v27.41)
  • Computrainer (v45.43)
  • Computrainer (w/ PC1 upgrade)
  • CSAFE bicycle
  • CSAFE-2 bicycle
  • CycleFX ITS (PEAK Sensors)
  • CycleOps Electronic Trainer
  • Daum Ergo Bike
  • Dyaco CSAFE Bike
  • FiTek (USB prototype)
  • GameBike
  • Inside Ride Bike Treadmill
  • Kettler Ergo Racer
  • Kettler KX-1/SX-1
  • Kinetics Trainer w/ built-in sensors
  • Kinetics Trainer w/ PEAK sensors
  • LAT Magnetic Trainer
  • Lode
  • MagneTrainer (FitXF-enabled bike)
  • Matrix CSAFE Bike
  • Minoura ICE
  • PCGamerBike (FitXF-enabled bike)
  • SportsArt CSAFE Bike
  • Tacx Fortius Trainer (USB)
  • Tacx i-Magic Trainer (USB)
  • Tacx i-Magic Sensorset (USB)
  • TherapyTrainer (FitXF-enabled bike)
  • Tunturi (T4, T6 or E Series)
  • Tunturi T8
  • Velodyne


Many of these are old, obscure stationary bikes or trainers. Some are prototypes that never made it to production. But some are bike trainers that had some commercial success, most notably Computrainer, Axiom and Tacx.


Since I have an old Win XP laptop not used for anything, it is my target platform for ANT+ “bridge” app. Therefore, here is the list of things you would need to make your legacy bike trainer work with Zwift:


  • a bike trainer of stationary bike that works with NetAthlon 2 XF (from the list above)
  • a computer or other device that runs Zwift
  • a Windows computer to run my bridge app
  • 2 ANT+ sticks (one for Zwift computer/device and one for the bridge app computer)
  • my bridge app


So what do y’all think?

(Paul Stewart) #2

Er, looks like the 2nd computer is unnecessary if Zwift is running on a Windows computer. You should be able to run both Zwift and my bridge app on the same computer. You will still need 2 ANT+ sticks.

(F udgy Pumpkins (B-) kiss) #3

I made one for my Fortius 1942

It runs in either a Linux VM or on a RaspberryPi

It uses ERG mode on the trainer and translates the “slope” command using formula consisting of wind resistance, rolling resistance and slope/mass.

Works great, but I can’t legally distribute it because it relies on loading proprietary Tacx Firmware.  Each user would need to have a Tacx Software CD and extract the Firmware from that CD (or from installed location.)  I think that Tacx intentionally sabotaged the older trainers so they could sell new ANT+ trainers.

Also, there is a long thread here about Antifier, another “bridge” tool



(Robert Klinkhammer[TriFury]) #4

I will try. I use a Mac for swift but have been running a windows vm for TACX. I will try. Been experimenting with the other one and wrote some code.

(Pim Hertogs) #5

Hey Douglas,


I see your Fortius code looks a lot like that in GoldenCheetah. Does that mean it also works with a T1932 head unit (as GC does)?

If so, I will give it a try but think you will have to add some delays here and there to obey the 1932 timings. I think those are not implemented in GC and as a result my 1932 is locking up after a few mins in GC. Would like to try and get that resolved in your code base so I have a properly working bridge.

(F udgy Pumpkins (B-) kiss) #6

Yes, I did use the Golden Cheetah code.  I modified the wattage interpretation significantly.  I used my PowerTap wheel to create a math formula (basically a 3d plane) with inputs of torque (I think that is what is read from the unit), and speed to output power in Watts.

I don’t have a 1932 head unit so I did not test on that.  I had problems with mine locking up using a long USB cord and running in a VM.  I both shortened the cord and switched to a RaspberryPi (Zero, only $10) and it works better now.


There was another user trying to get it working with the 1932.  Let me know how it goes and if I can help or answer any questions.


I would be fine with integrating changes you make or giving you write access.



(Pim Hertogs) #7

Cool, installing Ubuntu on Windows right now!

(Mark Haney) #8

Doug - I tried your code on my Raspberry Pi and a 1932 Fortius but could not get it to work.  Antifier does work with some caveats.  Would like to get your AntBridge working with the 1932 as well (and using my RPI Zero W).  Compile went fine, but not sure the order of what to execute.  The bin file created does not run correctly (get an error when I execute it).  Maybe I am missing something or the 1932 unit needs some different parameters to work with AntBridge?

(F udgy Pumpkins (B-) kiss) #9

Yeah it is a work in progess.  I have not checked in my newest changes.

Right now the order is

  1. cd ant_code; make; cd -

  2. cd fortius_code; make;

  3. ./bridge_tool

I am making a subdir make file and changing the name from bridge_tool.



(F udgy Pumpkins (B-) kiss) #10

Oh, one other thing.  You need to “sudo” or run as root.  There are permissions set on some of the devices and kernel modules needed to be changed so users have access.



(Mark Haney) #11

I did the above  -> sudo ./bridge_tool …:slight_smile:

(Pim Hertogs) #12

Jus compiled everything in Ubuntu 16 running in VirtualBox on Windows 10 and after fiddling with the USB passthrough I am able to find and configure the device in GoldenCheetah as FE-C device. Slope and ERG modes seem to work although ERG is stuttery at low cadence…

Will do some futher testing with Zwift later this week.

(Pim Hertogs) #13

Hey Douglas,

congrats on the great work! Tonight I have ridden my first Zwift ride using AntBridge and despite some minor issues it works great! Feel is pretty natural and I had no hiccups or whatsoever during 60 mins of training.

My set-up:

  • Windows 10 Professional
  • Tacx Fortius T1932 (motorbrake)
  • 2x ANT+ stick
  • Oracle Virtualbox running Ubuntu 16 and AntBridge

Some things I needed to further figure out or maybe you know

  • Speed/power received by Zwift seem to be lagging a bit. It takes a few seconds before you see the effect of an acceleration. I have seen this reported before and am not sure what is causing this.
  • I have the feeling that the motorbrake is not fully used when going downhill at a decent percentage (eg - 3-5%). Although the speed looks realistic or maybe even too high, the brake is not really helping the rear wheel spin. I am not sure if that is caused by the way the resistance is being controlled?

With above issues fixed it would be perfect but your tool is definitely usable as of today!

(F udgy Pumpkins (B-) kiss) #14

There are a few more things Im working on.

  • Building and autostarting 

  • For some reason Zwift does not send down user info (weight, bike weight etc) or wind resistance (drafting).  I have used 2 other simulators and they send down the user info and wind resistance so I think it is something with Zwift.

NOTE: you should code in your weight and recompile.

  • Simple GUI that shows current stats and allows changing power (in erg mode) and other settings.

(Pim Hertogs) #15

Thanks for the note on user weight and wind resistance. I was under the impression that drafting was working but maybe it was a kind of placebo effect.

I am gonna try and get this to run on a RPI next. The things I need there are indeed autostart and a heartbeat signal as I want to be able to operate it w/o terminal.

Will keep you posted.

Any ideas on the lagging of speed and power changes?

(F udgy Pumpkins (B-) kiss) #16

The lagging may be the way zwift does the calculations. 

The update frequency of the wattage is as high as possible but for some reason the wattage display even lags.  Then, when it does get a wattage, it calculates speed from that wattage.  It does not seem to utilize the speed data I provide.

So, the answer is I don’t know why the wattage data lags, but the calculation may be part of the overall lag.


(F udgy Pumpkins (B-) kiss) #17

Do you have a display on your VM?  Do you see either of these messages

“SET: wind resistance coef %f wind speed %f drafting factor %f”, wind_resistance_coef, wind_speed_kph, drafting_factor"

“SET: user weight kg %f bike weight %f wheel circumference mm %f”, user_weight_kg, bike_weight_kg, wheel_circumference_mm"


I am so confused because, like I said earlier, other software sends me those messages.  (PAGE_USER_CONFIGURATION and PAGE_WIND_RESISTANCE) but for some reason, Zwift does not.



(Pim Hertogs) #18

Yes i do have access to logging so can check for those messages. I dont recall having seen those indeed but will added some further debug statements to show all ANT page types that are being processed.

(F udgy Pumpkins (B-) kiss) #19

I did a ride today and my Powertap numbers lined up pretty well with the Fortius numbers.



(Pim Hertogs) #20

I only see that slope is being set as a result of a track resistance page. I never see other pages being received, eg wind resistance or user data.

However, when I look at the protocol implementation and compare that to the ANT+ FE-C device profile documentation from, I doubt whether the frequency of pages is correct? Maybe that is the reason why you never receive those pages. I guess they must be there otherwise drafting can never work. According to what documentation did you build that protocol handler?

Btw, I also changed the timing of the Fortius read/writes to maximize the number of 48 byte messages. Not sure if that has any impact though…Could not really tell from a short test drive.