github cyberjunky/python-garminconnect 0.3.9
Release 0.3.9

5 hours ago

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 normalizes lastSevenDaysAvgSpO2 from str to float when 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 raw sleepStartTimestampLocal / sleepEndTimestampLocal values, which can be offset by the timezone twice for some accounts (e.g. China/UTC+8); use the *GMT fields and convert locally. (#405)
  • Updated README API coverage statistics and bumped the method count.
  • Added get_functional_threshold_power_range to the interactive demo.py under Advanced Health Metrics.

Internal

  • Aligned the new FTP range method's parameter names and validation with the other range helpers: start/end strings, required end date, and _validate_date_range().
  • Minor style fix in demo.py dispatcher for ruff format consistency.

Full Changelog: 0.3.8...0.3.9

Don't miss a new python-garminconnect release

NewReleases is sending notifications on new releases.