After running the existing Ring polling integrations and finding them too slow and complex to configure, I built a new integration from scratch. It's been running in my home for a few months and I'm ready to share it.
GitHub: https://github.com/thaeropath/Hubitat_Ring_Integration
What it supports
| Ring Device | Events → Hubitat | Commands ← Hubitat |
|---|---|---|
| Camera / Doorbell | motion active/inactive, doorbell ding | — |
| Contact sensor | open / closed | — |
| Alarm hub PIR motion sensor | motion active/inactive | — |
| Ring Alarm | armed-away, armed-home, disarmed + who triggered | arm away, arm home, disarm |
| Door lock | locked / unlocked + who triggered | lock, unlock |
| Smart light (Ring Bridge) | on/off, brightness level | on, off, set level |
Alarm hub devices (contact sensors, PIR motion sensors, locks, alarm mode, Ring Bridge lights) are delivered in real time via Ring's alarm hub WebSocket — no polling. Camera motion and doorbell ding use FCM push notifications with a REST polling fallback every 20 seconds for networks where push is unavailable.
How it works
A small Node.js bridge server runs on your local network — Raspberry Pi, NAS, or any always-on machine with Docker. It holds a persistent WebSocket connection to Ring's cloud using the excellent ring-client-api library and pushes events directly to a custom endpoint on the Hubitat hub. No Maker API needed — the integration app creates its own OAuth endpoint.
Ring Cloud ──(WebSocket)──► Bridge Server ──(HTTP POST)──► Hubitat Hub
▲ │
└───────────(HTTP POST)────────┘
commands (arm, lock, etc.)
Installation
Available in Hubitat Package Manager — search for Ring Integration. Full manual install instructions and troubleshooting are in the README.
Configuration notes worth knowing before you start
-
Alarm hub devices load async — after starting the bridge, wait for the
✔ Ready for Hubitat device discoverylog line (~10 seconds) before running discovery in Hubitat. Running it too early will miss sensors and locks. -
Camera motion requires port 5228 — FCM push needs outbound TCP to
mtalk.google.com:5228. If your router blocks it, setCAMERA_PUSH=falsein.envand the polling fallback takes over automatically. -
Alarm control is optional — set
ALARM_CONTROL=falsein.envto make the alarm read-only from Hubitat (mode still reports; arm/disarm commands are blocked at the bridge). -
Ring token rotation is automatic — Ring invalidates the refresh token after every authentication. The bridge detects this, saves the new token to disk, and continues without interruption.
What I'm looking for feedback on
-
Testing on different Ring account configurations (multiple locations, different device mixes)
-
Whether HPM install and update flow works cleanly
-
Any Ring device types not currently recognized
Happy to answer questions. Full README with troubleshooting tips is at the GitHub link above.
Tested on: Hubitat C-8, Docker on macOS (validates the Docker/ARM64 image), ring-client-api v14.3.0