blueprint: name: Alarmo Keypad Sync Mod 2025 by Ekylypse description: Keypad sync with Alarmo domain: automation input: state_topic: name: MQTT State Topic of your Keypad description: "The State Topic is composed of your base_topic (see your Z2M Addon Configuration) and the Friendly Name of your keypad in Z2M. Example: zigbee2mqtt/Keypad" selector: text: set_topic: name: MQTT Set Topic of your Keypad description: "This is the same as your State Topic, with the addition of /set. Example: zigbee2mqtt/Keypad/set" selector: text: entity: name: Alarmo entity description: "An alarm control panel entity from alarmo." selector: entity: domain: alarm_control_panel integration: alarmo triggers: - entity_id: !input entity to: armed_night id: to_state_armed_night trigger: state - entity_id: !input entity to: disarmed id: to_state_disarmed trigger: state - entity_id: !input entity to: armed_home id: to_state_armed_home trigger: state - entity_id: !input entity to: armed_away id: to_state_armed_away trigger: state - entity_id: !input entity to: arming id: to_state_arming trigger: state - entity_id: !input entity to: pending id: to_state_pending trigger: state - entity_id: !input entity to: triggered id: to_state_triggered trigger: state - topic: !input state_topic id: keypad_command trigger: mqtt - event_type: alarmo_failed_to_arm id: event_arm_failure trigger: event - event_type: alarmo_command_success id: event_command_success trigger: event conditions: [] actions: - choose: - conditions: - condition: trigger id: to_state_disarmed sequence: - data_template: topic: !input set_topic payload: |- { "arm_mode": { "mode": "disarm" } } action: mqtt.publish - conditions: - condition: trigger id: to_state_armed_home sequence: - data_template: topic: !input set_topic payload: |- { "arm_mode": { "mode": "arm_day_zones" } } action: mqtt.publish - conditions: - condition: trigger id: to_state_armed_night sequence: - data_template: topic: !input set_topic payload: |- { "arm_mode": { "mode": "arm_night_zones" } } action: mqtt.publish - conditions: - condition: trigger id: to_state_armed_away sequence: - data_template: topic: !input set_topic payload: |- { "arm_mode": { "mode": "arm_all_zones" } } action: mqtt.publish - conditions: - condition: trigger id: to_state_arming sequence: - data_template: topic: !input set_topic payload: |- { "arm_mode": { "mode": "exit_delay" } } action: mqtt.publish - conditions: - condition: trigger id: to_state_pending sequence: - data_template: topic: !input set_topic payload: |- { "arm_mode": { "mode": "entry_delay" } } action: mqtt.publish - conditions: - condition: trigger id: to_state_triggered sequence: - data_template: topic: !input set_topic payload: |- { "arm_mode": { "mode": "in_alarm" } } action: mqtt.publish - conditions: - condition: trigger id: keypad_command enabled: true sequence: - choose: - conditions: - condition: template value_template: "{{ trigger.payload_json.action == \"disarm\" }}" sequence: - action: mqtt.publish metadata: {} data: topic: alarmo/command payload: >- {"command":"DISARM","code":"{{ trigger.payload_json.action_code }}"} evaluate_payload: false enabled: true alias: Disarm - conditions: - condition: template value_template: "{{ trigger.payload_json.action == \"arm_all_zones\" }}" sequence: - action: mqtt.publish metadata: {} data: topic: alarmo/command payload: >- {"command":"ARM_AWAY","code":"{{ trigger.payload_json.action_code }}"} evaluate_payload: false enabled: true alias: ArmAway - conditions: - condition: template value_template: "{{ trigger.payload_json.action == 'arm_day_zones' }}" sequence: - action: mqtt.publish metadata: {} data: topic: alarmo/command payload: >- {"command":"ARM_HOME","code":"{{ trigger.payload_json.action_code }}"} evaluate_payload: false enabled: true alias: ArmHome - conditions: - condition: template value_template: "{{ trigger.payload_json.action == \"arm_night_zones\" }}" sequence: - action: mqtt.publish metadata: {} data: topic: alarmo/command payload: >- {"command":"ARM_NIGHT","code":"{{ trigger.payload_json.action_code }}"} evaluate_payload: false enabled: true alias: ArmNight enabled: true - conditions: - condition: trigger id: event_arm_failure sequence: - choose: - conditions: - condition: template value_template: "{{ trigger.event.data.reason == 'invalid_code' }}" sequence: - data_template: topic: !input set_topic payload: |- { "arm_mode": { "transaction": {{ trigger.event.data.context_id }}, "mode": "invalid_code" } } action: mqtt.publish - alias: Send a notification to each device repeat: for_each: [] sequence: - data: title: Alarmo error message: Invalid code data: sticky: "true" action: >- notify.mobile_app_{{ device_attr(repeat.item, 'name')| slugify }} - conditions: - condition: template value_template: "{{ trigger.event.data.reason == 'open_sensors' }}" sequence: - data_template: topic: !input set_topic payload: |- { "arm_mode": { "transaction": {{ trigger.event.data.context_id }}, "mode": "not_ready" } } action: mqtt.publish - alias: Send a notification to each device repeat: for_each: [] sequence: - data: title: Alarmo error message: Not ready (possible open sensors) data: sticky: "true" action: >- notify.mobile_app_{{ device_attr(repeat.item, 'name')| slugify }} - conditions: - condition: template value_template: "{{ trigger.event.data.reason == 'not_allowed' }}" - condition: template value_template: "{{ trigger.event.data.command|lower == 'disarm' }}" sequence: - data_template: topic: !input set_topic payload: |- { "arm_mode": { "transaction": {{ trigger.event.data.context_id }}, "mode": "already_disarmed" } } action: mqtt.publish - alias: Send a notification to each device repeat: for_each: [] sequence: - data: title: Alarmo error message: Already disarmed data: sticky: "true" action: >- notify.mobile_app_{{ device_attr(repeat.item, 'name')| slugify }} - conditions: - condition: trigger id: event_command_success sequence: - choose: - conditions: - condition: template value_template: "{{ trigger.event.data.action == 'arm' }}" - condition: template value_template: "{{ trigger.event.data.context_id != null }}" - condition: template value_template: "{{ trigger.event.data.mode == 'away' }}" sequence: - data_template: topic: !input set_topic payload: |- { "arm_mode": { "transaction": {{ trigger.event.data.context_id }}, "mode": "arm_all_zones" } } action: mqtt.publish - conditions: - condition: template value_template: "{{ trigger.event.data.action == 'arm' }}" - condition: template value_template: "{{ trigger.event.data.context_id != null }}" - condition: template value_template: "{{ trigger.event.data.mode == 'home' }}" sequence: - data_template: topic: !input set_topic payload: |- { "arm_mode": { "transaction": {{ trigger.event.data.context_id }}, "mode": "arm_day_zones" } } action: mqtt.publish - conditions: - condition: template value_template: "{{ trigger.event.data.action == 'arm' }}" - condition: template value_template: "{{ trigger.event.data.context_id != null }}" - condition: template value_template: "{{ trigger.event.data.mode == 'night' }}" sequence: - data_template: topic: !input set_topic payload: |- { "arm_mode": { "transaction": {{ trigger.event.data.context_id }}, "mode": "arm_night_zones" } } action: mqtt.publish - conditions: - condition: template value_template: "{{ trigger.event.data.action == 'disarm' }}" - condition: template value_template: "{{ trigger.event.data.context_id != null }}" sequence: - data_template: topic: !input set_topic payload: |- { "arm_mode": { "transaction": {{ trigger.event.data.context_id }}, "mode": "disarm" } } action: mqtt.publish mode: parallel max: 10