🚨 Alarm System with Keypad support (Z2M / ZHA / Dashboard) [KEPZB-110]

Gotta love when code for a thing that is made by Home Assistant breaks because of one little piece of the code is just simply built wrong!
rainbow-spongebob

(Sorry @danieldeni, nothing against you lol. Just blaming things not being as simple as one would think)

:warning: New Update Available (2026.01.1)
Fix triggered notifications and add documentation improvements

What’s Fixed:

  • Triggered mode notifications now sent correctly (removed from config exclusion list)
  • Scripts were running but notifications failed due to config is not none check

What’s New:

  • Badge-style buttons in blueprint header (GitHub, Blueprint Code, Community, Version)
  • Version History section
  • Template binary sensor for presence tracking in package YAML example
  • Cleaned up description formatting to match other blueprints

Upgrade Instructions:

  • Simply re-import the blueprint and reload Automations
  • All changes are backward compatible

kinda new to this so sorry if it’s a stupid question but how do i use the arming mode?

I got everything to work but i just have the issue if i set it to away mode and leave the house the alarm triggers when i open my door. how do i use the arming mode so i give myself like 30sec or so to leave the house?

That is set with the arming_time parameter in the Manual Alarm Control Panel you made in YAML. It can have different settings per mode. If you dont set it, it should default to 60s.

As mentioned in the instructions inside the blueprint you should not set the ZHA Alarm Panel as the Main Alarm Panel, as that one doesn’t have the pending and arming states, so always directly switches states.

thx! i set the wrong main panel everything is working now.

:warning: New Update Available (2026.01.2)
Improve notification message readability and update documentation

What’s Changed:

  • Restructured default notification messages to place user/sensor names at the end for more natural phrasing (e.g., “The alarm is now armed in Away mode by {user_name}” instead of “{user_name} armed the alarm in Away mode”)
  • Updated dashboard keypad script aliases from colon to dash separator (“Alarm Dashboard - X” instead of “Alarm Dashboard: X”)
  • All notification defaults updated: armed modes, disarmed, arming, pending, triggered, and sensor alerts

Upgrade Instructions:

  • Simply re-import the blueprint and reload Automations
  • All changes are backward compatible
  • If you’ve customized your notification messages, this update will not affect them - changes only apply to defaults

@danieldeni
I have a problem.
So, when my alarm gets triggered by a sensor, it gets almost immediately dismissed and the mode switched back.


Is this a current problem, or is my config just wrong?

Which versions of HA / Z2M?

What was the state your Manual Alarm Control Panel was in when it got triggered?

Are you using a physical keypad and if so, connected through Z2M or ZHA?

I haven’t experienced this myself and am using it with the Z2M keypad + Dashboard Keypad.

I think it’s 2026.01.2 for MACP (according to the version history) and 2026.03.1b3 for HA Core. I am using a dashboard keypad, and it always does it on Armed Away, since I don’t currently use the other states, other than Disarmed, Armed Away, and Triggered. I also redid my entire blueprint just to be sure.

I am not running the beta of HA Core. Will see tonight if anything changes in 2026.03.0 release.

Okay, but the thing is, it’s been happening for a while, not just for this update…

No issues for me. Can you show how you have set up your Manual Alarm Control Panel? The blueprint shows how I have set mine, which works for me.

I got as much as I could. I didn’t really configure much, so I’m just showing what’s necessary related to the arming and triggering.

This is not readable.

Can you click on the three dots in the top right of that menu and click on Edit in YAML. Copy all the text and paste in a reply.

Mark it as preformatted text in the post, so it is easier to read.

Sorry about that. Here is the full YAML. I have privated my entity information in the yaml to protect my information.

use_blueprint:
  path: danielpetrovic/alarm-system-with-keypad.yaml
  input:
    alarm_control_panel_main: alarm_control_panel.alarm
    alarm_code_user:
      - input_text.alarm_code_user_1
      - input_text.alarm_code_user_2
    alarm_code_user_name: input_text.alarm_code_user_name
    integration_type:
      - dashboard
    alarm_dashboard_code: input_text.alarm_dashboard_code
    alarm_dashboard_action: input_text.alarm_dashboard_action
    alarm_presence_sensor: binary_sensor.home_members
    alarm_auto_arm_away: true
    alarm_auto_disarm_arriving: true
    alarm_schedule_weekdays_enabled: false
    alarm_schedule_weekends_enabled: false
    alarm_notifications_target:
      - {{ target_1 }}
      - {{ target_2 }}
      - {{ target_3 }}
      - {{ target_4 }}
      - {{ target_5 }}
      - {{ target_6 }}
      - {{ target_7 }}
      - {{ target_8 }}
    alarm_announcements_engine: tts.home_assistant_cloud
    alarm_announcements_player:
      - {{ announcements_device }}
    alarm_sensor_away:
      - {{ sensor_1 }}
      - {{ sensor_2 }}
      - {{ sensor_3 }}
    alarm_notifications_critical_armed_away: true
    alarm_notifications_critical_armed_home: true
    alarm_notifications_critical_armed_night: true
    alarm_sensor_night:
      - {{ sensor_1 }}
      - {{ sensor_3 }}
    alarm_notifications_critical_arming: true
    alarm_notifications_critical_pending: true
    alarm_notifications_critical_disarmed: true

The configuration of the blueprint seems to be ok.

Can you also post the YAML config of
alarm_control_panel.alarm itself? You should have this in YAML somewhere. As this is the entity that actually handles the state changes.

Yes, I found it in /homeassistant/packages/alarm.yaml.

alarm_control_panel:
  - platform: manual
    name: Alarm
    # Code is required to ARM the system, as requested.
    code_arm_required: true
    
    # --- Armed Away Settings ---
    armed_away:
      # Arming Time: 30 seconds to leave the house
      arming_time: 30
      # Delay Time: 60 seconds (1 minute) to enter the code
      delay_time: 60
    
    # --- Armed Home Settings ---
    armed_home:
      # Arming Time: Instant arm
      arming_time: 0
      # Delay Time: 30 seconds to enter the code
      delay_time: 30
      
    # --- Armed Night Settings ---
    armed_night:
      # Arming Time: Instant arm
      arming_time: 0
      # Delay Time: 30 seconds to enter the code
      delay_time: 30

The issue is that your blueprint config is missing the alarm_code_main input, but your alarm panel has code_arm_required: true. The blueprint sends the master code to the panel on every arm/disarm, when it’s not configured, it sends an empty code which the panel rejects.

Since you’re only using the dashboard keypad, the simplest fix is to just disable the code requirement on the panel side, the blueprint handles all code validation internally, the panel doesn’t need to enforce it too:

alarm_control_panel:
  - platform: manual
    name: Alarm
    code_arm_required: false  # ← change this

Thanks for this blueprint, but I’m having an issue. I have the following setup/hardware intended for the integration.

HA Core 2026.3.2
Sonoff Zigbee 3.0 USB Dongle Plus
Frient KEPZB0-110

All I want to do is have the ability to set individual user codes to be used with the Frient Keypad to change the alarm state, so that I can automate access to various part of the house (garage door, smart locks, etc) based on alarm arming and disarming. The Master set in the Alarm Code Main helper (which is the same code programmed within ZHA settings) will disarm the ZHA Keypad alarm. However, when I enter the codes for my two users (kids and guest) as set in the Alarm Code Kids and Alarm Code Guest helpers, the Frient alarm device in ZHA stays on “Armed Away” and doesn’t disarm. In all instances, the Alarm created by the Blueprint (manual Alarm Control Panel) doesn’t change states at all

I’m wondering what’s wrong with my setup.

I have the following set in my alarms.yaml

# Manual Alarm Control Panel
alarm_control_panel:
  - platform: manual
    name: Alarm
    code_arm_required: true
    armed_away:
      arming_time: 0
      delay_time: 20
    armed_home:
      arming_time: 0
      delay_time: 10
    armed_night:
      arming_time: 0
      delay_time: 20

# Input Text Helpers
input_text:
  # Main/Master code (sent to alarm panel)
  alarm_code_main:
    name: Alarm Code Main
    icon: mdi:server-security
    mode: password
    min: 4
    max: 16
    pattern: "^[0-9]+$"  # Supports PIN only

  # User codes (validated by blueprint)
  alarm_code_user_1:
    name: Alarm Code Kids
    icon: mdi:teddy-bear
    mode: password
    min: 4
    max: 16
    pattern: "^[0-9A-F+]+$"  # Supports PIN and RFID
  alarm_code_user_2:
    name: Alarm Code Guest
    icon: mdi:vacuum
    mode: password
    min: 4
    max: 16
    pattern: "^[0-9A-F+]+$"  # Supports PIN and RFID

  # User name storage (updated by blueprint)
  alarm_code_user_name:
    name: Alarm Last User Name
    icon: mdi:account
    max: 255re

And here is the Automation from Blueprint YAML

alias: Frient Keypad Blueprint
description: ""
use_blueprint:
  path: danielpetrovic/alarm-system-with-keypad.yaml
  input:
    alarm_control_panel_main: alarm_control_panel.alarm
    alarm_code_main: input_text.alarm_code_main
    alarm_code_user:
      - input_text.alarm_code_user_1
      - input_text.alarm_code_user_2
    alarm_code_user_name: input_text.alarm_code_user_name
    integration_type:
      - zha
    zha_alarm_keypad_device: "actualdevicenumbersredacted"
    zha_alarm_control_panel_keypad: alarm_control_panel.frient_a_s_kepzb_110_alarm_control_panel
    zha_alarm_code_keypad: input_text.alarm_code_main
    alarm_schedule_weekdays_enabled: false
    alarm_schedule_weekends_enabled: false