Feature #163
geschlossenStrava: Trainings automatisch hochladen
90%
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, Scopeactivity:write), Formate FIT/TCX/GPX. Verarbeitung ist asynchron: danachGET /uploads/{id}pollen, bisactivity_idgesetzt ist. - Die vorhandenen Exporte
TrainingExportService.ExportFitundExportTcxliefern 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 |
StravaUploadServiceinErControl.Core/ServicesnebenTrainingExportService: exportiert das Training als FIT in eine Temp-Datei, lädt hoch, polltGET /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 hatStravaUploadedAt(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.Idmit, 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
- Zielversion wurde von Später zu ErControl 3.1.9 geändert
JH Von Julius Haman vor 19 Tagen aktualisiert
- Beschreibung aktualisiert (Vergleich)
JH Von Julius Haman vor 19 Tagen aktualisiert · Edited
Test gegen das echte Strava (2026-10-13)¶
Funktioniert:
- Verbinden mit der Freigabe im Browser, Rückkehr an
http://localhost:<Port>/exchange_tokenmit der Callback-Domainlocalhost(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
- % erledigt wurde von 0 zu 90 geändert
JH Von Julius Haman vor 18 Tagen aktualisiert
- Status wurde von Neu zu Erledigt geändert