Projekt

Allgemein

Profil

Aktionen

Feature #163

geschlossen
JH

Strava: Trainings automatisch hochladen

Feature #163: Strava: Trainings automatisch hochladen

Von Julius Haman vor 19 Tagen hinzugefügt. Vor 18 Tagen aktualisiert.

Status:
Erledigt
Priorität:
Normal
Zugewiesen an:
-
Zielversion:
Beginn:
13.10.2026
Abgabedatum:
% erledigt:

90%

Geschätzter Aufwand:
Gefunden in Version:

Beschreibung

Idee

Trainings sollen aus ErControl direkt zu Strava hochgeladen werden können, optional automatisch nach Trainingsende.

Recherche-Ergebnis

  • Upload über POST /api/v3/uploads (multipart, Scope activity:write), Formate FIT/TCX/GPX. Verarbeitung ist asynchron: danach GET /uploads/{id} pollen, bis activity_id gesetzt ist.
  • Die vorhandenen Exporte TrainingExportService.ExportFit und ExportTcx liefern passende Dateien.
  • OAuth: Browser-Login, Redirect auf http://localhost:<port>/… mit lokalem Listener, Access-Token läuft nach 6 h ab, Refresh-Token wird gespeichert.
  • Strava-Apps starten im Single Player Mode (nur das eigene Konto), per Dashboard bis 10 Athleten, darüber nur nach Review ohne Garantie.
  • Eine Strava-API-App kann nur mit Strava-Abo angelegt werden (am 2026-10-13 im Dashboard bestätigt: "nur für Mitglieder").

Entscheidung

Variante A: Jeder Nutzer legt seine eigene Strava-API-App an und trägt Client-ID und Client-Secret in ErControl ein. Damit gibt es keine zentrale App, keine Athleten-Grenze und kein Review. Voraussetzung ist ein Strava-Abo des Nutzers, das in Doku und Dialog klar stehen muss.

Umsetzung (Skizze)

  • StravaUploadService: OAuth mit lokalem HttpListener, Token-Ablage verschlüsselt (DPAPI), Token-Refresh, Upload, Polling, Fehlerbehandlung (Duplikat, ungültige Datei, Netzfehler).
  • Einstellungen: Client-ID/Secret, Verbinden/Trennen, Schalter für automatischen Upload.
  • Trainingsdetail: Button "Zu Strava hochladen" (zuerst manuell, Automatik danach), Status/Fehler anzeigen, Strava-Link zur Aktivität speichern, um Doppel-Uploads zu vermeiden (external_id).
  • Tests gegen einen gefälschten HttpMessageHandler, ein echter Test erst mit Abo.
  • Dokumentation (ercontrolDocs, deutsch und englisch): Schritt-für-Schritt, wie man die Strava-App anlegt.

Offen

  • Der Ende-zu-Ende-Test braucht ein Strava-Abo (ein Monat reicht), erst abschließen, wenn der Code fertig ist.
  • Datenschutz-Hinweis in der Doku: Trainingsdaten gehen an Strava.

Konzept: Integration in die Oberfläche

Ort Heute Neu
Export-Menü der Trainingsliste (TrainingSessionsView) TCX, FIT, HRM, CSV Eintrag "Zu Strava hochladen" für die markierten Trainings
Trainingsdetail (TrainingDetailView) gleiche Export-Einträge für ein Training derselbe Eintrag, plus Link "Auf Strava ansehen"
Ende eines Trainings (FreiesTrainingWindowViewModel) Speichern optional: nach dem Speichern automatisch hochladen
Einstellungen – Abschnitt "Strava": Client-ID/Secret, Verbinden/Trennen, Schalter Auto-Upload
  • StravaUploadService in ErControl.Core/Services neben TrainingExportService: exportiert das Training als FIT in eine Temp-Datei, lädt hoch, pollt GET /uploads/{id}.
  • Auto-Upload läuft als Hintergrundaufgabe und blockiert das Beenden des Trainings nicht. Bei Fehlern (offline, Token abgelaufen) bleibt das Training als "nicht hochgeladen" markiert und kann manuell nachgeholt werden. Meldung als Hinweis, nicht als Fehlerdialog.
  • Mehrfachauswahl in der Liste: nacheinander hochladen, mit Fortschritt und Abschlussmeldung ("3 von 4 erfolgreich").

Konzept: Upload-Status

Zwei neue Felder am Training (EF-Migration, nullable, Bestandstrainings bleiben leer):

  • StravaActivityId (long?): gesetzt, sobald Strava die Aktivität angelegt hat
  • StravaUploadedAt (DateTime?): Zeitpunkt des Uploads

Anzeige:

  • Trainingsliste: schmale Spalte mit Symbol (gefüllt = hochgeladen, Tooltip mit Datum). Filter "noch nicht hochgeladen" erleichtert das Nachholen.
  • Trainingsdetail: Link auf https://www.strava.com/activities/<id>.
  • Erneuter Upload eines bereits hochgeladenen Trainings: Rückfrage ("bereits am … hochgeladen, erneut?"). Der Upload gibt external_id = training.Id mit, damit Strava Duplikate selbst ablehnt.

Grenze: ErControl weiß nur, was es selbst hochgeladen hat. Wurde die Aktivität in Strava danach gelöscht, steht hier weiter "hochgeladen". Eine Prüfung per Abruf wäre den zusätzlichen API-Verkehr nicht wert.

JH Von Julius Haman vor 19 Tagen aktualisiert Aktionen #1

  • Zielversion wurde von Später zu ErControl 3.1.9 geändert

JH Von Julius Haman vor 19 Tagen aktualisiert Aktionen #2

JH Von Julius Haman vor 19 Tagen aktualisiert · Edited Aktionen #3

Test gegen das echte Strava (2026-10-13)

Funktioniert:

  • Verbinden mit der Freigabe im Browser, Rückkehr an http://localhost:<Port>/exchange_token mit der Callback-Domain localhost (wechselnder Port wird akzeptiert).
  • Upload eines Trainings; die Aktivität erscheint bei Strava mit der Strecke auf der Karte.

Untersuchung: Karte nicht verschiebbar, kein Punkt auf der Karte beim Überfahren des Höhenprofils

Die exportierte FIT-Datei von Training #9 (topographisch, 1823 s, 11,56 km) wurde ausgelesen:

  • 1824 Datensätze, genau einer je Sekunde, alle mit Position (Breite/Länge), keine doppelten Zeitstempel.
  • Distanz steigt durchgehend, nie rückwärts; größter Positionssprung zwischen zwei Sekunden 23,7 m, keiner über 100 m.
  • Höhe 3 bis 215 m, Geschwindigkeit nie leer, FIT-Prüfsumme gültig.

Dieselbe Datei von Hand bei Strava hochgeladen verhält sich gleich, ebenso fremde öffentliche GPS-Aktivitäten. Das ist also eine Eigenschaft der Strava-Webseite bzw. des Browsers und kein Fehler im Export oder im Upload. Nichts zu tun.

Noch zu prüfen: Sportart, Name und Notiz bei Strava, Duplikaterkennung (zweiter Upload desselben Trainings), automatischer Upload nach dem Training. Danach Testaktivitäten bei Strava löschen und das Abo kündigen.

JH Von Julius Haman vor 19 Tagen aktualisiert Aktionen #4

  • % erledigt wurde von 0 zu 90 geändert

JH Von Julius Haman vor 18 Tagen aktualisiert Aktionen #5

  • Status wurde von Neu zu Erledigt geändert
Aktionen

Auch abrufbar als: PDF Atom