Skip to content

External Keypads Z Wave

raman325 edited this page Oct 27, 2026 · 1 revision

External Keypads: Z-Wave Alarm Keypads (Ring Alarm Keypad v2)

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.user in the automation if some users should only arm, and the lock_code_manager_credential_used event 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_notification

This drops every Z-Wave notification event from history, not just the keypad's.

Clone this wiki locally