Get training load (CTL/ATL/TSB)
get_training_loadComputes day-by-day fitness (CTL), fatigue (ATL), and form (TSB) from Suunto workouts, filling the API gap with an exponential TSS model.
Instructions
Fitness (CTL, 42-day), Fatigue (ATL, 7-day) and Form (TSB = CTL - ATL) day by day up to date. Suunto's API has no endpoint for these, so they are computed from each workout's TSS (tss.trainingStressScore, 0 when Suunto has none) with the standard exponential model — the same maths as generate_daily_digest. The result can be about 1 point off the watch for CTL (compared once with the Suunto app: ATL and TSB matched, CTL was about 0.9 lower). Without seeds, workouts from 120 days before the window are read as warm-up and CTL/ATL start from 0 there, so the window is not cold-started; with little workout history CTL still reads low (it takes about 4-6 weeks to converge), which notes then says. Output (compact JSON, numbers to 1 decimal): { from, to, current: { ctl, atl, tsb, rampRate7d (CTL change over the last 7 days, null when not enough days) }, weeks: [{ weekStart (Monday), workouts, durationS, tss }] (only the days from..to count, so the first and last week can be partial), series: [{ date, tss, ctl, atl, tsb }] (values at the end of each day; tss 0 is a rest day, not missing data), notes: [caveats, plus: no workouts at all in the range, workouts without TSS, and when the workout limit was reached so numbers may be too low] }. Workouts are placed on their own local date. Read-only: it only reads workouts and never touches the digest's history or averages files.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | The last local calendar day of the series, YYYY-MM-DD. Today works but its workouts may not have synced yet. | |
| days | No | How many days the series covers, ending at `date` (default 28). | |
| seedAtl | No | Same as seedCtl but for Fatigue (ATL). | |
| seedCtl | No | Optional: Fitness (CTL) at the end of the day before the series starts, read off the watch or app, instead of computing it from a 120-day warm-up. Giving seedCtl or seedAtl skips the warm-up; a seed left out starts at 0. |