From da9c1e04cb21f6853eb89e21c8bf5107141abac1 Mon Sep 17 00:00:00 2001 From: owain Date: Sun, 7 Jun 2026 15:26:54 +0100 Subject: [PATCH] Body --- 2026-06-04.zip | Bin 0 -> 35808 bytes .../app/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 143 bytes backend/app/__pycache__/main.cpython-313.pyc | Bin 0 -> 10495 bytes .../__pycache__/activities.cpython-313.pyc | Bin 0 -> 14827 bytes .../api/__pycache__/routes.cpython-313.pyc | Bin 0 -> 24033 bytes backend/app/api/health.py | 5 +- .../models/__pycache__/user.cpython-313.pyc | Bin 0 -> 11572 bytes backend/app/models/user.py | 5 +- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 152 bytes .../__pycache__/route_matcher.cpython-313.pyc | Bin 0 -> 15426 bytes .../wellness_parser.cpython-313.pyc | Bin 0 -> 13990 bytes backend/app/services/garmin_connect_sync.py | 73 ++++++++++++++++++ .../workers/__pycache__/tasks.cpython-313.pyc | Bin 0 -> 30646 bytes .../components/activity/MetricTimeline.jsx | 2 +- frontend/src/pages/HealthPage.jsx | 34 +++++--- 15 files changed, 104 insertions(+), 15 deletions(-) create mode 100644 2026-06-04.zip create mode 100644 backend/app/__pycache__/__init__.cpython-313.pyc create mode 100644 backend/app/__pycache__/main.cpython-313.pyc create mode 100644 backend/app/api/__pycache__/activities.cpython-313.pyc create mode 100644 backend/app/api/__pycache__/routes.cpython-313.pyc create mode 100644 backend/app/models/__pycache__/user.cpython-313.pyc create mode 100644 backend/app/services/__pycache__/__init__.cpython-313.pyc create mode 100644 backend/app/services/__pycache__/route_matcher.cpython-313.pyc create mode 100644 backend/app/services/__pycache__/wellness_parser.cpython-313.pyc create mode 100644 backend/app/workers/__pycache__/tasks.cpython-313.pyc diff --git a/2026-06-04.zip b/2026-06-04.zip new file mode 100644 index 0000000000000000000000000000000000000000..e310848069f57a86d8f2b86b8e8e8af2e63f0288 GIT binary patch literal 35808 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 literal 0 HcmV?d00001 diff --git a/backend/app/__pycache__/main.cpython-313.pyc b/backend/app/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05011ed7498890a78687c84ebbe887e3bcf0bf4c GIT binary patch literal 10495 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 NxRmHJmr``r{ug1L9H#&P literal 0 HcmV?d00001 diff --git a/backend/app/api/__pycache__/activities.cpython-313.pyc b/backend/app/api/__pycache__/activities.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fd0da4e024077a1e74f2752b031af8bb9f596dc GIT binary patch literal 14827 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 literal 0 HcmV?d00001 diff --git a/backend/app/api/health.py b/backend/app/api/health.py index 9cf18ec..b72c903 100644 --- a/backend/app/api/health.py +++ b/backend/app/api/health.py @@ -144,8 +144,9 @@ async def intraday_health( ) metric = result.scalar_one_or_none() return { - "hr_values": metric.intraday_hr if metric else None, - "body_battery": metric.body_battery if metric else None, + "hr_values": metric.intraday_hr if metric else None, + "body_battery": metric.body_battery if metric else None, + "body_battery_hires": metric.body_battery_hires if metric else None, } diff --git a/backend/app/models/__pycache__/user.cpython-313.pyc b/backend/app/models/__pycache__/user.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13c219ae8069b18dbe56c6f51c54f3c3b56a79a5 GIT binary patch literal 11572 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 K{Rh6|asM0fak6Lt literal 0 HcmV?d00001 diff --git a/backend/app/services/garmin_connect_sync.py b/backend/app/services/garmin_connect_sync.py index b9a567f..e8b275e 100644 --- a/backend/app/services/garmin_connect_sync.py +++ b/backend/app/services/garmin_connect_sync.py @@ -258,12 +258,19 @@ def sync_wellness(garmin, user_id: int, since: Optional[datetime], db, row["body_battery"] = _json.dumps(bb) # Intraday heart rate — store non-null [epoch_ms, bpm] pairs + intraday = None if hr_raw: raw_vals = hr_raw.get("heartRateValues") or [] intraday = [[int(ts), int(v)] for ts, v in raw_vals if v is not None] if intraday: row["intraday_hr"] = intraday + # High-resolution body battery derived from BB checkpoints + intraday HR + if bb and intraday: + hires = _compute_body_battery_hires(bb.get("values") or [], intraday) + if hires: + row["body_battery_hires"] = _json.dumps(hires) + if not row: continue @@ -351,6 +358,72 @@ def _parse_body_battery(bb_response, day_str: str): } +def _compute_body_battery_hires(bb_values, intraday_hr): + """ + Produce a higher-resolution body battery series by interpolating between + sparse BB checkpoints using intraday HR as a proxy for effort. + + During drain segments (BB falling) the drain is distributed proportionally + to how much each HR reading exceeds the day's median — peaks spend battery + faster than valleys. During recovery segments (BB rising) recovery is + spread uniformly over time. + + Returns [[ts_ms, level], ...] at the granularity of intraday HR, or None + if inputs are insufficient. + """ + if not bb_values or not intraday_hr or len(bb_values) < 2: + return None + + bb = sorted(bb_values, key=lambda x: x[0]) + hr = sorted(intraday_hr, key=lambda x: x[0]) + + hr_vals = [bpm for _, bpm in hr if bpm is not None and bpm > 0] + if not hr_vals: + return None + + hr_median = sorted(hr_vals)[len(hr_vals) // 2] + + result = [] + for i in range(len(bb) - 1): + t1, L1 = bb[i][0], bb[i][1] + t2, L2 = bb[i + 1][0], bb[i + 1][1] + delta = L2 - L1 + + seg_hr = [(ts, bpm) for ts, bpm in hr if t1 <= ts <= t2 and bpm is not None] + result.append([t1, round(float(L1), 1)]) + + if not seg_hr or abs(delta) < 1: + continue + + if delta < 0: + # Drain: weight each reading by HR above median + efforts = [max(0.0, bpm - hr_median) for _, bpm in seg_hr] + total = sum(efforts) or 1.0 + cumul = 0.0 + for j, (ts, bpm) in enumerate(seg_hr): + cumul += efforts[j] * delta / total + level = max(0.0, min(100.0, L1 + cumul)) + result.append([ts, round(level, 1)]) + else: + # Recovery: linear over time + span = max(1, t2 - t1) + for ts, _ in seg_hr: + frac = (ts - t1) / span + level = max(0.0, min(100.0, L1 + delta * frac)) + result.append([ts, round(level, 1)]) + + result.append([bb[-1][0], round(float(bb[-1][1]), 1)]) + + # Deduplicate and sort + seen, out = set(), [] + for item in sorted(result, key=lambda x: x[0]): + if item[0] not in seen: + seen.add(item[0]) + out.append(item) + + return out if len(out) > 4 else None + + def _safe(fn, *args): try: return fn(*args) diff --git a/backend/app/workers/__pycache__/tasks.cpython-313.pyc b/backend/app/workers/__pycache__/tasks.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc77078a640115f15aa65a3efc75fcba021c2ace GIT binary patch literal 30646 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.unit})} - + ({ - t: ts, - level, - type: type ?? 4, - bar: 100, + // Background bars use the raw checkpoint type codes to colour activity segments. + const bgData = (values || []).map(([ts, , type]) => ({ t: ts, type: type ?? 4, bar: 100 })) + + // Line uses hi-res data when available, otherwise the raw checkpoints. + const lineData = hiresValues?.length + ? hiresValues.map(([ts, level]) => ({ t: ts, level })) + : (values || []).map(([ts, level]) => ({ t: ts, level })) + + // Merge into a single dataset keyed by timestamp so both series share the same XAxis. + const tsSet = new Set([...bgData.map(d => d.t), ...lineData.map(d => d.t)]) + const bgMap = Object.fromEntries(bgData.map(d => [d.t, d])) + const lineMap = Object.fromEntries(lineData.map(d => [d.t, d])) + const chartData = [...tsSet].sort((a, b) => a - b).map(t => ({ + t, + bar: bgMap[t]?.bar ?? null, + type: bgMap[t]?.type ?? null, + level: lineMap[t]?.level ?? null, })) - const presentTypes = [...new Set(chartData.map(d => d.type))] + const presentTypes = [...new Set(bgData.map(d => d.type))] const levelColor = bbLevelColor(end_level) return ( @@ -113,12 +125,13 @@ function BodyBatteryChart({ bb }) { format(new Date(ts), 'HH:mm')} interval={Math.max(1, Math.floor(chartData.length / 6))} /> + format(new Date(ts), 'HH:mm')} formatter={(v, name) => name === 'level' ? [`${Math.round(v)}`, 'Battery'] : null} /> {chartData.map((d, i) => ( - + ))}

📊

@@ -334,7 +347,7 @@ function DailySnapshot({ day, avg30, intradayHr, bodyBattery, onOlder, onNewer, )} - + )} @@ -580,6 +593,7 @@ export default function HealthPage() { avg30={summary?.avg_30d} intradayHr={intradayData?.hr_values} bodyBattery={intradayData?.body_battery} + bbHires={intradayData?.body_battery_hires} onOlder={goOlder} onNewer={goNewer} hasOlder={selectedIdx >= 0 && selectedIdx < allDaysSorted.length - 1}