[RELEASE] Ring Integration with Real-Time Motion alerts, Ring Bridge, Ring Alarm

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 discovery log 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, set CAMERA_PUSH=false in .env and the polling fallback takes over automatically.

  • Alarm control is optional — set ALARM_CONTROL=false in .env to 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