TL;DR
A native Hubitat driver that controls an ecobee thermostat 100% locally over the HomeKit Accessory Protocol (HAP) — the hub itself acts as the HomeKit controller. No ecobee cloud account, no api.ecobee.com, no Apple TV / HomePod / Home Hub, no Pi or bridge. You pair the hub directly to the thermostat with its 8-digit HomeKit setup code; after that it's all LAN.
As far as I've found, this is the first direct, cloud-free ecobee integration on Hubitat — and it runs on a plain C5 / C7 / C8, not just newer hardware.
What it does (all local, no cloud)
Thermostat control
- Mode: off / heat / cool / auto (including dual-setpoint auto)
- Heating & cooling setpoints, "Set Desired Temperature," raise/lower setpoint
- Fan mode (auto / on) and actual fan-running state (
fanState: inactive / idle / blowing) - Comfort profiles: Set Comfort Profile (Home / Away / Sleep), with a
comfortProfileattribute showing the active one (orHold) - Resume Program, plus a
holdEndsAtattribute (when the current hold/event ends) - Humidifier target (Set Humidity Setpoint)
- Per-profile setpoints exposed as attributes (home/away/sleep heat & cool)
- Alerts/reminders text (
thermostatAlert) - Live temperature, humidity, and operating state
- "Macgyvered" extras built on the driver's own timers: Hold Until (set a profile/temp for N minutes then auto-resume), Boost (nudge the setpoint +/- for N minutes then resume), Fan Run Time (timed blower run to emulate the per-hour fan minimum HomeKit doesn't expose), and derived booleans
onHold/alertActivefor easy rule-gating.
Real-time: a persistent encrypted session with HomeKit event push — changes show up instantly, no polling — and it self-heals (tolerant keepalive watchdog + auto-reconnect).
Sensors: the thermostat's built-in motion/occupancy and any remote room sensors appear as their own child devices (motion, presence, temperature, battery). This keeps the thermostat itself a clean Thermostat (so it still exports to Apple HomeKit) while each sensor exports as its own accessory.
Multiple thermostats: fully supported — run one instance per ecobee.
How it compares (and where it doesn't fit)
A few people have asked how this stacks up against the other ways to run an ecobee on Hubitat (thanks @mavrrick58 for the nudge). My honest read — corrections welcome:
| Method | Local / no cloud | Needs ecobee cloud account | Extra hardware/software | Remote room sensors | Best for |
|---|---|---|---|---|---|
| This driver (HAP, local) | Yes | No | None | Yes — each as its own child device | Cloud-free, instant, simple control on any hub |
| Ecobee Suite (SANdood) | No (ecobee cloud) | Yes | None | Yes (rich) | Maximum features — schedules, vacations, history, weather |
| Built-in Ecobee integration | No (ecobee cloud) | Yes | None | Yes | Official-style cloud integration |
| Built-in HomeKit Controller | Yes | No | None | Reportedly struggles once a secondary sensor is added (per forum reports) | Native local control, simpler setups |
| Ecobee via Home Assistant (HomeKit) | Local to ecobee, but… | No | A running Home Assistant + the HA↔Hubitat bridge | Yes | People already invested in Home Assistant |
| Built-in "HomeKit" bridge | — | — | — | — | This is the export direction (Hubitat → Apple Home), not a way to control an ecobee |
Short version: if you want every cloud feature (full schedule editor, runtime history, weather, editable vacations), Ecobee Suite is still the most complete and these two pair well. If you want direct, cloud-free control with no extra software and remote sensors that actually behave, that's what this driver is for.
Supported models
- Works on the HomeKit-era ecobees: ecobee3, ecobee3 lite, ecobee4, ecobee SmartThermostat (with Voice Control).
- The ecobee3 lite has no built-in occupancy/motion sensor — so with no remote sensors it creates no sensor child device. That's expected, not a bug; all thermostat control still works.
- The 2022 Smart Thermostat Premium / Enhanced (Matter-era) are unconfirmed. If you have one and something's missing, run Dump Accessories (below) and post the output so it can be mapped.
Install
Via Hubitat Package Manager (recommended): search for "Ecobee HAP Thermostat (Local)".
Manual import (Drivers Code / Libraries Code → Import) — all three:
- Library: https://raw.githubusercontent.com/RamSet/hubitat/main/libraries/hap-core/hap-core.groovy
- Thermostat driver: https://raw.githubusercontent.com/RamSet/hubitat/main/drivers/ecobee-hap-thermostat/ecobee-hap-thermostat.groovy
- Sensor driver: https://raw.githubusercontent.com/RamSet/hubitat/main/drivers/ecobee-hap-sensor/ecobee-hap-sensor.groovy
v0.15.0 note (shared engine): the HAP engine (pairing, encrypted session, port discovery, reconnect) now lives in a shared
hapCorelibrary. I pulled it into a library because it's now shared with my new HomeKit Import (Local) package (imports any LAN HomeKit accessory into Hubitat) — same protocol engine under both, so fixes happen once and benefit this thermostat and every imported device. No setup change and no re-pairing — existing pairings are preserved.Existing users updating via HPM: HPM does not auto-pull the new library (neither Update nor Repair brings it in), so you'll see "library not found: #include RamSet.hapCore" until you add it once, manually: Libraries Code → Import → the
hap-coreURL above → Save. One-time; the driver compiles immediately after. Fresh installs pull the library automatically.
(If you installed a very early build from the old flat path, the files moved into drivers/. Re-import from the URLs above so updates track the new location.)
Pairing
- On the thermostat, reset/remove its HomeKit pairing if it's already in an Apple Home (this frees a slot and gives a fresh setup code). HomeKit is single-admin — it can't be in Apple Home and here at the same time.
- Create a Virtual Device using the Ecobee HAP Thermostat driver.
- In its preferences, enter the thermostat's IP and the 8-digit setup code, then Save.
- The setup code rotates quickly — generate it right before pairing and Save promptly (pairing at the thermostat is easiest). Watch
hapStatusgoconnecting → live. Sensors appear as child devices automatically. After pairing, the code is stored as long-term keys and is never needed again.
Exposing it back to Apple HomeKit / Google / Alexa
The thermostat is a standard Hubitat Thermostat, so it exports cleanly through Hubitat's built-in HomeKit Integration (and Google/Alexa). Motion/presence reach HomeKit via the child sensor devices — a Hubitat device can't be both a Thermostat and a motion/occupancy sensor in the HomeKit export, so the sensors are deliberately separate children.
Companion apps (optional)
There's a separate package, "Local Ecobee Helpers" (also in HPM), with offline helper apps built on this driver: per-room vent control, open-contact HVAC pause, and humidifier control. All local.
What HAP does NOT expose
These stay cloud-only or aren't on the HomeKit interface at all, so pair this with Ecobee Suite (cloud) if you need them:
- Weather / forecast, the full multi-period schedule editor, runtime / equipment history, vacations as editable objects
- A few device settings the ecobee keeps off HomeKit entirely: screen brightness, speaker volume, and fan minimum-runtime-per-hour
(You can detect that the thermostat is on a hold/override and when it ends via comfortProfile = Hold + holdEndsAt, and emulate a per-hour fan minimum with Fan Run Time.)
Troubleshooting
- "library not found: #include RamSet.hapCore" after a v0.15.0 update? Import the
hap-corelibrary once (see the v0.15.0 note under Install) — HPM doesn't auto-pull it into an existing install. - No sensor child appears? If your model has no built-in occupancy sensor (e.g. ecobee3 lite) and no remote sensors, that's expected — there's nothing to expose.
- Unknown model / something missing? Click Dump Accessories on the device and post the
===== HAP /accessories dump =====block from Logs. - Logging: preferences include Enable info logging and Enable debug logging toggles (debug auto-disables after 30 minutes).
For the curious (how it works)
The complete HAP handshake runs in Groovy on the hub: SRP-6a pair-setup (3072-bit, SHA-512), X25519 ECDH + Ed25519 pair-verify, and a ChaCha20-Poly1305 encrypted session. Because the Groovy sandbox blocks KeyAgreement / Signature / SecureRandom, X25519 and Ed25519 are hand-rolled in BigInteger. (Hubitat staff are adding those crypto classes to the sandbox in an upcoming build; since the engine now lives in one shared library, slimming it down to native crypto later will be a single change that benefits every driver that uses it.)
Related
- HomeKit Import (Local) — same HAP engine, pointed the other way: import any LAN HomeKit accessory (switches, lights, locks, garage doors, shades, sensors, more) into Hubitat. Release thread → (drop the link here)
Source & license
- Repo (public): GitHub - RamSet/hubitat · GitHub
- License: Apache 2.0. Provided as-is, without warranty — it controls real HVAC hardware, so test it on your own setup.
Feedback, model reports, and corrections welcome — thanks to everyone who's been testing on the forum.