Alarm System node for Node-RED.
npm install node-red-contrib-alarm-ultimate

[![NPM version][npm-version-image]][npm-url]
[![NPM downloads][npm-downloads-image]][npm-url]
[![Node-RED Flows][flows-image]][flows-url]
[![License][license-image]][license-url]
[![GitHub issues][issues-image]][issues-url]
[![Status: beta][beta-image]][repo-url]
Alarm System Ultimate nodes + web panel for Node-RED.
Includes:
- AlarmSystemUltimate (BETA): full alarm control panel node (zones, entry/exit delays, bypass, chime, 24h/fire/tamper, siren, event log, optional per-zone sensor supervision).
- Helper nodes: AlarmUltimateState, AlarmUltimateZone, AlarmUltimateSiren.
- AlarmUltimateState: Input/Output node with embedded adapters (Default / Homekit / Ax Pro / KNX-Ultimate).
- AlarmUltimateZone: output-only zone events splitter (no adapters).
- AlarmUltimateSiren: output-only siren state splitter.
- Web tools: Zones JSON mapper + web Alarm Panel (embeddable in Node-RED Dashboard).
Note: AlarmSystemUltimate is currently BETA.
- Install
- Quick start
- Screenshots
- Nodes
- Web tools
- Examples
- Permissions and endpoints
- Development
- Palette Manager: Menu → Manage palette → Install → search alarm ultimate
- NPM:
``bash`
npm i node-red-contrib-alarm-ultimate
Beginner-friendly flow:
1. Add an AlarmSystemUltimate (BETA) node.
2. Click Manage zones and add at least one zone (example topic: sensor/frontdoor). Use Export JSON / Import JSON in the Zones JSON Mapper web tool to backup/restore your zones.msg.topic="sensor/frontdoor"
Important: after editing zones, click Done in the Node-RED editor to save (if you click Cancel, changes are lost).
3. Send sensor messages to the Alarm node:
- open: , msg.payload=truemsg.topic="sensor/frontdoor"
- close: , msg.payload=falsemsg.topic = controlTopic
4. Arm/disarm by sending a control message to the Alarm node:
- (default alarm)msg.command = "arm"
- or msg.command = "disarm"
5. Connect a Debug node to the Alarm output to see events.
Optional (recommended):
- For sensor integrations that don't use msg.topic, use Zones → Zone input adapter in the AlarmSystemUltimate editor (KNX-Ultimate: knx.destination, AX Pro: payload.zoneUpdate).AlarmUltimateState
- Use in Input mode to normalize arm/disarm commands (e.g. HomeKit) and inject them into the selected Alarm node.AlarmUltimateState
- Use in Output mode with an Adapter to format state events for external systems (HomeKit / KNX / AX Pro / ...).AlarmUltimateZone
- Use / AlarmUltimateSiren output-only nodes to split Alarm outputs into dedicated streams.link in
- For distributed flows, use Node-RED built-in / link out to fan-in sensors/commands and fan-out Alarm outputs (see examples/alarm-ultimate-link-bus.json).
Main node that:
- Receives control commands on msg.topic === controlTopic
- Receives sensor messages on any other topic and matches them to a configured zone
It emits events and state updates on 9 outputs (see the node help in the editor for full details). Output #1 (All messages) is a superset and may emit a single message or an array (event + siren at the same time).
Use AlarmUltimateState (Output mode + Adapter) to format state events for your integrations, and AlarmUltimateZone / AlarmUltimateSiren to split outputs into dedicated streams.
Open zones listing features:
- Open Zones (Arming): open zones listing while arming (interval configurable; 0 disables)0
- Open Zones (Cycle): cyclic open zones listing at a fixed interval (any alarm state; disables)
Arming behavior:
- By default, arming is blocked if any (non-bypassed) zone is open.
- If enabled in a zone, supervision.blockArm: true also blocks arming while the zone is MISSING.
- Optional node setting: Wait zones closed before exit delay (when arming with open zones, the node waits for all zones to close before starting the exit delay countdown).
Persistence:
- Enable Persist state to keep armed/disarmed state, bypass list, event log and zone state across Node-RED restarts/deploys.
#### Optional per-zone sensor supervision
You can enable sensor supervision per zone to detect devices that stop reporting.
- Supervision starts immediately when the node runs.
- If a zone does not receive a valid sensor update for timeoutSeconds, the node emits supervision_lost and the Alarm Panel shows … • MISSING.supervision_restored
- The next valid sensor update emits .blockArm: true
- If , arming is blocked while the zone is missing.
“Valid” means the message value can be converted to boolean using the Alarm node With Input property (default msg.payload), e.g. true/false, open/closed, on/off, 1/0.
Example zone:
`json`
{
"name": "Front door",
"topic": "sensor/frontdoor",
"type": "perimeter",
"supervision": { "enabled": true, "timeoutSeconds": 120, "blockArm": true }
}
AlarmUltimateState and AlarmUltimateZone can work in two modes:
- Output: emit Alarm events to the flow (no wiring from the Alarm node required).
- Input: receive messages from the flow, apply an Adapter, and inject them into the selected Alarm node.
AlarmUltimateSiren remains output-only and emits siren telegrams.
- Alarm State (AlarmUltimateState): emits .../event telegrams (msg.event, msg.payload = { event, mode, ... })Alarm Zone
- (AlarmUltimateZone): emits zone_open / zone_close as .../event telegramsAlarm Siren
- (AlarmUltimateSiren): emits siren telegrams (msg.topic = , msg.event = siren_on|siren_off, msg.payload = true|false)
All nodes in this package add a stable, versioned object to every output message:
`js`
msg.alarmUltimate = {
v: 1,
ts: 1700000000000,
kind: "event|siren|open_zones|any_zone_open|command|...",
alarm: { id, name, controlTopic },
event: "armed|disarmed|zone_open|siren_on|...",
mode: "armed|disarmed",
reason: "init|timeout|manual|...",
};
Embedded adapters use msg.alarmUltimate as the canonical source, so they do not depend on user-configurable msg.topic / msg.payload formats.
These pages are served via the Node-RED admin HTTP endpoint:
- Zones JSON Mapper: /alarm-ultimate/alarm-json-mapper/alarm-ultimate/alarm-panel
- Alarm Panel:
The Alarm Panel supports:
- Preselect node: /alarm-ultimate/alarm-panel?id=/alarm-ultimate/alarm-panel?embed=1&id=
- Embed mode (for Dashboard iframes): view=keypad
- Views: , view=zones, view=log (e.g. /alarm-ultimate/alarm-panel?embed=1&view=log&id=)
The Zones JSON Mapper supports:
- Sample message mapping (e.g. KNX Ultimate): map topic/payload fields and generate a zone template.
- ETS Group Addresses export (TSV): paste the exported table and generate zones in batch (boolean datapoints only).
- Backup/restore: Export JSON / Import JSON for zone definitions.
- Quality-of-life: bulk apply (Kind/Supervision), sorting, duplicate-topic skipping on import, persisted Step 1 input.
- examples/alarm-ultimate-basic.json: ready-to-import flow with AlarmSystemUltimate, injects and debug nodes.examples/alarm-ultimate-dashboard.json
- : Node-RED Dashboard example embedding the Alarm Panel in a ui_template iframe.examples/alarm-ultimate-dashboard-controls.json
- : Node-RED Dashboard example with the embedded panel plus command buttons (and a small sensor simulator).examples/alarm-ultimate-dashboard-v2.json
- : Dashboard 2.0 example for @flowfuse/node-red-dashboard (Alarm Panel + basic controls + status).examples/alarm-ultimate-home-assistant-alarm-panel.json
- : Home Assistant Add-on example (no MQTT) using the HA Alarm Panel card.
See examples/README.md.
Run tests:
`bash`
npm test
When Node-RED authentication is enabled, the admin endpoints use these permissions (if available):
- AlarmSystemUltimate.readAlarmSystemUltimate.write
-
HTTP admin endpoints:
- GET /alarm-ultimate/alarm/nodesGET /alarm-ultimate/alarm/:id/state
- GET /alarm-ultimate/alarm/:id/log
- POST /alarm-ultimate/alarm/:id/command
- GET /alarm-ultimate/alarm-json-mapper
- GET /alarm-ultimate/alarm-panel`
-
[repo-url]: https://github.com/Supergiovane/node-red-contrib-alarm-ultimate
[npm-url]: https://www.npmjs.com/package/node-red-contrib-alarm-ultimate
[flows-url]: https://flows.nodered.org/node/node-red-contrib-alarm-ultimate
[license-url]: LICENSE
[issues-url]: https://github.com/Supergiovane/node-red-contrib-alarm-ultimate/issues
[npm-version-image]: https://img.shields.io/npm/v/node-red-contrib-alarm-ultimate.svg
[npm-downloads-image]: https://img.shields.io/npm/dm/node-red-contrib-alarm-ultimate.svg
[flows-image]: https://img.shields.io/badge/Node--RED%20Flows-library-8f0000?logo=nodered&logoColor=white
[license-image]: https://img.shields.io/npm/l/node-red-contrib-alarm-ultimate.svg
[issues-image]: https://img.shields.io/github/issues/Supergiovane/node-red-contrib-alarm-ultimate.svg
[beta-image]: https://img.shields.io/badge/status-beta-orange.svg