All topics are rooted under MQTT_BASE_TOPIC (default: paradox). In the patterns below, {base} refers to this value.
Customize the base topic and all sub-topic segments in your config file. See Configuration Options for the full list of MQTT_*_TOPIC keys.
Topic structure overview
{base}/
├── states/
│ ├── zones/{name}/{property}
│ ├── partitions/{name}/{property}
│ ├── outputs/{name}/{property}
│ ├── buses/{name}/{property}
│ ├── bus-module/{name}/{property}
│ ├── doors/{name}/{property}
│ ├── keypads/{name}/{property}
│ ├── repeaters/{name}/{property}
│ ├── users/{name}/{property}
│ ├── system/{property}
│ └── challenge
├── events/raw
├── interface/
│ ├── pai_status
│ └── availability
├── control/
│ ├── partitions/{name}/{command}
│ ├── outputs/{name}/{command}
│ ├── zones/{name}/{command}
│ └── doors/{name}/{command}
├── panic/{type}/{partition}/{userid}
├── command_status
└── definitions/{type}/{name}
The states segment always appears between the base topic and the element type. State topics follow the pattern {base}/states/{element-type}/{name}/{property} — not {base}/{element-type}/{name}/states/{property}.
State topics (published by PAI)
PAI publishes state changes for each panel element as individual property topics. {name} is the element’s label as reported by the panel (slugified).
| Topic pattern | Description |
|---|
{base}/states/zones/{name}/{property} | Zone state property (e.g. open, alarm, tamper, bypass) |
{base}/states/partitions/{name}/{property} | Partition state property (e.g. arm, alarm, current_state, target_state) |
{base}/states/outputs/{name}/{property} | PGM output state property |
{base}/states/buses/{name}/{property} | Bus state property |
{base}/states/bus-module/{name}/{property} | Bus module state property |
{base}/states/doors/{name}/{property} | Door state property |
{base}/states/keypads/{name}/{property} | Keypad state property |
{base}/states/repeaters/{name}/{property} | Repeater state property |
{base}/states/users/{name}/{property} | User state property |
{base}/states/system/{property} | Panel/system-level state property |
Set MQTT_USE_NUMERIC_STATES = True to publish 0/1 instead of False/True for boolean properties.
State values
Boolean state properties are published as True / False by default (or 1 / 0 when MQTT_USE_NUMERIC_STATES is enabled). All messages are published with MQTT_RETAIN = True by default so a new subscriber immediately receives the current state.
Event topics (published by PAI)
| Topic pattern | Description |
|---|
{base}/events/raw | Raw panel event as a JSON object. Published when MQTT_PUBLISH_RAW_EVENTS = True (default). |
Interface status topics (published by PAI)
| Topic pattern | Description |
|---|
{base}/interface/pai_status | PAI run state. Values: initializing, online, paused, stopped, error |
{base}/interface/availability | Broker-level availability. Values: online / offline (LWT) |
The availability topic uses an MQTT Last Will and Testament (LWT) message so that downstream consumers (e.g. Home Assistant) detect when PAI disconnects unexpectedly.
Control topics (subscribed by PAI)
Send commands to PAI by publishing to these topics. The message payload is the command value.
| Topic pattern | Direction | Payload / description |
|---|
{base}/control/partitions/{name}/{command} | Subscribe | Arm/disarm a partition. See available partition commands below. |
{base}/control/outputs/{name}/{command} | Subscribe | Control a PGM output. Commands: on, off, pulse |
{base}/control/zones/{name}/{command} | Subscribe | Control a zone. Commands: bypass, clear_bypass, clear_alarm_memory |
{base}/control/doors/{name}/{command} | Subscribe | Control a door (EVO panels only) |
{base}/panic/{type}/{partition}/{userid} | Subscribe | Trigger a panic alarm |
{base}/notifications/{level} | Subscribe | Inject a notification into PAI at the given event level |
Commands are executed immediately. Ensure only authorized MQTT clients have publish access to the {base}/control/# topic tree.
Partition commands
| Command | Description |
|---|
arm | Standard arm |
disarm | Disarm |
arm_stay | Stay / home arm |
arm_sleep | Sleep / night arm |
Commands are translated through MQTT_COMMAND_ALIAS before execution, so you can publish armed_away, armed_home, armed_night, or disarmed to use Home Assistant / Homebridge state names out of the box. See Command Alias Reference.
Command status topic
| Topic pattern | Description |
|---|
{base}/interface/command_status | Result of the most recently executed command, published when MQTT_PUBLISH_COMMAND_STATUS = True (QoS 2, retained) |
Definitions topics (published by PAI)
Published when MQTT_PUBLISH_DEFINITIONS = True.
| Topic pattern | Description |
|---|
{base}/definitions/{type}/{name} | Element definition metadata (partition, zone, user, etc.) |
Home Assistant discovery topics
Published when MQTT_HOMEASSISTANT_AUTODISCOVERY_ENABLE = True. The prefix is controlled by MQTT_HOMEASSISTANT_DISCOVERY_PREFIX (default: homeassistant).
| Topic pattern | Description |
|---|
{ha_prefix}/alarm_control_panel/{device}/{name}/config | HA auto-discovery payload for a partition as an alarm control panel entity |
{ha_prefix}/binary_sensor/{device}/{name}/config | HA auto-discovery payload for a zone as a binary sensor entity |
Set MQTT_HOMEASSISTANT_ENTITY_PREFIX to a string like Paradox {serial_number} to prefix all discovered entity names with your panel’s serial number.
MQTT Dash topic
Published when MQTT_DASH_PUBLISH = True.
| Topic pattern | Description |
|---|
metrics/exchange/pai (default) | MQTT Dash formatted data. Configurable via MQTT_DASH_TOPIC. |
Notifications topic
| Topic pattern | Description |
|---|
{base}/notifications/{level} | Inject a notification into PAI’s notification pipeline at the given event level (e.g. INFO, ERROR) |
Example: listening to all zone states
mosquitto_sub -h 127.0.0.1 -t 'paradox/states/zones/#'
Example: arming partition 1
mosquitto_pub -h 127.0.0.1 -t 'paradox/control/partitions/Partition1/arm' -m 'arm'
Example: using Home Assistant state names
With the default MQTT_COMMAND_ALIAS you can publish Home Assistant state names directly:
mosquitto_pub -h 127.0.0.1 -t 'paradox/control/partitions/Partition1/armed_away' -m 'armed_away'