List of Undocumented mesg_num?

Does anybody maintain or have a list of undocumented mesg_num fields?  Seeing a number of them show up in files:

In monitoring files:

  • 24
  • 211
  • 233

In Activity files:

  • 140
  • 141
  • 233

Obviously, the right solution is for Garmin to properly (comprehensively) document their SDK.  I just downloaded their Feb 2nd release and they still don't show up.  Barring Garmin doing their job, perhaps we can crowdsource the answers?

  • 140 which is Firstbeat metrics used to calculate proprietary things, I suspect the others are like that too, they aren't going to document them.

    I've researched 140 quite a bit. There are also many undocumented Event 21 types which I have another thread about.

    140 post-related is vaguely related to 79 for the start of the next activity and numbers used to calculate METRICS.FIT to send to garmin-connect

    for the 140 global message number post activity

    • 1 appears to be any new HR max detected for the current activity
    • 4 appears to be the aerobic load for the current activity
    • 5+6 is mysterious and appear related, it seems to be used to calculate 7, I call them "met capacity" and "met work" but that's wild guessing
    • 7 is well known to be "metmax" which can be converted to vo2max by dividing by (65536/3.5)
    • 9 is recovery time in minutes from the finish of the current activity, add to local time to get when the timer will reduce to zero
    • 14 is Lactate Threshold heartrate when detected during activity
    • 15 is LT pace in meters per second
    • 16 can also oddly be LT pace in meters per second but scale / 36?
    • 17 is the final "performance condition" at the end of the activity
    • 20 is the anaerobic load, extension of 4 added a year or two later

    If anyone discovers more of these or how 5+6 specifically works please let me know.

  • Thank you!  This is really helpful. 

    How have you figured these out?  Deduction from your own activities where you see stats presented in Connect that align to the value types you show above?  Another source?

    I know I'm a broken record, but it is beyond me how Garmin complies with GDPR / CCPA when they don't even tell you what they are collecting on you.  Seems like such an obvious violation.

  • I've owned half a dozen garmin watches since like 2013 so I have quite a collection of FIT files and self-data to study but I've only really gotten into it over the past year and started to notice what it updates in the files.

    Some programs like "golden cheetah" have figured out a few fields but I figured out more by comparing a lot when things change.Someone posted how to extract the exact vo2max from the FIT instead of using the rounded whole numbers on the watch and that got me really into taking apart the firstbeat metrics.

    Garmin stores a lot in FIT files, you can tell how tall and how heavy and where a runner runs, their power and stride and a few other things. Oddly not how old they are, I cannot find the birthdate or year in the FIT anywhere. It's possible to guess based on maximum heartrate and reverse engineer the various forumulas but they can be off a few beats which is a few years, but you can tell a teenager from a 40 year old and a 40 year old from a 50+ year old etc.

    Waiting for the Fenix7/955 and hoping I can afford one so I can tinker with all the new firstbeat metrics, my newest watch is only a fenix5 and it is missing a lot of things like respiratory rate and the altitude/climate adjusted vo2max, etc. only found in the newest models.

  • here's another undocumented message number id that was easy to figure out, 216 in case it helps someone someday

    216 is the heartrate zones timer on the watch or I guess any garmin device that supports it, my old watches from before 2016 don't use 216, the original vivoactive, the old 620 model, etc.don't have it but vivoactive3 has it and fenix of course, it doesn't need HRM belt, just wrist optical is enough to make it appear

    fields:

    * 253 is the classic timestamp

    * 0 (zero) is the record type it is being recorded for, 19 is lap, 18 is session, each type can have multiple 216s

    * 1 is the counter for record type in 0 (zero) each lap will have it's own matching counter, single sessions will just start/end at zero

    * 2 is an array of six unsigned 32bit int and appears to be the total beats spent in each HR zone, at first I thought it was milliseconds spent in each zone but without HRV the watch does not have that kind of precision so that's not right

    * 6 is array of six unsigned 8bit int and it's the pre-calculated HR bpm zones you can also see on garmin-connect/app that each number in field 2 is assigned to

    * 10 is the HR method used to make the zones. 1=maxhr method, 2=heartrate reserve method (high-rest)+rest, 3= Lactate Threshold HR (LTHR)

    * 11 is the pre-calculated max HR but it's not the auto-detected user max HR which can be much higher

    * 12 is not always set and is the user min HR selected

    * 13 appears to be the autodetected Lactate Threshold HR, not always set/used and in theory matches or close to Zone5 in field 6

    using this data you can re-create the final bargraph the user sees on their watch or garmin-connect or app, but it's easier just to recalculate your own if you know the LTHR or HRR for the user (sometimes you don't know though)

  • Hi

    The birth year is found in the user profile as one of the 'unknown' bytes ; add 1900

    Nick

  • Oh wow I cannot believe I missed that.

    global message id 3, field 24, offset +1900 = year of birth

    Thank you very much for sharing.

  • thanks for sharing the 140 and 216!

  • I have now shared many undocumented messages, fields and values, see medium.com/.../beyond-the-fit-sdk-c9969430aeeb