Skip to content

Alarm — Implementation Manual

A step-by-step build guide for the household alarm: Ring is the brain, Home Assistant is the automation layer. The Ring Alarm system runs as a self-contained, professionally-monitored alarm — the existing wired zones join it natively via the Ring Retrofit Alarm Kit — and HA taps the whole system with ring-mqtt so every sensor is available for automations and dashboards.

Status: Ready to build

Architecture decided 2026-06-28. Design source: projects/alarm_system.md. Reference page: Security & Alarm.


Why it's built this way

A Ring-native alarm keeps working and dispatches with the correct per-zone information even if the HA/Beelink server is down — the right property for life-safety. HA does not arm the system or trigger dispatch; it observes the Ring sensors and alarm state (via ring-mqtt) and runs automations on top: lights, presence, notifications, TTS, dashboards.

Wired zones ─► Retrofit Kit ─┐
Ring keypad ─────────────────┤
Ring contact + motion ───────┼─► Ring Alarm base ─► Ring Protect Pro ─► dispatch (native, per-zone)
ZCOMBO-G smoke (Z-Wave) ──────┤        │
Schlage lock (Z-Wave) ───────┘   ring-mqtt ─► Home Assistant (automations only)

The brain is in the Ring app

Arm modes, entry/exit delays, monitoring, and per-zone names are configured in the Ring app. HA reads alarm_control_panel.blairmont_alarm and reacts, but does not own that logic.

Trade-off accepted: HA's sensor copies are cloud-fed (Ring cloud → ring-mqtt), so HA automations on them carry slight latency and pause if internet/Ring is down. The alarm itself is local to the Ring base and unaffected. Don't build life-safety logic on the HA copies.


Prerequisites

Requirement This instance Notes
MQTT broker (Mosquitto) ✅ already running Shared with zigbee2mqtt / govee2mqtt / rtlamr2mqtt
Ring Protect Pro subscription ✅ paid Enables professional monitoring/dispatch
Ring Alarm base + keypad + sensors ✅ added Personnel-door contact + motion already in the Ring account
Ring Retrofit Alarm Kit ✅ sourced (Amazon) Brings wired zones into Ring (up to 8)
Ring account for ring-mqtt use the PRIMARY/owner account A secondary/shared account does not work — see Phase 4

Authenticate ring-mqtt with the PRIMARY (owner) Ring account

A secondary/shared account was tried first and does not work: a shared user gets location membership (shows up in the Ring app) but zero devices at Ring's device API (api.ring.com/devices/v1/locations returns {}), so ring-mqtt reports "the account does not have any associated locations." Use the primary account that owns the alarm. Running ring-mqtt and the official Ring camera integration on the same account coexists fine in practice (each uses its own device session); if cameras briefly drop afterward, just reconfigure the Ring integration.


Phase 1 — Ring core (mostly done)

In the Ring app:

  1. Confirm the base station, keypad, and native sensors (personnel-door contact, motion) are added.
  2. Set up professional monitoring (Ring Protect Pro) and verify the monitored address.
  3. Configure modes (Home / Away), per-sensor mode participation, and entry/exit delays.

Phase 2 — Existing wired zones via the Retrofit Kit

At the panel

Kill AC at the breaker AND disconnect the GE backup battery before touching terminals — the GE siren is live. Photograph every wire→terminal first. The GE Concord board is being retired; the Retrofit Kit reads the zone wiring directly.

  1. Mount the Retrofit Kit; land each existing zone loop (the two zone wires) on a separate Retrofit zone input — one input per door/zone so each shows individually.
  2. Power the Retrofit Kit per its manual; pair it to the Ring base station ("Add Device → Retrofit Kit") in the Ring app.
  3. In the Ring app, name each zone (Front Door, Rear Door, Garage Door, Motion…) and assign mode participation + delays.
  4. Test each zone (open the door / walk the PIR) and confirm it reports in the Ring app.

One sensor per zone

If a zone loop daisy-chains several physical sensors, Ring (like any panel) sees the zone, not which sensor tripped. The GE zones look 1-sensor-each — verify with a meter on install day so per-zone naming is meaningful.


Phase 3 — Native Z-Wave devices to the Ring base

The Ring base station is a Z-Wave hub. Pair these to Ring (not to a separate HA stick):

  • ZCOMBO-G smoke/CO — the one third-party Z-Wave sensor Ring accepts as a triggering alarm sensor. Pair via Ring app → Add Device → Z-Wave; configure as a fire/CO sensor (24-hr).
  • Schlage BE469ZP deadbolt — pair via Ring app; set a Ring Bond (e.g. lock when armed away). Manage user codes in the Ring app.

Both still surface to HA via ring-mqtt for automations.


Phase 4 — ring-mqtt (tap Ring into HA)

  1. Settings → Add-ons → Add-on Store → ⋮ → Repositories, add:
    https://github.com/tsightler/ring-mqtt-ha-addon
    
  2. Install ring-mqtt. In its Configuration, MQTT auto-discovers the Mosquitto broker. Set enable_cameras: false (alarm-only) so ring-mqtt doesn't duplicate the cameras/chimes the official Ring integration already provides. enable_panic stays off — Ring dispatches natively, so HA doesn't need panic switches.
  3. StartOpen Web UI → log in with the primary/owner Ring account + 2FA (stores the refresh token). ⚠️ Watch for browser autofill silently re-filling a different saved Ring login — if a re-auth doesn't actually switch accounts, uninstall/reinstall the add-on to clear the token and log in via a private window.
  4. ring-mqtt publishes via MQTT discovery; HA gains, on its own:
    • alarm_control_panel.blairmont_alarm (named after the Ring location — observe arm state; not ring_alarm)
    • binary_sensor.* for each native/Retrofit zone + the contact (binary_sensor.personnel_door) and motion (binary_sensor.foyer_motion_sensor) sensors (+ smoke/CO once paired)
    • lock.* for the Schlage (once paired)
    • base-station / keypad / range-extender siren + tamper + battery + info entities; siren switch switch.blairmont_alarm_siren

Note: the Ring Alarm enumerates over a separate per-location websocket that connects ~2–5 min after the cameras (which come over REST) — don't assume "no alarm" from an early add-on log.


Phase 5 — Register entities (test gate)

make snapshot          # needs HA_URL + HA_TOKEN — pulls the live entity registry
git add tests/fixtures/entities.txt
git commit -m "auto: snapshot — add Ring alarm zones/sensors via ring-mqtt"

For not-yet-paired devices referenced ahead of time, add an entry to tests/fixtures/entities_allow.txt with a justifying comment.


Phase 6 — HA automations (the point of ring-mqtt)

HA does not dispatch, and doesn't own the security logic — but it does arm/disarm as a routine convenience: Good Night arms Home, Good Morning disarms (script.good_night / script.good_morning; codeless — disarm_code is empty). Ring still owns dispatch, the keypad, and the app. It also reacts to Ring state for everything else. Build these in automations.yaml (single source of truth → CI hot-reloads on push):

  • Lighting & presence — Ring motion / contact binary_sensors drive lights, occupancy, and scenes.
  • Notifications & TTS — on alarm_control_panel.blairmont_alarmtriggered, announce the zone on Sonos/Echo and send a critical push with a Ring camera snapshot. Example trigger:

    - alias: "Alarm  Ring triggered  announce + push"
      id: alarm_ring_triggered_notify
      triggers:
        - trigger: state
          entity_id: alarm_control_panel.blairmont_alarm
          to: triggered
      actions:
        - action: notify.mobile_app_louis_iphone
          data:
            title: "🚨 Alarm triggered"
            message: "Ring alarm triggered  check the app."
            data:
              push: { sound: { critical: 1, volume: 1.0 } }
        # + Sonos/Echo TTS, Inovelli light flash, Ring snapshot
      mode: single
    
  • Lock logic / dashboards — surface lock.* and the alarm panel on the Command Dashboard; mirror arm state to tiles.

  • Retire the mocksautomations.yaml §12 has three input_button.*_test placeholders. Once the real Ring binary_sensors exist, repoint or remove them and delete the helpers from configuration.yaml. See Automations Reference.

Testing & validation

Test How Expected
Zone wiring Open each door / walk each PIR Ring app + HA binary_sensor both show open
Arm/disarm Arm Away on the keypad, exit, re-enter, disarm Entry delay, then disarm; HA alarm_control_panel.blairmont_alarm tracks state
Monitored trigger Coordinate with Ring + Ring practice/test mode Ring center receives the alarm with the correct zone
Smoke Detector test (ZCOMBO-G) Ring fire event; HA binary_sensor flips
HA automation Trip a sensor Lights/notifications/TTS fire from the ring-mqtt entity

Test monitored dispatch in Ring's practice/test mode

Live triggers can dispatch real responders. Put the Ring system in test mode (Ring app) before any end-to-end test and confirm with the monitoring center.


Entity reference (fill in real IDs)

Purpose Entity
Ring alarm state (observe) alarm_control_panel.blairmont_alarm
Retrofit zones binary_sensor.<zone_name>
Ring personnel-door contact binary_sensor.<ring_personnel_door_contact>
Ring motion binary_sensor.<ring_motion>
ZCOMBO-G smoke/CO binary_sensor.<smoke> / binary_sensor.<co>
Schlage deadbolt lock.<front_door>

See Entity IDs once make snapshot has run.


Operations & gotchas

  • Cloud dependency (HA side only): ring-mqtt entities depend on Ring's cloud — fine for automations, not for life-safety logic. The Ring alarm itself is local to the base and keeps working/dispatching if HA or the internet is down.
  • One Ring account: ring-mqtt runs on the primary/owner account (a secondary/shared account has no device-API access). The official Ring camera integration runs on the same account and coexists fine. ring-mqtt is alarm-only (enable_cameras: false) so the cameras/chimes aren't duplicated.
  • ZCOMBO-G is special: it's the only third-party Z-Wave sensor Ring accepts as a triggering alarm sensor; generic third-party Z-Wave sensors enroll monitoring-only and won't trigger dispatch.
  • Konnected is not used here — the Retrofit Kit reads the wired zones. The board is freed up.
  • Alexa/Echo TTS can go stale — the "Alexa — Heal When Unavailable" automation reloads the integration; don't assume an announcement was heard if the Echoes were unavailable.