As stated in an earlier post, I’m trying to write a plugin for HomeAssistant that shows me a graph of fitness, fatigue and form. Just for fun, because I can. I know I could easily check this site or strava or elevate to get the numbers, but…
So to get those numbers, I need to have training load (PSS) and Intensity. Reading my Strava data through API, I have “weighted_average_watts” (WAW) per activity and moving_time in seconds. When using the WAW and my FTP, I calculate Intensity Factor (IF) as WAW/FTP. And with those numbers, I can calculate my PSS Training Load:
(( moving time x WAW x IF) / (FTP * 3600) ) * 100
Comparing the data from Strava, Intervals, TrainingPeaks, Elevate and my own calculations, there are quite some differences though they all have Strava as source. How can this be? Is there such a difference in the formula’s to be used? Or is the weighted_average_watts re-calculated with different metrics?
For example for my last ride, Strava shows in the API I had a weigthed_average_watts of 196. On the Strava Web Page I then get a Training Load of 297, Elevate PSS is 322, TrainingPeaks PSS is 323, Intervals.icu is 322 and my own calculation is 281.
Don’t understand why I can’t match those numbers as I can’t seem to find any different formulas so the input must be wrong somehow.
Hi, thank you.
Read that and the formulas used are the same, but somehow the results don’t match. How can Intervals get a different PSS / Training Load if Strava is the source?
Yes, so my FTP is 210W on all the platforms. I just checked “moving time” and they all matched on the minute. All the sites have slightly different numbers and my own calculations are almost always lower than the others.
In this sheet you can see the yellow columns is what the Strava API gives me and that is all I have to do my calculations with and I would expect this to be the same for the other websites. From row 52 and down, I’ve copied all the info from the other sites into my sheet. And on the tabs you see the charts I made to compare the data. You’ll see that they do follow the same pattern, which for me is enough to start using my own calculations from the plugin I’m writing and I can always adjust later. I’m just curious to find out why the numbers are not the same for all the sites as they all (including my own calc), only have Strava as source.
I think you’ll find your numbers calculated from Strava weighted average power do not match those from intervals because intervals calculates those values from normalised power.
Thank you for that link, so Normalized Power and xPower difference. But Normalized Power is not visible in the Strava API output. So I wonder how Intervals gets that value. Is it re-calculated by looking at every ‘splits metric’? Strava API only gives back these values:
Intervals calculates normalised power (and almost everything else) from the full data stream. You should be able to recreate that from the Strava api, but it makes the task a bit more involved.
I thought that was a section of the full data stream, therefore I was missing power stats. But as you said, that is indeed more effort that needed for my project. I’ll stay with the summary Strava API gives me which has the weighted_average_power.
My Garmin 530 pushes the data to Garmin Connect and then Garmin Connect pushes it to Strava.
The app I’m writing is just a “fun” integration to be used for Home Assistant. It would be easier for me to read from Intervals API as it publishes the values I’m searching for in the API, but as my target audience is probably mostly using Strava, I need to read Strava API which only publishes very few values so I need to calculate CTL, ATL and TSB.
At the end of the day, consistency is key. TSS is a formula based on Duration, Normalised Power, FTP and intensity. PSS uses a different formula to calculate Average Weighted Power.
ATL, CTL and TSB are formulae using TSS/PSS. As long as PSS is always used, the relationship between each metric will be the same. Just don’t mix the two or try compare between the two.