What's Changed
New Features
- Added
get_functional_threshold_power_range(start, end, *, sport="RUNNING", aggregation="daily")for querying historic functional threshold power / FTP over a date range. (#404 by @rifusaki) get_lactate_threshold(latest=False)now reuses the new FTP range helper, removing the previously duplicated inline endpoint construction while keeping the same return shape.
Bug Fixes
get_spo2_data()now normalizeslastSevenDaysAvgSpO2fromstrtofloatwhen Garmin returns it as a string. (#406)- Fixed the widget/MFA login strategy to explicitly request OTP delivery, resolving flows where the MFA state was shelved and later strategies were skipped. (#386)
- Golf shot data (
get_golf_shot_data) now falls back to returning all 18 holes when the request includes double-digit holes (10–18), because Garmin's endpoint drops them from filtered queries. (#377)
Documentation & Demo
- Added a Golf section to the README with the hole-number behavior explained.
- Documented that
get_sleep_data()returns Garmin's rawsleepStartTimestampLocal/sleepEndTimestampLocalvalues, which can be offset by the timezone twice for some accounts (e.g. China/UTC+8); use the*GMTfields and convert locally. (#405) - Updated README API coverage statistics and bumped the method count.
- Added
get_functional_threshold_power_rangeto the interactivedemo.pyunder Advanced Health Metrics.
Internal
- Aligned the new FTP range method's parameter names and validation with the other range helpers:
start/endstrings, required end date, and_validate_date_range(). - Minor style fix in
demo.pydispatcher forruff formatconsistency.
Full Changelog: 0.3.8...0.3.9