From 923b5fdb0174626d2dea30d32f32d3bbd3bae511 Mon Sep 17 00:00:00 2001 From: Petru Paler Date: Thu, 15 Jan 2026 14:19:27 +0000 Subject: [PATCH] Fix body battery array parsing - use index 1 not 2 The Garmin API returns bodyBatteryValuesArray as [timestamp, level] tuples (2 elements), not [timestamp, status, level, quality] (4 elements). Was accessing index 2 which doesn't exist, now correctly using index 1. Co-Authored-By: Claude Opus 4.5 --- src/lib/garmin.test.ts | 12 ++++++------ src/lib/garmin.ts | 16 ++++++---------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/lib/garmin.test.ts b/src/lib/garmin.test.ts index 7f58c31..c9f12af 100644 --- a/src/lib/garmin.test.ts +++ b/src/lib/garmin.test.ts @@ -342,9 +342,9 @@ describe("fetchBodyBattery", () => { charged: 45, drained: 30, bodyBatteryValuesArray: [ - [1705190400000, "charging", 25, 1.0], - [1705194000000, "draining", 40, 1.0], - [1705197600000, "charging", 35, 1.0], + [1705190400000, 25], + [1705194000000, 40], + [1705197600000, 35], ], }, { @@ -352,8 +352,8 @@ describe("fetchBodyBattery", () => { charged: 85, drained: 60, bodyBatteryValuesArray: [ - [1705276800000, "charging", 65, 1.0], - [1705280400000, "draining", 85, 1.0], + [1705276800000, 65], + [1705280400000, 85], ], }, ]), @@ -432,7 +432,7 @@ describe("fetchBodyBattery", () => { mockJsonResponse([ { date: "2024-01-15", - bodyBatteryValuesArray: [[1705276800000, "charging", 70, 1.0]], + bodyBatteryValuesArray: [[1705276800000, 70]], }, ]), ); diff --git a/src/lib/garmin.ts b/src/lib/garmin.ts index 2e3329b..a7b0a1c 100644 --- a/src/lib/garmin.ts +++ b/src/lib/garmin.ts @@ -137,31 +137,27 @@ export async function fetchBodyBattery( ); return { current: null, yesterdayLow: null }; } + // Response structure: bodyBatteryValuesArray is [[timestamp, level], ...] + // Confirmed by bodyBatteryValueDescriptorDTOList in API response const data = JSON.parse(text) as Array<{ date: string; - bodyBatteryValuesArray?: Array<[number, string, number, number]>; + bodyBatteryValuesArray?: Array<[number, number]>; }>; - // Debug: log the raw response structure - logger.info( - { rawData: JSON.stringify(data).slice(0, 2000), date, yesterday }, - "Body battery raw API response", - ); - // Find today's and yesterday's data from the response array const todayData = data?.find((d) => d.date === date); const yesterdayData = data?.find((d) => d.date === yesterday); - // Current = last value in today's bodyBatteryValuesArray (index 2 is the level) + // Current = last value in today's bodyBatteryValuesArray (index 1 is the level) const todayValues = todayData?.bodyBatteryValuesArray ?? []; const current = - todayValues.length > 0 ? todayValues[todayValues.length - 1][2] : null; + todayValues.length > 0 ? todayValues[todayValues.length - 1][1] : null; // Yesterday low = minimum level in yesterday's bodyBatteryValuesArray const yesterdayValues = yesterdayData?.bodyBatteryValuesArray ?? []; const yesterdayLow = yesterdayValues.length > 0 - ? Math.min(...yesterdayValues.map((v) => v[2])) + ? Math.min(...yesterdayValues.map((v) => v[1])) : null; logger.info(