Connect your Proform TDF Bike to Zwift with TDF Data Bridge

I seem to have the code that @Tony_M2 posted earlier sort of working specifically the Github repo: tonymyatt/zwifit

I can view the ZwiFit app locally on the network, when I first went through the connection process, it was connected fine with iFit.

Then I wasn’t sure how to get it to connect to Zwift, so I turned off my Raspberry Pi 3b+ and turned it back on. Then I was able to get it to connect to Zwift, but it’s no longer connected to the iFit.

I’m not sure on how to reset it so that I can reconnect to iFit?

I decided to try again from scratch as I noticed I had cloned the repo from the readme and not the tonymyatt one.

Had to switch to python2.7 and somehow manually install bluetooth-hci-socket:
npm install bluetooth-hci-socket@npm:@abandonware/bluetooth-hci-socket

I’m able to get it connected to iFit and when I bike, I can see the speed on the web interface UI for ZwiFit.

However it seems to die after some time with the following error:

Characteristic not supported: 17
Characteristic not supported: 17
Characteristic not supported: 17
Characteristic not supported: 17
Characteristic not supported: 17
Characteristic not supported: 17
Characteristic not supported: 17
Characteristic not supported: 17
Characteristic not supported: 17
Characteristic not supported: 17
Characteristic not supported: 17
Characteristic not supported: 17
Characteristic not supported: 1
Characteristic not supported: 17
  throw new ERR_OUT_OF_RANGE(type || 'offset',

RangeError [ERR_OUT_OF_RANGE]: The value of "offset" is out of range. It must be >= 0 and <= 7. Received 8
    at boundsError (internal/buffer.js:77:9)
    at Buffer.readUInt16LE (internal/buffer.js:234:5)
    at Object.fromBuffer (/home/dan/zwifit/src/ble/ifit/_constants.js:128:40)
    at /home/dan/zwifit/src/ble/ifit/_request.js:801:45
    at Array.forEach (<anonymous>)
    at parseWriteAndReadResponse (/home/dan/zwifit/src/ble/ifit/_request.js:795:35)
    at /home/dan/zwifit/src/ble/ifit/_request.js:174:18
    at Characteristic.listener (/home/dan/zwifit/src/ble/ifit/_request.js:660:4)
    at Characteristic.emit (events.js:315:20)
    at Noble.onRead (/home/dan/zwifit/node_modules/noble/lib/noble.js:440:20) {
  code: 'ERR_OUT_OF_RANGE'
npm ERR! errno 1
npm ERR! zwifit@1.1.0 start: `node app.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the zwifit@1.1.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

I’m not sure if this should be moved to another thread? As it’s not really related to @Dan_Bee_TDFDB’s tool but to @Tony_M2’s fork on Github for ZwiFit tool.

Bonjour Dan, j’ai un Spinning Proform TDF CBC (modèle 2023), que j’utilise avec une tablette.
Je voulais savoir si il est compatible avec SWIFT

Merci pour votre retour

Salut Dan,
J’ai le Proform TDF CBC (modèle 2023) que j’utilise avec une tablette.
Ce modèle est il compatible avec SWIFT?

Merci d’avance pour votre retour

Hi, what is the link to download the software? The one one the website says the mega file is not available.
I may purchase a used TDF v4 to use with zwift and rouvy.

Sorry, I found it. Thanks.

Hey Steve, the latest version can be found here:


I am trying out the demo mode and it is connecting and controlling the trainer like magic!
2 questions, easy one first:

  1. Does the paid version incline feature be turned on/off? I am afraid my TDF doesn’t have low enough gears for me on the steeper sections.
  2. Have others noticed strange power/watts readings from their TDF’s? I don’t have power meter pedals at the moment, but I ride my Cyclops Magnus smart trainer enough to know I can ride at 125 watts, 75 rpm, and my heart rate stays about 125bpm. On the Proform I ride at 99w to maintain 125bpm. If I raise the power offset to +25, then it reports similarly to the Magnus. BUT, when I ride harder or change the cadence, it reports much higher watts and lower HR than I have ever done on the Magnus. (I love the power but feel like I am cheating!). Any ideas on how to get accurate power readings?

Hi Steve,

Yes, you can ride with or without incline by just de-coupling the controllable trainer sensor. However, some training programs (such as Zwift) also include the trainer difficulty setting, which also allow you to change the impact of gradient changes in your rides.

About the power-meter issues, those are real. The TDF bike does not count on real powermeter data, so it will depend on how well calibrated your bike is to get the most accurate readings and such. I do have some powermeter pedals, and what I try to do is find a match to the overall ride power readings rather than a 100% match. As you mentioned, depending on the road conditions, the accuracy of the ‘programmed’ power readings changes, so it is nearly impossible to get a perfect match on all riding conditions.

I hope this helps,

Hi Dan, what do you mean, ‘de-coupling the controllable trainer sensor’?

I will keep testing the power offset and try to find something reasonable.


You can stop the incline feedback altogether by unpairing the FE-C sensor on your training app (aka controllable trainer sensor)

I apologize in advance for yet another question! Is it possible to use power meter pedals on the TDF for reporting the power back to Zwift AND also get incline feedback?

I am trying to get reliable power readings for my training plan and also get the virtual resistance changes from Zwift for elevation changes.


For the price of power meter pedals you can just get a Zwift Hub one smart trainer, it will do everything in Zwift… you just need a bike too

Hi to everybody.

Any news in compatibility with Nordic Track S22i?

Hi Jose, that model is not supported by TDFDB

@Dan_Bee_TDFDB I am having issues with the new computer for my TDFDB and upgrading from TDFDB3 to TDFDB4. Would it be possible to PM you for help?

Thank you,
Jim C

Hey Jim I just saw your emails! I’ll get back to you directly ASAP

Thank you