What's Changed
Fixed
daily_sleep.avg_respiration_valuewas aliased to the wrong API field (avgRespirationValue, which never matches a real response) — corrected toaverageRespirationValue, so this field now actually populates instead of always beingNone.lowestRespirationValue/highestRespirationValuewere already correct. (#427)set_blood_pressure()'spulseparameter is now optional (int | None = None) — Garmin Connect's own UI allows saving a blood-pressure entry without a heart-rate value, but the library required one. When omitted,pulseis left out of the outgoing payload entirely rather than sent as a placeholder. (#426, #428)demo.py's local blood-pressure range checks (systolic/diastolic/pulse) didn't matchset_blood_pressure()'s own validation ranges, so a value the demo accepted could still be rejected by the API, and vice versa. All three ranges now match the library exactly (systolic 70-260, diastolic 40-150, pulse 20-250).demo.py's category-menu key dispatch checked the pressed key against a hardcoded whitelist string before checking the real menu — any new uppercase option key (most recently[B]for the new "next scheduled workout" option) silently became unreachable, printing "Invalid selection" even though it was a real, listed menu entry. The whitelist is gone; the existing options-dict lookup right below it is now the sole (and already-correct) source of truth, so this class of bug can't recur.
Added
- New
get_next_scheduled_workout()— returns the earliest upcoming calendar-service workout (today or later), checking the current and next calendar month, sinceget_scheduled_workouts(year, month)already required callers to fetch and merge two months manually for a sensible "what's next" view. Known limitation: this only sees whatever Garmin'scalendar-serviceendpoint has already committed to the visible calendar — for adaptive/Coach training plans, the Garmin Connect app can show upcoming sessions this endpoint doesn't return at all (confirmed live against a real account with an active Coach plan). That fuller view lives behind a different, session-cookie-authenticated API this client doesn't use. Documented on the method. (#429) demo.py: new interactive menu option[B]forget_next_scheduled_workout().
Docs
- README's "Total API Methods" wording corrected from "unique endpoints" to "methods" —
get_next_scheduled_workout()composes two calls to the existingget_scheduled_workoutsendpoint rather than adding a new remote endpoint. Method/category counts updated to 146+ across 14 categories.