Schlage BE469 Issues (Again) JS vs. ZIP

I have been struggling with my Schlage BE469 deadbolt lock of late.

Most recent symptom was the lock responded to lock and unlock commends but did not permit changing key codes nor did it properly report existing codes.

I tried may things, repairing the device, moving the hub closer, hour chatting with AI for ideas and sharing logs and so forth.

Most recently AI suggested JS is much more strict at enforcing timing rules whereas ZIP was more lax. So on a whim I swapped back to ZIP (I've been on JS for many months now). Now the lock allows me to change codes and the lock app also works.

So there is something weird about how JS works with sleepy FLiRS devices that is not working with these devices.

Anyone have a Schlage deadbolt working on JS reliably?

Not sure where to turn next? @bcopeland Any ideas for me?

Here is what AI said:

me: I am paired with S2

AI: If your Schlage lock successfully paired with S2 Access Control security, it narrows the blame significantly. This changes things, because it means you aren't dealing with the ancient S0 protocol—your lock is capable of modern, single-packet Z-Wave security.

With S2 active, this is primarily a defect in how Z-Wave JS handles the Hubitat command queue for these specific locks, combined with how slow the Schlage hardware handles wake-up calls.

This specific interaction explains why the ZIP engine works while Z-Wave JS drops your code changes, despite having the security protocol:

  1. The Z-Wave JS Issue: Queue Management and Aggressive Timeouts

When you change lock codes via a smart app, the hub doesn't just send one command; it sends a burst of sequential instructions (e.g., "Clear slot 3," "Write new code to slot 3," "Verify slot 3 code").

  • The JS Bottleneck: The Z-Wave JS engine is incredibly fast, but it is notorious for being highly aggressive with its timing windows and command queue. If a device does not respond to the first "clear slot" command immediately, Z-Wave JS can timeout, stall, or drop the subsequent "write code" commands in the queue.
  • The ZIP Advantage: Silicon Labs' legacy ZIP Gateway stack handles command queues differently. It is highly sequential, patient, and will holding-pattern messages until the device fully finishes processing the previous task. It doesn't trip over itself when communicating with a sluggish lock. [1, 2, 3]
  1. The Lock Issue: Slow FLiRS Wake-Up

Even though your lock has modern S2 security, it still uses a battery-saving hardware mechanism called FLiRS (Frequently Listening Routing Slave). [1, 2]

  • The lock is technically asleep 99% of the time.
  • When Hubitat wants to change a code, it has to send a "beam" to wake the lock up.
  • On the Schlage, it takes a fraction of a second too long for the chip to wake up, realize it needs to process a multi-step code change command, and reply.
  1. The Hubitat Component

Hubitat is caught in the middle because Z-Wave JS is still maturing on the platform. Many users in the Hubitat community have noted that while Z-Wave JS is excellent for standard devices and ghost-node removal, it still experiences inconsistent behavior and timing issues with heavy-payload devices like locks. Hubitat intentionally left the toggle to switch back to ZIP precisely because they knew certain legacy hardware combinations would struggle on the new engine. [1, 2, 3, 4]

The Verdict

It is a compatibility gap in Z-Wave JS's strict queue timing when talking to a slow-waking Schlage FLiRS lock. [1]

Since ZIP works flawlessly for you, it is absolutely best to leave the hub on the ZIP stack for now. The Hubitat team continuously patches the Z-Wave JS firmware, but until they fine-tune the command queuing for locks, ZIP is your best configuration. [1, 2, 3, 4]

Are your lock code changes pushing through instantly now, or do you still notice a 2- to 3-second delay when you save a new code in Hubitat?

I have a BE469 (Z-Wave, non-Plus, S0 security) on JS that works w/out issue. Reports status and unlocks/locks from commands/rules, etc. I'm able to add a new lock code, but status doesn't change in the app - says "Pending" and doesn't change, but I can use the new code at the lock.

I do not have encryption enabled.

I had an Ultraloq ZWave Pro lock (not a Schlage lock). When I tried JS the lock became number one failing device. So I switch back to ZIP. But I wanted to go ahead with JS so I took a risk and replaced Ultraloq ZWave Pro with Ultraloq ZWave V2 which is also LR. This new lock is paired in LR mode and of course, with S2 security. Now this new lock works pefectly fine with JS. All my other ZWave Devices are also happy with JS.

All 3 of mine do, but I do have one that is ornery taking a code in the 3rd slot (any other slot is fine)

I also have a BE469 with S2 on JS that works with no issue.

Oh Boy. Several folks have Schlage locks working with JS. Wasn't expecting that... Not sure why I am the odd man out... :tired_face:

I did say I could lock and unlock with JS. I just couldn't do complicated commands like change add/remove lock codes. I guess as a fallback I could switch to ZIP and make those changes then revert to JS for normal operation which is typically just lock unlock commands. I rarely change codes so that wouldn't be a major hardship in my use case.

The reason this cropped up was I created a new rule that is triggered upon a successful entry of one of the valid keycodes at the lock, then selectively, it turns on some lights and turns off the alarm system. I just recently got a mechanism setup for Hubitat to turn on/off my monitored alarm system. I found the rule wasn't triggering when a valid code was entered. This started me down this chasm that led me to here. I had setup the lock with codes long ago (when I was on ZIP) so until recently only used lock/unlock commands... now it seems the passing of a valid key entry isn't working with JS (I think). I am away from this location for a few days so when I get back I'll try a code entry at the keypad with ZIP and see if my rule operates properly and then go back to JS and see if it bogs down....

I got this far without complaining about Schlage but I really don't like their products. They seem buggy on the firmware front and documentation is weak, no published OTA files or release notes. I only went with them so I could have a single key for my home (all locks keyed alike). I had a Kwikset for years working under Vera with zero issues.

I did order a keyway kit to modify my Kwikset lock to accept a Schlage SC-1 key. If that works I'll put the Kwikset back in as I like its keypad much better.

In the meantime maybe others struggling with Schlage lock issues will see this. Maybe there is a JS tweak developers could add to timing (if that is the issue) to make it more robust on multi packet commends.

Lost in Schlagoland.....

Schlage has been an issue here for a long time, even before Zip and JS.. Which is why it's not on the compatibility list, even though it works for many... There seems to be some pretty drastic differences between firmware versions and models.. Some people have no problems, some can't even get it included.. I have bought schlage locks to test and could not replicate the problems, so I assume whatever model/firmware I had was not an issue..

PM sent w/offer of 1 Million Dollars for your lock. :wink:

image

What firmware?

image

Hmm... 11 should be fine.

It's been working (can change keypad codes) fine the last day or so but I stayed on ZIP and haven't returned to JS. I'm not going to try that until I get home.

For now the codes are the default length 4 digits but I prefer 7 digit codes. I'll change that from the lock keypad when I get home.

Then I can flip back and forth between zip and JS to see if it reveals much. Candidly if I get it to work with 7 digit codes and the code enter finally triggers a rule then I'll just leave it alone. I have already spent far too much time on what should be a trivial setup.

See above for my Schlage distain.... if you are going to be in the HA space you just have to have a better offering and support the major platforms. I doubt anyone is staying awake at night worrying about these locks on Hubitat over at Schlage-Allegion HQ.

Allegion if you are reading this how about getting your act together..... weak effort.

You will have to unpair the lock then factory reset the lock then change the code length before re pairing

??? really, it's a simple keypad change and doing so flushes all prior codes in the lock.

Any time I've tried to do that hubitat wouldn't add the codes when you change the code length on the lock alone.

I’ll try it when I get back. I think you change the key code length at the lock keypad then you have to change it at the device commands (I don’t think it is a command to the lock, just a local variable for the driver and LCM) to matchup with the lock. I know the lock will flush the codes when you change length, but not sure LCM will echo that. I think LCM gets the codes by polling the lock but not positive.

We’ll see soon.

OK I have arrived at a stable point through more trial and error (a lot of error :rage:).

  1. My lock is a Schlage BE469ZP
  2. My lock is now running 7 digit keycodes. I prefer this for comparison to phone numbers.
  3. The keycodes do successfully trigger the various rules I created for downstream action.
  4. I use Lock Code Manager to manage the codes. It works fine and is a good way to manage your code set. Allow you to assign a name to a code as well.
  5. Switching to Basic ZWave device and the plain ZWave Device drivers for diagnostics caused stored key codes to get scrambled and needing to be reentered and the scrambled ones deleted. Not sure why just another problem with this lock.
  6. This only works under ZIP for me, switching to JS and the rule triggering stopped working and I could no longer change codes via LCM.
  7. Code length changes from the Hubitat (Schlage BE469) device driver does not work, you have to change code length in the lock via the keypad, option 8.
  8. There is intentionally no OTA on these locks. Apparently Schlage uses one time programmable memory for security reasons. The firmware you buy it with is the only version you'll ever have on that lock.
  9. The membrane keypad is quirky. You have to hit the Schlage logo to wake it up or any key area. If you wake it up pressing the key area the lock will take that as you first digit even though you couldn't see what you are pressing as the backlight wasn't on. Just a poor design choice. Telling people to hit the Schlage logo then the keystrokes has a 25% success rate so invariably they end up entering the code a few times before it works. User frustration...
  10. The problems with JS are apparently due to tighter timing demands of JS vs ZIP. Some people report they have this lock working on JS but perhaps they have newer firmware or their usage profile doesn't need the tighter multi packet timing.

So I can do what I want to do with the lock if I stay with ZIP but I was well set on the JS path for the past several months so not pleased about going backwards. There is a lot of fumbling and false starts with this product. Now I have it set the way I want it I suppose it will be fairly stable but I will lose out on advancing benefits to JS as the go forward ZWave stack.

If I can retrofit my older (and dependable) Kwikset Lock with a Schlage SC1 keyway then this Schlage lock will be swiftly decommissioned....

I would just say stay away from Schlage ZWave locks. So many subtle conflicts and issues pop up. Allegion seems not very committed to the ZWave space and possibly HA in general.

OK more updates. I was able to get the Schlage lock to work reliably under JS, with some caveats.

After much trial and error and the help of AI I was able to get it to work. I was always able to get lock and unlock to work under JS but it wouldn’t work to have a keypad entry trigger a rule and LCM was hit or miss (possibly due to my 7 digit code insistence).

Anyway I set up the lock running ZIP and LCM to get the codes as I wanted. That all worked fine. Then I swapped over to JS and the lock worked (lock/unlock) but my original rule didn’t trigger at all (but strangely it did under ZIP). So I modified the rule trigger as follows and now the rule triggers under JS. It seems there is some sort of race condition where two messages happen back to back in JS that stop the normal trigger by code entry from working. When I trigger by this method it triggers before the corruption occurs and fires off the rule. Below is AI’s reasoning for the problem and why this solution fixes it.

So maybe more info than desired but if someone wants to use a Schlage lock and JS there are some work arounds you have to deal with. As mentioned, it works fine with ZIP both rules below but I want to run JS as it is the future and some of my other rules work better with JS than ZIP. Maybe the author of the built in Schlage driver can tweak the code to deal with the message collision issue noted below..

So this works now. LCM requires toggling back to ZIP but I don’t change codes often so not a major hardship. The rule workaround solves my biggest gap under JS. Interestingly all this running around gets me to parity with my 12 year old Vera and circa 2010 Kwikset lock :face_exhaling: that worked for over a decade. Such is progress…

Stay tuned for the next installment, I will dump the Schlage lock and go in a different direction…. more to come.

–

–

–

Modified rule works fine under JS.

Original rule (below) worked fine under ZIP but not at all under JS…

I still find that strange. I have 3 of the be469’s and have none of these issues. Seems something else is at play here.

A race condition like that, if it even makes sense, couldn’t happen if the driver was singleThreaded: true @bcopeland ?

The part about “Rule Machine catches the text name instantly” sounds like bs.

You might be able to test the theory by monitoring Z-Wave logs, with debug logs turned on for both the device and RM rule.