Wrist vs Chest Heart Rate on Garmin watch

Hi Guys,

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.

here is the table in the fit file:

any help would be greatly appreciated.

Cheers

1 Like

For me, Wrist is useless.

2 Likes

Same… And this new update is causing me some issues switching between both.

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.

You could make a custom chart to display normal HR and wrist HR.

3 Likes

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

Are you trying to determine when you can ditch the strap? Based on these data?

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.

1 Like

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

1 Like

Hi @david and @Wazc23 . Very good findings!

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!

Laurent

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.

Yes I have tried reprocessing the file, as well as changing the field position to 137, both without any result.

Looking forward to some hints, not sure what to try next!

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.

3 Likes

Awesome, thank you. Updated my costum activity streams Garmin GAS Speed and Garmin GAP Pace.

1 Like

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.
    Screenshot 2024-05-12 125912

  • 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.
    Screenshot 2024-05-12 125822

  • 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
    Screenshot 2024-05-12 130039

  • 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.
    image

Apparently this is called “Dynamic Source Switching” (https://support.garmin.com/en-CA/?faq=Nf8r6ApX4d9lX0G0flEsVA). It can be turned off. I will keep monitoring the behavior for a while before deciding if I turn it off.

4 Likes

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. :roll_eyes:

4 Likes