
As I mentioned a few weeks ago in my post Prosegur Alarms: A Step Back in Home Assistant Integration, I’ve installed an AJAX alarm system at home. And despite some voices claiming it wasn’t possible, I now have it successfully connected both to an Alarm Receiving Center (ARC) and to my Home Assistant home automation hub. This integration allows me to arm and disarm the alarm directly from my home automation control panel, and I can get real-time status updates from the alarm system itself, as well as from door/window sensors and even temperature data from motion sensors.

Remarkably, I achieved this integration without needing to hack an alarm remote and connect it to an ESP32 device controlled via ESPHome. Instead, I only spent €8 on the official Jeedom plugin for AJAX alarms—interestingly, this plugin has an AGPL license, making it open-source and free.
AJAX Alarm into Home Assistant: How I Achieved It
My goal was clear: fully integrate the AJAX alarm into my smart home ecosystem. Initially, it seemed challenging because there’s not any AJAX direct integration in Home Assistant. And there likely won’t be any in the future unless Nabu Casa officially steps in.
The only existing integration used the SIA security protocol, which AJAX utilizes to connect with Alarm Receiving Centers. However, I had to discard this method entirely. When using it, you cannot connect to an external ARC— as only one alarm center connection is permitted.
Fortunately, after researching and experimenting, I discovered a viable solution: using Jeedom and MQTT as intermediary bridges.
Jeedom
Jeedom is another open home automation platform similar in scope to Home Assistant but far less popular. However, it offers a specific AJAX plugin that connects through AJAX’s cloud service, similar to AJAX’s own mobile apps. The plugin costs €8, a one-time fee.
This component was crucial as it easily connected to the AJAX alarm and provided immediate access to sensor statuses and the alarm itself, all without using the SIA protocol.
I started by setting up a new Jeedom installation on my virtual machine home server (where I already run Frigate, among other applications). Based on Debian 11, it was straightforward to set up.
Next, connecting Jeedom to my AJAX alarm wasn’t too complex. It simply required purchasing the plugin from Jeedom’s marketplace and following basic instructions:
- Creating a new user on the AJAX hub specifically for home automation purposes, granting appropriate permissions.
- Using these new credentials in the Jeedom plugin configuration.
- Inviting [email protected] as a user to the AJAX hub (a necessary step to receive events from AJAX’s cloud).
- Crucially, setting up external access to Jeedom, enabling internet-based event reception.
After configuring these steps and initiating synchronization, all AJAX devices appeared in Jeedom.

Sending Data from Jeedom to Home Assistant
Then, I just had to transfer this data to Home Assistant using MQTT, a lightweight communication protocol commonly used in home automation.
I configured Jeedom’s free MQTT Manager plugin to connect to the Mosquitto MQTT server already running within my Home Assistant setup, which also manages devices like Tasmota, my heating system communicating via Ebusd, and all Zigbee devices through Zigbee2MQTT. I also set Jeedom to publish all device events automatically via MQTT.
Subsequently, I manually configured MQTT sensors, binary sensors, and buttons in my Home Assistant YAML configuration file to manage the alarm’s states and sensor statuses.
button:
# Note: there can only be one sensor section, one binary_sensor section, and one button section.
# If multiple exist, only the last one will be considered.
# Buttons to control the alarm hub
- name: "Arm Alarm"
# Note: "15" corresponds to the command number configured by Jeedom for my alarm.
# Change it according to your setup
command_topic: "jeedom/cmd/set/15"
unique_id: "control_arm_ajax_from_jeedom"
payload_press: "ARM"
retain: false
device:
identifiers: "AJAX Alarm via Jeedom MQTT"
name: "AJAX Alarm"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Alarm Night Mode"
# Note: "16" corresponds to the command number configured by Jeedom for my alarm.
# Change it according to your setup
command_topic: "jeedom/cmd/set/16"
unique_id: "control_night_mode_ajax_from_jeedom"
payload_press: "NIGHT MODE"
retain: false
device:
identifiers: "AJAX Alarm via Jeedom MQTT"
name: "AJAX Alarm"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Disarm Alarm"
# Note: "17" corresponds to the command number configured by Jeedom for my alarm.
# Change it according to your setup
command_topic: "jeedom/cmd/set/17"
unique_id: "control_disarm_ajax_from_jeedom"
payload_press: "DISARM"
retain: false
device:
identifiers: "AJAX Alarm via Jeedom MQTT"
name: "AJAX Alarm"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Stop Fire Alarm"
# Note: "19" corresponds to the command number configured by Jeedom for my alarm.
# Change it according to your setup
command_topic: "jeedom/cmd/set/19"
unique_id: "mute_fire_detectors_ajax_from_jeedom"
payload_press: "muteFireDetectors"
retain: false
device:
identifiers: "AJAX Alarm via Jeedom MQTT"
name: "AJAX Alarm"
model: "Hub 2 Plus"
manufacturer: "AJAX"
sensor:
# AJAX Alarm Hub Sensors
- name: "AJAX Alarm Status"
# Note: "1" corresponds to the command number configured by Jeedom for my alarm.
# Change it according to your setup
state_topic: "jeedom/cmd/event/1"
unique_id: "alarm_status_ajax_from_jeedom"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
expire_after: 2629746
device:
identifiers: "AJAX Alarm via Jeedom MQTT"
name: "AJAX Alarm"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Last Event"
# Note: "3" corresponds to the command number configured by Jeedom for my alarm.
# Change it according to your setup
state_topic: "jeedom/cmd/event/3"
unique_id: "last_event_alarm_ajax_from_jeedom"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
expire_after: 2629746
device:
identifiers: "AJAX Alarm via Jeedom MQTT"
name: "AJAX Alarm"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Last Event Code"
# Note: "4" corresponds to the command number configured by Jeedom for my alarm.
# Change it according to your setup
state_topic: "jeedom/cmd/event/4"
unique_id: "last_event_code_alarm_ajax_from_jeedom"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
expire_after: 2629746
device:
identifiers: "AJAX Alarm via Jeedom MQTT"
name: "AJAX Alarm"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Mobile Signal Strength"
# Note: "7" corresponds to the command number configured by Jeedom for my alarm.
# Change it according to your setup
state_topic: "jeedom/cmd/event/7"
unique_id: "gsm_signal_level_ajax_from_jeedom"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
expire_after: 2629746
device:
identifiers: "AJAX Alarm via Jeedom MQTT"
name: "AJAX Alarm"
model: "Hub 2 Plus"
manufacturer: "AJAX"
binary_sensor:
- name: "Alarm Tamper"
# Note: "5" corresponds to the command number configured by Jeedom for my alarm.
# Change it according to your setup
state_topic: "jeedom/cmd/event/5"
unique_id: "alarm_tamper_ajax_from_jeedom"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
expire_after: 2629746
device_class: tamper
payload_on: "1"
payload_off: "0"
device:
identifiers: "AJAX Alarm via Jeedom MQTT"
name: "AJAX Alarm"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "External Power"
# Note: "12" corresponds to the command number configured by Jeedom for my alarm.
# Change it according to your setup
state_topic: "jeedom/cmd/event/12"
unique_id: "externally_powered_ajax_from_jeedom"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
expire_after: 2629746
device_class: power
payload_on: "1"
payload_off: "0"
device:
identifiers: "AJAX Alarm via Jeedom MQTT"
name: "AJAX Alarm"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Door 1"
# Note: "72" corresponds to the command number configured by Jeedom for my alarm.
# Change it according to your setup
state_topic: "jeedom/cmd/event/72"
unique_id: "door_1_status_ajax_from_jeedom"
device_class: door
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
payload_on: "0"
payload_off: "1"
expire_after: 2629746
device:
identifiers: "Door 1 AJAX via Jeedom MQTT"
name: "Door sensor 1 AJAX"
model: "DoorProtect"
manufacturer: "AJAX"
- name: "Door 2"
# Note: "92" corresponds to the command number configured by Jeedom for my alarm.
# Change it according to your setup
state_topic: "jeedom/cmd/event/92"
unique_id: "door_2_status_ajax_from_jeedom"
device_class: door
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
payload_on: "0"
payload_off: "1"
expire_after: 2629746
device:
identifiers: "Door 2 AJAX via Jeedom MQTT"
name: "Door sensor 2 AJAX"
model: "DoorProtect"
manufacturer: "AJAX"
- name: "Door 3"
# Note: "82" corresponds to the command number configured by Jeedom for my alarm.
# Change it according to your setup
state_topic: "jeedom/cmd/event/82"
unique_id: "door_3_status_ajax_from_jeedom"
device_class: door
payload_on: "0"
payload_off: "1"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
expire_after: 2629746
device:
identifiers: "Door 3 AJAX via Jeedom MQTT"
name: "Door sensor 3 AJAX"
model: "DoorProtect"
manufacturer: "AJAX"
After manually reloading the MQTT entities configured from Home Assistant, all these sensors began displaying real-time information. After some testing, fine-tuning, and minor adjustments, I managed not only to visualize the alarm status from my Home Assistant dashboard but also to control it: arming, disarming, and integrating it into various automations.
Now, I can smoothly manage my AJAX alarm directly from Home Assistant, without sacrificing the peace of mind provided by having my home monitored by a Alarm Receiving Center (ARC).
I can create complex scenarios involving lighting, advanced notifications, and automatic actions based on the alarm’s state. I can also detect door openings monitored by AJAX sensors, regardless of whether the alarm is armed or not. However, the temperature readings reported by these sensors are not very precise; the threshold for generating events appears to be above 1.5 degrees Celsius, making this data less practical to use.
This integration not only enhances security but also makes managing my smart home easier and more convenient than ever.