Repository navigation
External Keypads Z Wave
Part of External Keypads, which explains the use_credential action these recipes call and what a valid code produces.
Z-Wave keypads like the Ring Alarm Keypad v2 store no codes. Each time someone
enters a code and presses a button, the keypad sends it to Home Assistant as a
zwave_js_notification event from the Entry Control command class (111). The
code is in event_data and the button is in event_type. That makes the keypad a
code source like any other: Lock Code Manager checks the code, and your automation
arms or disarms the alarm.
The event types for the Ring Alarm Keypad v2's buttons, from a Ring keypad user's testing and node-zwave-js's Entry Control event types:
event_type |
Button |
|---|---|
2 |
Enter (a code submitted on its own) |
3 |
Disarm |
5 |
Away |
6 |
Home |
Other Entry Control keypads may send different event types. To check yours, open
Developer tools → Events, listen to zwave_js_notification, and press the
buttons.
The automation below uses Alarmo, but any
alarm panel's arm and disarm actions work the same way. Replace the device ID with
your keypad's (it's in the URL of the keypad's device page), and use any entity
that belongs to the keypad as source:
automation:
- alias: "Ring keypad: arm and disarm Alarmo"
mode: queued
triggers:
- trigger: event
event_type: zwave_js_notification
event_data:
command_class: 111
device_id: your_keypad_device_id
conditions:
- "{{ trigger.event.data.event_type in [3, 5, 6] }}"
- "{{ trigger.event.data.event_data is string
and trigger.event.data.event_data | length > 0 }}"
actions:
- action: lock_code_manager.use_credential
data:
config_entry_title: House Locks
code: "{{ trigger.event.data.event_data }}"
source: sensor.ring_keypad_battery_level
target: alarm_control_panel.alarmo
response_variable: check
- if: "{{ check.valid }}"
then:
- choose:
- conditions: "{{ trigger.event.data.event_type == 3 }}"
sequence:
- action: alarmo.disarm
data: {entity_id: alarm_control_panel.alarmo}
- conditions: "{{ trigger.event.data.event_type == 5 }}"
sequence:
- action: alarmo.arm
data: {entity_id: alarm_control_panel.alarmo, mode: away}
- conditions: "{{ trigger.event.data.event_type == 6 }}"
sequence:
- action: alarmo.arm
data: {entity_id: alarm_control_panel.alarmo, mode: home}With two keypads, add the second keypad's device ID as another trigger. Both then check against the same users, so there is nothing to keep in sync between them.
Let Lock Code Manager decide who gets in. Alarmo checks codes against its own users, so for it to accept an arm or disarm that Lock Code Manager already approved, turn off Require code for disarming (and Require code for arming, if it's on) in Alarmo's Codes settings. Two things to know about that:
- Alarmo then disarms without a code from anywhere, including its own dashboard card, so anyone who can use your dashboards can disarm it.
- Alarmo's per-user rules (who may arm or disarm, which areas) and its record of
who changed the state no longer apply. Use Lock Code Manager's users and
conditions to control who may use the keypad,
check.userin the automation if some users should only arm, and thelock_code_manager_credential_usedevent for who did it.
Keypad feedback. The keypad's spoken confirmations and lights are set
separately through the Indicator command class; Lock Code Manager doesn't send
them. The community thread above shows how, and adding that step after the
choose gives the keypad its confirmation.
Keep the code out of your history. The code travels in the
zwave_js_notification event, and the recorder keeps events. To stop that:
recorder:
exclude:
event_types:
- zwave_js_notificationThis drops every Z-Wave notification event from history, not just the keypad's.
Getting Started
- Upgrading to 7.0
- Upgrading to 6.0
- Upgrading to 5.0
- Configuration Structure
- Adding and Removing Locks
- Migrating from keymaster
UI
Features
- Managing Guests and Rentals
- Services and Actions
- Blueprints
- Tracking lock state change events
- Using Condition Entities
- Unsupported Condition Entities
Advanced
Development
Troubleshooting
FAQ
Supported Integrations