From a73172bfc3ea5c892fdf5921b17b2b85d60018fc Mon Sep 17 00:00:00 2001 From: claude Date: Sun, 23 Aug 2026 11:21:29 +0200 Subject: [PATCH] =?UTF-8?q?doc:=20openScale=20milstolpe=201-4=20klara=20+?= =?UTF-8?q?=20README=20(v=C3=A5g,=20GPL)=20+=20version=200.4.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg --- README.md | 16 ++++++++++ app/build.gradle.kts | 2 +- doc/openscale-integration.md | 61 ++++++++++++++++++++++++------------ doc/plan.md | 8 +++-- 4 files changed, 63 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 6bf31d6..819348c 100644 --- a/README.md +++ b/README.md @@ -70,5 +70,21 @@ vid varje push till `main` och lägger den på den rullande `latest`-releasen. Eftersom Googles aapt2 bara finns för x86_64 använder bygget en statiskt byggd arm64-aapt2 via `android.aapt2FromMavenOverride`. +## Bluetooth-våg + +Appen kan hämta vägningar (vikt + muskel/fett/vatten-%) direkt från en +BLE-personvåg med [openScale](https://github.com/oliexdev/openScale)s +drivrutiner (vendrade under `app/src/main/java/com/health/openscale/`). +Koppla vågen under *Inställningar → Bluetooth-våg* och väg dig från profilen. +Först ut: Biltema 84-1002 (PT-727), som är en Exingtech Y1 ("VScale"). +Detaljer: [`doc/openscale-integration.md`](doc/openscale-integration.md). + +## Licens + +GPL-3.0 (se [`LICENSE`](LICENSE)). Relicensierad från och med BT-vågstödet — +openScales drivrutiner är GPL-3.0, vilket kräver att hela appen är det. +BLE-biblioteket [Blessed-Kotlin](https://github.com/weliem/blessed-kotlin) +är MIT. + Mer om arkitektur och planer: [`doc/plan.md`](doc/plan.md) och [wikin](https://gitea.brasse-pc.eu/brasse/FitnessDroid/wiki). diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b1d4fcc..f09ad7a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -29,7 +29,7 @@ android { minSdk = 31 targetSdk = 35 versionCode = ciRunNumber ?: 1 - versionName = "0.3.2" + (ciRunNumber?.let { "+build.$it" } ?: "-dev") + versionName = "0.4.0" + (ciRunNumber?.let { "+build.$it" } ?: "-dev") } signingConfigs { diff --git a/doc/openscale-integration.md b/doc/openscale-integration.md index f15a5d3..3cfd4c4 100644 --- a/doc/openscale-integration.md +++ b/doc/openscale-integration.md @@ -67,34 +67,55 @@ cachas lokalt (som kroppsvikten) för offline och för BIA-beräkningen. **Webb (brasse-pc.eu-v2):** samma fält på profil-fliken via `updateProfile`. +## Användarens våg (identifierad 2026-08-23) + +**Biltema 84-1002 "Bluetooth Analyser Scale", modell PT-727** (Ningbo Putian). +Annonserar som BLE-namnet **"VScale"** (verifierat med `bluetoothctl` på +brasse-linux01: `Device C4:BE:84:79:D0:6C VScale`) → openScales +**`ExingtechY1Handler`** matchar (exakt namnmatch `vscale`). + +Protokoll (GATT): appen skriver `[0x10, userId, kön, ålder, längd_cm]` till +vågen; vågen räknar ut kroppssammansättningen **ombord** och notifierar en +20-bytes-ram (vikt, fett-%, vatten-%, muskel-%, benmassa kg, bukfettsindex). +Ingen BIA-formel behövs i appen — men längd/födelseår/kön måste finnas. + ## Milstolpar (byggbara steg) -1. **Grund + licens + About** — LICENSE → GPL-3.0; `blessed-kotlin`-beroende; - BLE-permissions i manifestet; About-vy under Profil (attribution + länkar + - openetlicens-text); körruntime-permission-flöde. *Ingen vågkod än — bara - att allt kompilerar och About visas.* -2. **Porta bluetooth-paketet** — vendora `com.health.openscale.core.bluetooth` - (ScaleCommunicator, ScaleFactory, scales/, adaptrar, data/, libs/) med - copyright-headers kvar. Slimmad `ScaleMeasurement`/`ScaleUser`. Får det att - kompilera mot Blessed. -3. **Skanna + koppla** — "Anslut våg" i inställningar: skanna BLE, kör - `ScaleFactory` mot varje enhet, visa matchade vågar, spara vald MAC. -4. **Väg dig-flöde** — knapp som skannar/kopplar vald våg, tar emot en - `ScaleMeasurement`, förhandsvisar och sparar via `addBodyMeasurement` - (offline-kön tar resten). Live-status ("står på vågen…"). +1. **Grund + licens + About** *(klar 2026-08-23)* — LICENSE → GPL-3.0; + `blessed-kotlin` 3.0.12 via JitPack (krävde Kotlin 2.0.21→2.2.0, KSP2, + Room 2.7.2); BLE-permissions (`BLUETOOTH_SCAN` neverForLocation + + `BLUETOOTH_CONNECT`); About-vy under Profil med GPL-attribution. +2. **Porta bluetooth-paketet (grund)** *(klar 2026-08-23)* — vendrat + `com.health.openscale.core.bluetooth` med copyright-headers kvar: + ScaleDeviceHandler, Gatt/Broadcast/Spp-adaptrar, ScaleFactory (utan Hilt), + ScaleCommunicator, BleScanner, ConverterUtils, ScaleMeasurement/ScaleUser, + samt **ExingtechY1Handler**. Shims i samma paketnamn för openScales + interna beroenden (facades → DataStore, slimmade enums, LogManager → + logcat), så fler drivrutiner kan portas nästan rakt av. + *Kvar: resterande ~59 handlers + libs/ portas allteftersom.* +3. **Skanna + koppla** *(klar 2026-08-23)* — Inställningar → Bluetooth-våg: + BLE-skanning, vågar med drivrutinsstöd överst (drivrutinsnamn visas), + spara/ta bort vald våg. Runtime-permission-flöde. +4. **Väg dig-flöde** *(klar 2026-08-23, otestat mot fysisk våg)* — knapp i + profilen → väg-skärm med livestatus, resultat och spara via + `addBodyMeasurement`. Kroppsdata (längd/födelseår/kön) i profilen skickas + till vågen. **Nästa steg: verifiera mot Biltema-vågen.** 5. **API: längd (+ ålder/kön)** — utöka gym-API:ts `User` med `HeightCm` (+ `BirthDate`/`Sex`), migration, `myProfile` + `updateProfile`, deploy. - App + webb får profilfält. Se "API-ändring" ovan. -6. **Impedansvågar + bättre kalorier** — BIA-beräkning för vågar som skickar - rå impedans (använder längd/ålder/kön), och BMR-baserad energiförbrukning. - Verifieras mot din våg. + App + webb får profilfält; appens lokala kroppsdata börjar synka mot + API:t. Se "API-ändring" ovan. +6. **Fler drivrutiner + impedansvågar + bättre kalorier** — porta resterande + handlers + `libs/` (BIA-beräkningar för vågar som skickar rå impedans), + och BMR-baserad energiförbrukning. 7. **Polering + docs** — felhantering, timeouts, ominställning av våg; uppdatera README/wiki + infra-Doc (GPL-relicens noterad). ## Öppna frågor / risker -- **Vilken våg du har** avgör om milstolpe 5 (impedans-BIA) behövs eller om - din våg skickar färdiga procent. Identifieras i milstolpe 3 via skanning. -- Blessed-Kotlins exakta koordinater/version verifieras vid milstolpe 1. +- ~~Vilken våg du har~~ → Biltema PT-727 = Exingtech Y1 ("VScale"), räknar + ombord — milstolpe 6:s BIA behövs inte för den. +- ~~Blessed-Kotlins koordinater~~ → `com.github.weliem:blessed-kotlin:3.0.12` + (JitPack). Byggd med Kotlin 2.2 → tvingade upp projektets Kotlin/KSP/Room. - APK växer (drivrutiner + BLE-lib) — troligen någon MB, oproblematiskt. - GPL-relicens är permanent för koden; medvetet val. +- Väg-flödet är obekräftat mot fysisk våg (kräver test med telefon + våg). diff --git a/doc/plan.md b/doc/plan.md index efd3030..c6a82c5 100644 --- a/doc/plan.md +++ b/doc/plan.md @@ -61,9 +61,11 @@ mallar, grunddata och profil. mätningar från profilen med datumväljare, viktgraf i statistiken med glidande medelvärde och linjär trendlinje. Profilens bodyWeightKg speglar alltid senaste mätningen. -4. **BT-våg via openScale-drivrutiner** *(planerad)* — hämta vägningar - (vikt + %muskler/fett/vatten) direkt från en Bluetooth-våg genom att - bädda in openScales drivrutiner. Kräver relicens till GPL-3.0. Full plan: +4. **BT-våg via openScale-drivrutiner** *(påbörjad 2026-08-23 — milstolpe 1–4 + klara, väntar på fysiskt vågtest)* — hämta vägningar (vikt + + %muskler/fett/vatten) direkt från en Bluetooth-våg genom att bädda in + openScales drivrutiner. Relicensierad till GPL-3.0. Först ut: + Biltema 84-1002 (PT-727) = Exingtech Y1 ("VScale"). Full plan: [`doc/openscale-integration.md`](openscale-integration.md). 5. **Passhistorik** — lista, visa, redigera och ta bort tidigare pass. 4. **Logga lyft (snabbloggning) + PB** — enkel lyftlogg och PB-matrisen.