# Aktiviteter, kcal-mätare & mål — plan *Godkänd 2026-08-23. Samma plan finns i brasse-pc.eu-v2: `docs/gym-activities-plan.md` — uppdatera båda vid ändringar.* Cardio/fristående aktiviteter (promenad, jogg, vandring, fäktning/HEMA m.m.) som eget koncept vid sidan av gympass, en daglig kcal-mätare på hemskärmen, mål (dag/vecka/månad) och GPS-livespårning. Kondition markeras med ❤️. ## Grundkoncept - **Pass** (finns): gympass med övningar/set. - **Aktivitet** (nytt): något man gör över tid. Har tid, ev. distans/höjd/ rutt, kcal, ansträngning (RPE) och källa (manuellt/spårat/telefon/import). ### Aktivitetsbibliotek ~60 kurerade aktiviteter från **Compendium of Physical Activities** (publika MET-standarden), seedade i gym-API:t: `key, namnSv, namnEn, met, kategori, isDistanceBased, iconKey, googleFitType`. Google Fit-typmappningen gör framtida import rak. Stadspromenad, jogg, skogsvandring och HEMA/fäktning får tempo-/RPE-justerade MET-kurvor. ### Kcal-modellen Kräver längd/födelseår/kön i API:t (gamla "milstolpe 5" ur `openscale-integration.md` bakas in i etapp 1). - **Passivt:** BMR (Mifflin–St Jeor: `10·vikt + 6.25·längd − 5·ålder + k`, k = +5 man / −161 kvinna), fylls på linjärt över dygnet. - **Aktivt loggat:** gympass (befintlig MET-modell) + aktiviteter (MET × vikt × timmar; distansaktiviteter justeras efter verkligt tempo och höjdmeter, icke-distans efter RPE-slidern). Netto-kcal (MET−1) används så BMR inte dubbelräknas. - **Telefon-auto:** steg + externa pass via **Health Connect**, med dubbelräkningsskydd (steg under egen loggad aktivitet räknas inte). - **RPE-slider:** "ingen ansträngning" → "kan inte prata mer än ett par ord" (talk test) → intensitetsfaktor på aktivitetens MET. - **Aktivitetsgissning:** tempo + höjdprofil ⇒ promenad (<~6,5 km/h)/jogg/ vandring (lågt tempo + höjdmeter); stillastående + timer ⇒ fäktning/HEMA. ### Mätaren på hemskärmen Dagens kcal överst på Hem, tredelad: **aktivt loggat / telefon / passivt**. Mål visas som progress-bars/mätare under. ## Datamodell (gym-API, EF-migrationer körs vid deploy) - `User` + `HeightCm` (double?), `BirthYear` (int?), `Sex` (string? "male"/"female") - `ActivityType` — seedad tabell (se ovan), utökningsbar - `Activity` — Guid id, userId, activityTypeId, startedAt, durationSeconds, distanceMeters?, elevationGainMeters?, estimatedKcal, rpe? (0–10), source (`manual`/`tracked`/`phone`/`imported`), routePolyline? (Google encoded), externalId? (dedup vid import), notes? - `DailySteps` — userId, date, steps (upsert från appen) - `Goal` — metric (`KCAL`/`GYM_SESSIONS`/`STEPS`/`ACTIVITIES`/`DISTANCE_KM`) × period (`DAY`/`WEEK`/`MONTH`), targetValue; max ett mål per metrik+period - GraphQL: `activityTypes`, `activities(from,to)`, `addActivity`/`update`/ `delete`, `upsertDailySteps`, `goals` + `setGoal`/`deleteGoal`, `myProfile`/`updateProfile` (+längd/år/kön), `dailySummary(date)` (kcal-tredelningen serverberäknad så app+webb delar logik) ## Tagna designbeslut (2026-08-23) | Fråga | Beslut | |---|---| | Karta i appen | **osmdroid + OpenStreetMap** (inga nycklar, GPL-vänligt) | | Steg/telefondata | **Health Connect** (även vägen för Google Fit-import) | | Ruttlagring | **Encoded polyline + sammanfattning** på servern | | Aktivitetsbibliotek | **~60 kurerade** ur MET-kompendiet | ## Etapper Leveransordning per etapp: **backend → CI grönt → webb → CI grönt → app → användartest**. Endast ETT Pi5-bygge åt gången — polla CI och vänta hellre för länge. (Path-filter: gym-api triggas av `backend-gym-traker/**`, frontend av `src/**` m.fl., FitnessDroid av varje push till main.) 1. **Profil & kalorigrund** — API: HeightCm/BirthYear/Sex + `updateProfile`. Webb: profilfält. App: kroppsdata synkas mot servern (lokal cache kvar), BMR, kcal-mätare v1 på hemskärmen (passivt + gympass). 2. **Aktiviteter: bibliotek + manuell logg** — API: ActivityType (seed) + Activity CRUD + `dailySummary`. Webb: aktivitetsflik ❤️ (logga/lista/ rätta). App: aktivitetsflik med bibliotek, manuell loggning (tid/distans/RPE), kcal in i mätaren. 3. **Live-spårning (GPS)** — App: starta aktivitet, foreground-service, osmdroid-livekarta, live kcal/distans/tempo/höjdmeter; icke-distansläge (timer + RPE efteråt); aktivitetsgissning; polyline till servern. Webb: Leaflet-karta i aktivitetsdetalj. 4. **Mål & mätare** — API: Goal CRUD. App: målkort med progress på Hem (dag/vecka/månad × kcal/pass/steg/aktiviteter/km). Webb: målinställningar + progress. 5. **Steg & telefondata** — API: DailySteps. App: Health Connect-permissions, daglig stegsynk, auto-aktiviteter från HC ("telefon"-källa), mätarens tredelning komplett. Webb: stegvisning. 6. **Statistik & polish** — ❤️-sektion i statistiken (app+webb): distans/tempo-trender per typ, vecko-km; dokumentation; Google Fit-importens grund (source/externalId/typmappning/HC) verifierad klar. ## Status - [x] Etapp 1 — Profil & kalorigrund *(kod klar 2026-08-23: backend a1cd4d3, webb 560894c, app — väntar på användartest + omdeploy av gym-api/frontend-containrarna)* - [x] Etapp 2 — Aktiviteter: bibliotek + manuell logg *(kod klar 2026-08-23: backend 9a81cf6, webb — aktivitetsflik, app 0.6.0; väntar på användartest)* - [x] Etapp 3 — Live-spårning (GPS) *(klar & fälttestad 2026-08-26: GPS-väntfas, providerlyssning gps/fused/network, fartgrind (Doppler), rörelsevakt (accelerometer), offline-kö, teknisk logg — GPS-filter justerbara i inställningarna)* - [x] Etapp 4 — Mål & mätare *(kod klar 2026-08-26: Goal-modell + goalsWithProgress i API:t, målsektion i webbens aktivitetsflik, målkort med progress-bars på appens hemskärm + målskärm; väntar på användartest)* - [x] Etapp 5 — Steg & telefondata *(kod klar 2026-08-26: DailySteps + upsert i API:t med telefon-kcal (0.00038 kcal/steg/kg, dubbelräkningsskydd mot gång/löp/vandringsaktiviteter), Health Connect-läsning i appen (connect-client 1.1.0-alpha07 — nyare kräver AGP 8.9/SDK 36), aktivering under Inställningar → Stegsynk; webben behövde ingen ändring. Väntar på användartest)* - [ ] Etapp 6 — Statistik & polish Google Fit-importen byggs efter etapp 6 som separat arbete.