Geplant und absolviert, jetzt auf einer Karte

Dr. Sebastian Reinhard 5 Min. Lesezeit
Geplant und absolviert, jetzt auf einer Karte

EndurexAI führt geplante Ausdauer-Workouts jetzt automatisch mit den Strava-Aktivitäten zusammen, die sie erfüllen. Wenn eine Ausfahrt, ein Lauf oder ein Schwimmtraining von Strava synchronisiert wird, sucht das Backend nach einem geplanten Workout am selben Tag, in derselben Sportart, mit einer Dauer, die dazu passt. Wird eines gefunden, werden beide verknüpft. Der Kalender zeigt dann eine einzelne Karte mit den Ist-Leistungswerten oben und den geplanten Zielwerten darunter, statt zwei Karten nebeneinander.

Vorher und nachher

Vor dieser Änderung lebten ein geplantes Workout und die Strava-Aktivität, die es erfüllte, als zwei separate Einträge auf dem Kalender. Du hast die geplanten Zahlen von der einen Karte gelesen, dann den Blick zur Aktivitätskarte gewandert, um zu vergleichen. Wer das schon an einem Montagmorgen nach der Sonntagsausfahrt gemacht hat, kennt die Reibung.

Nach dieser Änderung entsteht aus derselben Situation eine Karte. Die Überschrift zeigt den Namen der Aktivität. Die erste Reihe enthält den Ist-TSS, die Ist-Dauer, die Ist-Distanz und den durchschnittlichen Puls. Darunter zeigt eine kleinere “vs Plan”-Reihe den geplanten TSS und die geplante Dauer. Die Karte behält die Optik der absolvierten Sessions aus dem vorherigen Release: grüner Rand, eingelassener Schatten, gedämpfte Sättigung, die beim Hover verschwindet. Ein Klick auf die Karte springt direkt in die Aktivitätsdetails.

Die zusammengeführte Karte

Die Karte von oben nach unten gelesen: die obere Reihe zeigt, was der Körper geleistet hat, die untere, was der Plan verlangt hat. Die geplante Beschreibung bleibt erhalten, sodass eigene Notizen sichtbar bleiben. Hatte das geplante Workout keine Beschreibung, entfällt diese Zeile.

Die Ist-Werte stehen bewusst an dominanter Stelle. Der Plan ist eine Hypothese; die Aktivität sind die Daten. Im Nachhinein wiegen die Daten schwerer, und die geplanten Zielwerte werden zur Referenz statt zur Hauptaussage.

Wie die Zuordnung entschieden wird

Der Matcher prüft drei Dinge. Erstens muss das Datum der Aktivität mit dem Datum eines geplanten Events übereinstimmen. Zweitens muss die Sportart der Aktivität auf die Sportart des Workouts abbilden. Strava’s Ride, Virtual Ride, Gravel Ride, Mountain Bike Ride, E-Bike Ride und Handcycle lösen alle nach Rad auf. Run, Virtual Run und Trail Run lösen nach Lauf auf. Swim löst nach Schwimmen auf. Drittens muss die geplante Dauer zwischen der Hälfte und dem Doppelten der Ist-Dauer liegen.

Bleibt nach diesen drei Prüfungen genau ein geplantes Workout übrig, wird es verknüpft. Bleiben mehrere übrig, wählt der Matcher dasjenige mit dem höchsten Compliance-Index, berechnet aus der gemessenen Leistungskurve gegen das geplante Ziel. Die Begründung: Compliance kodiert bereits, wie gut eine absolvierte Session zu einem bestimmten Ziel passt, und ist damit das richtige Signal, um einen Gleichstand zwischen mehreren Kandidaten am selben Tag aufzulösen.

Hat die Aktivität keine Wattdaten, kann Compliance nicht berechnet werden. In diesem Fall greift der Matcher auf die kleinste Differenz zwischen geplanter und absolvierter Dauer zurück. Reine Pulsläufe und Bahnschwimmen bekommen so eine sinnvolle Verknüpfung statt eines leeren Ergebnisses.

Der Matcher überschreibt nie eine Verknüpfung, die du selbst gesetzt hast. Eine manuelle Zuordnung gewinnt immer.

Forward- und Inverse-Richtung

Zwei Pfade decken die zwei möglichen Reihenfolgen ab. Der Forward-Pfad läuft, wenn eine Aktivität von Strava ankommt und ein geplantes Workout bereits im Kalender steht. Der Inverse-Pfad läuft, wenn ein geplantes Workout hinzugefügt wird, nachdem die Aktivität schon synchronisiert wurde.

Der zweite Pfad macht retroaktives Planen funktionsfähig. Entscheidest du am Dienstag, dass die spontane lange Ausfahrt von gestern in deinem Plan stehen soll, kannst du ein geplantes Event auf den Montag setzen, und es greift die bestehende Aktivität in dem Moment, in dem du speicherst. Das Backend hört auf neue Ausdauer-Events und führt, sobald eines ohne bestehende Verknüpfung erstellt wird, dieselbe Matching-Logik in umgekehrter Richtung aus, auf der Suche nach einer unverknüpften Aktivität, die passt.

Was bewusst unverknüpft bleibt

Aktivitäten, die deutlich außerhalb des geplanten Dauerfensters liegen, werden in Ruhe gelassen. Ein dreißigminütiger Rollentrainer-Spin an einem Tag mit einer geplanten zweistündigen Grundlagenfahrt wird nicht zusammengeführt. Beide sind in keinem sinnvollen Sinn dasselbe Training, und sie als eines zu behandeln, würde den Vergleich zwischen Plan und Ausführung verfälschen.

Das gilt auch in die andere Richtung. Eine vierstündige Ausfahrt an einem Tag mit einem geplanten einstündigen Regenerationsspin bleibt separat. Aktivitäten außerhalb des Halbe-bis-Doppelte-Fensters erscheinen als eigene absolvierte Karten auf dem Kalender. Das geplante Workout sitzt, falls es unerfüllt bleibt, daneben und kann weiterhin als erledigt markiert werden, damit sein TSS zum Tag zählt.

Ein engeres Fenster würde mehr Fälle abdecken, würde aber auch beginnen, Sessions zusammenzuführen, die nicht zusammengehören. Ein weiteres Fenster würde das Doppelkartenproblem weiter schrumpfen, würde aber die Integrität des Plan-gegen-Soll-Vergleichs aushöhlen. Halbe-bis-Doppelte liegt an einer Stelle, an der fast jede ehrliche Substitution drinnen ist und fast jede klar abweichende Session draußen.

Wo es zu finden ist

Die zusammengeführte Karte lebt auf dem Kalender. Keine neuen Einstellungen, keine Schalter, nichts zum Aktivieren. Neue Aktivitäten, die nach dem Deploy synchronisiert werden, werden automatisch zugeordnet.

Historische Aktivitäten, die vor dem Deploy synchronisiert wurden, können per Management-Befehl im Block zugeordnet werden:

manage.py backfill_activity_event_matches --dry-run --user-id=<id>

Das Dry-Run-Flag druckt vorgeschlagene Verknüpfungen, ohne etwas zu schreiben. Das Flag weglassen, um zu committen. Mit --since=YYYY-MM-DD lässt sich das Zeitfenster eingrenzen.

Abschluss

Die Form des Kalenders hat sich leicht verändert. Das Verhalten des darunterliegenden Trainingsplans nicht. cl, al und Form folgen weiterhin denselben TSS-Werten wie zuvor. Die zusammengeführte Karte ist eine Darstellungsänderung über Daten, die bereits da waren, und der Matcher ist ein kleiner Backend-Dienst, der einen manuellen Schritt in einen automatischen verwandelt.

Dr. Sebastian Reinhard

Dr. Sebastian Reinhard

Founder & Head Coach

Triathlete and software engineer building the future of AI-powered endurance coaching. Passionate about combining data science with training methodology.

Comments(0)

Sign in to join the conversation.