aiogarmin
Async Python client for Garmin Connect API, designed for Home Assistant integration.
Features
- Fully async using the native Garmin Connect API
- Robust authentication with multiple login strategies and automatic fallback
- MFA support with automatic endpoint fallback
- Token persistence - save and restore sessions to avoid re-login
- Automatic token refresh - proactively refreshes before expiry
- Retry with backoff for rate limits (429) and server errors (5xx)
- Midnight fallback - automatically uses yesterday's data when today isn't ready yet
- Coordinator-based fetch - optimized data fetching for Home Assistant multi-coordinator pattern
- Data transformations - automatic unit conversions (seconds→minutes, grams→kg)
Installation
pip install aiogarmin
Optional: install with improved browser UA generation:
pip install aiogarmin[ua]
Usage
import asyncio
import aiohttp
from datetime import date
from aiogarmin import GarminClient, GarminAuth
async def main():
async with aiohttp.ClientSession() as session:
auth = GarminAuth()
# Load saved session from disk
if not auth.load_session(".garmin_tokens.json"):
await auth.login("email@example.com", "password")
# Handle MFA if required
if not auth.is_authenticated:
mfa_code = input("Enter MFA code: ")
await auth.complete_mfa(mfa_code)
auth.save_session(".garmin_tokens.json")
client = GarminClient(session, auth)
today = date.today()
core_data = await client.fetch_core_data(today) # Steps, HR, sleep, stress
body_data = await client.fetch_body_data(today) # Weight, body composition, fitness age
activity_data = await client.fetch_activity_data(today) # Activities, workouts
training_data = await client.fetch_training_data(today) # HRV, training status
goals_data = await client.fetch_goals_data() # Goals, badges
gear_data = await client.fetch_gear_data() # Gear, device alarms
For Home Assistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
session = async_get_clientsession(hass)
auth = GarminAuth()
auth.load_session(config_dir / "garmin_tokens.json")
client = GarminClient(session, auth)
core_data = await client.fetch_core_data(target_date=date.today())
body_data = await client.fetch_body_data(target_date=date.today())
Coordinator Fetch Methods
Optimized methods that group related API calls for Home Assistant coordinators:
| Method | API Calls | Data Returned |
|---|---|---|
fetch_core_data() |
3 | Steps, distance, calories, HR, stress, sleep, body battery, SPO2 |
fetch_body_data() |
3 | Weight, BMI, body fat, hydration, fitness age |
fetch_activity_data() |
4+ | Activities, workouts, HR zones, polylines |
fetch_training_data() |
7 | Training readiness, status, HRV, lactate, endurance/hill scores |
fetch_goals_data() |
4 | Goals (active/future/history), badges, user level |
fetch_gear_data() |
4+ | Gear items, stats, device alarms |
fetch_blood_pressure_data() |
1 | Blood pressure measurements |
fetch_menstrual_data() |
2 | Menstrual cycle data |
Individual API Methods
| Method | Description |
|---|---|
get_user_profile() |
User profile info |
get_user_summary() |
Daily summary (steps, HR, stress, body battery) |
get_daily_steps() |
Steps for date range |
get_body_composition() |
Weight, BMI, body fat |
get_fitness_age() |
Fitness age metrics |
get_hydration_data() |
Daily hydration |
get_activities_by_date() |
Activities in date range |
get_activity_details() |
Detailed activity with polyline |
get_activity_hr_in_timezones() |
HR time in zones |
get_workouts() |
Scheduled workouts |
get_training_readiness() |
Training readiness score |
get_training_status() |
Training status |
get_morning_training_readiness() |
Morning readiness |
get_endurance_score() |
Endurance score |
get_hill_score() |
Hill score |
get_lactate_threshold() |
Lactate threshold |
get_hrv_data() |
Heart rate variability |
get_goals() |
User goals by status |
get_earned_badges() |
Earned badges |
get_gear() |
User gear items |
get_gear_stats() |
Gear statistics |
get_gear_defaults() |
Default gear settings |
get_devices() |
Connected devices |
get_device_alarms() |
Device alarms |
get_device_settings() |
Device settings |
get_blood_pressure() |
Blood pressure data |
get_menstrual_data() |
Menstrual cycle data |
get_menstrual_calendar() |
Menstrual calendar |
Data Transformations
The library automatically adds computed fields for convenience:
- Time conversions:
sleepTimeSeconds→sleepTimeMinutes - Activity time:
highlyActiveSeconds→highlyActiveMinutes - Weight:
weight(grams) →weightKg - Stress:
stressQualifier→stressQualifierText(capitalized) - Nested flattening: HRV status, training readiness, scores
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
aiogarmin-0.2.1.tar.gz
(36.5 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
aiogarmin-0.2.1-py3-none-any.whl
(32.5 kB
view details)
File details
Details for the file aiogarmin-0.2.1.tar.gz.
File metadata
- Download URL: aiogarmin-0.2.1.tar.gz
- Upload date:
- Size: 36.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
680fd67bb47fbdcf8f915c93d543f77ffe982ed4a5a7515c47dad3218250e825
|
|
| MD5 |
b97dcaa34dec15f774c8a7295069bc08
|
|
| BLAKE2b-256 |
7ef42fd1b16fb92b28469e366a966ab0fc3fbbfca7fd40e326d12be6a02cfa35
|
File details
Details for the file aiogarmin-0.2.1-py3-none-any.whl.
File metadata
- Download URL: aiogarmin-0.2.1-py3-none-any.whl
- Upload date:
- Size: 32.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b3d3be1a8b55cd054aa36bcb218d39b0bbcb01e5bf9a50de637c82c3a417dfa3
|
|
| MD5 |
85311d98f7d2dbeac9b73435bfb07085
|
|
| BLAKE2b-256 |
96515391a242433fd914c159362b6ec002c59ac0697f9d06907726f1a049b2fe
|