Eigene Trainingswerte und Metriken erstellen

Du kannst eigene benutzerdefinierte Metriken in JavaScript programmieren und diese bei Deinen Aktivitäten und in der Auswertung anzeigen lassen.

Mit ein wenig Kenntnissen in JavaScript ist es möglich, aus den bereits vorhandenen Daten einer Aktivität, weitere Werte und Metriken programmatisch zu erstellen. Tredict nennt dies "Benutzerdefinierte Felder".

Deine selbst erstellten Aktivitätsmetriken stehen dann ganz normal in der Trainingsdetailansicht, in der Jahreskalenderansicht und der Auswertung und Statistik zur Verfügung.

So kannst Du unkompliziert eigene Ideen umsetzten, experimentelle Metriken erstellen oder Dein Training um Deine von anderen Analyseplattformen gewohnten Werte erweitern.

Im Glossar findest Du eine Liste der Basiswerte einer Aktivität, die Du verwenden kannst.


Beispiel I: Die Temperatur-Differenz der Uhr zur Außentemperatur berechnen

Die Temperaturmessung am Handgelenk ist bei modernen Sportuhren von Garmin, Suunto, Polar und anderen schon seit ein paar Jahren Standard.

Wenn man nun die Temperatur am Handgelenk mit der wahren Außentemperatur des Wetterdienstes vergleicht und sich die Temperaturdifferenz anschaut, kann man einen interessanten Rückschluss auf die Anwendungsmöglichkeit und Genauigkeit des Temperatursensors der Uhr ziehen.

Temperaturdifferenz im Aggregationsdiagramm
Die beim Laufen errechnete Temperaturdifferenz zwischen Gerätetemperatur und Außentemperatur über das Jahr verteilt.

In dem Aggregationsdiagramm ist zu erkennen, daß unsere errechnete Temperaturdifferenz beim Laufen in der kalten Jahreszeit mit 7 Grad Celsius deutlich höher ausfällt, als in der warmen Jahreszeit.

Unser Benutzerdefiniertes Feld lässt den Schluss zu, daß die von der Uhr angezeigte Temperatur zwar als Gerätetemperatur behandelt werden kann, aber keines Falls als Außentemperatur verwendet werden darf, da die Differenz doch gewaltig ist.

Interessant wäre es nun, das Gleiche mit Freiwasser-Schwimmaktivitäten zu machen. So wäre es vermutlich möglich, den Unterschied zwischen Wassertemperatur und Lufttemperatur zu bestimmen.


Wie lege ich ein Benutzerdefiniertes Feld an?

In der Kategorie "Einstellungen" findest Du die Unterkategorie "Benutzerdefinierte Felder".

Vorausgesetzt Deine Laufuhr unterstützt die Temperaturmessung am Handgelenk, wirst Du mit einem Blick auf die Metrikenliste der Aktivität, die Werte temperature und temperatureStation finden.

Aus der von der Wetterstation gemessenen Außentemperatur und der von der Uhr gemessenen Temperatur bildest Du die Differenz und gibst diese zurück.

Der JavaScript-Code zum Berechnen der Temperaturdifferenz kann einfacher nicht sein:
return this.temperature - this.temperatureStation;

Wobei this das Objekt der Aktivität ist.

Temperatur Difference JavaScript
Das Benutzerdefinierte Feld "Temperature Difference" bildet sich aus der von der Sportuhr gemessenen Temperatur und der Temperatur des Wetterdienstes.

Eine ausführlichere Erklärung zum Erstellen eigener Metriken findest Du im Glossar.

Beachte beim Erstellen des Benutzerdefinierten Feldes, daß dieses nur eine Zahl zurückgeben kann. Es ist nicht möglich, Zeichenketten anzuzeigen.


Beispiel II: Metriken von TrainingPeaks® nachbilden

Wenn Du Metriken wie Training Stress Score® (TSS®), Intensity Factor® (IF®) oder den Variability Index (VI) von TrainingPeaks® gewohnt bist, kannst Du diese mit der "Benutzerdefinierten Felder"-Funktion ebenfalls in Tredict nachbilden.
Die Formeln dazu sind auf der Seite von TrainingPeaks erklärt und Tredict stellt alle nötigen Basiswerte an der Aktivität bereit.

Der Wert powerPerceived an einer Tredict-Aktivität ist dabei analog der Normalized Power® (NP®) zu verwenden.

Beachte dabei, daß es zu allen Metriken Unterschiede geben kann, da TrainingPeaks diese Werte eventuell intern doch anders berechnet und Tredict in keiner Beziehung zu TrainingPeaks steht.

Der JavaScript-Code zum Nachbilden des Training Stress Score® nach Wattleistung könnte z.B. so aussehen:

const { powerPerceived, ftp, duration } = this;

if (!powerPerceived || !ftp || !duration) {
  return null;
}

const intensity = powerPerceived / ftp;
const tss = (duration * powerPerceived * intensity / (ftp * 3600)) * 100;

return Math.round(tss);

Disclaimer: TSS, NP, IF und TrainingPeaks sind ein eingetragenes Warenzeichen der Peaksware, LLC. Tredict behauptet nicht, die genannten Metriken direkt zu unterstützen. Es ist dem Benutzer selber überlassen, ob er die genannten Metriken als "Benutzerdefiniertes Feld" anhand der bekannten Formeln implementiert und der Benutzer ist für die Überprüfung der Korrektheit selbst verantwortlich.


Beispiel III: Positiver oder negativer Split einer Aktivität?

Dieses Beispiel ist programmatisch etwas komplizierter, da wir die gesampelten Seriendaten verwenden werden, um festzustellen, ob die Aktivität einen positiven oder negativen Split aufweist.

Die Seriendaten werden nur in der Trainingsdetailansicht zur Verfügung gestellt. Durch die Datenmenge der Serien ist es nicht möglich, diese in der Statistik für jede Aktivität zu laden. Dieses Feld wird in der Auswertung und Analysis also leider nicht angezeigt, sondern nur in der Detailansicht der Aktivität.

Der "Split" bezeichnet die Teilung genau in der Mitte des Workouts. Von einem negativen Split spricht man dann, wenn die zweite Hälfte des Workouts schneller gelaufen, gefahren oder geschwommen wurde. Im Gegensatz zeigt Dir der positive Split ein Langsamerwerden in der zweiten Hälfte auf.

Die Trainingslehre bevorzugt den negativen Split, da dieser statistisch häufiger bei Wettkämpfen von Weltklasseathleten vorkommt. Warum dies so ist, hat sicherlich mehrere gleichzeitige Ursachen. Der negative Split sollte kein forciertes Trainingsziel sein, sondern nur ein sekundäres Resultat und kann somit als Indikator zu Rate gezogen werden.

So sieht der Code für die Berechnung des negativen Splits aus:

const { distance: totalDistance } = this;

const { data, sampleSize, endOffset } = this.seriesSampled || {};
const { distance } = data;

if (totalDistance == null || distance == null || !distance.length) {
  return null;
}

const durationByLength = distance.length * sampleSize + endOffset;

const splitDuration = durationByLength / 2;
const splitDistance = distance[Math.round(splitDuration / sampleSize)];

const firstSplitPace = splitDuration / splitDistance;

const secondSplitPace = splitDuration / ((totalDistance / 1000) - splitDistance);

return firstSplitPace > secondSplitPace && 1 || 0;

Zunkünftig könnte es sein, daß der negative Split als festes vorberechnetes Feld in Tredict implementiert wird. Wir lassen uns überraschen. :-)

verfasst am 21.12.2020, 11:36:21 von Felix Gertz