Into the Venu 2+

Context

I am a runner. I also love stats. So when my birthday came around I received a gift of a Garmin Venu 2 Plus fitness watch and I was super excited. I had to take a break from running while Graduate school was ongoing due to the workload between that and working at the same time, so this is a good way to get back into it. Garmin watches are great I’ve had several Garmin watches before and they are awesome. They provide many stats and the file types (FIT files) are also very open so the amount of data that can be directly read is awesome. The Garmin SDK is easy to get access to as well, and apps, datafields (during activities), and watch faces are quick to whip up. I was also working with a friend on a pet project where we wanted to collect these data from our friends and see if we could find trends. Specifically if there are any particular data which correspond to better pace, recovery, and so on. Really we just wanted to mess with the data and see what there was to see.

Taking it to the next level
I wanted to also personally dive into my own stats and improvement over time. As I was fairly out of shape I could basically plot and see how I improve over time and my trends, knowing a lot more than when I was first starting. I also decided to take the opportunity to get even more data by purchasing a Garmin Running Dynamics (RD) pod. This small device no larger than a strawberry provided extra stats that, at the time of writing, wrist based activity trackers cannot accurately provide (Ground Contact Time/Balance, Vertical Ratio, etc…). I would also be able to use these stats for the pet project and see if maybe there was one of these more advanced stats that could correlate with better performance, as some friends had sensors that could provide similar data.

Just one problem…
There was only one obstacle. Garmin has several product lines: the flagship “Fenix” line, the running-focused “Forerunner” line, the more casual “Venu” line. Turns out, Garmin’s RD Pod (and several other sensors) ONLY work with some of the watch lines. Wouldn’t you know it, the RD Pod isn’t compatible with my shiny new watch. I could constantly swap out my old (compatible, but old) Garmin watch for runs but it is cumbersome and doesn’t let me use my new watch. The sensor in the RD pod was ANT-based, which I know the new watch has, but it seemingly would fail to even find the sensor!

Market Segmentation and Profit
As it were, the limitation is entirely artificial. You see, Garmin’s watches have built-in profiles for many sensors, but not all are included for each device. While the sensor works just fine (using the ANT protocol), there is no receiving or parsing component in the Venu 2 Plus I have. In fact, with the right profile, this RD pod should work on every Garmin watch, Apple watch, and even laptops! I knew there had to be a way, and I wasn’t going to let the fact that the lowest end new watch that supported this costing hundreds more than my watch stop me. Add to that the real-time, mid-race pacing feature wasn’t available on this watch either and I knew I had to take care of things myself.

Diving into the SDK and ANT
I went ahead and setup a Garmin SDK and emulator on my computer. This way, I could develop applications in MonkeyC. I started off with my real-time, mid-race pacing feature since this could be done by querying APIs exposed to me in a simple manner. It took a few hours to understand the documentation and flow, querying the right APIs and performing calculations to get all the data displayed right in all fields in a clean yet compact manner. I also wanted the watch to tell me if I was falling behind on pace or going too fast (and burning up my stamina too early on). Finally, it was time to tackle the RD pod.

It works! Sort of..
I had such a hard time getting the sensor to work. Actually, I couldn’t even get the ANT module on the watch to scan. Turns out, the official documentation is not complete. I had to dig through tons of docs until I found the whole code from which an incomplete snippet was taken and shown to be a working copy. I had read that Garmin’s docs were poor, but I did not believe it until I saw it for myself. After another day I had the module scanning. Now to look for the RD pod. This part was fairly quick, and I was receiving tons of data, although there was no way to know what I was looking at! This time I knew I was looking for the ANT+ profile that Garmin themselves helped create. They made a standard for Running Dynamics so after some focused searching I found what each byte of data represents and thankfully the data I was getting was very reasonable and matched up with these unofficial docs. After some cleaning up and converting, I had successfully gathered data off the “incompatible” sensor and had it working on my latest watch. But something was missing. Garmin logs all these RD Pod stats in their application and on the web interface. This lets me see all these advanced running metrics very directly and conveniently. Also, my application did not log anything so it was of no use if I wanted to look at the data afterwards in say PyCharm.

FIT Files
This is something my friend was already looking at. FIT files are Garmin’s standard way of storing activity data. It is also what is uploaded to the web and visualized into the charts. I knew I had to somehow get these Running Dynamics and insert them into the FIT files if I wanted to have a cohesive workflow and still be able to get all the nice-to-have features Garmin includes by default on their running focused / flagship watches.

Enter FitContributor
Garmin actually does have an API to insert data into their own FIT files. That is a way to insert your own data that Garmin will take as their own and visualize for you in all runs done with the application running. What luck! The next step was to very, very carefully analyze the structure of the old garmin watch with RD pod’s FIT files, web interface, and Garmin Connect app and meticulously copy every metric, unit, and so on. I was then able to transform the data I got from the RD pod into these carefully crafted structures I created to mimic Garmin’s own.

It's all come together
After lots of trial and error, and going on runs with the new setup, I am able to confirm that my Venu 2 Plus, a watch “incompatible” with Garmin’s RD Pod, is fully functional. The data in Garmin’s applications looks 1:1 between the compatible and new watches, and while there might be some confused people at Garmin if they look through this data, the rate of data collection, accuracy, and all stats reported are exactly what the pod is saying.

Next steps
The next steps of this project are to work on data gathering and cleaning in a way that benefits the pet project. While I report exactly what Garmin does in their own format, there may be a better way for my pet project that I can simultaneously log. As for my custom Pacing metrics and connection to the sensor, that portion is complete, working, and I use this setup every time I run.