A COVID Story
May 30, 2021
At the beginning of the pandemic I bought some decent friction resistance Sunny indoor bikes for really cheap so we can spin with my wife in our little apartment during lock down. Then I quickly graduated to magnetic resistance bikes with Bluetooth enabled consoles so all the hard work and buckets of sweat wouldn’t just vanish into the air and the activities would be recorded. But mobile apps didn’t pick up all the metrics, so I ended up writing my own application (the Track My Indoor Workout) to satisfy my craving to pick up all sensor readings and also to generate a GPS track based on my speed so I can participate in Strava challenges requiring GPS data. I opted to use Flutter so I can learn Dart more (I’ve tried Dart years ago when it was popularized with early versions of Angular) and in the future I could potentially release an iOS version as well.
Then an interesting thing happened: a few months later the application became something bigger than just a learning project or a simple software. First of all Flutter provided so much joy that I got addicted to enhancing the app. It also gave me satisfaction that others used my app and some of them contacted me with useful feature requests. To this day whenever I can I try to prioritize these real-world needs on top of my own agenda. For example the heart rate zones and the zone colored graphs were a wish of an early adopter. The personal leaderboard with the pace light, or the heart rate domain alerting are other features which were requested by different users. I’m very glad I listened to them because I believe they truly bring value to the app from a real world usage perspective. I still have several tickets in the queue which hopefully one day I’ll fulfill.
Early 2021 I had to travel to Europe due to a life and death situation (otherwise I wouldn’t have traveled in the midst of a pandemic). After I got out of quarantine in Hungary I started to workout to get my mind off of the tragedy. When I grew up my main sport was flat water kayaking for 20 years. Since I live in the US I sporadically white water kayak but I got away from racing K-1s. My twin brother has a KayakPro Compact kayak ergometer in Hungary since the winters are cold enough that we don’t paddle on the Danube. The ergometer had the standard V5 console, which is nice enough but it’s not Bluetooth smart. I started to use the console and my twin brother realized its usefulness as well since he usually paddles 1 hour to the dot.
It popped into my mind: it would have been so great to record the kayaking sessions! I looked up the KayakPro’s website and I realized that they have a Bluetooth enabled console called Genesis Port Smart Console. It’s manufactured by North Pole Engineering and it implements the Fitness Machine’s Rower Data standard protocol. North Pole Engineering by the way has several genius gadgets like the Runn Smart Treadmill Sensor - capable of convert your non connected treadmill into a modern BLE (Bluetooth Low Energy) FTMS (Fitness Machine) Treadmill -, or the GEM modules which utilize older equipment’s CSAFE port to make them all modern.
The first equipment I supported - the Precor Spinner® Chrono™ Power - had a proprietary protocol, however the second one - the Schwinn IC4 (which is the same as the Schwinn IC8, Schwinn 800IC, Bowflex C6) - implements the so called Indoor Bike Data section of the previously mentioned BLE FTMS standard. The BLE FTMS is a set of standards which cover not only Indoor Bikes, but also Treadmills, Rowers, Crosstrainers, Stair Climbers, and Step Climbers. I wanted to implement Rower data support, so I reached out to KayakPro and they were extremely supportive to hook me up with an engineering sample of the Genesis Port. It took me a couple of month to debug and polish everything including a Spin-Down calibration procedure, but in the end I believe it is even smoother than North Pole Engineering’s own mobile app.
I had to support the direct pairing of heart rate monitors to my application. With several fitness machines you can pair the HRM (heart rate monitor) to the console and then my application gets the heart rate data through the FTMS data. However some equipment like the Runn or the Genesis Port doesn’t have displays, so in that case the user has to pair the sensor directly to my app. I also had to develop FIT file format support. Originally I went with TCX because it is a textual format so it was easier to debug. Also an important factor was that a TCX writer Flutter plugin allowed me to jump start the support. However TCX turned out to be very limited in terms of sports: it categorizes anything other than cycling or running as ‘other’.
The Genesis Port Smart console may attach to a kayak, canoe, rowing, or even swimming ergometer. So I had to develop FIT file support to handle those sports decently and I also had to develop a sport selection user interface. Lately I’m in close conversation with a user who has a Schwinn 510u upright bike and I got confirmation that I support it through FTMS along with the Schwinn 130 and Schwinn 170. I’m looking forward to the future: one day I plan to support iFit indoor bikes and treadmills. Tens of thousands of athletes now own iFit compatible equipment and one day the year long iFit membership will expire. Hopefully my free application can prevent the transformation of those equipment into coat hanger devices.
I also studied how I could support Daum, Kettler, or Tacx indoor bikes, PAFERS API compatible equipment. That is on the back burner, however in the near future I’ll add sync capability to other fitness portals. I applied for API access to Garmin, SUUNTO, MapMyFitness, and Training Peaks. Training Peaks already got back to me (by the way that integration is a user request, I haven’t even known that company before). It turned out that Garmin is the opposite of Strava: Strava is very open to embrace ingestion of workouts from other sources but blocks syncing their data to other aggregators (like FitRankings). Garmin is very open to allow transfer of athlete workouts to other portals but doesn’t allow programmatic upload of activities. That is really peculiar because athletes can manually upload FIT files (as far as I know). I hope that either SUUNTO or MapMyFitness will be open for uploads.
Please check out the application’s website for a more complete list of new features and stay tuned!