Control your Resideo thermostats from Home Assistant. Sign in with the same email and password you use in the First Alert app — Resideo's current app for these thermostats — and that's the whole setup. From then on everything stays in sync in real time: change something on the thermostat or in the app, and Home Assistant sees it a second later.
Note
Home Assistant already ships with a Lyric integration for these thermostats, but it requires a developer account with OAuth API keys — a bit of a headache to set up — and it updates by polling. This one uses your regular credentials and streams changes in real time.
Important
This works with thermostats you manage in the First Alert app — ElitePRO S1200, X8S, T9/T10, and T5/T6. It does not reach older Lyric-branded thermostats (like the Lyric Round), which live on a separate Resideo system. And if Resideo hasn't yet moved your account to its newer login, sign-in is rejected even with the right password. Supported devices explains both — and how to fix them.
A heads-up on Resideo's confusing app names: the current app for these thermostats is First Alert. The app now called Resideo on your phone (it used to be Honeywell Home) is the older one, on the system this integration can't use. When setup asks for a login, it means your First Alert account.
Each thermostat becomes a Home Assistant device, and every wireless room sensor gets one too. Entities only appear when your hardware actually supports them — no dead tiles.
| Entity | Type | Notes |
|---|---|---|
| Thermostat | climate |
Current temperature & humidity; heat / cool / off (+ auto where supported); target temperature or range; fan Auto / Circulate / On; presets None / Temporary hold / Permanent hold |
| Indoor / Outdoor temperature | sensor |
Shown in your Home Assistant unit system (°F/°C) |
| Indoor / Outdoor humidity | sensor |
|
| Carbon dioxide, VOC | sensor |
Air-quality models only |
| Connectivity | binary_sensor |
Reports Disconnected when the thermostat drops offline |
| Fan, Circulation fan | binary_sensor |
Whether air is moving, and why |
| Adaptive recovery active | binary_sensor |
Pre-heating/cooling ahead of a schedule period |
| Air filter, Fault | binary_sensor |
Complains when something's wrong |
| Feels Like | switch |
Target the perceived (feels-like) temperature instead of the measured one |
| Adaptive recovery | switch |
a.k.a. Smart Response |
| Schedule | switch |
Follow or ignore the programmed schedule |
| Emergency heat | switch |
Shown only when the thermostat reports emergency-heat support |
| Heat/Cool setpoint min & max | number |
Guardrails for the setpoint range |
| Freeze protection floor | number |
A 35–45 °F "pipes shall not freeze" floor |
The nerd drawer: ~45 diagnostic entities, if you're into that
Heat/Cool setpoint, Hold status, Equipment status, Demand, Current stage, Air / CO2 / VOC / Humidity quality, Schedule period / day / type, Backlight, Room priority, Air filter remaining, Firmware (+ status, last updated), Faults, Signal strength, Heat/cool mode, Fan reason, Demand response, Adaptive recovery mode, Ventilation & ventilation-boost timers, Language, Registered, Heating/Cooling system & stages, Temperature units, Matter status, Priority status — plus Vacation hold, Freeze protection, Away mode, and Commercial mode binary sensors.
| Entity | Type | Notes |
|---|---|---|
| Temperature, Humidity | sensor |
Per-room readings the thermostat averages |
| Carbon dioxide, VOC | sensor |
Air-quality sensor models only |
| Motion, Occupancy | binary_sensor |
|
| Exclude motion / Exclude temperature | switch |
Drop this room from occupancy/averaging |
| Occupancy sensitivity | select |
Takes effect at the sensor's next check-in (battery life comes first) |
| Battery, Signal strength, Status | sensor |
Diagnostic |
The one-click way:
The clicking-around way:
- HACS → Integrations → ⋮ → Custom repositories → add
https://github.com/sfcodes/ha-resideo, category Integration. - Install Resideo, then restart Home Assistant.
No HACS? The copy-paste classic
Copy custom_components/resideo/ from the latest release into your Home Assistant
config/custom_components/ directory and restart. The integration is fully self-contained —
the async API client (aioresideo) is vendored inside it, and the only runtime dependency is
aiohttp, which Home Assistant already provides.
Or: Settings → Devices & Services → Add Integration → Resideo. Sign in however you like:
- Email and password — the same login you use in the First Alert app (sent only to Resideo's own sign-in endpoint; only the resulting refresh token gets stored). Try this first.
- Sign in with your browser — opens Resideo's own sign-in page so you log in there instead, then you paste the redirect back. Slower, but it's the one that works when Resideo's bot detection blocks the direct login (see Troubleshooting).
- Refresh token — already have an Auth0 refresh token and prefer pasting to typing? Go for it.
Picking one isn't a commitment: any failed attempt puts you back on this list, with an explanation of what went wrong, so you can switch paths without restarting setup.
One entry per account — adding the same account twice gets politely rejected. And if the token ever dies (password change, revocation), you get a re-authentication prompt instead of a silently broken integration.
This integration is cloud_push: after one REST bootstrap against Resideo's
native API at api.ha.resideo.com (the same backend the First Alert app uses), it parks on a persistent
Azure SignalR stream — so thermostat, app, and schedule changes land in Home Assistant in
~1–3 seconds, including the ones someone makes on the wall. Your own commands show up
instantly (optimistically), get confirmed by the stream, then double-checked by a quiet
reconcile — no flicker, no stale values.
If the stream can't be established, setup fails and retries — there's no polling fallback; this integration simply doesn't poll.
Sign in with your First Alert account — Resideo's current app for these thermostats. Confusingly, that is not the app now called Resideo on your phone (it used to be Honeywell Home), which is the older one this integration can't use. Here's each:
|
✅ First Alert — the current app, use this one Google Play · |
❌ Resideo (formerly Honeywell Home) — the older app, can't be used here Google Play · |
If a thermostat shows up in your First Alert app, this integration can drive it. That includes:
| Thermostat | Status |
|---|---|
| ElitePRO S1200 Smart, X8S Smart — with wireless room sensors | ✅ Built and tested against these |
| T9 / T10 Smart and newer models | ☑️ Expected to work — let me know if you try one out |
| T5, T5+, T6, T6R Smart | ☑️ Work when set up in the First Alert app (confirmed by a user running a T5) |
Smoke detectors and other Resideo products aren't supported yet — if you own one and want to help wire it up, contributions are warmly welcome.
There are two reasons it can fail, each with a clear symptom and fix.
1. The thermostat is an older Lyric one. A few Honeywell thermostats — the Lyric Round and other older Lyric-branded units — run on a separate, older Resideo cloud that this integration can't reach. It's not about the model number: a T5 or T6 set up in the First Alert app is fine; a Lyric-branded thermostat is not. The quick test is which app shows it — if it appears in First Alert, it works here. If it only shows in the Resideo app (the one formerly called Honeywell Home), a supported model can be moved over by following Resideo's instructions; a Lyric-branded one can't, so use Home Assistant's built-in Lyric integration for those.
Symptom: sign-in succeeds, then setup fails with "No supported thermostats in this Resideo account."
2. Your account is on Resideo's older login. The First Alert app uses a newer login, and the old one — behind the Resideo app (formerly Honeywell Home) — is a completely separate sign-in. Until your thermostat is moved over, the same email and password that work in the old app are rejected here. Fix: move it to the First Alert app by following Resideo's own guide, Switching from the Resideo app to the First Alert app, then sign in here again.
Symptom: sign-in is rejected, even though the password is definitely right.
Note
Total Connect Comfort (older thermostats) and Total Connect 2.0 (security systems) are separate Resideo products with their own accounts — not the same login. Those credentials won't work here.
Something acting up? Grab a debug log. Settings → Devices & Services → Resideo → Enable debug logging. (Flip it off again and Home Assistant hands you the captured log.) YAML fans:
logger:
logs:
custom_components.resideo: debugDownload diagnostics. On the integration (or any device) page: ⋮ → Download diagnostics. It's the raw device state plus your account's regional settings (country, locale, time zone), with tokens, serial numbers, MAC addresses, and anything identifying you or your home already scrubbed — perfect for bug reports.
Filing an issue? Bring receipts: the Home Assistant and integration versions, the diagnostics file, and a debug log covering the moment things went sideways.
Sign-in fails with a CAPTCHA. Resideo's sign-in sometimes decides a login looks like a bot and demands a CAPTCHA, which Home Assistant has no way to solve — it will say so. It's not your password; ordinary bad credentials get their own distinct message, so the two are never confused.
The CAPTCHA message comes with the other sign-in methods listed right underneath it, Sign in with your browser first. It hands you Resideo's real sign-in page, you log in there like any other website, and you paste the resulting redirect back into Home Assistant. In practice the CAPTCHA doesn't even appear — Resideo's bot detection is reacting to the headless login, not to you. The step includes click-by-click instructions; the one thing that trips people up is that your browser's Network panel has to be open before you sign in.
Sign-in is rejected, but the same password works in your phone app. Your account is still on Resideo's older login — the one behind the Resideo app (formerly Honeywell Home) — not the newer one the First Alert app and this integration use. Move your thermostat to First Alert by following Resideo's instructions, then sign in here again. See Supported devices for the two setup failures and their fixes.
Setup fails with "No supported thermostats in this Resideo account." Your sign-in worked — the account just holds nothing this integration can drive. The message lists what it did find, which is usually the giveaway; if that list is empty, or your thermostat only shows in the older Resideo app (formerly Honeywell Home), see Supported devices. This one doesn't retry on its own, because it isn't a temporary failure: sort out the account side, then reload the entry.
(Versions up to 0.2.0 reported this as No SignalR-capable thermostat locations found. Same
cause — and that's SignalR, Microsoft's push-messaging service, not anything to do with
infrared.)
"Cannot connect" during setup usually means a firewall or proxy is eating outbound
WebSockets to *.service.signalr.net. The stream isn't optional, so un-block it and try
again.
"Resideo's cloud is refusing requests", and everything went unavailable. Every call is coming back as HTTP 503, and Home Assistant raises a repair notice quoting whatever Resideo's servers said. That response looks identical whether Resideo is having an outage or has simply stopped serving the address this integration uses — so open the First Alert app on your phone, which settles it in seconds. If the app is broken too, it's an outage: wait, and everything comes back on its own. If the app works normally, the endpoint has most likely been retired and you need a newer version of this integration. Resideo did precisely that in September 2026, moving the consumer API to a new host and leaving the old one answering "The API is temporarily down for planned maintenance" indefinitely — which is why the notice never tells you that waiting will help.
Resideo posts confirmed outages at status.resideo.com. Treat a green status page as weak evidence, though: it reported every service operational — "First Alert App" included — right through the September 2026 move, while the retired host had already been refusing every request for well over a day. The phone app is the reliable test.
Warning
Unofficial & reverse-engineered. This integration mimics the mobile app against an undocumented API; Resideo may change or cut off access at any time. Use at your own risk.
- The Resideo cloud speaks Fahrenheit, whatever your thermostat or app displays. Home Assistant converts everything to your configured unit system, so Celsius households see °C throughout — but the handful of °F-native controls (like the freeze-protection floor) step in whole °F.
- Temporary hold only exists while a schedule is enabled and followed; with the schedule off, setpoint changes are permanent holds — exactly like the app.
- Vacation hold and Hold until show up when the device reports them, but can't be started from Home Assistant yet.
Leaving? No hard feelings. Settings → Devices & Services → Resideo → ⋮ → Delete. If you also delete the files, restart afterwards. Devices that vanished from your Resideo account can be removed one-by-one from their device pages.
PRs and bug reports welcome — the setup is the usual:
python -m venv .venv && source .venv/bin/activate
pip install ruff -r requirements.txt -r requirements.test.txt
ruff check .
pytest # tests/aioresideo (client) + tests/resideo (HA integration layer)The vendored client has its own docs in docs/CLIENT.md. The repo doubles
as a local Home Assistant dev instance under config/ (gitignored), with
config/custom_components symlinked to custom_components/ so your edits load live.
Releasing: versioning is driven from manifest.json via bump2version
(.bumpversion.cfg). Run the Release GitHub Action (choose patch/minor/major) — it runs
the tests, bumps the version, pushes a vX.Y.Z tag, and drafts a GitHub Release. HACS installs
from releases.
MIT. Go build something cozy.