Z2 Training Monitor — Swapping Strain for EF Drift, Durability-Scaling W' Balance

Bob SanfordMay 15, 20265 min read

The Z2 Training Monitor data field shipped with Strain — a Banister TRIMP-based 0–21 score modeled on Whoop's cardiovascular load metric — sitting in the bottom-right tile alongside W' Balance. Six MTB rides later, that tile now displays EF Drift instead. The companion W' Balance tile got a structural change at the same time: it now scales with cumulative kJ of work. Both changes have the same root cause.

Why Strain Had to Go

Strain is great as a daily training-load summary. It's not great as a real-time pacing signal on a 24-hour event. Two problems showed up on long rides:

  1. It saturates. Banister TRIMP grows fast at first and then asymptotes. By hour 8 of a planned 24-hour event, the score was already pinned near 21 with no useful resolution left. The tile became a "yes, you're tired" indicator that didn't change for the next 16 hours.
  2. It's a tunable constant, not measured physiology. Strain depends on a calibration factor K. Two riders with identical HR traces get different Strain numbers based on a fudge factor. There's no objective ground truth to validate against mid-ride.

I wanted a fatigue signal that (a) never saturates, (b) is rooted in actual physiology you can measure on the bike, and (c) gives different readings as the day goes on so the rider can act on them.

EF Drift — The Replacement

Efficiency Factor decoupling is the cumulative-fatigue gold standard from Training and Racing with a Power Meter (Allen & Coggan). The math is simple:

EF       = power / HR
drift    = (EF_baseline / EF_current) − 1

Positive drift means HR is rising for the same wattage — the textbook signature of cumulative fatigue. The physiology backing it up is well-documented: plasma volume loss (Coyle 1990s), thermoregulatory shunt, glycogen depletion forcing recruitment of less-efficient muscle fibers, and elevated sympathetic drive all contribute to a higher HR at the same power as the day wears on.

Reading the number:

DriftMeaning
0–3%Well-paced — sustainable indefinitely
3–7%Warming to fatigue — monitor
7–12%Cooked — eat, drink, cool down
12–18%Dial back hard
18%+Pull-out territory

It never asymptotes the way Strain does, and the ranges map directly to actions.

Baseline establishment

EF drift only works against a reference. The data field collects 1-minute windows opportunistically and locks the baseline once 15 valid windows accumulate — typically during the warmup or the first few minutes of trail 1.

The validity gate

This is the part that took six MTB rides to tune. A naive implementation samples EF every second. On MTB trails, that includes coasting descents (zero power, sky-high EF), 30-second bursts above CP (high power, low EF), and stops at trailheads (zero power, dropping HR). Feeding any of those into the rolling EF gives garbage drift readings.

The gate that worked: only count a second when the 30-second rolling power lies in [0.55×CP, 1.05×CP] and HR > HRrest+20. The dual band filters both coasting and burst climbs. Calibration against six MTB rides reduced per-minute drift jitter from 10–27% (with the original 0.50–1.10 band) to 3–7% while still locking the baseline within the first half-hour of typical riding.

5 AM event-day reset

Baseline and last drift persist across activity stop/start, power-off, and reboot. All rides started between 5 AM local and the next 5 AM local share the same baseline. The 5 AM boundary (rather than 6 AM) lets a pre-event warm-up ride seed the baseline cleanly before the start-line surge of trail 1 contaminates it.

Durability-Scaled W' Balance

The other change: W' Balance no longer uses fixed CP and W'. As you accumulate kJ of work across the event-day, effective CP and W' shrink to reflect real durability loss documented in the 2018–2024 research from Spragg, Maunder, Clark, and Pugh.

CP_effective = CP × (1 − 0.020 × kJ_total/1000)   // ~2% per 1000 kJ
W'_effective = W' × (1 − 0.008 × kJ_total/1000)   // ~0.8% per 1000 kJ

Floored at 0.7× to prevent absurd values; cumulative kJ persists with the same 5 AM reset as EF Drift.

The practical effect: a 175 W push that didn't dent W' on trail 1 may drain it quickly on trail 9 because effective CP has dropped 5–10%. The body genuinely loses sustainable power and anaerobic capacity over hours of hard riding — the W' Balance tile now reflects that instead of pretending hour 1 and hour 12 are physiologically equivalent.

Combined Row-4 Usage

The two row-4 tiles answer different pacing questions on different timescales:

  • W' Balance — for the next climb (seconds)
  • EF Drift — for the whole event (hours)

The full decision table in the README maps every combination of the two to a specific action. The short version: both green at hour 12 means you're winning; both red means full stop.

What Stayed

  • Two-stage alerts (inverse video → flashing)
  • Combined power + HR condition for "quietly overcooked" detection
  • All thresholds plus W' capacity, Critical Power, HRrest configurable via Connect IQ settings
  • The four-row layout (with a new sensor-battery overlay on the distance row)

Try It

The data field is on GitHub: github.com/midyear66/840-Data-Screen-JD

Sideload to an Edge 840 with OpenMTP (Mac) or Windows Explorer. Default thresholds are tuned for FTP 171 W / Max HR 174 bpm — adjust via Connect IQ settings to match your numbers.

See the Z2 Training Monitor app page for the full feature breakdown.


The SSETCO Team

Thanks for Reading!

Have questions or want to discuss this topic further?