Synchronize Ring Alarm Keypad v2 with Alarmo

I’ve been using this keypad with Alarmo since October 2024, and it worked flawlessly until recently. As of February 2026, several key functions have stopped working:

  • No countdown timer or audible beeps when arming Away or when entering the home
  • No visual progress bar during exit/entry delays
  • Siren no longer activates when testing alarm triggers

When I press Away, the system does arm correctly (confirmed in the HA app), but the keypad shows no visual feedback and doesn’t run the countdown. Once the system is armed, it still announces “Away and Armed.” Disarming also works and announces normally.

Troubleshooting so far

  • Removed and re‑added the keypad as a new device
  • Moved very close to Zwave antennae just in case
  • Bought a brand‑new keypad to rule out hardware failure — same issue
  • Confirmed all volume and brightness settings are above zero
  • Used ChatGPT and Perplexity to walk through troubleshooting steps
  • Restored my entire HA setup back to February 2026 (the last point where I believe everything was working correctly)

Versions during testing (Feb 2026)

  • Home Assistant: 2026.2.3
  • Alarmo Card: v1.6.7
  • Alarmo: v1.10.15
  • Z‑Wave JS: 1.0.1

Even after rolling back to these versions, the keypad still behaves incorrectly.

At this point I’m not sure if this is a known issue or something unique to my setup, but I’m out of ideas and would appreciate any insight.

SCROLLING UP AND READING
“When you are one the bleuprint page, click on the three dot in front of the one you want and select reload.”

Ok this fixed it !!! Holy shit (dances around)

Now to revert back to April version of all HA things and see what happens.
-Q- What can possibly get screwed up with a bleuprint that it requires reloading and, is this something fairly typical?

1 Like

@ImSorryButWho can you also try adding suggested
3-second delay to workaround this infamous issue? → Ring Keypad v2 (4AK1SZ) seems to lose connection often after being armed · Issue #4879 · zwave-js/zwave-js · GitHub

Quoting kiety from GitHub:

noticed the S2 security collision. Thanks to that find, I think I’ve found a solution. I’ve added a 3 second delay between Alarmo disarming and sending the disarm command back to the Ring Keypads. I added -delay: "00:00:03" after line 225 in @ImSorryButWho 's Ring Alarm Sync Blueprint.

conditions:
- condition: trigger
id: alarm_disarmed
sequence:
- delay: "00:00:03" # <--------
- service: zwave_js.set_value
target:
device_id: !input keypad
data:
command_class: "135"
endpoint: "0"
property: "2"
property_key: "1"
value: 99

I’ve done limiting testing, but so far it seems to improve the situation.

2 Likes

FYI, Ryckie added a optional delay setting to workaround S2 security collisions in commit b6bec78 to his fork Advanced Ring Keypad V2 Blueprint for Home Assistant (Alarmo)

3 Likes

After testing it for a while, is this fix working OK?

Love this blueprint. Has always been a favorite of mine.

Spook, however, set up a blueprint updater in their new version and this was one that got flagged for update. After that my timer did not function anymore. After turning on tracing for this automation I found it was passing the time delay into the function in a string while my device was wanting a number for that variable. As well as using “timeout” instead of a number for the property_key.

Tracked tthis down to THIS PR.

If you update and the timer breaks, just “take control” of the automation and revert the changes on the lines listed. This appears to be due to something with an update to the way Z-WaveJS updates something something something.

It’s all a little above my head into the nitty gritty of the Z-Wave protocol. But this revert worked. Just want to try and save someone some extra time. I spent 2 hours diagnosing this.

2 Likes

@ImSorryButWho , please revert this PR, I had to adjust it too!

**Logboek Details (FOUT)**

Logger: homeassistant.components.automation.ring_keypad_garage
Bron: helpers/script.py:2291
Integratie: Automatisering ([documentatie](https://www.home-assistant.io/integrations/automation), [problemen](https://github.com/home-assistant/core/issues?q=is%3Aissue+is%3Aopen+label%3A%22integration%3A+automation%22))
Eerst voorgekomen: 20:00:26 (2 gebeurtenissen)
Laatst gelogd: 20:00:26

* Ring Keypad Garage: Choose at step 1: choice 8: Error executing script. Error for call_service at pos 1: Node(node_id=12) - NotFoundError: Value 12-135-0-18-timeout not found on node Node(node_id=12)
* Ring Keypad Garage: Error executing script. Error for choose at pos 1: Node(node_id=12) - NotFoundError: Value 12-135-0-18-timeout not found on node Node(node_id=12)

and

**Logboek Details (FOUT)**

Logger: homeassistant.components.automation.ring_keypad_garage
Bron: components/automation/\__init_\_.py:806
Integratie: Automatisering ([documentatie](https://www.home-assistant.io/integrations/automation), [problemen](https://github.com/home-assistant/core/issues?q=is%3Aissue+is%3Aopen+label%3A%22integration%3A+automation%22))
Eerst voorgekomen: 20:00:26 (1 gebeurtenis)
Laatst gelogd: 20:00:26

Error while executing automation automation.ring_keypad_garage: Node(node_id=12) - NotFoundError: Value 12-135-0-18-timeout not found on node Node(node_id=12)

Reverting that PR fixed it!

It seems like that PR did fix it for some people.

My guess is its based on firmware. I think the smart solution here would be to have a check box or dropdown in the blueprint config for “Legacy Protocol” which can flip those variables without needing to manually edit.

What version of the FW do you have on your device? I’ve recently acquired a second Keypad with 1.20.0 and there seem to be quite a bit of changes compared to 1.18.0. Apparently there is also a version 2.0.0, but only for some hardware versions.

So that’s the weird thing. Supposedly I’m on 2.0.0 but that PR comes from a post where the protocol supposedly got an update. Check this link here and here. That’s why I said it was all quite above my head.

It should also be noted that I have NEVER owned a ring base station so I have no way to update the firmware on this device other than through home assistant. Which from what I’ve read in documentation is almost impossible.
image

My two devices are on firmware v1.18.0.
I also don’t have any base station so upgrading the firmware seems to be impossible.

It’s working great again with the revert however.

It seems there may be different revisions/firmware versions of the Ring Keypad v2 in use. Some keypads apparently work with the newer property_key: "timeout" implementation, while others — including mine — still require the older property_key: "7" with the delay specified as a numeric value in seconds.

Would it make sense to support both methods in the blueprint?

For example, the blueprint could have an optional switch such as “Use legacy delay format”:

  • Off (default): use the current property_key: "timeout" implementation
  • On: use property_key: "7" and pass the Alarmo delay as seconds

This would allow users with older keypad revisions to keep using the blueprint without having to take control of the automation or maintain a modified local copy, while keeping the new implementation as the default for newer devices.

Something along the lines of:

legacy_delay_mode:
  name: Use legacy delay format
  description: >
    Enable this for Ring Keypad v2 devices that expose the entry/exit
    delay using property key 7 and a numeric duration in seconds.
    Leave disabled for devices using the newer "timeout" property key.
  default: false
  selector:
    boolean:

The alarm_arming and alarm_pending branches could then select the appropriate zwave_js.set_value call based on this setting.

Variables:

variables:
  alarm: !input alarm
  legacy_delay_mode: !input legacy_delay_mode

  formatted_delay: >
    {% set delay = state_attr(alarm, 'delay') %}
    {% set total_seconds = delay if delay is not none else 0 %}
    {% set minutes = total_seconds // 60 %}
    {% set seconds = total_seconds % 60 %}
    {{ minutes }}m{{ seconds }}s

For arming eg.:

- conditions:
    - condition: trigger
      id: alarm_arming
  sequence:
    - choose:
        - conditions:
            - condition: template
              value_template: "{{ legacy_delay_mode }}"
          sequence:
            - service: zwave_js.set_value
              target:
                device_id: !input keypad
              data:
                command_class: "135"
                endpoint: "0"
                property: "18"
                property_key: "7"
                value: "{{ state_attr(alarm, 'delay') }}"
      default:
        - service: zwave_js.set_value
          target:
            device_id: !input keypad
          data:
            command_class: "135"
            endpoint: "0"
            property: "18"
            property_key: "timeout"
            value: "{{ formatted_delay }}"

and for pending eg.:

- conditions:
    - condition: trigger
      id: alarm_pending
  sequence:
    - choose:
        - conditions:
            - condition: template
              value_template: "{{ legacy_delay_mode }}"
          sequence:
            - service: zwave_js.set_value
              target:
                device_id: !input keypad
              data:
                command_class: "135"
                endpoint: "0"
                property: "17"
                property_key: "7"
                value: "{{ state_attr(alarm, 'delay') }}"
      default:
        - service: zwave_js.set_value
          target:
            device_id: !input keypad
          data:
            command_class: "135"
            endpoint: "0"
            property: "17"
            property_key: "timeout"
            value: "{{ formatted_delay }}"

I think this would provide a relatively simple backward-compatible solution for both types of Ring Keypad v2 devices.

If you think this approach makes sense, I’d also be happy to test the legacy path on my keypad.

I sumbitted a PR last night for this exact logic.

Already tested this PR in my local home assistant instance. With tracking tracing it appears to function properly and passes the expected variables in the zwave command. I obviously cannot test if it actually functions with the “new” method, but everything i saw in my tests says it should work flawlessly.