Support for Tacx older smart trainers

(Paul) #241

Yes, on the “bike display” side. The goal with implementing a drafting effect is to make it so the bike trainer provides less resistance than it would if you were not drafting. Back in the NetAthlon days, there were only two things you sent to the trainer that would affect resistance:

  • percent grade
  • rider weight

For many trainers we supported, rider weight was something you sent the trainer once during initialization, so really the only thing available was percent grade. So the only way to implement drafting was to send the trainer a percent grade that was less than the actual percent grade of the terrain the rider was on.

As a side note, this discussion is bringing back memories of some design decisions we made with NetAthlon and how it differs from Zwift. I think that overall there isn’t much of a comparison between the two: Zwift is clearly so, so much better! I really like their decision to base your in-game speed on your power output, even for bike trainers that are able to accept percent grade change requests. We decided instead to go with speed values we received from the interactive bike trainers because we felt that it was important for the speed values you saw in NetAthlon actually matched what your trainer or bike computer displayed. Now that I’ve ridden Zwift a few times, I realize their way is better. We had a problem in NetAthlon when folks were riding together using trainers of different brands. A good example is a Velodyne going against a Computrainer. I have a Velodyne, which has a massive flywheel. A Computrainer has a tiny one. If I was riding against a Computrainer and we both started up a hill, my flywheel’s momentum would allow me to carry some speed into the hill. The resistance on the Computrainer would kick in much quicker, so I’d leave the other rider behind. The opposite happened when we started downhill; it would take me a little while to get the flywheel up to speed while the Computrainer rider would shoot past me.

One thing that I like better (maybe the only thing) is that early on we were not satisfied with how our prototype environments (we called them “courses”) portrayed small variations in terrain grade. That is, when you were on a 0% slope (flat terrain), it really didn’t look much different that 1% or -1%. So we decided early on that we would build our courses so that the terrain was 2 times normal. That is, if a top of a hill was really 50m, we would make it 100m. In the game code, we would then figure out the slope of the terrain the bike was on and divide that by 2 before sending the grade to the bike trainer. We felt like this made it easier to look at the scene and be able to anticipate grade changes more easily. Earlier today, I rode the flat London loop on Zwift. Although this route is pretty flat, there are a few grade changes with the max being about 4%. It was really hard to see when the terrain started to go up or down. I find that I’m constantly looking at the percent grade value displayed in the map.

(Pim Hertogs) #242

Thanks. Assuming Zwift uses grade changes only, I would expect them to send rider weight indeed but even that is not being sent as far as I can see from the logs.

I can see the advantage and why they compute speed instead of taking it directly from the trainer but I don’t like the fact that it seems to be lagging. When you speed up or slow down, it takes quite a bit of time (few secs) before this is visible in Zwift. As the actual speed in the bridge is updating in sync, I think this is caused by Zwift processing.


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


Sorry for hijacking your thread.  I figured either to offer you the code as a starting point or dissuade you from doing it as Tacx holds the Firmware as proprietary.



I agree.  Why is it not sending user weight either?  That seems 100% necessary.

Also, the ANT+ protocol specifies the wind resistance page for trainers.  I think the page is mandatory (the trainer must support the page). Since I enumerate as an FEC it knows I support wind resistance (and user weight setting).  It should send me both.

I had a friend come over with a Tacx ANT+ and tried to capture the sync sequence with “Ant Ware II” but failed and I ran out of time and failed to get the capture.

I will try again.



(Paul) #244

Hi, Douglas

I laughed a little when I read “I think the [wind resistance] page is mandatory…” My experience with communication protocols and exercise equipment is that equipment manufacturers sometimes don’t follow the specs. Sometime in the early 2000s, the CSAFE communication protocol spec developed by FitLinxx was adopted by the Fitness Industry Suppliers Association (FISA) and a CSAFE group was formed within FISA. There was even a certification process, and many exercise equipment manufacturers touted “CSAFE enabled” or “CSAFE certified” equipment. CSAFE is a complicated protocol, and what we found is that almost none of the “certified” stationary bikes we supported actually followed the spec! We ended up having to write special code for each stationary bike we supported just to get the bike into a state where we could communicate with it.

Don’t get me wrong; ANT+ is nothing like CSAFE. I would expect equipment manufacturers to be able to properly implement ANT+. But at the same time I would not be surprised if there were missing things. Also. take a look at page 70 of the “ANT+ Managed Network Document - Fitness Equipment Device Profile, Rev 4.2” doc. In section “7.8.3 Data Page 50 (0x32) - Wind Resistance”, the second sentence reads, “Any open display or fitness equipment that supports the FE-C use case may support this data page.” The way I interpret this is that Zwift (the “open display”) can choose whether or not to support this page, and your Tacx trainer (the “fitness equipment”) can also choose whether or not to support this page.

(Pim Hertogs) #245

Agree, was thinking the same when reading that.

The thing I don’t understand is that if the trainer supports simulation mode, the open display may send track resistance (as Zwift is doing). However, it should also return user config if requested. So apparantly that is a deviation from he spec.

I am wondering if Zwift is not simply calculating slope% server side taking all parameters into account (track resistance, weight, slope, drafting, etc.). That would work with the widest variety of trainers without relying on heavy calcs trainer side…

(Paul) #246

Hi, Pim

I’m looking at page 78, section “7.10.2 Data Page 55 (0x37) - User Configuration”, and it isn’t completely clear how this works. One way to interpret the text here is that this is a command that is only initiated by the open display (Zwift) and that the fitness equipment (Tacx trainer) does not request it. If you use the SimulANT+ app (available from and use it for both a bike trainer and a fitness equipment display (using 2 ANT+ sticks plugged into your computer), you’ll see that there is no option or button on the bike trainer section to request user configuration from the open display. If you are using the Android ANT+ Plugin Sampler and choose the Fitness Equipment Controls Display, you’ll see that there is a button labeled Request User Configuration. If you run SimulANT+ and configure one ANT+ stick as a bike trainer and connect the Android app to it, you can try the Request User Configuration button in the Android app. When you tap this button, you’ll see this on SimulANT+: “Ignoring request for page 55 (undefined)”. But in either app, the open display can send user configuration and the emulated bike trainer in SimulANT+ will accept this page and save its data. So maybe we should see what the folks at Dynastream have to say about this.


(Paul Yeatman BSc.) #247

OK, a little update on my ride experience.

Riding the set courses is acceptable.  Riding in ergo mode is a bit hit and miss.  Sometimes the resistance is huge and other times it is very small.  This can usually be fixed by coasting until Zwift says Ergo mode is off and to be steady to restart it.

Ergo in general.  The power seemed too iffy.  Target zone 260w.  My readings 220-240.  Anything above 240 would jump up to 350 or so W (according to Zwift).  Sprints (anything over 450W) would shoot right up to the max wattage of 2000 and I know for sure I’m not doing that for 30 seconds.  This is similar to the behavious reported by Christian Bothén . (Yay for winning a sprint jersey, but probably not legitimately)  Ergo resistances were at level 4 to 6 for 90% of the riding. Once I noticed level 9 and once, level 1.

Historically, ergo’s been a bit wonky on my Fortius trainers.  Eg I’d never do a power/time session as the resistance would be huge.  I’d do a distance/time session and ride at the power I wanted to by setting a slope of 5-6%.  Thus, my ergo experience may just be a manifestation of the capabilities of the Fortius trainer.

Anyhoo, would the ergo be more dependant on the power curve (posted earlier) than “just” riding around the various maps?  With the slopes ranging from -5.2 to +31.7, would that need tweaking?  The documentation for the Fortius says a max of 20% can be ridden, so should the custom file say the same thing?

(Hendrik Schaarschmidt) #248


Is there any option to support the old T1902 Interface ?



(Micha Run) #249

I use a Tacx Flow T 2200 with 2202 interface. Zwift runs on mac book. how to connect the flow with the amt+ (mine garmin)? The project on github from John run on win or linux and her are people they use a raspberry to connect.

I read this thread to the end but i don’t understand it really. Can anyone help me?

If I need a raspberry is available, as well a T1925.

(Paul Yeatman BSc.) #250

Reading about how Zwift does slopes, they tend to have the slope so a 31% on the Fortius would actually be 15% which is within the units capabilities.

I might be able to get my hands on some more power units in the next week so can produce some more power/resistance files for your pleasure.

(David Gunstensen) #251

I would love if I can get some power files that work for me.  I’ve pretty much given up on Antifier.  I just find the power levels are just not right.  I’ve tried a few files and none seem to work even close.  The default one I have trouble generating much more that 30W on a steep hill (which pretty much means I stop and fall off)  I tried some of the files posted here and found the power fluctuated wildly.  Sometimes spiking to 2000W.  (This kind of struck me as a problem with Antifier.  as in maybe it should be taking the average readings from the head unit for a longer time before sending it to Zwift.  But I have really looked at the code to see how it works)

(Tony H) #252

I’ve got Look power pedals and a tacx forties.  Antifier is working on my pc, but I’m transmitting to a dongle on my android phone because I couldn’t get my computer to recognize 2 dongles.  Trainerroad is on my phone and it will only sporadically pick up the reading from my pedals.  The result is that it reads 1watt mostly and then spikes to 275+ before dropping back to 1w.  I’m a neophyte concerning computers.  If anyone has a few pointers for me to sort out my issue, I’d appreciate.  With my power pedals, I think I should be able to contribute info for a power curve.

(Paul Yeatman BSc.) #253

David: I’ll produce 2-3 power files over the course of the coming weekend using Vector pedals and post the results.  It is a decent workout just trying to do one of those!

Tony: Re dropouts: how close is the receiver to the transmitter?  less distance is better.  Re: x2 dongles in computer.  Try a different port if you can.  Pull out the detected one and see if the non detected one is detected after plugging it in.  If yes, plug both in and see how it goes.   Try some more ports if the x2 dongles don’t play together.  Tun of your anti-virus (if paranoid, unplug your network 1st).  See if there is any difference with the dongles.  You only need a network connection to log into Zwift, after that, you can pull the plug.

(Paul Yeatman BSc.) #254

Not had chance to do more testing (obviously).