KeyMaster Z-Wave lock manager and scheduler

Thanks for writing up the issue, we’ll have a look to see what’s going on.

1 Like

@PrayerfulDrop sorry about the wait. Finally got around to hopping on the PC.

So I have a keymaster lovelace folder where I put all my yamls for keymaster. Starts off with the ui-lovelace main page linking to a default.yaml view. Uses button-card and browser_mod along with the other HACS frontend card elements used by keymaster.

default.yaml:

cards:
  - type: vertical-stack
    cards:
      - type: custom:button-card
        template: header
        name: Front Door
      - type: horizontal-stack
        cards:
          - type: custom:button-card
            entity: binary_sensor.active_frontdoor_1
            template: lock_manager_button
            name: "Code 1"
            tap_action:
              !include frontdoor/code_1.yaml
          - type: custom:button-card
            name: "Code 2"
            entity: binary_sensor.active_frontdoor_2
            template: lock_manager_button
            tap_action:
              !include frontdoor/code_2.yaml
          - type: custom:button-card
            name: "Code 3"
            entity: binary_sensor.active_frontdoor_3
            template: lock_manager_button
            tap_action:
              !include frontdoor/code_3.yaml
      - type: horizontal-stack
        cards:
          - type: custom:button-card
            name: "Code 4"
            entity: binary_sensor.active_frontdoor_4
            template: lock_manager_button
            tap_action:
              !include frontdoor/code_4.yaml
          - type: custom:button-card
            name: "Code 5"
            entity: binary_sensor.active_frontdoor_5
            template: lock_manager_button
            tap_action:
              !include frontdoor/code_5.yaml
          - type: custom:button-card
            name: "Code 6"
            entity: binary_sensor.active_frontdoor_6
            template: lock_manager_button
            tap_action:
              !include frontdoor/code_6.yaml

Rinse and repeat for multiple locks (I have backdoor and sidedoor as well.)

Each button click brings up a popup dialog courtesy of browser_mod.

Then each code.yaml looks like this:

action: fire-dom-event
browser_mod:
  command: popup
  title: 'Front Door - Code 1'
  style:
    background: none
  card:
    type: entities
    show_header_toggle: false
    entities:
      - type: divider
      - entity: input_text.frontdoor_name_1
      - entity: input_text.frontdoor_pin_1
      - entity: input_boolean.enabled_frontdoor_1
      - entity: input_boolean.notify_frontdoor_1
      - type: divider
      - entity: sensor.connected_frontdoor_1
        state_color: true
      - entity: binary_sensor.active_frontdoor_1
        state_color: true
      - entity: binary_sensor.pin_synched_frontdoor_1
        state_color: true
      - type: 'custom:fold-entity-row'
        head:
          type: section
          label: Advanced Options
        entities:
          - entity: input_boolean.reset_codeslot_frontdoor_1
          - type: divider
          - entity: input_boolean.accesslimit_frontdoor_1
          - entity: input_number.accesscount_frontdoor_1
            type: 'custom:numberbox-card'
            icon: 'mdi:key-variant'
            speed: 250
          - type: divider
          - entity: input_boolean.daterange_frontdoor_1
          - entity: input_datetime.start_date_frontdoor_1
          - entity: input_datetime.end_date_frontdoor_1
      - type: custom:fold-entity-row
        head:
          type: section
          label: 'Daily Access Breakdown'
        entities:
          - type: custom:fold-entity-row
            head:
              type: section
              label: 'Sunday'
            entities: 
              - input_boolean.sun_frontdoor_1
              - input_boolean.sun_inc_frontdoor_1
              - input_datetime.sun_start_date_frontdoor_1
              - input_datetime.sun_end_date_frontdoor_1
          - type: custom:fold-entity-row
            head:
              type: section
              label: 'Monday'
            entities: 
              - input_boolean.mon_frontdoor_1
              - input_boolean.mon_inc_frontdoor_1
              - input_datetime.mon_start_date_frontdoor_1
              - input_datetime.mon_end_date_frontdoor_1
          - type: custom:fold-entity-row
            head:
              type: section
              label: 'Tuesday'
            entities: 
              - input_boolean.tue_frontdoor_1
              - input_boolean.tue_inc_frontdoor_1
              - input_datetime.tue_start_date_frontdoor_1
              - input_datetime.tue_end_date_frontdoor_1
          - type: custom:fold-entity-row
            head:
              type: section
              label: 'Wednesday'
            entities: 
              - input_boolean.wed_frontdoor_1
              - input_boolean.wed_inc_frontdoor_1
              - input_datetime.wed_start_date_frontdoor_1
              - input_datetime.wed_end_date_frontdoor_1
          - type: custom:fold-entity-row
            head:
              type: section
              label: 'Thursday'
            entities: 
              - input_boolean.thu_frontdoor_1
              - input_boolean.thu_inc_frontdoor_1
              - input_datetime.thu_start_date_frontdoor_1
              - input_datetime.thu_end_date_frontdoor_1
          - type: custom:fold-entity-row
            head:
              type: section
              label: 'Friday'
            entities: 
              - input_boolean.fri_frontdoor_1
              - input_boolean.fri_inc_frontdoor_1
              - input_datetime.fri_start_date_frontdoor_1
              - input_datetime.fri_end_date_frontdoor_1
          - type: custom:fold-entity-row
            head:
              type: section
              label: 'Saturday'
            entities: 
              - input_boolean.sat_frontdoor_1
              - input_boolean.sat_inc_frontdoor_1
              - input_datetime.sat_start_date_frontdoor_1
              - input_datetime.sat_end_date_frontdoor_1

I think I got everything on here. Lots of copy/paste and replace entities involved :rofl:
*edited to add: All from this previous post!

3 Likes

**EDIT:
Error still occurs post v0.0.24 with package regeneration. Saw the guard for v0.0.24, which means multiples don’t get created and there’s just a log error. Is this working as intended? (Error occurs twice, which I assume is because I have 3 locks total.)

Logger: homeassistant.components.binary_sensor
Source: helpers/entity_platform.py:492
Integration: Binary sensor (documentation, issues)
First occurred: 1:00:06 PM (2 occurrences)
Last logged: 1:00:06 PM

Platform keymaster does not generate unique IDs. ID keymaster_zwave_network_ready already exists - ignoring binary_sensor.keymaster_zwave_network_ready

Keymaster is working perfectly for me the last several versions. Love it!
This probably does not belong here, but I know there are a lot of schlage be469 users using this. This does work for me with the new 2021.3.0 zwave.js

Have a look to get an idea on how the zwave config parameters can work for your.

automation:
  - alias: Set Lock Options (Front Door)
    trigger:
      - platform: state
        entity_id:
          - input_select.lock_zwave_option_3_front
          - input_select.lock_zwave_option_4_front
          - input_select.lock_zwave_option_5_front
          - input_select.lock_zwave_option_7_front
          - input_select.lock_zwave_option_8_front
          - input_select.lock_zwave_option_9_front
          - input_select.lock_zwave_option_10_front
          - input_select.lock_zwave_option_11_front
          - input_select.lock_zwave_option_15_front
          - input_select.lock_zwave_option_16_front
    condition:  
      - condition: state
        entity_id: 'input_boolean.allow_automation_execution'
        state: 'on'  
    action:
      - service: zwave_js.set_config_parameter
        entity_id: lock.front_door
        data_template:
          parameter: >-
            {% if trigger.entity_id == 'input_select.lock_zwave_option_3_front' %}
              3
            {% elif trigger.entity_id == 'input_select.lock_zwave_option_4_front' %}
              4
            {% elif trigger.entity_id == 'input_select.lock_zwave_option_5_front' %}
              5
            {% elif trigger.entity_id == 'input_select.lock_zwave_option_7_front' %}
              7
            {% elif trigger.entity_id == 'input_select.lock_zwave_option_8_front' %}
              8
            {% elif trigger.entity_id == 'input_select.lock_zwave_option_9_front' %}
              9
            {% elif trigger.entity_id == 'input_select.lock_zwave_option_10_front' %}
              10
            {% elif trigger.entity_id == 'input_select.lock_zwave_option_11_front' %}
              11
            {% elif trigger.entity_id == 'input_select.lock_zwave_option_15_front' %}
              15
            {% elif trigger.entity_id == 'input_select.lock_zwave_option_16_front' %}
              16
            {% else %}
              0
            {% endif %}
  
          value: >-
            {{ trigger.to_state.state }}

input_select:
  lock_zwave_option_3_front:
      name: Enable or disable the beeper.
      options:
          - Enable Beeper
          - Disable Beeper

  lock_zwave_option_4_front:
      name: Prevents all user codes from unlocking the deadbolt
      options:
          - Disable Vacation Mode
          - Enable Vacation Mode

  lock_zwave_option_5_front:
      name: Press the Outside Schlage Button to lock the deadbolt
      options:
          - Enable Lock & Leave
          - Disable Lock & Leave

  lock_zwave_option_7_front:
      name: Alarm sounds based on door activity
      options:
          - Alarm Off
          - Activity
          - Tamper
          - Forced Entry

  lock_zwave_option_8_front:
      name: Activity Alarm Sensitivity
      options:
          - Medium Sensitivity
          - Most Sensitive
          - Medium/high Sensitivity
          - Medium/low Sensitivity
          - Least Sensitivity

  lock_zwave_option_9_front:
      name: Tamper Alarm Sensitivity
      options:
          - Medium Sensitivity
          - Most Sensitive
          - Medium/high Sensitivity
          - Medium/low Sensitivity
          - Least Sensitivity

  lock_zwave_option_10_front:
      name: Forced Entry Alarm Sensitivity
      options:
          - Medium Sensitivity
          - Most Sensitive
          - Medium/high Sensitivity
          - Medium/low Sensitivity
          - Least Sensitivity

  lock_zwave_option_11_front:
      name: Disable Local Alarm Controls
      options:
          - Enable local alarm controls
          - Disable local alarm controls

  lock_zwave_option_15_front:
      name: Auto lock
      options:
          - Disable auto lock
          - Enable auto lock

  lock_zwave_option_16_front:
      name: User code pin length (changing Length erases all codes)
      options:
          - 4
          - 5
          - 6
          - 7
          - 8
1 Like

And basic lovelace card

entities:
  - input_select.lock_zwave_option_3_front
  - input_select.lock_zwave_option_4_front
  - input_select.lock_zwave_option_5_front
  - input_select.lock_zwave_option_7_front
  - input_select.lock_zwave_option_8_front
  - input_select.lock_zwave_option_9_front
  - input_select.lock_zwave_option_10_front
  - input_select.lock_zwave_option_11_front
  - input_select.lock_zwave_option_15_front
  - input_select.lock_zwave_option_16_front
show_header_toggle: false
title: Front Door Zwave Config Options
type: entities

Just an entity card

Is there a walkthrough for ZwaveJS2MQTT users? I installed via HACS and I’m running into problems…

I’ve added a binary_sensor.yaml file containing this:

# Added for KeyMaster
binary_sensor:
  - platform: mqtt
    name: ozw_network_status
    state_topic: OpenZWave/1/status/
    value_template: >
      {{ "ON" if value_json.Status in ["driverAwakeNodesQueried", "driverAllNodesQueriedSomeDead", "driverAllNodesQueried"] else "OFF" }}
    json_attributes_topic: OpenZWave/1/status/
    device_class: "connectivity"

I’ve added this to automations.yaml:

# Added for KeyMaster
# This automation ensures that input_boolean.allow_automation_execution
# is turned off when the system starts loading.  You can also use this automation
# to handle other startup functions.
- alias: homeassistant start-up
  initial_state: true
  trigger:
    platform: homeassistant
    event: start
  action:
    - service: input_boolean.turn_off
      entity_id: 'input_boolean.allow_automation_execution'
    - service: input_boolean.turn_off
      entity_id: input_boolean.system_ready
    - service: timer.cancel
      entity_id:
        - timer.litterbox
        - timer.fireplace
    - service: google_assistant.request_sync
      data_template:
        agent_user_id: !secret GAagent_user_i
    - service: system_startup_cleanup

# When either z-wave network stops, disable the automation boolean	
- alias: open_zwave_network_down
  initial_state: true
  trigger:
    - platform: state
      entity_id: binary_sensor.ozw_network_status
      to: "off"
    - platform: event
      event_type: zwave.network_stop
  action:
    - service: homeassistant.turn_off
      entity_id: input_boolean.allow_automation_execution

# When either z-wave network starts up, call the cleanup code
- alias: zwave_ozw_network_up
  initial_state: true
  trigger:
    - platform: state
      entity_id: binary_sensor.ozw_network_status
      to: "on"
    - platform: event
      event_type: zwave.network_ready
    - platform: event
      event_type: zwave.network_complete
  action:
    - service: script.system_startup_cleanup

I added this to scripts.yaml (I’m not using HomeKit):

# Note the last call turns on input_boolean.allow_automation_execution
system_startup_cleanup:
  sequence:
    - service: input_boolean.turn_on
      entity_id: input_boolean.system_ready
    - service: input_boolean.turn_on
      entity_id: 'input_boolean.allow_automation_execution'

I’ve created my input_boolean… and I’m getting a configuration.yaml error:

Error loading /config/configuration.yaml: Secret GAagent_user_i not defined

Any ideas?

My \packages folder does not contain a key-master folder. I see no *.ini files related to this add-on. I have added _LockName1 and _LockName2 to all of the entities associated with the two locks I have.

I was under the impression v.24 didn’t need those files. I deleted those entries, updated to the latest version, and it works perfect for me.

Have you read the wiki?

Assuming you’re on the latest version of keymaster, you don’t need the first “pre-installation” step listed. But yes, update to the latest version via HACS and follow the wiki!

Ah, yes… that’s what I get for starting from post #1!

Thanks. I’m making progress. I suppose it’s normal for the binary sensor to show as “entity not found” in Lovelace if I don’t in fact have door sensors?

That is correct, you can remove them from your lovelace if you don’t have them.

Yeah… I really don’t like badges, most of the time. I don’t like that they can’t be renamed. I’m planning to get door sensors, so I’ll just add them back in when I have them in the network.

1 Like

Quick suggestion that’s probably been suggested/considered before…

In the lovelace file, adding a button for the “allow_automations” boolean has been a big help for me. I was having issues getting codes to take,etc and it’s generally been because allow_automations was off. By adding a button in the lovelace yaml, I can see quickly if that’s the issue and toggle it right there if it is.

Just a note that this input_boolean is no longer necessary for v0.0.23 and on. :tada:

2 Likes

Need help with the notifications. Now that the latest version of HA and ZwaveJS2MQTT I now have the two sensors from my Yale needed for latest version of keymaster. I am struggling with getting the notifications to work properly. Here is what I want:

  • when user unlocks door notification is sent immediately to notify.pushover
  • the message to say LOCKUSER unlocked DOORTHATWASUNLOCKED or a better way to customize the message itself

What I get is a message that says front door - Aaron about 30min after the event. I am also getting a ton of notifications that’s lock codes are deleted every 2-3 hours.

So how do I make these dreams come true?

Keymaster emits an event you can trigger automations off of keymaster_lock_state_changed if you throw this into your Dev-Tools->Events and hit “Start Listening” then do something with your lock, you’ll see the information it sends out.

Also shouldn’t this say active or available?

It should show “on” when your zwave network is detected, but it looks like you’re using an older version.

I am going to remove Leinster and start over. What should I look to remove from previous versions to ensure my HA is clean?

It’s best to review the release notes:

See this feature request. If you can post some screenshots there, I’d appreciate it.

1 Like