Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Experimental support for Keiser M3 #50

Merged
merged 23 commits into from
Feb 21, 2021

Conversation

chriselsen
Copy link
Contributor

@chriselsen chriselsen commented Feb 14, 2021

To try this out:

  • Start with current Gymnasticon Pi image
  • Setup build environmant:
sudo apt-get install git
cd
git clone https://github.com/ptx2/gymnasticon.git
cd gymnasticon
sudo service gymnasticon stop
sudo setcap cap_net_raw+eip $(eval readlink -f $(which node))
  • Checkout experimental branch and build it
git fetch origin pull/50/head:keiser-m3-experimental
git checkout keiser-m3-experimental
npm install
npm run build
npm link
gymnasticon --bike keiser
  • Provide output if things are not working

@chriselsen
Copy link
Contributor Author

Sorry, realized that I had a typo in the instructions for testing above. Could you try again?
If everything works out fine, you should see a file ./src/bikes/keiser.js within the gymnasticon folder. That is the new bike driver.

If you only have a Bluetooth 4.0 dongle right now, this might indeed not work. Gymnasticon needs to receive and send, which is only possible with Bluetooth 4.1+ over the same dongle. Let me see if I can build you a simple test script, just to confirm the communication with your bike.

@chriselsen
Copy link
Contributor Author

chriselsen commented Feb 14, 2021

@nealjane I added a very simple test script, just to validate the communication with your bike.

var noble = require('@abandonware/noble');

noble.on('stateChange', function(state) {
  if (state === 'poweredOn') {
    noble.startScanning(null, true);
    console.log('Scanning...');
  } else {
    noble.stopScanning();
  }
});

noble.on('discover', function(peripheral) {
  if (peripheral.advertisement.localName == "M3") {
    console.log('Discovered Keiser M3: ', peripheral.address);
    try {
      console.log(peripheral.advertisement.manufacturerData);
      console.log('Power: ', peripheral.advertisement.manufacturerData.readUInt16LE(10));
      console.log('Cadence: ', Math.round(peripheral.advertisement.manufacturerData.readUInt16LE(6)/10));
    } catch (err) {
      console.log(`\tError parsing: ${err}`);
      console.log(`\t ${err.stack}`);
    }
  }
});

Just download it into the gymnasticon folder with

wget https://raw.githubusercontent.com/ptx2/gymnasticon/01f629418f6472a6ede127dedb253dcfc2e87efe/keiser.js

and then execute it with node keiser.js.

It should show you Power and Cadence values - along with some other debug data. Just validate that the Power and Cadence values displayed match what you see on the console.
If it doesn't, paste the output of one "<Buffer ..." line with the subsequent Power / Cadence values.

@nealjane
Copy link

nealjane commented Feb 15, 2021

@chriselsen. Hi Chris, Ran script you wrote this am. watts and power are shown on screen = bike screen.-fab! (Can’t take pic from bike as I’m peddaling - but it’s definitely picking up correct rpm and power)
image

@nealjane
Copy link

nealjane commented Feb 15, 2021

@chriselsen - just realised/reread the instruction on front page, I’m using pi zero W - so does that mean I don’t need the extra usb Bluetooth 4.1 dongle as it’s built in?!

@chriselsen
Copy link
Contributor Author

@chriselsen. Hi Chris, Ran script you wrote this am. watts and power are shown on screen = bike screen.-fab! (Can’t take pic from bike as I’m peddaling - but it’s definitely picking up correct rpm and power)

That's great news! Than the experimental bike driver should work as expected.

As you're using a Raspberry Pi Zero W, you don't need any external Bluetooth dongle.
Just follow above steps to get the experimental bike driver running and you should be good to go.

Let me know how it went.

@nealjane
Copy link

@chriselsen , unplugged my bt4.0 and restarted pi0w- it’s just hanging at ‘connecting to bike’
image
..anything to do with me installing gymnasticon with bt4.0 originally plugged in??

@chriselsen
Copy link
Contributor Author

chriselsen commented Feb 15, 2021

..anything to do with me installing gymnasticon with bt4.0 originally plugged in??

You'll have to follow the steps in post 1 to actually download and build the new driver.
You can go into the gymnasticon folder and continue with the second block, the one that begins with git fetch...

Also the command line option should be --bike keiser.
Without it, it will try to connect to the default Flywheel bike. That won't work.

Looks like you're rebooting your Pi. In that case you also want to stop the gymnasticon service with sudo service gymnasticon stop. Otherwise you'll end up with two instances running at the same time, which won't work either.

@nealjane
Copy link

@chriselsen Giving me an error as follows from typing - ‘git fetch origin pull/50/head:keiser-m3-experimental’

  • gives me ‘Fatal: not a git repository (or any of the parent directories): .git’

@chriselsen
Copy link
Contributor Author

You have to be inside the gymnasticon folder when executing the command.

@tompijls
Copy link

Hey Chris,

started playing with this as well.

Once you stop pedalling on the keiser, it shows average cadence/power for about a minute before the device shuts down.

It's specified by the data type integer per keiser specs: https://dev.keiser.com/mseries/direct/#advertising-data-structure

So ideally you should only report data when it is realtime data. Don't think you make that distinction currently?

Cheers

@chriselsen
Copy link
Contributor Author

@tompijls Thanks for the feedback and the pointer. I now added support for real-time vs. summary mode.
At the end of a ride, once you stop pedaling, gymnasticon should now transmit a value of 0 for power and cadence.

Give it a try and let me know how it's working for you:

git branch -d keiser-m3-experimental
git fetch origin pull/50/head:keiser-m3-experimental
git checkout keiser-m3-experimental
npm install
npm run build
npm link
gymnasticon --bike keiser

@tompijls
Copy link

tompijls commented Feb 15, 2021

Yes, this seems to work partially ==> although after a little while it stops reporting and i get following noble warning.

[2021-02-15T21:41:46.291Z] pedal stroke [timestamp=1613425306291.1465 revolutions=10 power=11W]
[2021-02-15T21:41:46.584Z] received stats from bike [power=11W cadence=74rpm]
[2021-02-15T21:41:47.101Z] pedal stroke [timestamp=1613425307101.9573 revolutions=11 power=11W]
[2021-02-15T21:41:47.234Z] received stats from bike [power=11W cadence=73rpm]
[2021-02-15T21:41:47.548Z] received stats from bike [power=11W cadence=73rpm]
[2021-02-15T21:41:47.875Z] received stats from bike [power=11W cadence=72rpm]
[2021-02-15T21:41:47.935Z] pedal stroke [timestamp=1613425307935.2905 revolutions=12 power=11W]
[2021-02-15T21:41:48.198Z] received stats from bike [power=11W cadence=72rpm]
[2021-02-15T21:41:48.769Z] pedal stroke [timestamp=1613425308768.6238 revolutions=13 power=11W]
[2021-02-15T21:41:49.601Z] pedal stroke [timestamp=1613425309601.957 revolutions=14 power=11W]
[2021-02-15T21:41:50.436Z] pedal stroke [timestamp=1613425310435.2903 revolutions=15 power=11W]
[2021-02-15T21:41:51.268Z] pedal stroke [timestamp=1613425311268.6235 revolutions=16 power=11W]
[2021-02-15T21:41:52.102Z] pedal stroke [timestamp=1613425312101.9568 revolutions=17 power=11W]
[2021-02-15T21:41:52.936Z] pedal stroke [timestamp=1613425312935.29 revolutions=18 power=11W]
noble warning: unknown handle 66 disconnected!

@chriselsen
Copy link
Contributor Author

will try fresh tomorrow.- 😞

  1. Create the SD card as described here: https://github.com/ptx2/gymnasticon
  2. Before disconnecting the card from your computer: Within the drive that is labeled "boot" create an empty file with the name ssh. This will enable SSH access on your Pi.
  3. Stick the SD card into the Pi and boot up.
  4. After a few minutes you should be able to connect via SSH and user "pi".
  5. At this point just copy and paste:
sudo apt-get install git
cd
git clone https://github.com/ptx2/gymnasticon.git
cd gymnasticon
sudo service gymnasticon stop
sudo setcap cap_net_raw+eip $(eval readlink -f $(which node))
git fetch origin pull/50/head:keiser-m3-experimental
git checkout keiser-m3-experimental
npm install
npm run build
npm link
gymnasticon --bike keiser

Now start pedaling and see what happens.

@chriselsen
Copy link
Contributor Author

Yes, this seems to work partially ==> although after a little while it stops reporting and i get following noble warning.

I assume that's when you're still pedaling?
Looks like gymnasticon stopped receiving data after 2021-02-15T21:41:48.198Z in that example.

Can you try running it with debugs enabled?
NODE_DEBUG=gymnasticon:bike* gymnasticon --bike keiser

@tompijls
Copy link

seems to be unrelated to your keiser implementation, but rather when I try to add the cycling meter in the mPaceline app (which seems unsupported for now)

Trying to connect the sensor stops the capturing of data from the keiser (or the bot bike)
Disconnecting it throws the noble warning.

Shall i raise the issue in the main issue section of this repository?

@chriselsen
Copy link
Contributor Author

seems to be unrelated to your keiser implementation, but rather when I try to add the cycling meter in the mPaceline app (which seems unsupported for now)

Trying to connect the sensor stops the capturing of data from the keiser (or the bot bike)
Disconnecting it throws the noble warning.

Shall i raise the issue in the main issue section of this repository?

Yes, please raise a separate issue for this. Especially if this also happens with the "bot" bike.
If I understand you correctly, you are trying to add gymnasticon as a power/cadence source in the mPaceline app?

It's interesting that you seeing a noble error. Noble is used for communication between gymnasticon and the source bike, not between gymnasticon and any receiving devices (Zwift, apps, sports watches, ...).

Please do let me know if there is anything not working with the "Keiser" bike driver though.

@tompijls
Copy link

Ok,

I used the gymnasticon image (yesterday did manual install) with a clean install.

Bot now works correctly, noble warning still shows up

Keiser bike reports data correctly until the moment i connect the sensor in the app, than it somehow stops getting data.

[2021-02-16T07:28:02.871Z] pedal stroke [timestamp=1613460482871.7336 revolutions=52 power=16W]
[2021-02-16T07:28:03.504Z] received stats from bike [power=15W cadence=49rpm]
[2021-02-16T07:28:03.823Z] received stats from bike [power=15W cadence=49rpm]
[2021-02-16T07:28:04.096Z] pedal stroke [timestamp=1613460484096.2234 revolutions=53 power=15W]
[2021-02-16T07:28:04.149Z] received stats from bike [power=15W cadence=49rpm]
[2021-02-16T07:28:04.470Z] received stats from bike [power=14W cadence=48rpm]
[2021-02-16T07:28:05.348Z] pedal stroke [timestamp=1613460485346.2234 revolutions=54 power=14W]
[2021-02-16T07:28:06.596Z] pedal stroke [timestamp=1613460486596.2234 revolutions=55 power=14W]
[2021-02-16T07:28:07.846Z] pedal stroke [timestamp=1613460487846.2234 revolutions=56 power=14W]
[2021-02-16T07:28:09.097Z] pedal stroke [timestamp=1613460489096.2234 revolutions=57 power=14W]
[2021-02-16T07:28:10.347Z] pedal stroke [timestamp=1613460490346.2234 revolutions=58 power=14W]
[2021-02-16T07:28:11.597Z] pedal stroke [timestamp=1613460491596.2234 revolutions=59 power=14W]
[2021-02-16T07:28:12.846Z] pedal stroke [timestamp=1613460492846.2234 revolutions=60 power=14W]
[2021-02-16T07:28:14.096Z] pedal stroke [timestamp=1613460494096.2234 revolutions=61 power=14W]
[2021-02-16T07:28:15.347Z] pedal stroke [timestamp=1613460495346.2234 revolutions=62 power=14W]
[2021-02-16T07:28:16.596Z] pedal stroke [timestamp=1613460496596.2234 revolutions=63 power=14W]
noble warning: unknown handle 64 disconnected!

@nealjane
Copy link

nealjane commented Feb 16, 2021

Morning Chris- managed to get it all working this am on a new sd card. Text shown on screen matches the keiser bike - so its working. 😀👍🏻- Your hard work on this is very much appreciated. (used your most recent update)

connecting to Zwift/peloton cadence makes it go haywire pi stating fixed power and cadence which then doesn’t stop even when you stop. (cadence was at approx 100 on bike before i started to connect to Zwift, after that cadence and power were stuck on the last recoded figures. I disconnected from zwift bluetooth where the buffer finishes..)

pi@gymnasticon:~/gymnasticon $ NODE_DEBUG=gymnasticon:bike* gymnasticon --bike keiser
[2021-02-16T14:42:32.778Z] connecting to bike...
[2021-02-16T14:42:33.513Z] bike connected eb:9b:9e:70:01:12
[2021-02-16T14:42:33.552Z] no ANT+ stick found
GYMNASTICON:BIKES:KEISER 513: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 db 05 00 00 23 00 00 00 00 00 00 00 01> Power: 35 Cadence: 150
[2021-02-16T14:42:33.933Z] received stats from bike [power=35W cadence=150rpm]
[2021-02-16T14:42:33.951Z] pedal stroke [timestamp=1613486553938 revolutions=1 po.......

.......242.6929 revolutions=37 power=66W]
[2021-02-16T14:43:09.849Z] pedal stroke [timestamp=1613486589848.7534 revolutions=38 power=66W]
[2021-02-16T14:43:10.456Z] pedal stroke [timestamp=1613486590454.814 revolutions=39 power=66W]
[2021-02-16T14:43:11.062Z] pedal stroke [timestamp=1613486591060.8745 revolutions=40 power=66W]
[2021-02-16T14:43:11.667Z] pedal stroke [timestamp=1613486591666.935 revolutions=41 power=66W]
[2021-02-16T14:43:12.274Z] pedal stroke [timestamp=1613486592272.9956 revolutions=42 power=66W]
[2021-02-16T14:43:12.881Z] pedal stroke [timestamp=1613486592879.0562 revolutions=43 power=66W]
[2021-02-16T14:43:13.486Z] pedal stroke [timestamp=1613486593485.1167 revolutions=44 power=66W]
[2021-02-16T14:43:14.093Z] pedal stroke [timestamp=1613486594091.1772 revolutions=45 power=66W]
[2021-02-16T14:43:14.699Z] pedal stroke [timestamp=1613486594697.2378 revolutions=46 power=66W]
[2021-02-16T14:43:15.305Z] pedal stroke [timestamp=1613486595303.2983 revolutions=47 power=66W]
[2021-02-16T14:43:15.910Z] pedal stroke [timestamp=1613486595909.359 revolutions=48 power=66W]
[2021-02-16T14:43:16.517Z] pedal stroke [timestamp=1613486596515.4194 revolutions=49 power=66W]
[2021-02-16T14:43:17.123Z] pedal stroke [timestamp=1613486597121.48 revolutions=50 power=66W]
[2021-02-16T14:43:17.729Z] pedal stroke [timestamp=1613486597727.5405 revolutions=51 power=66W]
[2021-02-16T14:43:18.334Z] pedal stroke [timestamp=1613486598333.601 revolutions=52 power=66W]
[2021-02-16T14:43:18.940Z] pedal stroke [timestamp=1613486598939.6616 revolutions=53 power=66W]

@tompijls
Copy link

tompijls commented Feb 21, 2021 via email

@tompijls
Copy link

This is what the output shows when at the end of my run - bike disconnect after 5 minutes although the keiser switched of way faster

[2021-02-21T12:14:22.686Z] received stats from bike [power=50W cadence=63rpm]
[2021-02-21T12:14:23.335Z] received stats from bike [power=49W cadence=63rpm]
[2021-02-21T12:14:23.394Z] pedal stroke [timestamp=1613909663395.9834 revolutions=2471 power=49W]
[2021-02-21T12:14:24.349Z] pedal stroke [timestamp=1613909664348.3643 revolutions=2472 power=49W]
[2021-02-21T12:14:24.968Z] received stats from bike [power=52W cadence=65rpm]
[2021-02-21T12:14:25.271Z] pedal stroke [timestamp=1613909665271.4412 revolutions=2473 power=52W]
[2021-02-21T12:14:25.296Z] received stats from bike [power=52W cadence=65rpm]
[2021-02-21T12:14:26.195Z] pedal stroke [timestamp=1613909666194.518 revolutions=2474 power=52W]
[2021-02-21T12:14:26.273Z] received stats from bike [power=51W cadence=64rpm]
[2021-02-21T12:14:26.919Z] received stats from bike [power=51W cadence=62rpm]
[2021-02-21T12:14:27.163Z] pedal stroke [timestamp=1613909667162.26 revolutions=2475 power=51W]
[2021-02-21T12:14:27.246Z] received stats from bike [power=51W cadence=62rpm]
[2021-02-21T12:14:27.897Z] received stats from bike [power=51W cadence=62rpm]
[2021-02-21T12:14:28.130Z] pedal stroke [timestamp=1613909668130.002 revolutions=2476 power=51W]
[2021-02-21T12:14:28.221Z] received stats from bike [power=49W cadence=62rpm]
[2021-02-21T12:14:28.543Z] received stats from bike [power=48W cadence=62rpm]
[2021-02-21T12:14:28.864Z] received stats from bike [power=48W cadence=62rpm]
[2021-02-21T12:14:29.096Z] pedal stroke [timestamp=1613909669097.744 revolutions=2477 power=48W]
[2021-02-21T12:14:29.193Z] received stats from bike [power=48W cadence=62rpm]
[2021-02-21T12:14:29.517Z] received stats from bike [power=50W cadence=63rpm]
[2021-02-21T12:14:29.839Z] received stats from bike [power=50W cadence=63rpm]
[2021-02-21T12:14:30.049Z] pedal stroke [timestamp=1613909670050.1248 revolutions=2478 power=50W]
[2021-02-21T12:14:30.162Z] received stats from bike [power=50W cadence=63rpm]
[2021-02-21T12:14:30.482Z] received stats from bike [power=52W cadence=65rpm]
[2021-02-21T12:14:30.810Z] received stats from bike [power=52W cadence=65rpm]
[2021-02-21T12:14:30.973Z] pedal stroke [timestamp=1613909670973.2017 revolutions=2479 power=52W]
[2021-02-21T12:14:31.128Z] received stats from bike [power=52W cadence=65rpm]
[2021-02-21T12:14:31.446Z] received stats from bike [power=53W cadence=65rpm]
[2021-02-21T12:14:31.772Z] received stats from bike [power=53W cadence=65rpm]
[2021-02-21T12:14:31.897Z] pedal stroke [timestamp=1613909671896.2786 revolutions=2480 power=53W]
[2021-02-21T12:14:32.098Z] received stats from bike [power=53W cadence=65rpm]
[2021-02-21T12:14:32.422Z] received stats from bike [power=52W cadence=65rpm]
[2021-02-21T12:14:32.820Z] pedal stroke [timestamp=1613909672819.3555 revolutions=2481 power=52W]
[2021-02-21T12:14:33.065Z] received stats from bike [power=52W cadence=65rpm]
[2021-02-21T12:14:33.387Z] received stats from bike [power=49W cadence=62rpm]
[2021-02-21T12:14:33.705Z] received stats from bike [power=49W cadence=62rpm]
[2021-02-21T12:14:33.787Z] pedal stroke [timestamp=1613909673787.0974 revolutions=2482 power=49W]
[2021-02-21T12:14:34.033Z] received stats from bike [power=49W cadence=62rpm]
[2021-02-21T12:14:34.359Z] received stats from bike [power=43W cadence=58rpm]
[2021-02-21T12:14:34.681Z] received stats from bike [power=43W cadence=58rpm]
[2021-02-21T12:14:34.822Z] pedal stroke [timestamp=1613909674821.58 revolutions=2483 power=43W]
[2021-02-21T12:14:35.334Z] received stats from bike [power=43W cadence=50rpm]
[2021-02-21T12:14:35.658Z] received stats from bike [power=43W cadence=50rpm]
[2021-02-21T12:14:35.976Z] received stats from bike [power=43W cadence=50rpm]
[2021-02-21T12:14:36.021Z] pedal stroke [timestamp=1613909676021.58 revolutions=2484 power=43W]
[2021-02-21T12:14:36.303Z] received stats from bike [power=34W cadence=50rpm]
[2021-02-21T12:14:36.630Z] received stats from bike [power=34W cadence=50rpm]
[2021-02-21T12:14:36.953Z] received stats from bike [power=34W cadence=50rpm]
[2021-02-21T12:14:37.221Z] pedal stroke [timestamp=1613909677221.58 revolutions=2485 power=34W]
[2021-02-21T12:14:37.594Z] received stats from bike [power=34W cadence=50rpm]
[2021-02-21T12:14:37.919Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:38.245Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:38.563Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:38.892Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:40.508Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:40.829Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:41.157Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:41.479Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:41.800Z] received stats from bike [power=4W cadence=9rpm]
[2021-02-21T12:14:42.443Z] received stats from bike [power=4W cadence=9rpm]
[2021-02-21T12:14:43.084Z] received stats from bike [power=4W cadence=9rpm]
[2021-02-21T12:14:43.407Z] received stats from bike [power=4W cadence=9rpm]
[2021-02-21T12:14:43.732Z] received stats from bike [power=4W cadence=9rpm]
[2021-02-21T12:14:43.889Z] pedal stroke [timestamp=1613909683888.2468 revolutions=2486 power=4W]
[2021-02-21T12:14:44.379Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:45.024Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:45.674Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:46.972Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:47.289Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:47.933Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:48.254Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:48.902Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:49.228Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:14:49.556Z] received stats from bike [power=0W cadence=0rpm]
Stats timeout: Restarting BLE Scan
[2021-02-21T12:14:51.560Z] received stats from bike [power=0W cadence=0rpm]
[2021-02-21T12:19:49.557Z] bike disconnected c7:bc:77:bb:1f:8a

@ptx2
Copy link
Owner

ptx2 commented Feb 21, 2021

@robcalm Great to know about the RPi3B+! Thanks for reporting that. I've added it to the README.

Can you confirm that you had the latest code when you did your last test? If not, hopefully your issues go away after grabbing the latest code. From your current gymnasticon directory, you can get the latest code by:

git checkout master
git pull
npm run build
gymnasticon --bike keiser

@ptx2
Copy link
Owner

ptx2 commented Feb 21, 2021

@tompijls Chris did mention somewhere above that timeout is probably too long and I agree. However in practice, had you started riding again during that 5 minutes, I believe it would have started to pick up stats again, as it should still be scanning. Let us know if you think that's not the case.

Looking at that log I actually don't think we need to restart the BLE scan there either, as it should still be scanning, just not finding anything. But in practice I don't think it matters.

Can you confirm your last ride was with the latest code? Besides the 5 minute timeout, does everything else still look good?

@tompijls
Copy link

Just tried again, and indeed within the 5 minutes it picks up again. everything works fine with me in combination with mpaceline. i ran with debug settings

i assume i used the latest version: ran this:
rm -fr gymnasticon
git clone https://github.com/ptx2/gymnasticon.git
cd gymnasticon
npm install
npm run build
NODE_DEBUG=gymnasticon:bike* gymnasticon --bike keiser

output attached

below is the time around 1st and 2nd session. in between the keiser shut off completely

[2021-02-21T15:35:52.196Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 9079: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 03 00 00 39 02 80 0a> Power: 0 Cadence: 0
[2021-02-21T15:35:53.170Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 9079: Stats timeout exceeded
Stats timeout: Restarting BLE Scan
[2021-02-21T15:35:55.177Z] received stats from bike [power=0W cadence=0rpm]
noble warning: unknown handle 64 disconnected!
Restarting BLE Scan
GYMNASTICON:BIKES:KEISER 9079: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 00 b3 02 00 00 39 00 00 00 00 05 00 00 0a> Power: 57 Cadence: 69
[2021-02-21T15:37:15.080Z] received stats from bike [power=57W cadence=69rpm]
[2021-02-21T15:37:15.081Z] pedal stroke [timestamp=1613921835081 revolutions=60 power=57W]
GYMNASTICON:BIKES:KEISER 9079: *** replaced zero power with previous power 57
GYMNASTICON:BIKES:KEISER 9079: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 ce 02 00 00 00 00 00 00 00 05 00 80 0a> Power: 57 Cadence: 72
[2021-02-21T15:37:15.405Z] received stats from bike [power=57W cadence=72rpm]
GYMNASTICON:BIKES:KEISER 9079: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 ce 02 00 00 3c 00 00 00 00 05 00 80 0a> Power: 60 Cadence: 72
[2021-02-21T15:37:15.733Z] received stats from bike [power=60W cadence=72rpm]

keiser output.txt

@ptx2
Copy link
Owner

ptx2 commented Feb 21, 2021

Great, thanks @tompijls!

@robcalm
Copy link

robcalm commented Feb 22, 2021

@ptx2

I ran the build as you suggested to make sure that everything was up to date and the dropouts still seem to be happening. see below for the basic log. Does it maybe look like I broke my build somehow if it's still not working right. I've bashed this one around a bit.

image

I'd stopped pedaling at the end where there are consecutive zero data points

So I tried to rebuild per tompijls again using:

rm -fr gymnasticon
git clone https://github.com/ptx2/gymnasticon.git
cd gymnasticon
npm install
npm run build
NODE_DEBUG=gymnasticon:bike* gymnasticon --bike keiser

image

...still dropouts, and none of the
[GYMNASTICON:BIKES:KEISER 9079: *** replaced zero power with previous power 57]
stuff seen in the debug log from tompijls that would suggest I have the new code in.

@chriselsen
Copy link
Contributor Author

I ran the build as you suggested to make sure that everything was up to date and the dropouts still seem to be happening.

Looks like these dropouts are rather causes by poor Bluetooth connectivity.
The RPi3 is known for interference between Bluetooth and Wifi. You might want to disable the Wifi module and try again.
The frequent "Stats timeout" are an indication that no data from the Keiser bike was received within 2s.
But also seeing that gymnasticon frequently receives data from the bike with both power and cadence at 0 is rather concerning.
I'm wondering if that's caused by your bike running an older firmware version (< 6.31). The below debug mode will tell us.

Can you make sure that when running gymnasticon manually you don't have the gymnasticon service running accidentally:
sudo service gymnasticon stop

Also try running gymnasticon in debub mode for the bike:
NODE_DEBUG=gymnasticon:bike* gymnasticon --bike keiser

@robcalm
Copy link

robcalm commented Feb 22, 2021

Hi Chris, I've appended the debug log to my previous post. What do you think?

I'll turn off wifi and let you know if it improves...

I softblocked the wireless lan and we are still getting the [stats timeout:restarting BLE scan] appearing frequently. with wifi disabled I can't ssh so no pic unfortunately.

I shut down the service before I did the last run

@chriselsen
Copy link
Contributor Author

chriselsen commented Feb 22, 2021

Hi Chris, I've appended the debug log to my previous post. What do you think?

Yes, you indeed have a bike running version 6.22, which sends out data only every 2 seconds. That doesn't play well with the stats timeout.
Can you please try changing this value within "gymnasticon/src/bikes/keiser.js" to:

const KEISER_STATS_TIMEOUT = 5.0;

Afterwards build it again with npm run build and then run it with NODE_DEBUG=gymnasticon:bike* gymnasticon --bike keiser.
The "Stats timeout" messages should disappear.

@robcalm
Copy link

robcalm commented Feb 22, 2021

I made the change you suggested and the "Stats timeout" messages were much reduced. So I increased the value from 5 to 7 and the messages have stopped, even with the adapter wifi running as well. Here is the debug log:

image

It doesn't seem to be getting any zero values it wants to replace with the last good value, and I pedaled for about 10 minutes.

I've run fulgaz and overall it behaves really well. The only quirk is that when you register the power and cadence devices when the program starts, it shows multiples of each. It doesn't seem to matter much which one you choose.

Do you think this will always be something that I need to reconfigure in the .js file due to my old firmware, or do you think that it would be sensible to put variant keiser configs into the master?

Thanks very much for the help today.

@robcalm
Copy link

robcalm commented Feb 22, 2021

also, how could you tell the firmware version from the debug log? I don't see 6.2.2 anywhere.

@tompijls
Copy link

02 01 06 22
see https://dev.keiser.com/mseries/direct/

@chriselsen
Copy link
Contributor Author

Do you think this will always be something that I need to reconfigure in the .js file due to my old firmware, or do you think that it would be sensible to put variant keiser configs into the master?

Definitely not! :-) The idea behind Gymnasticon is to be able to buy a cheap Raspberry Pi Zero W or alike for < $50, load a pre-made OS image on it, power it up next to your bike and forget about it. Right now for bikes outside Peloton and Flywheel you still need to configure the bike type. But even with feature request #57 that need should go away and the config file should only be for advanced users.
I'll add code which will check the Keiser bike version and adapt the timer values accordingly. That's about 10-15 lines of code and quick to implement, especially as there are only effectively two Keiser version. The "old" one which sends data only every ~ 2 secs and the "new" one, which send data about 3x per second. (See below).

It doesn't seem to be getting any zero values it wants to replace with the last good value, and I pedaled for about 10 minutes.

That's definitely good to hear. In your debug log above, I can see that data packets do get lost once in a while. So you might still try to position the Raspberry closer to the bike to see if that has an effect.

The challenging part here is that you are using a Raspberry device that previously hasn't been tested with Gymnasticon and that is known for Wifi/Bluetooth issues, as well as a new bike driver, which most certainly still has some growing pains. Thanks for sticking in here and being a good guinea pig! This is certainly helping others with a similar setup as we iron out the kinks.

The purpose of the "stats timeout" value that you adjusted is the following:
The Keiser bike behaves like a Bluetooth beacon and effectively "shouts out" the data values to the world in a regular interval. Gymnasticon picks up these "shouts", but it cannot maintain an actual Bluetooth connection with that bike as it e.g. does with Zwift/FulGaz on the receiver side or the Flywheel/IC4 bike.
Now if you were in the middle of a ride and the Keiser bike suddenly stopped transmitting data out of the blue (e.g. because you unplugged the bike), Gymnasticon would keep sending the last received valued to Zwift/FulGaz. You would therefore appear to be still riding. That's where this timer comes in and says: "I haven't heard from the Keiser bike for X data packets, let me tell Zwift/FulGaz.".
For newer Keiser bikes that send out data 3x per second that X translated to 6 lost data packets in a row or 2 seconds. But for the older Keiser version we now see that this need to be upped to 6.5 - 7 seconds, which would be 3 lost data packets. If we applied that same timeout value to newer Keiser bikes, that would be about 20 lost data packets and you could end up appearing to be riding in Zwift/FulGaz for 7 seconds after the bike "died".

One question for you (@robcalm), @tompijls and @nealjane: How long does it take your bike to turn off / go to sleep automatically after you start pedaling? I would expect a value in the 30 - 90 sec range.
Right now I set that value within Gymnasticon to 300 seconds (5 minutes), which is too high. I would like to bring this down to something realistically as part of this Bike version fix.

I've run fulgaz and overall it behaves really well. The only quirk is that when you register the power and cadence devices when the program starts, it shows multiples of each. It doesn't seem to matter much which one you choose.

Based on your description above it sounds like you paired your Windows machine to Gymnasticon at the OS level. You shouldn't do that. Instead Zwift/FulGaz will pick up the Bluetooth signal from Gymnasticon by itself. You should especially not need to have to change anything on Gymnasticon itself to make this work.
To rule out any issue with the bike driver, you can use the "bot" driver with gymnasticon --bike bot --bot-power 200 --bot-cadence 95 to troubleshoot your Zwift / Gymnasticon connection.
Give it a try and see if that changes things. If not, please go ahead and open another separate issue.

@nealjane
Copy link

@chriselsen , just timed it - from when I stop peddaling to screen going off is 60 seconds. All working fine with build 1.4 for me so far! 👍🏻

@tompijls
Copy link

tompijls commented Feb 22, 2021

confirmed - about 6 seconds until it switches to summary mode, and just over 1 minute before the display switches off

version 6.40

@nealjane
Copy link

nealjane commented Feb 22, 2021

confirmed - about 6 seconds until it switches to summary mode, and just over 1 minute before the display switches off

version 6.4.0

@tompijls Where does it say the version??? - asking as mines a v old m3 with a Bluetooth addon (ive have it set to higher signal rate- but just wondered what it might say my version is)

found it- you’ve noted it above- will check later.

@tompijls
Copy link

You have 6.31 from one of the early screenshots you posted. 3rd and 4rd byte

Screenshot 2021-02-22 at 18 53 28

@chriselsen
Copy link
Contributor Author

Created Issue #60 to work on this. We will have to increase the Stats timeout for the older bikes. But I'm also wondering if we can lower the values for the newer ones. Loosing 3 packets should be enough to tell that there is something wrong.

@nealjane and @tompijls: As you have newer versions of the Keiser bike, can you please try changing this value within "gymnasticon/src/bikes/keiser.js" to:

const KEISER_STATS_TIMEOUT = 1.0;

Afterwards build it again with npm run build and then run it with NODE_DEBUG=gymnasticon:bike* gymnasticon --bike keiser.

You should still not see "Stats timeout", even within a 10 - 20 minute ride.

@tompijls
Copy link

chris, i recreated from image. do i need to do a pull request first?

@chriselsen
Copy link
Contributor Author

chris, i recreated from image. do i need to do a pull request first?

The changes are now in main, so you only need to do:

cd
git clone https://github.com/ptx2/gymnasticon.git
cd gymnasticon
vi ./src/bikes/keiser.js <-- See above for what to edit.
npm install
npm run build
NODE_DEBUG=gymnasticon:bike* gymnasticon --bike keiser

If the gymnasticon folder in /home/pi already existed, just delete it first.

@tompijls
Copy link

tompijls commented Feb 22, 2021

First output. Stopped pedalling after about 40 seconds, then started again.

I guess we need to look into the realtime flag (5th byte), which I think you now filter out?
If no keiser broadcast seen for a couple of seconds (realtime or summary) you can consider the bike to be disconnected

Can do a longer session in the morning.

GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 a3 01 00 00 13 00 02 00 00 35 02 80 08> Power: 19 Cadence: 42
[2021-02-22T18:15:58.971Z] received stats from bike [power=19W cadence=42rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 a3 01 00 00 13 00 02 00 00 35 02 80 08> Power: 19 Cadence: 42
[2021-02-22T18:15:59.299Z] received stats from bike [power=19W cadence=42rpm]
[2021-02-22T18:15:59.638Z] pedal stroke [timestamp=1614017759638.746 revolutions=67 power=19W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 a3 01 00 00 13 00 02 00 00 36 02 80 08> Power: 19 Cadence: 42
[2021-02-22T18:15:59.943Z] received stats from bike [power=19W cadence=42rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 a3 01 00 00 13 00 02 00 00 36 02 80 08> Power: 19 Cadence: 42
[2021-02-22T18:16:00.599Z] received stats from bike [power=19W cadence=42rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 02 00 00 37 02 80 08> Power: 0 Cadence: 0
[2021-02-22T18:16:00.926Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 02 00 00 37 02 80 08> Power: 0 Cadence: 0
[2021-02-22T18:16:01.252Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 02 00 00 37 02 80 08> Power: 0 Cadence: 0
[2021-02-22T18:16:01.587Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 02 00 00 37 02 80 08> Power: 0 Cadence: 0
[2021-02-22T18:16:02.221Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 02 00 00 37 02 80 08> Power: 0 Cadence: 0
[2021-02-22T18:16:02.540Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 02 00 00 37 02 80 08> Power: 0 Cadence: 0
[2021-02-22T18:16:02.869Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 02 00 00 37 02 80 08> Power: 0 Cadence: 0
[2021-02-22T18:16:03.187Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 02 00 00 37 02 80 08> Power: 0 Cadence: 0
[2021-02-22T18:16:03.515Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 02 00 00 37 02 80 08> Power: 0 Cadence: 0
[2021-02-22T18:16:04.171Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 02 00 00 37 02 80 08> Power: 0 Cadence: 0
[2021-02-22T18:16:04.499Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 02 00 00 37 02 80 08> Power: 0 Cadence: 0
[2021-02-22T18:16:04.820Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 02 00 00 37 02 80 08> Power: 0 Cadence: 0
[2021-02-22T18:16:05.139Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Stats timeout exceeded
Stats timeout: Restarting BLE Scan
[2021-02-22T18:16:07.143Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 11 00 00 00 00 00 02 00 00 37 02 80 08> Power: 0 Cadence: 2
[2021-02-22T18:16:32.658Z] received stats from bike [power=0W cadence=2rpm]
[2021-02-22T18:16:32.659Z] pedal stroke [timestamp=1614017792658 revolutions=68 power=0W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 11 00 00 00 00 00 02 00 00 38 02 80 08> Power: 0 Cadence: 2
[2021-02-22T18:16:32.983Z] received stats from bike [power=0W cadence=2rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 11 00 00 00 00 00 02 00 00 38 02 80 08> Power: 0 Cadence: 2
[2021-02-22T18:16:33.312Z] received stats from bike [power=0W cadence=2rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 8e 02 00 00 00 00 02 00 00 3a 02 80 08> Power: 0 Cadence: 65
[2021-02-22T18:16:34.919Z] received stats from bike [power=0W cadence=65rpm]
[2021-02-22T18:16:34.920Z] pedal stroke [timestamp=1614017794919 revolutions=69 power=0W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 f1 02 00 00 00 00 02 00 00 3a 02 80 08> Power: 0 Cadence: 75
[2021-02-22T18:16:35.567Z] received stats from bike [power=0W cadence=75rpm]
[2021-02-22T18:16:35.719Z] pedal stroke [timestamp=1614017795719 revolutions=70 power=0W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 f1 02 00 00 2f 00 02 00 00 3b 02 80 08> Power: 47 Cadence: 75
[2021-02-22T18:16:35.893Z] received stats from bike [power=47W cadence=75rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 f1 02 00 00 2f 00 02 00 00 3b 02 80 08> Power: 47 Cadence: 75
[2021-02-22T18:16:36.216Z] received stats from bike [power=47W cadence=75rpm]
[2021-02-22T18:16:36.520Z] pedal stroke [timestamp=1614017796519 revolutions=71 power=47W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 45 03 00 00 37 00 02 00 01 00 02 80 08> Power: 55 Cadence: 84
[2021-02-22T18:16:36.863Z] received stats from bike [power=55W cadence=84rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 6f 03 00 00 3b 00 02 00 01 00 02 80 08> Power: 59 Cadence: 88
[2021-02-22T18:16:37.182Z] received stats from bike [power=59W cadence=88rpm]
[2021-02-22T18:16:37.200Z] pedal stroke [timestamp=1614017797200.818 revolutions=72 power=59W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 8c 03 00 00 3e 00 02 00 01 01 02 80 08> Power: 62 Cadence: 91
[2021-02-22T18:16:37.826Z] received stats from bike [power=62W cadence=91rpm]
[2021-02-22T18:16:37.860Z] pedal stroke [timestamp=1614017797860.1587 revolutions=73 power=62W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 99 03 00 00 3f 00 02 00 01 01 02 80 08> Power: 63 Cadence: 92
[2021-02-22T18:16:38.482Z] received stats from bike [power=63W cadence=92rpm]
[2021-02-22T18:16:38.513Z] pedal stroke [timestamp=1614017798512.3325 revolutions=74 power=63W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 99 03 00 00 3f 00 02 00 01 02 02 80 08> Power: 63 Cadence: 92
[2021-02-22T18:16:38.810Z] received stats from bike [power=63W cadence=92rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 9f 03 00 00 40 00 02 00 01 02 02 80 08> Power: 64 Cadence: 93
[2021-02-22T18:16:39.132Z] received stats from bike [power=64W cadence=93rpm]
[2021-02-22T18:16:39.157Z] pedal stroke [timestamp=1614017799157.494 revolutions=75 power=64W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 9f 03 00 00 40 00 02 00 01 02 02 80 08> Power: 64 Cadence: 93
[2021-02-22T18:16:39.456Z] received stats from bike [power=64W cadence=93rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 a8 03 00 00 41 00 02 00 01 03 02 80 08> Power: 65 Cadence: 94
[2021-02-22T18:16:39.776Z] received stats from bike [power=65W cadence=94rpm]
[2021-02-22T18:16:39.795Z] pedal stroke [timestamp=1614017799795.7917 revolutions=76 power=65W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 a8 03 00 00 41 00 02 00 01 03 02 80 08> Power: 65 Cadence: 94
[2021-02-22T18:16:40.101Z] received stats from bike [power=65W cadence=94rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 a6 03 00 00 41 00 02 00 01 03 02 80 08> Power: 65 Cadence: 93
[2021-02-22T18:16:40.426Z] received stats from bike [power=65W cadence=93rpm]
[2021-02-22T18:16:40.440Z] pedal stroke [timestamp=1614017800440.9531 revolutions=77 power=65W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 a6 03 00 00 41 00 02 00 01 04 02 80 08> Power: 65 Cadence: 93
[2021-02-22T18:16:40.753Z] received stats from bike [power=65W cadence=93rpm]
[2021-02-22T18:16:41.086Z] pedal stroke [timestamp=1614017801086.1145 revolutions=78 power=65W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 a6 03 00 00 41 00 02 00 01 04 02 80 08> Power: 65 Cadence: 93
[2021-02-22T18:16:41.732Z] received stats from bike [power=65W cadence=93rpm]
[2021-02-22T18:16:41.734Z] pedal stroke [timestamp=1614017801732 revolutions=79 power=65W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 a6 03 00 00 41 00 03 00 01 05 02 80 08> Power: 65 Cadence: 93
[2021-02-22T18:16:42.057Z] received stats from bike [power=65W cadence=93rpm]
[2021-02-22T18:16:42.377Z] pedal stroke [timestamp=1614017802377.1614 revolutions=80 power=65W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 b3 03 00 00 41 00 03 00 01 05 02 80 08> Power: 65 Cadence: 95
[2021-02-22T18:16:42.386Z] received stats from bike [power=65W cadence=95rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 b6 03 00 00 41 00 03 00 01 05 02 80 08> Power: 65 Cadence: 95
[2021-02-22T18:16:42.708Z] received stats from bike [power=65W cadence=95rpm]
[2021-02-22T18:16:43.008Z] pedal stroke [timestamp=1614017803008.7402 revolutions=81 power=65W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 b6 03 00 00 41 00 03 00 01 06 02 80 08> Power: 65 Cadence: 95
[2021-02-22T18:16:43.030Z] received stats from bike [power=65W cadence=95rpm]
[2021-02-22T18:16:43.640Z] pedal stroke [timestamp=1614017803640.319 revolutions=82 power=65W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 b9 03 00 00 41 00 03 00 01 06 02 80 08> Power: 65 Cadence: 95
[2021-02-22T18:16:43.680Z] received stats from bike [power=65W cadence=95rpm]
[2021-02-22T18:16:44.272Z] pedal stroke [timestamp=1614017804271.898 revolutions=83 power=65W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 a8 03 00 00 41 00 03 00 01 07 02 80 08> Power: 65 Cadence: 94
[2021-02-22T18:16:44.333Z] received stats from bike [power=65W cadence=94rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 8f 03 00 00 3e 00 03 00 01 07 02 80 08> Power: 62 Cadence: 91
[2021-02-22T18:16:44.653Z] received stats from bike [power=62W cadence=91rpm]
[2021-02-22T18:16:44.931Z] pedal stroke [timestamp=1614017804931.2385 revolutions=84 power=62W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 8f 03 00 00 3e 00 03 00 01 08 02 80 08> Power: 62 Cadence: 91
[2021-02-22T18:16:44.975Z] received stats from bike [power=62W cadence=91rpm]
[2021-02-22T18:16:45.591Z] pedal stroke [timestamp=1614017805590.579 revolutions=85 power=62W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 79 03 00 00 3c 00 03 00 01 08 02 80 08> Power: 60 Cadence: 89
[2021-02-22T18:16:45.627Z] received stats from bike [power=60W cadence=89rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 79 03 00 00 3c 00 03 00 01 09 02 80 08> Power: 60 Cadence: 89
[2021-02-22T18:16:45.949Z] received stats from bike [power=60W cadence=89rpm]
[2021-02-22T18:16:46.264Z] pedal stroke [timestamp=1614017806264.7363 revolutions=86 power=60W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 89 03 00 00 3e 00 03 00 01 09 02 80 08> Power: 62 Cadence: 91
[2021-02-22T18:16:46.272Z] received stats from bike [power=62W cadence=91rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 91 03 00 00 3f 00 03 00 01 0a 03 80 08> Power: 63 Cadence: 91
[2021-02-22T18:16:46.912Z] received stats from bike [power=63W cadence=91rpm]
[2021-02-22T18:16:46.924Z] pedal stroke [timestamp=1614017806924.077 revolutions=87 power=63W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 91 03 00 00 3f 00 03 00 01 0a 03 80 08> Power: 63 Cadence: 91
[2021-02-22T18:16:47.236Z] received stats from bike [power=63W cadence=91rpm]
[2021-02-22T18:16:47.583Z] pedal stroke [timestamp=1614017807583.4175 revolutions=88 power=63W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 78 03 00 00 3c 00 03 00 01 0b 03 80 08> Power: 60 Cadence: 89
[2021-02-22T18:16:48.196Z] received stats from bike [power=60W cadence=89rpm]
[2021-02-22T18:16:48.257Z] pedal stroke [timestamp=1614017808257.5747 revolutions=89 power=60W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 78 03 00 00 3c 00 03 00 01 0b 03 80 08> Power: 60 Cadence: 89
[2021-02-22T18:16:48.516Z] received stats from bike [power=60W cadence=89rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 7b 03 00 00 3c 00 03 00 01 0c 03 80 08> Power: 60 Cadence: 89
[2021-02-22T18:16:48.843Z] received stats from bike [power=60W cadence=89rpm]
[2021-02-22T18:16:48.931Z] pedal stroke [timestamp=1614017808931.732 revolutions=90 power=60W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 72 03 00 00 3c 00 03 00 01 0c 03 80 08> Power: 60 Cadence: 88
[2021-02-22T18:16:49.491Z] received stats from bike [power=60W cadence=88rpm]
[2021-02-22T18:16:49.613Z] pedal stroke [timestamp=1614017809613.55 revolutions=91 power=60W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 72 03 00 00 3c 00 04 00 01 0d 03 80 08> Power: 60 Cadence: 88
[2021-02-22T18:16:49.816Z] received stats from bike [power=60W cadence=88rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 37 03 00 00 3c 00 04 00 01 0d 03 80 08> Power: 60 Cadence: 82
[2021-02-22T18:16:50.142Z] received stats from bike [power=60W cadence=82rpm]
[2021-02-22T18:16:50.345Z] pedal stroke [timestamp=1614017810345.2573 revolutions=92 power=60W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 37 03 00 00 3c 00 04 00 01 0d 03 80 08> Power: 60 Cadence: 82
[2021-02-22T18:16:50.466Z] received stats from bike [power=60W cadence=82rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 37 03 00 00 3c 00 04 00 01 0e 03 80 08> Power: 60 Cadence: 82
[2021-02-22T18:16:50.792Z] received stats from bike [power=60W cadence=82rpm]
[2021-02-22T18:16:51.077Z] pedal stroke [timestamp=1614017811076.9646 revolutions=93 power=60W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 dd 02 00 00 3c 00 04 00 01 0e 03 80 08> Power: 60 Cadence: 73
[2021-02-22T18:16:51.119Z] received stats from bike [power=60W cadence=73rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 dd 02 00 00 3c 00 04 00 01 0e 03 80 08> Power: 60 Cadence: 73
[2021-02-22T18:16:51.447Z] received stats from bike [power=60W cadence=73rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 dd 02 00 00 2d 00 04 00 01 0f 03 80 08> Power: 45 Cadence: 73
[2021-02-22T18:16:51.772Z] received stats from bike [power=45W cadence=73rpm]
[2021-02-22T18:16:51.898Z] pedal stroke [timestamp=1614017811898.8823 revolutions=94 power=45W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 71 02 00 00 24 00 04 00 01 0f 03 80 08> Power: 36 Cadence: 63
[2021-02-22T18:16:52.098Z] received stats from bike [power=36W cadence=63rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 71 02 00 00 24 00 04 00 01 0f 03 80 08> Power: 36 Cadence: 63
[2021-02-22T18:16:52.424Z] received stats from bike [power=36W cadence=63rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 71 02 00 00 24 00 04 00 01 10 03 80 08> Power: 36 Cadence: 63
[2021-02-22T18:16:52.747Z] received stats from bike [power=36W cadence=63rpm]
[2021-02-22T18:16:52.852Z] pedal stroke [timestamp=1614017812851.2632 revolutions=95 power=36W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 71 02 00 00 24 00 04 00 01 10 03 80 08> Power: 36 Cadence: 63
[2021-02-22T18:16:53.072Z] received stats from bike [power=36W cadence=63rpm]
[2021-02-22T18:16:53.803Z] pedal stroke [timestamp=1614017813803.644 revolutions=96 power=36W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 df 01 00 00 18 00 04 00 01 11 03 80 08> Power: 24 Cadence: 48
[2021-02-22T18:16:54.370Z] received stats from bike [power=24W cadence=48rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 57 01 00 00 0e 00 04 00 01 12 03 80 08> Power: 14 Cadence: 34
[2021-02-22T18:16:55.021Z] received stats from bike [power=14W cadence=34rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 57 01 00 00 0e 00 04 00 01 12 03 80 08> Power: 14 Cadence: 34
[2021-02-22T18:16:55.340Z] received stats from bike [power=14W cadence=34rpm]
[2021-02-22T18:16:55.569Z] pedal stroke [timestamp=1614017815568.3499 revolutions=97 power=14W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 57 01 00 00 0e 00 04 00 01 12 03 80 08> Power: 14 Cadence: 34
[2021-02-22T18:16:55.660Z] received stats from bike [power=14W cadence=34rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 57 01 00 00 0e 00 04 00 01 13 03 80 08> Power: 14 Cadence: 34
[2021-02-22T18:16:55.981Z] received stats from bike [power=14W cadence=34rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 57 01 00 00 0e 00 04 00 01 13 03 80 08> Power: 14 Cadence: 34
[2021-02-22T18:16:56.300Z] received stats from bike [power=14W cadence=34rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 04 00 01 14 03 80 08> Power: 0 Cadence: 0
[2021-02-22T18:16:57.266Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 04 00 01 14 03 80 08> Power: 0 Cadence: 0
[2021-02-22T18:16:57.587Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 c9 00 00 00 00 00 04 00 01 15 03 80 08> Power: 0 Cadence: 20
[2021-02-22T18:16:59.203Z] received stats from bike [power=0W cadence=20rpm]
[2021-02-22T18:16:59.205Z] pedal stroke [timestamp=1614017819204 revolutions=98 power=0W]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 c9 00 00 00 07 00 04 00 01 16 03 80 08> Power: 7 Cadence: 20
[2021-02-22T18:16:59.848Z] received stats from bike [power=7W cadence=20rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 c9 00 00 00 07 00 04 00 01 16 03 80 08> Power: 7 Cadence: 20
[2021-02-22T18:17:00.169Z] received stats from bike [power=7W cadence=20rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 04 00 01 16 03 80 08> Power: 0 Cadence: 0
[2021-02-22T18:17:00.490Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 04 00 01 16 03 80 08> Power: 0 Cadence: 0
[2021-02-22T18:17:01.463Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 04 00 01 16 03 80 08> Power: 0 Cadence: 0
[2021-02-22T18:17:01.783Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 04 00 01 16 03 80 08> Power: 0 Cadence: 0
[2021-02-22T18:17:02.424Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 04 00 01 16 03 80 08> Power: 0 Cadence: 0
[2021-02-22T18:17:02.744Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 04 00 01 16 03 80 08> Power: 0 Cadence: 0
[2021-02-22T18:17:03.386Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 04 00 01 16 03 80 08> Power: 0 Cadence: 0
[2021-02-22T18:17:03.709Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 04 00 01 16 03 80 08> Power: 0 Cadence: 0
[2021-02-22T18:17:04.037Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 04 00 01 16 03 80 08> Power: 0 Cadence: 0
[2021-02-22T18:17:04.358Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 04 00 01 16 03 80 08> Power: 0 Cadence: 0
[2021-02-22T18:17:04.686Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Found Keiser M3: M3 Address: c7:bc:77:bb:1f:8a Data: <Buffer 02 01 06 40 00 72 00 00 00 00 00 00 04 00 01 16 03 80 08> Power: 0 Cadence: 0
[2021-02-22T18:17:05.011Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: Stats timeout exceeded
Stats timeout: Restarting BLE Scan
[2021-02-22T18:17:07.015Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 8533: M3 Bike disconnected
[2021-02-22T18:22:05.017Z] bike disconnected c7:bc:77:bb:1f:8a

@robcalm
Copy link

robcalm commented Feb 22, 2021

@chriselsen

Based on your description above it sounds like you paired your Windows machine to >Gymnasticon at the OS level. You shouldn't do that. Instead Zwift/FulGaz will pick up the >Bluetooth signal from Gymnasticon by itself. You should especially not need to have to >change anything on Gymnasticon itself to make this work.

Yes, I did pair through the OS. If I don't do that then software like fulgaz on PC can't see gymnasticon / the bike. I've tried with two PCs (one very new and one older) and both behave the same way. Any idea why this might be? Might there be something weird about the adapter config at the PC end? The same issue is pervasive in keiser2Zwift, but in that case I haven't found a workaround.

I'll try playing with the bot a bit, and create a new issue ticket if you think that's worthwhile.

Also, I have a 60s timeout on the bike computer too.

My RP is about as close to the bike as it can be - less than 1 m while testing. What is it in the most recent log I posted that indicates continued data dropouts? To my untrained eye it looks clean.

@robcalm
Copy link

robcalm commented Feb 22, 2021

Also, is it possible to donate to this project?

@nealjane
Copy link

nealjane commented Feb 22, 2021

@chriselsen changed Stat to 1.0. I had Not a single Timeout when I rode the bike for 3-4 mins this evening (couldnt get it working in time for my bike rideearlier this evening for a longer ride sorry).

[2021-02-22T22:34:57.214Z] received stats from bike [power=5W cadence=17rpm] GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 a0 00 00 00 05 00 08 00 03 2e 02 00 04> Power: 5 Cadence: 16
[2021-02-22T22:34:57.421Z] received stats from bike [power=5W cadence=16rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 98 00 00 00 05 00 08 00 03 2e 02 00 04> Power: 5 Cadence: 15
[2021-02-22T22:34:57.631Z] received stats from bike [power=5W cadence=15rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 90 00 00 00 05 00 08 00 03 2e 02 00 04> Power: 5 Cadence: 14
[2021-02-22T22:34:57.837Z] received stats from bike [power=5W cadence=14rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 8a 00 00 00 05 00 08 00 03 2e 02 00 04> Power: 5 Cadence: 14
[2021-02-22T22:34:58.036Z] received stats from bike [power=5W cadence=14rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 88 00 00 00 05 00 08 00 03 2e 02 00 04> Power: 5 Cadence: 14
[2021-02-22T22:34:58.243Z] received stats from bike [power=5W cadence=14rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 88 00 00 00 05 00 08 00 03 2f 02 00 04> Power: 5 Cadence: 14
[2021-02-22T22:34:58.448Z] received stats from bike [power=5W cadence=14rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 88 00 00 00 05 00 08 00 03 2f 02 00 04> Power: 5 Cadence: 14
[2021-02-22T22:34:58.859Z] received stats from bike [power=5W cadence=14rpm]
[2021-02-22T22:34:59.005Z] pedal stroke [timestamp=1614033299004.3254 revolutions=229 power=5W]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 88 00 00 00 05 00 08 00 03 2f 02 00 04> Power: 5 Cadence: 14
[2021-02-22T22:34:59.068Z] received stats from bike [power=5W cadence=14rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 88 00 00 00 05 00 08 00 03 31 02 00 04> Power: 5 Cadence: 14
[2021-02-22T22:35:00.300Z] received stats from bike [power=5W cadence=14rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 88 00 00 00 05 00 08 00 03 31 02 00 04> Power: 5 Cadence: 14
[2021-02-22T22:35:00.708Z] received stats from bike [power=5W cadence=14rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 88 00 00 00 05 00 08 00 03 31 02 00 04> Power: 5 Cadence: 14
[2021-02-22T22:35:00.910Z] received stats from bike [power=5W cadence=14rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 88 00 00 00 05 00 08 00 03 31 02 00 04> Power: 5 Cadence: 14
[2021-02-22T22:35:01.112Z] received stats from bike [power=5W cadence=14rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 88 00 00 00 05 00 08 00 03 32 02 00 04> Power: 5 Cadence: 14
[2021-02-22T22:35:01.936Z] received stats from bike [power=5W cadence=14rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 88 00 00 00 05 00 08 00 03 32 02 00 04> Power: 5 Cadence: 14
[2021-02-22T22:35:02.138Z] received stats from bike [power=5W cadence=14rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 7e 00 00 00 05 00 08 00 03 33 02 00 04> Power: 5 Cadence: 13
[2021-02-22T22:35:02.746Z] received stats from bike [power=5W cadence=13rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 70 00 00 00 05 00 08 00 03 34 02 00 04> Power: 5 Cadence: 11
[2021-02-22T22:35:03.355Z] received stats from bike [power=5W cadence=11rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 68 00 00 00 05 00 08 00 03 34 02 00 04> Power: 5 Cadence: 10
[2021-02-22T22:35:03.758Z] received stats from bike [power=5W cadence=10rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 00 00 00 00 00 00 08 00 03 34 02 00 04> Power: 0 Cadence: 0
[2021-02-22T22:35:04.171Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 00 00 00 00 00 00 08 00 03 35 02 00 04> Power: 0 Cadence: 0
[2021-02-22T22:35:04.374Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 00 00 00 00 00 00 08 00 03 35 02 00 04> Power: 0 Cadence: 0
[2021-02-22T22:35:04.577Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 00 00 00 00 00 00 08 00 03 35 02 00 04> Power: 0 Cadence: 0
[2021-02-22T22:35:04.782Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 00 00 00 00 00 00 08 00 03 35 02 00 04> Power: 0 Cadence: 0
[2021-02-22T22:35:04.982Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 00 00 00 00 00 00 08 00 03 35 02 00 04> Power: 0 Cadence: 0
[2021-02-22T22:35:05.186Z] received stats from bike [power=0W cadence=0rpm]
GYMNASTICON:BIKES:KEISER 623: Found Keiser M3: M3 Address: eb:9b:9e:70:01:12 Data: <Buffer 02 01 06 31 00 00 00 00 00 00 00 00 08 00 03 36 02 00 04> Power: 0 Cadence: 0
[2021-02-22T22:35:05.808Z] received stats from bike [power=0W cadence=0rpm]

@tompijls
Copy link

@chriselsen , what are these lines actually indicating? I see I have quite a few more than @nealjane ?

[2021-02-22T18:16:50.345Z] pedal stroke [timestamp=1614017810345.2573 revolutions=92 power=60W]

@nealjane
Copy link

@tompijls i didn’t add all the lines - was only an Exttract of last few seconds (as I had no timeouts when I searched it)

@nealjane
Copy link

@chriselsen thinking about it, Id suggest you go with Toms results though - as my bike is probably ‘non standard’ due to having a very specific Bluetooth addon

  • DPcycling Keiser M3 Bluetooth Adapter

@chriselsen
Copy link
Contributor Author

Thanks for providing the feedback! This looks good.

To answer some of the questions:

  • Logs: "received stats from bike": These lines indicate when Gymnasticon received data from the bike. With the bike from @robcalm - which we know runs an older version of the firmware - the timestamps indicate that this happens roughtly every 2 seconds. But you can also see a few cases where the timestamp indicate that the gap was bigger than 2 seconds and rather was 4 seconds (1 lost data packet) or 6 seconds (2 lost data packets). It's unclear whether these missed packets are due to the RPi 3 being used or the older version of the bike having issues with bluetooth itself. With the recent changes these missed packets don't affect downstream data towards Zwift or FulGaz, but the experience will appear more sluggish. If you suddenly increase/decrease power or cadence (e.g. a sprint) it could take 7 seconds for that to be reflected. For @nealjane and @tompijls - who have newer versions of the bike - we can see that the timestamps are roughly 300 ms apart. Here in neither case I saw any gaps in this rhythm, which means no lost packets.
  • Logs: "pedal stroke": These lines indicate when Gymnasticon sends data downstream to Zwift / FulGaz. The frequency of these lines depends on your cadence, as they appear roughly with each full revolution of your pedaling. Here, we can ignore these, as we are focusing on the connection to the bike.

For you three everything should be working fine and as well as technically possible by your bike. The changes to the Keiser bike version detection as well as the bike autodiscovery won't change anything for you. But for new users it will mean that plug & play becomes reality and no configuration whatsoever is necessary. That will probably take 1 - 2 weeks to implement, test and release.

@tompijls
Copy link

tompijls commented Feb 24, 2021

Thanks @chriselsen and @ptx2 - any testing required just let me know!

By the way, i did post about gymnasticon in the 2.5k user Keiser Peloton Group and got a first positive reply - downside may be there will be loads more feature requests coming in ;-)

Screenshot 2021-02-24 at 07 05 14

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants