Support for Tacx older smart trainers

(David Gunstensen) #221

Has anyone got this to work with the T1932 and 32 bit windows 7?  I cannot get it to detect the VR unit or dongle.  I works on my win10 machine (which is in an inconvenient location from my bike setup).  I guessing I might need to upgrade something on the win 7 machine,

(Paul Yeatman BSc.) #222

>Huw. 1 dongle transmits. Another receives.

>David. You need to tell Windows the head unit is a n ANT+ device. It took me a while to get Windows 7 to do this. Open device manager. Go into properties of the Jungo device. Update driver. Uninstall driver making sure the remove driver box is ticked. Redetect the hardware. It should now show up as unknown device. Update driver. Browse for driver and select the ANT driver as per the readme.

Fire up Zwift. Fire up antifier (the 32 bit build). Load the power profile. Start the script. Enjoy!

(Paul Yeatman BSc.) #223

I tried producing a power curve today using a Fortius 1932 and Vector 2’s.  The rolldown was 6 secs.  The pedals did not return a calibration signal.

I rode the 14 levels of increasing pain.  This populated the pickle file, however the custom file was not populated.  (A 0 error of some sort was returned). 

If useful, here is a link to the file…  - I added the .txt so I could upload it

(Paul Yeatman BSc.) #224

Hot off the press Tacx Fortius T1932 power curve using uncalibrated Vector 2’s. My Wahoo Bolt also would not calibrate the pedals.

Up until lvl9 things are smooth.  Things get jerky after that.  Looking at the data, the slopes agree. Mine loses smooth riding historically >15% at speeds lower than 15kp.

31.7:33.9641223026,-76.4338256888  (14 lvl errors, changed to 31.8)

Now to experience how this feels in Zwift.

(Peppy Hudman) #225

Is there a “has the capability to work list” anywhere posted ?


I have a Flow I-Magic T1901 turbo, with one of the green T1902 head units…which is kinda old but works fine with TT3 and TT4.  With 2 ANT+ dongles and Antifier, will this work ?

(David Gunstensen) #226

So I’ve got everything connected and working but have a couple questions I hope someone could help with.  (T1932 Fortius multiplayer)

Power settings.

    I find the power readings to be way off.  I have tried the default and two other Fortius files provided here.  Is there any way I can adjust the file other than trial and error?  ie ride on tacx at a fixed cadence and slope and calc it from there?  The power levels am getting are off by up to a factor of 8 or 9.  ie on a hill I estimate I"m putting out 250W and Zwift and antifier are showing 30-40.  On level ground it is off by about a factor of 2.

If I do manual edit the file why is there a multiplier and an addition?  How would I decide which to change?

Perform Runoff.  Do I need to do this?  I tried and cannot get it to work.  It immediately starts to countdown or says stopped.  I have no way to ramp up to 40kph and then start timer.

Head Unit buttons.  IS there anyway to make these work so I can select the direction options in zwift when I come to an intersection?

Thanks for any help.


(Pim Hertogs) #227

Finally got around to my missing data issue on a 1932 unit. Turns out that the delays between read and writes from and to the unit are really sensitive. If these are not correct, the device will return 24 bytes of data iso 48. The 24 bytes do not include speed, cadence, etc.

Have fixed John’s code per below

  • when 24 bytes are being retrieved, keep values that are not being updated as is. In John’s code these were set to 0 which does not seem to be correct

  • added sleep timers to make sure the appropriate read/write delays are being applied.

As a result I now almost always get 48 bytes returned.

In the mean time I have started re-writing John’s code to separate Tacx and ANT+ control loops into separate threads. This takes me a bit more time as I am not too familiar with Python.

@John, how can I push my changes into your repo as a separate branch?

(Christian Bothén) #228

I have problems with Zwift giving me 2000 W when my power output exceeds around 540 W. At the same time Antifier displays the correct power. The power in Zwift is locked at 2000 W until I go below 540 W again. Has anyone else experienced this?

(Paul Yeatman BSc.) #229

>>David Gunstense.

Before I create a power profile I was keeping Antifier above the Zwift window. Stopping ever now and then, altering the multiplier and additional numbers in the power file based on the resistance level.  Riding a little more.  Repeating until the power readings matched what my real life readings show.  Tedious, but in the end, you’d get a “realistic” feel.

I thought about riding a slope vs distance workout on the Fortius and recording power from my Vectors and creating a linear graph myself for the power curve.  This could be done, however I’m not clear on how the multiplier vs additional actually works.


I’ve ridden a ride with the Vectors running alongside the Fortius.  For the Vectors, my average power was 238.  For the Zwift, 275.  I could not get the vectora to calibrate to LR balance was 20/80, so perhaps that caused the low IRL readings - I’ll try to calibrate using a Garmin, a Wahoo and Antifier and see if I have any success later today.

If that does not equalize the readings, rather than running a power curve again (that thing’s HARD), I’d rather modifier the power file to drop the watts down 35w in all cases.  How would that be done?

(Pim Hertogs) #230

Hey John, my github username is pim555

(Robert Klinkhammer[TriFury]) #231

FWIW, I have noticed that the TACX fortius always reads about 30 watts higher than my vectors when running TACX software. I had tried calibrating the TACX and vectors. At no point was I able to get them to match. Assuming the vectors are correct, doing a simple bias adjustment across all values may be a simple option

(Pim Hertogs) #232

Hey John, uploaded the fix as a new branch into github. Pls check and merge if you are ok.

I also have a question on the rundown calibration. What is that supposed to do? I can see that it determines the time to rundown to 0 but that value does not seem to be used anywhere else?

(Mark Haney) #233

Pim - I just rode your updated with my Raspberry Pi and the power curve Paul posted above here.  I noticed that the power generally reported to Zwift felt about right but during my ride the resistance of my TACX Fortius never changed from level 4.  The route I rode went from about -3 degrees slope to 3 degrees slope with mostly flat areas.  The ride was enjoyable but the actual speed I was riding (Garmin speed/cadence sensor) did not match what Zwift and the TACX/antifier were reporting even on flat ground.  My ride was about 14mph in reality but TACX reported it to be a bit over 20mph (which corresponds to the effort I felt throughout the ride at about 170 watts average for 27 1/2 minutes (10 miles on Zwift, but 6.6 miles in reality).

I was looking at the code and noticed this is where either force or resistance is sent/received … using VNC Viewer on my windows 10 machine I could view the status of the raspberry pi and Antifier.  Again it stayed at resistance 6.  Is there a way to correctly adjust resistance to the corresponding Zwift slope?  I know this was happening a while back.  Maybe I somehow had ERG mode engaged?  I did not choose a workout, just went for a straight ride.

(Mark Haney) #234

General question - does the power curve have anything to do with resistance values or is it just calibrating what the trainer reports back to Zwift as actual power being exerted?  If it is only power exerted, then there needs to be a way to calibrate grade to resistance unless I am missing something.  


Does the Fortius only have 14 resistance levels? If so, what does TACX do to calibrate grade to resistance? (I have ridden GPS/Google rides where the grades are somewhat similar to the real rides I have captured and replayed).

(Pim Hertogs) #235

Hey Mark, the changes I made should not impact resistance settings. All I have changed is that reading the Fortius params happens correctly.

That said, I have also for the first time ridden Zwift for 60 mins using antifier and noticed a couple of weird things

  • speed reported by antifier is significantly different from what is shown in Zwift. Especially at steeper slopes, speed in Zwift is much lower than in Antifier.

  • Wattage feels about right on flat, again on steep slopes it does not.

  • I saw a couple of times that Antifier was not updating my Fortius anymore. Starting and stopping solved this.

Will continue to dig in.

@John, is there a functional description of the dataflow between Zwift and the trainer device? That would help a lot in understanding and debugging.

(Paul) #236

Check this out:


(Peppy Hudman) #237

@John - is the T1901 brake and the green T1902 head unit too old for this to work ?  Appreciate that the T1902 would probably only work on 32bit OSes…

(Cameron Maher (Lakers)) #238


This is fantastic!
I’ve just been given a Tacx Flow 2200 trainer. Are you able to confirm if this trainer will work with this method on Zwift? I’d be keen to know before I fork out for additional ANT+ dongles, etc.

Here is a picture of the trainer and head unit - can someone please confirm if this will work?

Thanks again - amazing work by all of you.

(Paul) #239

Y’all sort of hijacked my post about older bike trainers (not only old Tacx trainers) titled " Support for old, non-ANT+ trainers and bikes" which is here. So I thought I’d offer my insights to Douglas’ comments about attempting to get the wind resistance page from Zwift here on this thread to hopefully move this topic back here where (I think) it originated.

At WebRacing (which used to be called FitCentric), I spent a lot of time with trainer and stationary bike manufacturers about their communication protocols in order to add support for their products in NetAthlon. We had a relationship with Tacx at one point, and they provided us with exactly how to communicate with their trainer. Realize this was several years ago, but at that time we didn’t simply send a percent grade to the Tacx trainer. Instead, Tacx provided us with a set of power curves related to what they referred to as the “brake position”. We had to work backwards to arrive at what to set the trainer’s brake position for a particular wheel speed and power output. The important point I’m trying to make here is that the Tacx trainers at this time had a finite number of brake positions and no real ability to do any sort of complex calculations needed if we were to simply send it a percent grade. Actually, the algorithm they provided us with to implement in our code was VERY complicated (it was by far the most difficult trainer to add support for in our software). I’m going to assume that the reason why they had us do power calculations in our code was that they were unable to do these calculations in their trainer’s firmware.

I’m sure a lot has changed from those early days. But at the same time, I would be surprised to learn if there are many (if any) trainers support the data sent via the ANT+ FE-C wind resistance data page. You can simplify a power calculation some if you assume a zero wind speed. Not only that, but it would be easier for a trainer manufacturer to fully test their implementation of simulating percent grade without having to also test for a varying wind speed.

When I think about how Zwift implements features like their powerups, I think that leads me to believe they implement drafting much like I did in NetAthlon. I noticed that when one of the powerups was active (I forget which), I noticed that my percent grade was smaller during that powerup. So it may be that drafting is implemented by adjusting the percent grade sent to the trainer. What I did in NetAthlon was that I calculated a percent grade using a formula given total weight, power, speed, rolling resistance, etc. But for this calculation, I assumed a much lower frontal area. This new percent grade was my “maximum drafting effect grade”. Then I established a drafting zone between my rider and another rider. I assumed that the drafting effect in this zone was linearly proportional to where my bike was in the drafting zone (this might not have been a good assumption, but that’s what I went with). That is, if I was at the front edge of the zone, I was at 100% drafting effect. If I was at the back edge of the zone, drafting effect was zero and if I was in the middle it was 50%. I then sent to the trainer a grade = (actual grade) - ((actual grade - 100% draft grade) * draft %). It worked fairly well. 

Anyway, hope this helps.







(Pim Hertogs) #240

Hey Paul, sorry for hijacking your post but I think Douglas has done some great work already to the point that his bridge is perfectly useable for me. Got carried away a bit realizing how well that works…

If I understand you correctly, you believe that drafting is implemented by varying the %grade sent to the trainer. I think that might very well be the case.

I have been riding my first Zwift rides over the last 2 weeks and have the feeling that drafting is working. At first I thought that I imagined but when paying closer attention, I think I do feel lower resistance when I draft. Will  try to do some closer logging to see if I can find evidence.

When you explain what you did in NetAthlon wrt drafting, I assume you refer to the implementation of drafting on the bike display side, not the trainer?