gymnasticon icon indicating copy to clipboard operation
gymnasticon copied to clipboard

Support for resistance change

Open roberttod opened this issue 5 years ago • 2 comments

@ptx2 I was inspired after reading your dev notes a couple of months ago and ended up attaching a raspberry pi to my spin bike, https://www.diamondbackfitness.com/products/510ic-indoor-cycle . The down button for resistance was broken on the bike's built in screen so I replaced all of the logic with a pi and connected it to zwift using gymnasticon. Because of all the hardware involved I had to write the logic in python, which I connected to the "bot" bike using a UDP connection.

I built a custom UI (before I connected to zwift) where I can change the resistance, but changing apps from zwift to my UI to change resistance isn't the easiest thing to do while working out, so thought I'd try to build the BLE resistance change logic.

I've started to build out some BLE characteristics in this PR and the pi now shows up in zwift as supporting resistance change. I'm wondering if you could help point me in the right direction.

A couple of things I'd love some help with

  • The BLE GATT docs are almost impossible to read! I'm not sure how you managed to connect everything just from the spec, were there any other resources you used to figure out the UUIDs and protocols?
  • Do you know how the zwift command to change resistance would come through to a bleno characteristic? I was monitoring onWriteRequest but didn't see anything (I'm not really sure when zwift updates resistance, I assumed it would reset it at the start but perhaps I need to choose a hilly course to see it change)

Thanks so much for building this project and inspiring me, it's been nice to get back into electronics!

roberttod avatar Sep 19 '20 14:09 roberttod

Hi, thanks for opening this, it would be excellent to add FTMS support!

I still need to read up on FTMS and I have only skimmed the PR so far, but just quickly: it looks like characteristic 2AD6 might still need to be implemented? (org.bluetooth.characteristic.supported_resistance_level_range)

I agree on the PDFs. It might be easier to start with the GATT XML spec and refer back to the PDF to fill in the blanks. The XMLs used to be on developer.bluetooth.org but I can't find them there anymore. They're all over the web though, e.g.:

https://github.com/oesmith/gatt-xml https://github.com/oesmith/gatt-xml/blob/master/org.bluetooth.service.fitness_machine.xml https://github.com/oesmith/gatt-xml/blob/master/org.bluetooth.characteristic.supported_resistance_level_range.xml

btmon(1) is very useful for catching things that don't bubble up to the app.

It may also be worth having a look at the websites of Nordic and SiLabs and other BLE chip makers, as they often have developer resources, blog posts, reference implementations, forums, etc.

I'll try to have a better look at this a little later, hope this helps, let me know how it goes!

ptx2 avatar Sep 20 '20 16:09 ptx2

Thanks! That's exactly what I was looking for!

I'll leave the PR as a draft until I finish the implementation, it's only half done as it stands so might not be that much value but thought it was worth at least sharing where I'm at so far. Hopefully I'll be able to make some progress over the next couple of weeks.

roberttod avatar Sep 20 '20 19:09 roberttod