WattFlow logo
Aanvullend document

WattFlow sequentiediagrammen

Dit document bevat alleen de hoofdflows in sequentievorm. Het is bedoeld als snelle visuele aanvulling op de brede architectuurdocumentatie, zonder alle lange uitleg ertussen.

Leeswijze. De diagrams hieronder zijn bewust operationeel: wie initieert iets, welke service reageert, en waar wordt data of status echt vastgelegd.
Actie of opdracht
Response of status terug
Bevestigde state
Validatie, uitzondering of fallback

1. Scan en trainer verbinden

Dit is de flow die in Instellingen gebeurt wanneer iemand op Scan devices drukt en WattFlow daarna de trainer automatisch probeert te kiezen.

Operator SettingsTabView BluetoothManager CoreBluetooth Smart trainer Tap "Scan devices" scanAllSources() Start scan FTMS advertising seen Registry updated best trainer chosen connectTrainer(id) central.connect() Discover services Services + characteristics FTMS valid, status connected

Wat hierbij belangrijk is

  • De trainer moet echt FTMS hebben. Alleen "lijkt op een trainer" is niet genoeg.
  • De Settings-flow auto-connect momenteel alleen de trainer, niet automatisch alle andere sensoren.
  • De keuze is RSSI-gedreven: de beste zichtbare trainer wint als er niet al een expliciete voorkeur is.

2. Extra sensoren koppelen

Powermeter, cadans en hartslag volgen een vergelijkbare maar strengere flow, omdat WattFlow trainers, speed-only sensoren en echte externe meters uit elkaar moet houden.

Operator SettingsTabView BluetoothManager Device registry Sensor Select source connectPower / Cadence / HR Validate role + capability FTMS block? wheel-only? Reject trainer as PM reject speed-only CSC Connect peripheral Services discovered + notify active UI shows connected / in use

Belangrijkste regels

  • Een trainer mag niet als externe powermeter of als losse cadence source gebruikt worden.
  • Een wheel-only CSC sensor wordt afgewezen als cadence source.
  • HR via trainer is fallback; een directe HR-sensor wint voor RR- en HRV-data.

3. Workout starten en live sturen

Zodra een workout is gekozen, verschuift de regie naar WorkoutSessionEngine. Die engine start de workout, leest live waarden en stuurt de trainer opnieuw per stap of tick.

Operator TrainingenTab AppModel WorkoutSessionEngine BluetoothManager Trainer Choose workout prepareWorkout(...) Create session Bind live signals Start workout startWorkout() Apply current step Set ERG / resistance Live data Power / cadence / HR 1 Hz target update + PowerMatch ActivitySample recorded every second
Variant Wat er verandert in de flow
FTP-modus Workoutpercentages worden direct doelwatts op basis van huidige FTP.
Level-modus De engine rekent met een virtuele FTP en een niveau-factor; live UI toont nadrukkelijk het niveau.
PowerMatch aan De engine corrigeert trainer-targets op basis van externe powermeterfeedback, maar de trainer blijft FTMS-targets ontvangen.
FreeRide In plaats van target watts verstuurt WattFlow een resistance level.

4. Workout afronden en opslaan

Bij het einde van een workout wordt niet alleen de UI bijgewerkt. De app bouwt een volledige activiteit op, maakt exportbestanden en bereidt daarna optioneel syncs voor.

WorkoutSessionEngine AppModel ActivityStore Exporters Apple Health phase = finished buildActivityRecord() Save local activity Write TCX + FIT lastFinishedActivity set FTP suggestion evaluated saveWorkout(payload) if Health sync on Saved or failed, summary remains available
Operator-opmerking. Een workout is in de praktijk al lokaal opgeslagen zodra de sessie finished raakt. De latere knop "klaar" ruimt vooral de sessie op en kan optioneel Strava-upload doen.

5. Strava upload

Upload gebeurt pas na de samenvatting, wanneer de gebruiker opslaat met Strava-upload aan.

Operator WorkoutSummaryView AppModel StravaConnectService Strava API Tap save onSaveWorkout() Prefer FIT upload fallback to TCX uploadFIT() POST /uploads Poll upload status Upload settled Clear session + switch to Historie

6. Strava import

Historie kan ook andersom werken: WattFlow haalt recente Strava-activiteiten op en bouwt ze lokaal opnieuw op.

Operator ActivitiesTabView AppModel StravaConnectService Strava API ActivityStore Open "To import" Fetch candidates fetchImportActivities() GET /activities Candidates Candidates returned List shown Import selected activity importActivity(id) GET activity + streams + laps Save imported local record Activity saved, optional Health sync follows Activity appears in Historie

7. Apple Health sync

Apple Health heeft eigenlijk twee aparte flows: toestemming/inkomend profiel, en uitgaande workout/FTP-sync.

Operator SettingsTabView AppModel AppleHealthService HealthKit Enable Health setAppleHealthSyncEnabled(true) requestAuthorization() requestAuthorization Granted / denied Refresh auth state Refresh profile from Health Read bodyMass + cycling FTP Values returned Apply local weight + FTP Later: workout finish -> saveWorkout(payload) FTP change -> saveCyclingFTP(ftp)

8. Trainerkalibratie

De trainer spin-down is de meest "fysieke" flow in de app: de gebruiker moet echt optrekken en uitrollen, terwijl WattFlow de voortgang bewaakt via FTMS-speed.

Operator Settings UI BluetoothManager Trainer / FTMS Open calibrate Start trainer calibration Request control Start FTMS spin-down FTMS speed updates Phase 1: pedalUp Phase 2: coastDown Phase 3: finished Guidance updated in UI

Bijbehorende bronbestanden

Flow Belangrijkste code
Scannen en verbinden WattFlow/Views/SettingsTabView.swift, WattFlow/Services/BluetoothManager.swift
Workout starten en live sturen WattFlow/AppModel.swift, WattFlow/Services/WorkoutSessionEngine.swift, WattFlow/Services/BluetoothManager.swift
Strava WattFlow/AppModel.swift, WattFlow/Services/StravaConnectService.swift
Apple Health WattFlow/AppModel.swift, WattFlow/Services/AppleHealthService.swift

Deze diagrams zijn een operationele vereenvoudiging van de codeflow op 24 maart 2026. Voor alle randgevallen en routingdetails blijft de hoofdgids leidend.