Skip to main content
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 patternDescription
{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 patternDescription
{base}/events/rawRaw panel event as a JSON object. Published when MQTT_PUBLISH_RAW_EVENTS = True (default).

Interface status topics (published by PAI)

Topic patternDescription
{base}/interface/pai_statusPAI run state. Values: initializing, online, paused, stopped, error
{base}/interface/availabilityBroker-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 patternDirectionPayload / description
{base}/control/partitions/{name}/{command}SubscribeArm/disarm a partition. See available partition commands below.
{base}/control/outputs/{name}/{command}SubscribeControl a PGM output. Commands: on, off, pulse
{base}/control/zones/{name}/{command}SubscribeControl a zone. Commands: bypass, clear_bypass, clear_alarm_memory
{base}/control/doors/{name}/{command}SubscribeControl a door (EVO panels only)
{base}/panic/{type}/{partition}/{userid}SubscribeTrigger a panic alarm
{base}/notifications/{level}SubscribeInject 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

CommandDescription
armStandard arm
disarmDisarm
arm_stayStay / home arm
arm_sleepSleep / 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 patternDescription
{base}/interface/command_statusResult 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 patternDescription
{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 patternDescription
{ha_prefix}/alarm_control_panel/{device}/{name}/configHA auto-discovery payload for a partition as an alarm control panel entity
{ha_prefix}/binary_sensor/{device}/{name}/configHA 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 patternDescription
metrics/exchange/pai (default)MQTT Dash formatted data. Configurable via MQTT_DASH_TOPIC.

Notifications topic

Topic patternDescription
{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'

Build docs developers (and LLMs) love