Schlage Connect ZWave Locks


You definitely need the network key for secure nodes :). Glad its working. I really like my lock with HA. Hope yours works out for you too


Just wanted to chime in on this thread. I moved to HA from Vera back in 2016. But the one thing that I left attached to Vera was my Schlage lock (BE469) since the process looked daunting.

Well, I moved my lock over to Hassio this morning and it couldn’t have gone smoother. I followed the steps that @mkzimms posted above, but tweaked the steps slightly to work with Hassio. Since Hassio has built-in Zwave control, I added the secure node from there instead of dropping-out to OZWC.

In a nutshell:

  1. Make sure you’ve set a network key for your zwave network. I used the code on that page (in a Hassio SSH session) to generate my key. Restart Hassio after adding a key the first time.
  2. Exclude lock from Vera (long-press zwave button on Vera, key programming code into lock + press zero)
  3. Factory reset lock (disconnect battery, press and hold Schlage button, reconnect battery, release button)
  4. Go to HA zwave panel (under configuration) and click “add note secure”
  5. Within 30 seconds, go to lock, key in programming code + press zero
  6. Optional: rename lock’s zwave node using HA’s zwave panel
  7. Optional: open entity_registry.yaml and rename the lock and the associated sensors (they’ll all be at the end)

I was able to successfully call lock.set_usercode to add back the codes for my family.


Here’s the code I set up to notify me when the door is unlocked. I’m user slot 3, so I exclude myself. Names changed to protect the innocent :slight_smile:

This avoids having to interpret all of the associated sensors that come along with the lock node.
I use Pushover for my notifications. I like the first line to be a quick-read for when it displays on my Pebble.

- alias: Unlock Front Door Notify
    - platform: state
      to: 'unlocked'
      from: 'locked'
    condition: and
      - condition: template
        value_template: '{{ == "Keypad Unlock"}}'
      - condition: template
        value_template: '{{ != "Unlocked with Keypad by user 3"}}'
    - service: notify.scott_notifier
        title: >
          Unlock by {% if == 'Unlocked with Keypad by user 1' -%}
          {%- elif == 'Unlocked with Keypad by user 2' -%}
          {%- elif == 'Unlocked with Keypad by user 4' -%}
          {%- endif -%}
        message: >
          {%- if == 'Unlocked with Keypad by user 1' -%}
          {%- elif == 'Unlocked with Keypad by user 2' -%}
          {%- elif == 'Unlocked with Keypad by user 4' -%}
          {%- endif %} unlocked the front door


Very cool. I use very similar. I even have it when we use a specific user code, it automatically disarms the HA Manual Alarm.


It appears that HA can’t see the difference between when the lock is unlocked by the keypad and unlocked by a lock.unlock call from HA. So my above code will trigger if you unlock from HA and give you a wrong notification.

It looks like touchscreen_deadbolt_access_control doesn’t change when altered over zwave and won’t change the values for notification/lock_status.


Actually HA does not send back code ‘24’ and ‘25’ for electronic unlock and lock. Here is the bug:


This is definitely not my code, but I use it on my setup. Works great though.

- platform: template
        #NOTE: To ensure consistent updates, we link to the update of the zwave entity id, and not the lock!
          - sensor.schlage_be469nxcen_touchscreen_deadbolt_alarm_type_89_0
          #- input_select.lock_hass_status_for_office_back_door_lock
          - zwave.schlage_be469nxcen_touchscreen_deadbolt_89
        value_template: >-
            {% set alarm_type = states('sensor.schlage_be469nxcen_touchscreen_deadbolt_alarm_type_89_0') %}
            {% set alarm_level = states('sensor.schlage_be469nxcen_touchscreen_deadbolt_alarm_level_89_1') %}
            #{% set hass_state = states('input_select.lock_hass_status_for_office_back_door_lock') %}

            {#- Z-Wave/RF Lock: Alarm State 0x01 (???) -#}
            {%- if hass_state == 'locked_by_hass' -%}
                {{ 'locked with Home Assistant' }}

            {#- Z-Wave/RF Unlock: Alarm State 0x01 (???) -#}
            {%- elif hass_state == 'unlocked_by_hass' -%}
                {{ 'unlocked with Home Assistant' }}

            {# Manually Locked: Alarm State 0x15 (21) #}
            {% elif alarm_type == '21' %}
                {{ 'locked manually with key cylinder or inside thumb turn' }}

            {#- Manual Unlock: Alarm State 0x16 (22) -#}
            {%- elif alarm_type == '22' -%}
                {{ 'unlocked manually with key cylinder or inside thumb turn' }}

            {#- Keypad Lock by keypad touch (lock & leave): Alarm State 0x12 (18) -#}
            {%- elif alarm_type ==  '18' -%}
                {{ 'locked with keypad' }}

            {#- Keypad Unlock: Alarm State 0x13 (19) -#}
            {%- elif alarm_type == '19' -%}
                {{ 'unlocked with keypad by user ' ~ alarm_level }}

            {%- else -%}
                {#- The lock status is sometimes unknown when HASS boots and Z-Wave is initialized.  In this case
                    we want to use the last state reported by the lock itself (physically) if possible, otherwise
                    we return 'unknown' -#}
                {# {{ 'unknown' }} #}
                {% set state = states.lock.schlage_be469nxcen_touchscreen_deadbolt_locked_89_0 %}
                {% set status = (state.attributes.lock_status if state else '')|trim() %}
                {% set result = status if status != '' else 'unknown' %}
                {{ result|lower() }}
            {%- endif -%}

I can see things like this in my HA logbook

garage_door_lock_state changed to #unlocked manually with key cylinder or inside thumb turn
garage_door_lock_state changed to #unlocked with keypad by user 3


I have a FE599GR Wireless Door Lock and a couple of BE469’s. So far I’ve only added the FE599. Would this work for the 599 as well. I only have these three devices

zwave.door_to_the_garage_lock (renamed)

If not no biggie, I’ll defineitly be using this for my other two locks, thanks for sharing


I am not sure if it would or not. Worth a try I guess


Looks like you’re not using hass_state in your code (it’s comment out). Do you have some other code looking for the lock.lock service to be called to value that input_select? Or are you not using it at all?


I didn’t need the input select because I don’t have my lock in the HA gui. I do use service lock.lock though in my scripts files. I use Alexa to lock the doors. (but not unlock). From my script.yaml

    - service: homeassistant.turn_off
        entity_id: group.bedtime

    - service: script.turn_on
        entity_id: script.timed_orb

    - service: lock.lock


Right - so your code behaves like mine, then. If you were to unlock the door via script (which I don’t actually do in practice), it would trigger notifications like I have above. Since my code is looking for unlocks. I guess that’s not really a big deal, though.


Correct. I also have one that notifies me the door didn’t lock as well (like for bedtime)

- alias: Warn if deadbolt not locked at bedtime
    - platform: state
      entity_id: script.time_for_bed
      to: 'on'
    - delay: 00:01:00
    - condition: state
      entity_id: lock.schlage_be469nxcen_touchscreen_deadbolt_locked_89_0
      state: 'unlocked'
    - service: notify.notify
        message: "Please check garage door!"

Now if the door is hanging wide open and the deadbolt can still go to the locked position, this won’t notify me, but the door has a reed switch in it that will notify me if the door is left open for more than 3 minutes


If you have an open close sensor you can check that for open and even if deadbolt was on, you could be aware the door was open.


Thats what I have :). Reed switch = door open/close sensor

- alias: Warn when garage door is left open too long
    - platform: state
      entity_id: switch.garage_door
      to: 'on'
       minutes: 3
    - service: notify.notify
        message: "Garage Door is Ajar"
        target: "channel/hiddenfrompublicposts"


I have two BE469 deadbolts. One adds, but stops at probe, after a reboot it added, and had two sensors. I was able to add codes,

I added the second one and realized that I had 6 sensors, I’ve tried several times to get the 1st one to pair fully, but have been unsuccessul. Just gets stuck at probe, after a reboot, it adds, but not with all the proper sensors.

Anyone else have and recommendations?


I see this in my logs

2018-04-29 16:03:38.170 Detail, Node055, Notification: Notification - NoOperation
2018-04-29 16:03:38.171 Detail, Node055, Notification: Notification - Node Dead

When adding (stuck at probe)


OK, 5th time was the charm. If I had to pick what I believe was the difference it was doing a full reboot between steps. Not just a restart of hass


I’m trying to get this working, and not sure of a few things. My sensor is

is your sensor named " sensor.schlage_be469nxcen_touchscreen_deadbolt_alarm_type_89_0"

Or should I have a sensor with that name? I do have several sensors (6 total), but not withe alarm type?


Ugg, So I’ve added my two schlage BE469 deadbolts. It took me several hours of adding, and removing yesterday. I thought I had added them correctly, I am able to lock, unlock, set codes via UI, etc. But I just realized that I have different devices for each lock. Which one is right? I’m starting to try to figure out how to get some automations working, like user code alerts. Maybe also disabling security system with specific codes, but not sure which device will provide the necessary data