All checks were successful
release / build-release (push) Successful in 4m17s
- Statistikfliken: Kondition & aktiviteter-kort för vald period — KPI (antal/distans/tid/kcal), km per vecka-staplar och per typ-lista - README: aktiviteter/kcal-mätare/mål-avsnitt - Version 0.11.0 — hela aktivitetsplanen (etapp 1–6) därmed kodkomplett Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
110 lines
6.7 KiB
Markdown
110 lines
6.7 KiB
Markdown
# 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)*
|
||
- [x] Etapp 6 — Statistik & polish *(kod klar 2026-08-26: konditionssektion ❤️ i både appens och webbens statistik (KPI, km/vecka, per typ), README uppdaterad. Google Fit-importens grund verifierad: source=imported, externalId-dedup, googleFitType-mappning i biblioteket och Health Connect-läsning på plats)*
|
||
|
||
Google Fit-importen byggs som separat arbete — all grund finns: source=imported, externalId-dedup i addActivity, googleFitType-mappning per aktivitetstyp och Health Connect-integrationen i appen.
|