Skip to content

Instantly share code, notes, and snippets.

@julienma
Last active February 4, 2026 00:04
Show Gist options
  • Select an option

  • Save julienma/555a408c486d109c5ec1e8c0ae1eddbc to your computer and use it in GitHub Desktop.

Select an option

Save julienma/555a408c486d109c5ec1e8c0ae1eddbc to your computer and use it in GitHub Desktop.
Home Assistant blueprint for Frient Keypad integration with Alarmo alam control panel
blueprint:
name: "Frient Zigbee Keypad with Alarmo (PINs managed in Alarmo)"
description: >
This blueprint integrates the Frient Zigbee keypad with the Alarmo alarm control panel
via Zigbee2MQTT. PINs and RFID tags are fully managed inside Alarmo —
the keypad simply passes user actions (arm/disarm/emergency) to Alarmo.
domain: automation
author: "Based on nelis and AndrejDelany blueprint. Modified by DopeHead200 and julienma."
source_url: "https://github.com/DopeHead200/alarmo-keypad-blueprint"
input:
z2m_keypad_path:
name: "MQTT State Topic of your Zigbee2MQTT Keypad"
description: "Example: zigbee2mqtt/Keypad"
selector:
text: {}
z2m_keypad_path_set:
name: "MQTT Set Topic of your Zigbee2MQTT Keypad"
description: "Example: zigbee2mqtt/Keypad/set"
selector:
text: {}
control_panel:
name: "Alarmo Control Panel"
description: "Select your Alarmo control panel entity (alarm_control_panel)"
selector:
entity:
domain: alarm_control_panel
trigger:
# Un seul trigger pour tous les états du panneau
- platform: state
entity_id: !input control_panel
id: panel_state
- platform: mqtt
topic: !input z2m_keypad_path
id: keypad_mqtt
condition: []
action:
- choose:
# --- Alarmo → Keypad sync (simplifié) ---
- conditions:
- condition: trigger
id: panel_state
- condition: template
value_template: >
{{ trigger.to_state is not none and
trigger.to_state.state in [
'arming','armed_away','armed_home','armed_night',
'pending','triggered','disarmed'
] }}
sequence:
- variables:
mode_map:
arming: exit_delay
armed_away: arm_all_zones
armed_home: arm_day_zones
armed_night: arm_night_zones
pending: entry_delay
triggered: in_alarm
disarmed: disarm
- action: mqtt.publish
data:
topic: !input z2m_keypad_path_set
payload: >
{ "arm_mode": { "mode": "{{ mode_map[trigger.to_state.state] }}" } }
# --- Keypad → Alarmo ---
- conditions:
- condition: trigger
id: keypad_mqtt
sequence:
- choose:
- conditions:
- condition: template
value_template: '{{ trigger.payload_json.action == "arm_all_zones" }}'
sequence:
- action: alarm_control_panel.alarm_arm_away
target:
entity_id: !input control_panel
data:
code: '{{ trigger.payload_json.action_code | default("") }}'
- conditions:
- condition: template
value_template: '{{ trigger.payload_json.action == "arm_day_zones" }}'
sequence:
- action: alarm_control_panel.alarm_arm_home
target:
entity_id: !input control_panel
data:
code: '{{ trigger.payload_json.action_code | default("") }}'
- conditions:
- condition: template
value_template: '{{ trigger.payload_json.action == "arm_night_zones" }}'
sequence:
- action: alarm_control_panel.alarm_arm_night
target:
entity_id: !input control_panel
data:
code: '{{ trigger.payload_json.action_code | default("") }}'
- conditions:
- condition: template
value_template: '{{ trigger.payload_json.action == "disarm" }}'
sequence:
- action: alarm_control_panel.alarm_disarm
target:
entity_id: !input control_panel
data:
code: '{{ trigger.payload_json.action_code | default("") }}'
- conditions:
- condition: template
value_template: '{{ trigger.payload_json.action == "emergency" }}'
sequence: []
default: []
mode: parallel
max: 10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment