philosowaffle/peloton-to-garmin

VO2 Max and Training Effect not updating

kelaban opened this issue · 20 comments

Describe the bug
In the last week VO2 Max and Training Effect has stopped reporting in Garmin Connect.

To Reproduce
Steps to reproduce the behavior:

  1. Do an activity that would normally qualify (e.g 45 minute Power zone ride)
  2. View Cycling VO2 Max in Garmin

Expected behavior
I have a Fenix 7. Up until this past week the default p2g settings have triggered Garmin to update training load and VO2 Max.

Logs
N/A

Installation (please complete the following information):

  • OS: linux
  • Method: docker
  • Version: 4.0.0

Additional context

As an experiment, I tried re-reporting workouts using my own Fenix 7 device profile which did not fix the issue.

I can confirm all workouts have HR, Power, cadence, and distance data reporting as expected from p2g

I just posted a response to another discussion thread about this, but I was wondering why the training effect stopped updating in Garmin for all synced Peloton activities (cycling, strength, etc.) all of a sudden this week. Sounds like it is the exact issue you're facing.

Same experience for me, last activity that worked was on 12/20 for me for cycling. Also no calculated load for the activity.

Edit: Using the docker version, attempted both automatic and manual syncs, default settings. Epix 2 for watch.

Edit2: Also tried using the github sync workflow, still no training effect/load.

Same issue for me.

VO2 Max, training load and intensity are not calculated anymore. :-(

Main device: Fenix 7 Pro

Latest P2G version / Docker / default device used.

Keeping an eye on this, but currently I'm thinking this is an issue on Garmin's side of things.

Someone on the Zwift forums seems to have isolated the issue to the modified device ID causing the issue:

https://forums.zwift.com/t/no-training-effect-in-garmin-connect-for-some-trainings/619745

My rides currently show up as TACX rides when I sync.

Historically the TACX Device worked in convincing Garmin that it should generate TE for a given workout. But maybe that has changed? Folks can test out other devices by playing around with the DeviceInfo configuration option in P2G.

If we find one that works I can update the default that P2G uses.

Garmin support FAQ

...
Qualifying activities from the following apps can contribute towards your VO2 Max:

Tacx Training™ App | Tacx Training™ Desktop app
Zwift
TrainerRoad
ROUVY
...

I don't remember these restrictions being in the documentation before... I wonder if my memory is just bad or if these are new? If they are new requirements, that would explain why things stopped working:

Activities recorded from these apps do not generate a VO2 Max reading by themselves. The activities are post processed using a Garmin device and Garmin Connect to generate a reading. For your VO2 Max to update from a supported fitness app, you must meet these requirements:

The app must be linked to your Garmin Connect account. Tacx apps are linked by default.

Your VO2 Max capable Garmin device must be listed in your Garmin Connect account. This allows the activity recorded from the other app to sync with the device to allow post processing.

Your VO2 Max capable Garmin device must have an activity of the correct activity type saved on it. It is recommended to have a recently recorded activity to provide the most accurate information.

If these requirements are met, Garmin Connect will sync the activity data to your Garmin device. The device will then process this data and if conditions are met, an updated VO2 max reading will be generated. If you are using an Edge device, you must sync your device twice for an updated VO2 Max to display in Garmin Connect.

Progress....

I was trying to troubleshoot this yesterday and saved my last two outputted .fit files onto a shared drive which I happened to have access to today (I'm not my desktop where the github actions are run).

I used fitfiletools.com to change the device for the two .fit files: (1) Manufacturer = Zwift; (2) Manufacturer = TACX, but did not indicate a specific Device. I reuploaded the two activities directly on connect.garmin.com, refreshed my Garmin Connect app, and training effect was processed. When I look at the activity on connect.garmin.com for the TACX import, it shows Tacx App (Windows) Software 1.30, which is the same as when it was imported through the Github action, but maybe not specifying the "Device" itself was the difference?

Edit: I even got a "First Tacx Ride" badge for the manually imported TACX ride.

Interesting find. P2G actually does not use the TACX manufacturer ID, but instead the Garmin Manufacturer Id with the TACX Device. So perhaps that is the crux of the issue.

That sounds correct. I just verified steps @seesomak mentions. Using runalyze.com to view the output files here is the difference between P2G uploaded file and a fitfiletools.com modified file.

Original

==
= TYPE=0 NAME=device_info NUMBER=23
--- timestamp=1072289641=2023-12-23T18:14:01Z
--- serial_number=1=1
--- manufacturer=1=garmin
--- garmin_product=20533=20533
--- device_index=0=creator
--- source_type=5=local
--- product_name="TacxTrainingAppWin"
--- software_version=130=1.30
==

Modified

==
= TYPE=0 NAME=device_info NUMBER=23
--- timestamp=1072982998=2023-12-31T18:49:58Z
--- serial_number=1=1
--- manufacturer=89=tacx
--- product=20533=20533
--- device_index=0=creator
--- source_type=5=local
--- product_name="TacxTrainingAppWin"
--- software_version=130=1.30
==

Tacx Manufacturer ID

Following up I was able to fix reporting from P2G by going to Settings -> Conversion -> Advanced and setting the device info to this profile.

<Creator>
  <Name>TacxTrainingAppWin</Name>
  <ManufacturerId>89</ManufacturerId>
  <UnitId>1</UnitId>
  <ProductID>20533</ProductID>
  <Version>
    <VersionMajor>1</VersionMajor>
    <VersionMinor>30</VersionMinor>
    <BuildMajor>0</BuildMajor>
    <BuildMinor>0</BuildMinor>
  </Version>
</Creator>

Perfect, let's use that as a temporary workaround until I can apply the needed change to P2G (hopefully in next day or so).

This is a newbie docker question, but does anyone know what "DeviceInfoPath" I should be pointing to when using docker through Synology Container Manager?

I've tried pointing to:

/volume1/docker/p2g/deviceInfo.xml
/app/deviceInfo.xml

Neither seems to process the training effect. If there isn't an easy fix, I will wait for version 4.1.0.

Thanks all!

Assuming you're using the WebUI docker image:

  1. Map the volume in the API container (not the UI container). Let's say you're mapping looks like this:
    1. - /volume1/docker/p2g/deviceInfo.xml:/app/deviceInfo.xml
  2. In the WebUI, go to Settings > Conversion > Advanced, now update the device info path to be /app/deviceInfo.xml

Just merged the proposed change. Y'all can switch over to the latest tag to get it right away. I have a few more things I want to knock out before releasing 4.1.0 officially.

Thank you everyone for doing the elbow grease to investigate this issue!

Quick observation: I just updated my fork to the latest commit in main, deleted my activities in Garmin Connect and from my Forerunner 955 and then ran the sync workflows action. Looks like the manufacturer was still set to Garmin (1) in the fit file, but changing it manually as @seesomak described seemed to work. Is the intention that one would need to change the DeviceInfo to get this working via actions?

The GitHub action does not actually use the code from the repo, it pulls from the published Docker image. So this line needs to be updated to console-latest. console-stable won't get these changes till the next release is officially cut.

The GitHub action does not actually use the code from the repo, it pulls from the published Docker image. So this line needs to be updated to console-latest. console-stable won't get these changes till the next release is officially cut.

Got it, makes sense, thanks @philosowaffle