Success installing Kwikset 916 Zigbee doorlock with ZHA

When I got the Kwikset 916 deadbolt lock I couldn’t get it connected to ZHA and the bolt would open but would not close from the lock’s keypad. After much fruitless searching, I called Kwikset/Wiser support. Installing a new set of AA batteries solved BOTH problems. The still shrink-wrapped Duracell batteries that came in the box were bad.

With the new batteries ZHA found the door lock in seconds and added it as a device under the ZHA integration.

I see that there are a few posts talking about Zigbee2mqtt instead of ZHA. Is this needed to get additional features like programmatically adding new unlock codes or determining which code was used to unlock the door?

UPDATE 3/5/24 - I found the ZHA Toolkit to extend ZHA functionality, and a script blueprint for adding temporary access codes.

1 Like

Reviving an older thread here but I recently replaced my failing 916 ZWAVEs with the 916 Zigbee. I use Z2M as well and was able to get them in there and allow me to program the PIN codes. Before I was using KeyMaster with the ZWAVE version and sadly nothing like that exists today I was going to explore creating a simple card to allow PIN setting and reviewing. I was able to use automation though with the MQTT stuff to determine WHO unlocked or WHAT unlocked the door once I flipped the setting in Z2M to allow the pin used to be exposed.

2 Likes

I am reviving an old thread due to finding an edit from Mar 24. I have just installed one of these units, and unable to properly get lock status via ZHA as it outputs LockState.Not_fully_locked instead of LockState.Locked.

@Victor.S Does your lock output this when locked?

No, mine says “Locked”.

Things to try:

  • fresh batteries - even if the lock says they are okay.
  • confirm that the bolt can can physically extend and withdraw fully and smoothly.
  • call the Kwikset support line. I got a knowledgeable human with almost no hold time.

You can install the ZHA Toolkit to get full Zigbee data from the lock. The results are rather arcane - but it does work. I figured out how to turn the beep on and off from a script that way.

How did you get that to work I’ve been trying for a couple of days straight and even using mqtt explorer I’m not seeing the pin being transmitted nor does it show in zigbee2mqtt.

You have to tell Z2M to expose it:

Once it there it will show up like this in MQTT under the action_user/pin_code.

I use this for automations to do certain functions like this:

alias: "Locks: BBQ Backdoor keypad unlock"
description: ""
trigger:
  - platform: mqtt
    topic: zigbee2mqtt/BBQ Backdoor
condition:
  - condition: template
    value_template: "{{ trigger.payload_json['action_source_name'] == 'keypad' }}"
  - condition: template
    value_template: "{{ trigger.payload_json['action'] == 'unlock' }}"
action:
  - choose:
      - conditions:
          - condition: state
            entity_id: alarm_control_panel.alarm_partition_1
            state: disarmed
        sequence:
          - service: system_log.write
            data:
              message: >-
                BBQ Backdoor unlocked by {{ found_user }} via keypad; alarm is
                already disarmed.
          - service: notify.all_mobile_devices
            data:
              title: BBQ Backdoor
              message: >-
                Door unlocked by {{ found_user }} via keypad; alarm is already
                disarmed.
      - conditions:
          - condition: or
            conditions:
              - condition: state
                entity_id: alarm_control_panel.alarm_partition_1
                state: armed_away
              - condition: state
                entity_id: alarm_control_panel.alarm_partition_1
                state: armed_home
        sequence:
          - service: system_log.write
            data:
              message: >-
                BBQ Backdoor unlocked by {{ found_user }} via keypad; alarm is
                armed.
          - service: notify.all_mobile_devices
            data:
              title: BBQ Backdoor
              message: Door unlocked by {{ found_user }} via keypad; alarm is armed.
          - service: script.turn_on
            target:
              entity_id: script.alarm_disable_based_on_door_pin_code
            data:
              variables:
                person: "{{ found_user }}"
                door: BBQ Backdoor
mode: single
variables:
  config:
    - name: Family
      code: "1111"
    - name: Dog Sitter
      code: "2222"
  found_user: >
    {{ config | selectattr('code', 'eq',
    trigger.payload_json.users.get(trigger.payload_json.action_user |
    string,{}).get('pin_code')) | map(attribute='name') | first | default }}