Garmin Connect for Home Assistant: 130 sensors pulled from a cloud account
This Garmin Connect integration allows you to expose and upload data from and to Garmin Connect to Home Assistant.
At a glance
- What is it?
- The Garmin Connect integration for Home Assistant polls the Garmin cloud on a schedule and exposes health, training and activity data as sensors, with nine coordinators running in parallel. It is a cloud API integration rather than a direct device link, which shapes both what it can show and how fresh it is.
- Who is it for?
- Adopt the Garmin Connect integration if you want your Garmin history inside Home Assistant for dashboards, automations or a long term record, and you are happy to poll a cloud service on a schedule. Do not adopt it if you need realtime data, because the update path runs through the Garmin cloud and a device that has not synced has nothing to report.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
A cloud integration, not a device link
The Garmin Connect integration connects your Garmin Connect cloud service to Home Assistant, enabling users to monitor their health and fitness data from Garmin wearable devices directly in Home Assistant.
The wording matters, because it determines what the integration can and cannot do. This talks to the Garmin servers, not to your watch. Your watch syncs to Garmin Connect, Garmin Connect serves the data over its API, and this integration polls that API. The README states the tip directly: Garmin devices sync to Garmin Connect when in Bluetooth range of the paired phone or via WiFi, and sensors update after your device syncs to Garmin Connect and the integration polls for new data.
So there are two independent lags. The first is the device to cloud sync, which depends on your watch being near your phone or on WiFi. The second is the cloud to Home Assistant poll. Neither is under the integration's control, and a user looking at a stale number is usually looking at the first lag rather than a broken poll.
The prerequisites are short: a Garmin Connect account, at least one Garmin device synced to that account, and access to your authentication method during setup if you have MFA enabled.
The project is MIT licensed, written in Python, with the integration living under custom_components/, and the last push was on 2026-10-20. Releases are steady: 3.0.20 on 2026-10-16, 3.0.19 on 2026-09-29 and 3.0.18 on 2026-09-18.
Nine coordinators pull in parallel, and the poll interval is configurable
The integration uses cloud polling to fetch data from Garmin Connect servers, and the data is refreshed based on the configured scan interval, with a default of 5 minutes.
The interval is a single option, listed in the options table with a default of 300 seconds and a range of 60 to 3600 seconds. It is set after setup through the integration's Configure button. The range is worth understanding: at the bottom of it you poll once a minute, which is frequent for a cloud API that has no push mechanism, and at the top you poll roughly every hour, which is the sort of setting you choose for a rate limit you are worried about rather than for freshness.
Underneath, nine independent coordinators fetch data in parallel. The Core coordinator takes steps, distance, calories, heart rate, stress, sleep, body battery, SpO2, respiration and intensity. Activity takes the last activity, recent activities and workouts. Training takes training readiness and status, HRV, lactate threshold, endurance and hill scores, and power-to-weight and FTP by sport. Body takes weight, BMI, body fat, muscle mass, hydration and fitness age. Goals takes active and future goals, goal history, badges and user points. Gear takes shoes, bikes, and equipment usage and distance. Blood Pressure takes systolic, diastolic and pulse. Menstrual takes cycle phase, day and fertile window. And Nutrition takes consumed calories and macros, goals and a per-meal breakdown.
Splitting the work this way is a practical design choice. Nine coordinators mean a slow or failing endpoint for one data category does not hold up the others, and each can be reasoned about on its own.
The sensor list runs to 130 and is grouped by what you might want to automate
The integration provides 130 or more sensors, and the README groups them by the kind of question you would ask of them.
The daily health metrics are steps, distance, floors climbed and calories burned. Heart rate monitoring covers resting, min, max and 7-day average heart rate. HRV covers status, weekly and nightly averages, and baseline metrics. Stress tracking gives average and max levels with duration breakdowns. Sleep analysis gives total sleep, deep, light and REM sleep, a sleep score, sleep need, and bedtime and wake targets. Body Battery gives the current level and the charged and drained values. Body composition gives weight, BMI, body fat, muscle mass, bone mass and hydration.
Training metrics include training readiness, training status, lactate threshold, endurance and hill scores, and power-to-weight and FTP by sport. Activities and workouts give the last activity, a recent activities list and workout tracking. Goals and badges give active and future goals, goal history and earned badges. Blood pressure gives systolic, diastolic and pulse. Menstrual cycle tracking gives cycle phase, day and fertile window. Gear tracking gives dynamic sensors for shoes, bikes and other equipment. Hydration gives daily intake, goals and sweat loss.
Two of those groups carry a caveat in the README, and they are the ones to check before you build an automation on them. Menstrual cycle and nutrition sensors are disabled by default and have to be enabled in the entity settings, and the nutrition coordinator is marked as Connect+ only and disabled by default.
The structure of the entities is simple. All sensors are created under a single Garmin Connect device, and entity IDs follow the pattern sensor.garmin_connect_[sensor_name]. The README also notes that most sensors are enabled by default, and that sensor values depend on your Garmin devices and connected apps, so not all data may be available for your account.
Installing through HACS or by copying a directory
There are two install routes, and HACS is the recommended one.
With HACS, you open your Home Assistant instance and add the repository inside the Home Assistant Community Store, using the HACS repository link for this project. The manual alternative is a five step sequence: install HACS if you have not already, search for Garmin Connect in HACS, click Download, restart Home Assistant, and add the integration via Settings and Devices and Services.
The manual file installation is even shorter and works without HACS. You copy the custom_components/garmin_connect directory to your config's custom_components directory, restart Home Assistant, and add it the same way.
Then the configuration itself is five steps. Navigate to Settings and Devices and Services, click the Add Integration button, search for Garmin Connect, enter your Garmin Connect email and password, and if MFA is enabled, enter the verification code when prompted.
That last step is the one worth planning for. The integration authenticates as your Garmin account, and a multifactor code is requested during setup rather than being handled in the background, so you need your phone or your authenticator to hand at the moment you add the integration. The repository has a hacs.json for the HACS metadata and a custom_components/ directory alongside it, which is the layout Home Assistant expects for a custom component.
The Python side is small and pinned hard
The dependency list is short and unusually exact, which is the right call for a Home Assistant custom component.
homeassistant>=2026.10.0
ha-garmin==0.1.52
colorlog==6.12.0
setuptools==84.0.0The first entry sets a floor on the Home Assistant version, and the second is the library that talks to Garmin, pinned to an exact version because that is the layer where a Garmin API change would break the integration. The last two are pinned exactly as well.
The tooling configuration in pyproject.toml shows the level of rigour. The pytest configuration sets testpaths to the tests directory and uses asyncio_mode auto, which is the right setting for a component with many concurrent coordinators. Mypy is configured for Python 3.14 with check_untyped_defs and warn_return_any on, so untyped function bodies are still checked. Ruff targets py314 with a line length of 100 and a rule set that includes the pycodestyle, pyflakes, isort, naming, pyupgrade, bugbear and comprehensions groups, ignoring the line length error because the formatter handles it. Coverage is measured over custom_components, and codespell is configured to skip the web directory.
The repository also has a .devcontainer.json, a .coderabbit.yaml, a SECURITY.md, a CLAUDE.md, separate requirements files for runtime and for linting, and a scripts/ directory. The separation of requirements.txt and requirements_lint.txt is a small sign of a project that keeps its linting dependencies out of what Home Assistant installs.
What this integration is not for
It is worth being clear about the alternative approaches, because the cloud polling shape rules some of them out.
Any alternative that skips the cloud would have to reach the watch directly, and this integration does not do that: it polls the Garmin servers. The cloud poll gives you history that the Garmin servers already have, including a body battery series and a training readiness history that are generated server side.
That history is the real value here. Body Battery, training readiness, HRV baselines and 7-day averages are the kind of numbers that only exist because Garmin computes them over time on their servers, and a local link would not give you those.
The cost is the dependency on a third party service that has no public API contract, on an account whose MFA prompt you will meet at setup, and on a scan interval that is a compromise between freshness and politeness. When Garmin changes its API, the integration is the thing that breaks, and the ha-garmin dependency is pinned to an exact version for that reason.
There is also a manual alternative that is worth naming for anyone who only wants one or two numbers. Home Assistant can fetch a URL with a REST sensor, so if you can find an endpoint that returns a single value, a short REST configuration could pull it. That is fine for a one-off, and it is unmaintained by definition, which is the trade you make when you skip the integration.
Editorial conclusion
Adopt the Garmin Connect integration if you want your Garmin history inside Home Assistant for dashboards, automations or a long term record, and you are happy to poll a cloud service on a schedule. Do not adopt it if you need realtime data, because the update path runs through the Garmin cloud and a device that has not synced has nothing to report. Before you install, check the scan interval option, which runs from 60 to 3600 seconds with a default of 300, and remember that the integration needs your Garmin account password and, if you have MFA enabled, access to your authentication method during setup.
Frequently asked questions
How do I install the Garmin Connect integration in Home Assistant?
The recommended route is HACS: add the repository inside the Home Assistant Community Store, search for Garmin Connect, download it, restart Home Assistant, then add it via Settings and Devices and Services. Alternatively, copy custom_components/garmin_connect into your config's custom_components directory and restart.
How often does the Garmin Connect integration update its data?
It uses cloud polling, with a scan interval option that defaults to 300 seconds and accepts values from 60 to 3600 seconds. Nine independent coordinators fetch their data in parallel, covering core metrics, activity, training, body, goals, gear, blood pressure, menstrual and nutrition.
Why are some Garmin Connect sensors missing in Home Assistant?
Menstrual cycle and nutrition sensors are disabled by default and have to be enabled in the entity settings, and the nutrition coordinator is marked as Connect+ only. The README also notes that sensor values depend on your Garmin devices and connected apps, so not all data may be available for your account.
Does the Garmin Connect integration need multi-factor authentication set up?
You enter your Garmin Connect email and password during setup, and if MFA is enabled on your account you enter the verification code when prompted. The prerequisites therefore include access to your authentication method at the moment you add the integration.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/cyberjunky-home-assistant-garmin-connect)Was this useful?