Athlete summary
Without a power meter, Koyaro still builds a training-load history for your PMC (fitness / fatigue / form). The engine picks the best available signal:
| What you have | Daily PMC load | HR zones |
|---|---|---|
| Power + FTP | TSS (full fidelity) | Coggan %FTP (power) |
| HR + LTHR | hrTSS (TSS scale) | Friel %LTHR (default) |
| HR + max/rest HR, no LTHR | Banister TRIMP (per second) | Karvonen %HRR (auto) |
| Neither | Manual RPE / duration estimate | — |
Nothing hard-fails for lack of a power meter. Mixed power/HR weeks stay comparable when LTHR is set, because hrTSS uses the same “1 h at threshold = 100” reference as power TSS.
hrTSS vs TRIMP
hrTSS anchors intensity to lactate-threshold heart rate (LTHR):
hrTSS = Σ (Δt_s · (HR / LTHR)²) / 3600 · 100One hour at LTHR equals 100 — the same reference as 1 h at FTP = 100 TSS.
Banister TRIMP anchors intensity to heart-rate reserve (HRr = (HR − rest) / (max − rest)):
TRIMP = Σ (Δt_min · HRr · k · e^(b · HRr))- Male:
k = 0.64,b = 1.92 - Female:
k = 0.86,b = 1.67
These match trimp_coefficients / banister_trimp in coach.domain.metrics.heart_rate (do not invert female k/b).
Koyaro integrates TRIMP per sample (usually 1 Hz). Using only session average HR under-weights surges because the exponential is convex. The session-average closed form remains available for steady-effort checks and matches the integral when HR is constant.
PMC precedence (bike): training_load = TSS → else hrTSS → else TRIMP. TRIMP is always stored as hr_load when max/rest HR are known, even when hrTSS drives the PMC.
Multi-sport: run/swim use sport-native external load when CS/CSS exist; HR fallbacks follow the same hrTSS → TRIMP chain for run, and TRIMPc → sRPE (preferred) for swim. Cross-sport Foster monotony may use sRPE or HR-TRIMP as a documented shared scalar — never assert bike TSS ≡ run-load ≡ swim-load. See.
Karvonen %HRR zones (optional)
Friel’s seven zones (%LTHR) remain the default when LTHR is set. You can also choose Karvonen heart-rate reserve zones:
zone HR = rest + %HRR × (max − rest)Five ACSM-style bands with upper bounds at 60 / 70 / 80 / 90% HRR (open-ended top). Set hr_zone_model to karvonen on the athlete profile, or leave it unset: the engine auto-selects Karvonen when LTHR is missing but max and resting HR are present. Custom absolute bpm tables still override both models.
Literature
- Banister / Morton — training impulse (TRIMP) with sex-specific exponential weights on heart-rate reserve.
- Karvonen et al. (1957) — target HR from resting HR + % of heart-rate reserve.
- Joe Friel — seven cycling HR zones as fractions of LTHR.
- Allen & Coggan / TrainingPeaks — TSS and hrTSS (LTHR-anchored load on the TSS scale) for the Performance Management Chart.