If you use UniFi Protect’s Alarm Manager and have adopted any sensors, relays, fobs or an Alarm Hub, Protect switches Alarm Manager to Global mode. From then on, the official UniFi Protect integration can no longer arm, disarm or even read your alarm’s state. The public Protect API simply doesn’t expose it in Global mode, and a firmware update can flip you back.
I built a small custom integration that fixes this:
UniFi Protect Alarm Bridge — GitHub - violuke/ha_unifi_protect_alarm_bridge: Home Assistant alarm panel for UniFi Protect's Global Alarm Manager · GitHub
What it does
- Adds an
alarm_control_panelthat talks to Alarm Manager directly. - The panel shows
disarmed,arming(during your exit delay),armed_away/armed_home/armed_night, ortriggered, and never shows a state it hasn’t read from the console. - Instant updates. Arming or disarming from the Protect app, a schedule or a fob shows up in HA within about a second, via Protect’s own update websocket. Polling is only a safety net.
- Arm-mode mapping. Map HA’s away/home/night modes to your Protect arm profiles.
- Setup and maintenance from the UI. A config flow, reauth, repairs (for example if the account loses its role or Global mode is switched off), and redacted diagnostics.
- Runs alongside the official UniFi Protect integration and doesn’t depend on it.
Requirements (please read)
- HA 2026.9+. Install through HACS (custom repository for now).
- A dedicated local-only UniFi OS account with the Super Admin role and no MFA.
- Alarm Manager isn’t available to any custom role. I tested Protect Full Management, Network Site Admin and user-management roles, and all were refused.
- HA stores the credentials unencrypted, like every integration, so give HA an account that’s used for nothing else.
- It uses undocumented UniFi OS APIs. If a firmware update changes them, you’ll get a repair notice in HA rather than a silently wrong alarm state.
Tested on: UDM Pro, Protect 7.2.105, Global mode, a single arm profile.
Not yet tested live: the triggered state, arming with the exit delay switched off, and multiple arm profiles.
If you try it, I’d love to hear your console model and Protect version, and whether those untested cases behave. Issues and feedback are welcome on GitHub.