
Tal y como comenté hace unas semanas en mi post Movistar Prosegur Alarmas: un paso atrás en la integración con Home Assistant, he instalado una alarma AJAX en mi domicilio. Y, pese a las voces que decían que no era posible, la tengo ya conectada tanto a una Central Receptora de Alarmas (CRA) como a mi central domótica de Home Assistant, de modo que puedo conectarla y desconectarla desde mi panel de control domótico, y puedo obtener el estado tanto de la central de la alarma como de los sensores de apertura en tiempo real, así como datos de temperaturas medidas por los sensores de movimiento.

Todo ello, sin necesidad de hackear un mando de la alarma para conectarlo a un ESP32 para su control desde ESPHome, y sólo gastándome 8 € en la adquisición del plugin oficial de Jeedom para la conexión con alarmas AJAX (plugin que, por cierto, tiene licencia AGPL, por lo que es open source y libre).
Cómo lo he conseguido
Tenía claro que quería integrar la alarma AJAX completamente en mi ecosistema inteligente. Inicialmente parecía un reto complicado, porque AJAX no tiene integración directa con Home Assistant (y parece que, a corto plazo no la va a tener a no ser que Nabu Casa, oficialmente, dé los pasos necesarios).
La única integración existente emplea el protocolo SIA de seguridad, que es uno de los que utiliza la alarma AJAX para conectarse con la central receptora de alarmas (CRA). Esta alternativa permite monitorizar el estado de alarma y recibir saltos de alarma generados por los sensores cuando la alarma está armada. Sin embargo, tuve que descartar esta opción completamente, ya que no es posible usarla si la alarma AJAX se conecta a una CRA externa, ya que sólo se permite la conexión con una única central receptora.
Por suerte, tras investigar y experimentar, encontré una solución: usar Jeedom y MQTT como puentes intermedios.
Jeedom
Jeedom es otra plataforma domótica abierta, similar en cuanto alcance a Home Assistant, pero mucho menos popular. Sin embargo, cuenta con un plugin específico para AJAX que se conecta a la alarma a través de la nube de AJAX, empleando un sistema similar al usado por las app móviles de AJAX. Este plugin es de pago (8€ en un único pago).
La existencia de este componente fue clave, porque permitió conectar la alarma AJAX fácilmente y tener acceso inmediato al estado de los sensores y de la alarma, todo ello sin emplear la interfaz SIA de interconexión a CRAs .
Así que lo primero fue configurar una instalación nueva de Jeedom en mi servidor doméstico de máquinas virtuales (donde ya ejecuto, entre otros, mi instalación de Frigate). Basada en Debian 11, tener un Jeedom arrancado fue sencillo.
Después, conectarlo a mi alarma AJAX no fue demasiado complicado. Simplemente, comprar el plugin en el market de Jeedom con mi usuario y seguir las instrucciones que, básicamente implican:
- Crear un nuevo usuario en la central AJAX que será el empleado por la domótica, y darle los permisos oportunos.
- En la configuración del plugin, emplear las credenciales de este nuevo usuario recién creado.
- Invitar a [email protected] como usuario de la alarma (paso necesario para poder recibir eventos desde la nube de AJAX).
- Muy importante, configurar el acceso externo al sistema Jeedom, de manera que pueda accederse a él desde Internet (sin esto, los eventos desde la nube de AJAX no podrán recibirse).
Tras configurar esto, y pulsar el correspondiente botón de sincronización, todos los equipos AJAX aparecerán en Jeedom.

Envío de datos de Jeedom a Home Assistant
A partir de ahí, solo quedaba lograr que la información viajara hasta Home Assistant. Aquí es donde entra MQTT, un protocolo ligero de comunicación ampliamente utilizado en domótica.
Configuré en Jeedom el plugin gratuito MQTT Manager para que se conectara al servidor MQTT Mosquitto que tengo configurado en mi sistema Home Assistant y que ya recibía el estado de mis equipos Tasmota, mi caldera que comunica mediante Ebusd, y todos mis equipos Zigbee mediante Zigbee2MQTT. También configuré que publicara automáticamente todos los eventos generados en todos los dispositivos mediante MQTT.
Luego, configuré manualmente en el fichero de configuración yaml de sensores MQTT todos los botones para la gestión del estado de la alarma, así como los binary_sensors y los sensors para recibir los distintos estados.
button:
# Ojo, sólo puede haber una sección sensor, una sección binary_sensor y una sección button. Si hay varias, se hará caso
# sólo a la última
# Botones para actuar sobre la central
- name: "Armar alarma"
# Ojo, el "15" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
command_topic: "jeedom/cmd/set/15"
unique_id: "control_arm_ajax_from_jeedom"
payload_press: "ARM"
retain: false
device:
identifiers: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Alarma Modo Noche"
# Ojo, el "16" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
command_topic: "jeedom/cmd/set/16"
unique_id: "control_night_mode_ajax_from_jeedom"
payload_press: "NIGHT MODE"
retain: false
device:
identifiers: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Desarmar alarma"
# Ojo, el "17" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
command_topic: "jeedom/cmd/set/17"
unique_id: "control_disarm_ajax_from_jeedom"
payload_press: "DISARM"
retain: false
device:
identifiers: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Parar alarma incendio"
# Ojo, el "19" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
command_topic: "jeedom/cmd/set/19"
unique_id: "mute_fire_detectors_ajax_from_jeedom"
payload_press: "muteFireDetectors"
retain: false
device:
identifiers: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
sensor:
# Sensores de la central AJAX
- name: "Estado Alarma Ajax"
# Ojo, el "1" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/1"
unique_id: "estado_alarma_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: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Último evento"
# Ojo, el "3" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/3"
unique_id: "ultimo_evento_alarma_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: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Código último evento"
# Ojo, el "4" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/4"
unique_id: "codigo_ultimo_evento_alarma_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: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Intensidad señal móvil"
# Ojo, el "5" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/7"
unique_id: "gsm_signal_level_alarma_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: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Tipo red móvil"
# Ojo, el "6" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/8"
unique_id: "gsm_network_status_alarma_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: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Estado batería"
# Ojo, el "13" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/13"
unique_id: "battery_state_alarma_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: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Carga batería"
# Ojo, el "14" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/14"
unique_id: "battery_charge_level_alarma_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: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Puerta 1 Temperatura"
# Ojo, el "74" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/74"
unique_id: "temperatura_puerta_1_ajax_from_jeedom"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
device_class: temperature
state_class: measurement
unit_of_measurement: "°C"
expire_after: 2629746
device:
identifiers: "Puerta 1 AJAX via Jeedom MQTT"
name: "Sensor puerta 1 AJAX"
model: "DoorProtect"
manufacturer: "AJAX"
- name: "Puerta 2 Temperatura"
# Ojo, el "94" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/94"
unique_id: "temperatura_puerta_2_ajax_from_jeedom"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
device_class: temperature
state_class: measurement
unit_of_measurement: "°C"
expire_after: 2629746
device:
identifiers: "Puerta 2 AJAX via Jeedom MQTT"
name: "Sensor puerta 2 AJAX"
model: "DoorProtect"
manufacturer: "AJAX"
- name: "Puerta 3 Temperatura"
# Ojo, el "84" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/84"
unique_id: "temperatura_puerta_3_ajax_from_jeedom"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
device_class: temperature
state_class: measurement
unit_of_measurement: "°C"
expire_after: 2629746
device:
identifiers: "Puerta 3 AJAX via Jeedom MQTT"
name: "Sensor puerta 3 AJAX"
model: "DoorProtect"
manufacturer: "AJAX"
- name: "Detector 1 Temperatura"
# Ojo, el "40" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/40"
unique_id: "temperatura_detector_1_ajax_from_jeedom"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
device_class: temperature
state_class: measurement
unit_of_measurement: "°C"
expire_after: 2629746
device:
identifiers: "Detector 1 AJAX via Jeedom MQTT"
name: "Detector 1 AJAX"
model: "MotionCam (PhOD)"
manufacturer: "AJAX"
- name: "Detector 2 Temperatura"
# Ojo, el "56" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/56"
unique_id: "temperatura_detector_2_ajax_from_jeedom"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
device_class: temperature
state_class: measurement
unit_of_measurement: "°C"
expire_after: 2629746
device:
identifiers: "Detector 2 AJAX via Jeedom MQTT"
name: "Detector 2 AJAX"
model: "MotionCam (PhOD)"
manufacturer: "AJAX"
- name: "Detector 3 Temperatura"
# Ojo, el "64" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/64"
unique_id: "temperatura_detector_3_ajax_from_jeedom"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
device_class: temperature
state_class: measurement
unit_of_measurement: "°C"
expire_after: 2629746
device:
identifiers: "Detector 3 AJAX via Jeedom MQTT"
name: "Detector 3 AJAX"
model: "MotionCam (PhOD)"
manufacturer: "AJAX"
- name: "Detector 4 Temperatura"
# Ojo, el "32" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/32"
unique_id: "temperatura_detector_4_ajax_from_jeedom"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
device_class: temperature
state_class: measurement
unit_of_measurement: "°C"
expire_after: 2629746
device:
identifiers: "Detector 4 AJAX via Jeedom MQTT"
name: "Detector 4 AJAX"
model: "MotionCam (PhOD)"
manufacturer: "AJAX"
- name: "Detector 5 Temperatura"
# Ojo, el "48" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/48"
unique_id: "temperatura_detector_5_ajax_from_jeedom"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
device_class: temperature
state_class: measurement
unit_of_measurement: "°C"
expire_after: 2629746
device:
identifiers: "Detector 5 AJAX via Jeedom MQTT"
name: "Detector 5 AJAX"
model: "MotionCam (PhOD)"
manufacturer: "AJAX"
- name: "Detector 6 Temperatura"
# Ojo, el "24" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/24"
unique_id: "temperatura_detector_6_ajax_from_jeedom"
value_template: '{% if value_json.value is defined and value_json.value != "" %}{{value_json.value}}{% else %}{{this.state}}{% endif %}'
device_class: temperature
state_class: measurement
unit_of_measurement: "°C"
expire_after: 2629746
device:
identifiers: "Detector 6 AJAX via Jeedom MQTT"
name: "Detector 6 AJAX"
model: "MotionCam (PhOD)"
manufacturer: "AJAX"
binary_sensor:
- name: "Manipulación alarma"
# Ojo, el "5" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/5"
unique_id: "manipulacion_alarma_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: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Conexión red móvil"
# Ojo, el "6" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/6"
unique_id: "gsm_status_alarma_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: connectivity
payload_on: "1"
payload_off: "0"
device:
identifiers: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Datos móviles activos"
# Ojo, el "9" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/9"
unique_id: "gsm_gprs_enabled_alarma_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: connectivity
payload_on: "1"
payload_off: "0"
device:
identifiers: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Conexión a CRA"
# Ojo, el "10" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/10"
unique_id: "cms_active_channels_alarma_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: connectivity
payload_on: "1"
payload_off: "0"
device:
identifiers: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Ethernet activo"
# Ojo, el "11" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/11"
unique_id: "ethernet_enabled_alarma_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: connectivity
payload_on: "1"
payload_off: "0"
device:
identifiers: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Alimentación externa"
# Ojo, el "12" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/12"
unique_id: "externally_powered_alarma_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: "Alarma AJAX via Jeedom MQTT"
name: "Alarma AJAX"
model: "Hub 2 Plus"
manufacturer: "AJAX"
- name: "Puerta 1"
# Ojo, el "72" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/72"
unique_id: "estado_puerta_1_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: "Puerta 1 AJAX via Jeedom MQTT"
name: "Sensor puerta 1 AJAX"
model: "DoorProtect"
manufacturer: "AJAX"
- name: "Puerta 2"
# Ojo, el "92" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/92"
unique_id: "estado_puerta_2_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: "Puerta 2 AJAX via Jeedom MQTT"
name: "Sensor puerta 2 AJAX"
model: "DoorProtect"
manufacturer: "AJAX"
- name: "Puerta 3"
# Ojo, el "82" corresponde al número de comando que Jeedom ha configurado para mi alarma.
# Cambiar por lo que corresponda
state_topic: "jeedom/cmd/event/82"
unique_id: "estado_puerta_3_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: "Puerta 3 AJAX via Jeedom MQTT"
name: "Sensor puerta 3 AJAX"
model: "DoorProtect"
manufacturer: "AJAX"
Lenguaje del código: YAML (yaml)
Tras recargar las entidades MQTT configuradas manualmente desde Home Assistant, todos estos sensores comenzaron a mostrar información en tiempo real. Tras algunas pruebas, ajustes y correcciones menores, conseguí no solo visualizar el estado de la alarma desde mi panel de Home Assistant, sino también controlarla: armarla, desarmarla e integrarla en diversas automatizaciones.
Ahora puedo gestionar mi alarma AJAX desde Home Assistant con total fluidez, sin perder la confianza que me da mantener mi casa monitorizada por una CRA.
Puedo crear escenarios complejos que involucran iluminación, notificaciones avanzadas y acciones automáticas en función del estado de la alarma. También puedo detectar apertura de las puertas monitorizadas por los sensores de AJAX, sin importar que la alarma esté o no activa. La temperatura reportada por los sensores no está muy allá: parece que el umbral de generación de eventos está por encima del grado y medio, por lo que no es demasiado práctico emplear estos datos.
Esta integración no solo mejora la seguridad, sino que también hace que la gestión de mi hogar inteligente sea más práctica y cómoda que nunca.