Since a recent update to my watch I noticed that Garmin is trying to do something tricky with heart rate between Optical and Chest Heart rate. I am wondering if I can get this data into a chart in intervals.icu?
*** Adds heart rate dynamic source switching to select the best heart rate data source (watch or chest HRM) to improve accuracy during running activities. ***
I can see the data in fitfileviewer website as per screenshot, just wondering how I get this into a chart? I did try the custom chart activity stream but do not see the Wrist heart rate or External heart rate in the dropdown list.
oh wow⌠didnât notice that thereâs now is 2 diff columns in addition to Heart Rate.
Your screenshot seems to just show that Garmin is now writing both HR to the FIT file but is prioritising External
I added a custom activity stream for this (âWrist Heart Rateâ) with some Javascript to pickup the value. It doesnât appear in the record fields drop down because the field doesnât have a name:
{
for (let m of icu.fit.record) {
for (let f of m) {
if (f.num === 136) {
data.setAt(m.timestamp.value, f.value)
break
}
}
}
}
I added it to your Monday run. You just need to search for it to display it for yourself and reprocess existing runs to get it.
Excellent thanks David, I made a simple chart and great to be able to see the data straight from Intervals.icu. If anyone has similar model watch I have shared the chart
I would love to ditch the strap, but I still get better results with the strap on. My main reason for checking was I am not sure if Garmin is actually showing me wrist or chest strap heart rate during recent activity on the watch display at the time. I had a feeling doing a hard session the heart rate looked too low, and then I found Garmin has made some changes in the last firmware updates. I do prefer if I have the Strap on that it only records from the the Strap and doesnât try to do anything fancy. It was a track session so my heart rate would get high on the effort, then drop down on the recovery.
I see what you mean. There isnât an option to disable wrist HR PER activity (except swimming)
I also find that my old model watch will auto use the chest HR even when not in activity mode and I can see the HR widget using it.
But on my newer âhand me downâ watch, it will revert back to optical. So much so that now when I do a workout on the phone app, I will just remove the watch.
I have tried with disabling optical heart rate on the watch before an activity and then turning back on afterwards, but half the time I forget so that is a pain also. It would be great if they had the option similar to swimming to disable during run or bike etc⌠cheers
I hadnât realized that my watch was switching between strap and wrist HR. I was assuming strap should always take precedence and I also strongly prefer the strap. I just checked in fit file viewer and I can confirm the switching behavior.
I tried leveraging the custom stream from @Wazc23 but I have a few questions
I donât see the Wrist HR displaying in my charts despite adding the custom stream and checking the checkbox in charts, is this expected?
I tried playing the script from the custom stream screen on my latest activity, and I get a âmemory limit exceededâ error. Could that be why it does not display?
I also see that the field is hard coded by its number (136). Could the field position be different based on the watch? I use a Garmin Forerunner 955
If so, how can I figure out what is the field position I am looking for? I would actually be interested in pulling both the Wrist HR and the external HR fields. I want to investigate the difference but also since when the switching behavior started
Thank you in advance and let me know if I can further clarify my questions!
If I were Garmin, Iâll be programming the firmware to auto-switch when for some reason the Strap Data is missing for X seconds and then switch back when itâs back.
Hi @Laurent_Caron Have you tried going to the activity, and selecting actions > reprocess file, then refreshing the page. In regards to the 136 I am not sure either how that number was found, and if it may be different on your model watch.
I have made it easier to lookup fields by number which as a side effect also sorts out the memory limit issue. You can now use f_136 (or f_137 or whatever) to lookup fields by number. I edited your copy of the script and @Wazc23 's original.
{
for (let m of icu.fit.record) {
let f = m.f_136
if (f) data.setAt(m.timestamp.value, f.value)
}
}
As for the 136, that was discovered by looking at the fit file. As far as I know this isnât documented anywhere. So it could change or be different on a different watch.
It looks like âexternal heart rateâ is field number 144. So you could just copy the wrist HR stream and make one for that to compare on charts. Please make it public if you do.
I found that by looking at the âgetMessagesForName-*.jsâ script loaded by fitfileviewer.com.
Thank you so much @david ! Your fix worked as intended. I was able to easily identify all series (HR, Wrist, External), import or create the streams, and reprocess files to understand the Garmin feature a bit better.
I must admit I was quite surprised by the findings⌠I would hope and expect the strap signal to always take precedence over the optical heart rate, but it seems like Garmin has been working on a feature that tries to optimize the origin of the heart rate signal.
We can see the feature being built incrementally over the last few Garmin Forerunner 955 software updates :
16.17 (Up to Nov 5 2023) : Only âHeart Rateâ series available, in red. Looks high quality so I assume my strap is providing the signal 100% of the time.
17.21 (Starting Nov 20 2023) : âExternal HRâ becomes populated, in blue (and Heart Rate remains). Both are 100% coherent, supporting the hypothesis that my strap is always the source providing HR to the watch.
18.12 (Starting Jan 14 2024) : âWrist HRâ becomes populated, in green (and the other 2 remain). âExternal HRâ stays 100% coherent with âHeart Rateâ, and âWrist Heart Rateâ is clearly lagging, missing precision, and intermittently on/off
19.12 (Starting May 2 2024) : âWrist HRâ changes definition. Rather than actually representing Wrist HR, it is clearly post-processed and very influenced by the External HR. So it becomes impossible to know what the initial Wrist HR was before post-processing, as if the Wrist sensor is now always turned off, and only turns on when the watch does not trust the strap. However the Wrist HR field would still store strap signal even when the optical sensor is turned off, so the Wrist HR field means nothing really.
In the latest Fenix 7 beta firmware 17.x (maybe other series watches too?), Garmin introduced the Source Switching option for Wrist HR, which, when turned off, forces the watch to use External HR if an external HR sensor is connected â essentially overriding this new behaviour.
I imagine they got a number of complaints about their âsmartâ auto-switching algos.
I ended up disabling âSource Switchingâ today, after my watch prioritized the wrist HR before the strap HR for 4 minutes, despite the wrist HR being 40 bpm off. It was so obvious that I noticed during the run.
Usually I would not be able to tell whether the watch or the strap is providing the data (even though I am always suspicious about it and trying to guess) because the delta is quite small and after 20 seconds the strap always takes priority. But 40 bpm off for 4 minutes is way too much so I am disabling the feature for good. Back to trusting my strap in all situations.
See the graph below, with the chest strap in blue and âWrist HRâ in red :