KeyMaster Z-Wave lock manager and scheduler

This worked Thanks!

Actually, looks like after putting this line in my configuration.yaml enabled logging of everything. My log was like 3.1GB in a span of 2 hours.

I checked the logs and now its logging, debug, info, everything not even related to keymaster.

Before it was only logging warnings, errors.

Do I need to add more parameters to this line not to enable logging of everything?

You can try this then:

logger:
  default: error
  logs:
    custom_components.keymaster: critical

My experience is that the actual default should be warning at least if you want to match the normal logging behavior. Though setting to error definitely will reduce all loging

Hello, I just removed and reinstalled Keymaster and I dont see the errors anymore.

It was a pain to re-setup since I have to have a 60 footer Ethernet (making it a USB extension) to make the Zwave dongle closer to the lock (BE469).

I think I tinkered on it a lot when I was initially setting it up and I ended up messing up something. Started fresh again and its all good now.

Thanks for your help.

Hello, first off I like to say thanks for the great project! i have been wondering how to setup Garage Notifications? Does anyone have any insight into this?

I have just created a Node-RED flow to trigger notifications on lock events. Please noteā€¦ it is truly awful. A complete mess. I know about as much about coding as I do about home decorating. And coincidentally, I have at least as many excess nodes in this flow as I do excess pillows in my living room (in my opinion, which according to my wife is worthless).

Hereā€™s the flow. I built it iteratively using debug nodes. My message nomenclature is horrendous. But it works. The three key bits of info are lock state, lock (name), and slot (user). Someone way smarter than me could put most of this flow into a single function node. Ideally, Iā€™d like to create a subflow that either allows for the number of slots, user names, and lock names to be addedā€¦ or even better, pulls all of that information from the Keymaster config. I donā€™t know if the latter is possible.

Anywayā€¦ behold my crappy flow:

[{"id":"df3870764c87ac9a","type":"group","z":"647eafda.c7cfa","name":"Door Lock Notifications","style":{"label":true},"nodes":["684ad4b5722e759d","f25ed3b4e6ce55f3","f9b8ec1c28b8fbd9","a670aaacfad6913a","3b7fc3cc7e27aa85","5166f974ca56568e","d07cca1e11406367","f0433b0a7edaef0b","e8c145174ce7d71b","53a48d3cc805b6aa","f7d97df523e35c6b","eab5077b8975a825","3aaaeaecbb837998","401e4a4c8d50fae7","675801b24024a5c6","5c767d42fb80c77e","8f2ed5388d0eaa36","00e9e9586ec47c3f","72edc5645ccce85a","074db3ee2a88f015","109edd8059f1029d","326e40d98777a356"],"x":34,"y":1824,"w":1992,"h":377},{"id":"684ad4b5722e759d","type":"server-events","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"Door Lock Event","server":"296c0678.b5f9ca","version":2,"eventType":"keymaster_lock_state_changed","exposeToHomeAssistant":false,"eventData":"","haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"waitForRunning":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"eventData"}],"event_type":"","x":140,"y":1980,"wires":[["f25ed3b4e6ce55f3"]]},{"id":"f25ed3b4e6ce55f3","type":"change","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"Change message","rules":[{"t":"set","p":"state","pt":"msg","to":"payload.event.state","tot":"msg"},{"t":"set","p":"slot","pt":"msg","to":"payload.event.code_slot","tot":"msg"},{"t":"set","p":"lock","pt":"msg","to":"msg.payload.event.lockname","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":330,"y":1980,"wires":[["a670aaacfad6913a"]]},{"id":"f9b8ec1c28b8fbd9","type":"switch","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"Slot","property":"payload.event.code_slot","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"str"},{"t":"eq","v":"1","vt":"str"},{"t":"eq","v":"2","vt":"str"},{"t":"eq","v":"3","vt":"str"},{"t":"eq","v":"4","vt":"str"},{"t":"eq","v":"5","vt":"str"},{"t":"eq","v":"6","vt":"str"}],"checkall":"true","repair":false,"outputs":7,"x":890,"y":1980,"wires":[["00e9e9586ec47c3f"],["f0433b0a7edaef0b"],["d07cca1e11406367"],["e8c145174ce7d71b"],["53a48d3cc805b6aa"],["f7d97df523e35c6b"],[]]},{"id":"a670aaacfad6913a","type":"switch","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"Lock Name","property":"msg.payload.event.lockname","propertyType":"msg","rules":[{"t":"eq","v":"frontdoor","vt":"str"},{"t":"eq","v":"garagedoor","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":530,"y":1980,"wires":[["3b7fc3cc7e27aa85"],["5166f974ca56568e"]]},{"id":"3b7fc3cc7e27aa85","type":"change","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"Front Door","rules":[{"t":"set","p":"lock","pt":"msg","to":"front door","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":730,"y":1960,"wires":[["f9b8ec1c28b8fbd9","8f2ed5388d0eaa36"]]},{"id":"5166f974ca56568e","type":"change","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"Garage Door","rules":[{"t":"set","p":"lock","pt":"msg","to":"garage entry door","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":730,"y":2000,"wires":[["f9b8ec1c28b8fbd9"]]},{"id":"d07cca1e11406367","type":"change","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"user2","rules":[{"t":"set","p":"user","pt":"msg","to":"user2","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1080,"y":1980,"wires":[["eab5077b8975a825"]]},{"id":"f0433b0a7edaef0b","type":"change","z":"647eafda.c7cfa","d":true,"g":"df3870764c87ac9a","name":"user1","rules":[{"t":"set","p":"user","pt":"msg","to":"user1","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1070,"y":1940,"wires":[["eab5077b8975a825"]]},{"id":"e8c145174ce7d71b","type":"change","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"user3","rules":[{"t":"set","p":"user","pt":"msg","to":"user3","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1080,"y":2020,"wires":[["eab5077b8975a825"]]},{"id":"53a48d3cc805b6aa","type":"change","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"user4","rules":[{"t":"set","p":"user","pt":"msg","to":"user4","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1080,"y":2060,"wires":[["eab5077b8975a825"]]},{"id":"f7d97df523e35c6b","type":"change","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"user5","rules":[{"t":"set","p":"user","pt":"msg","to":"user5","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1070,"y":2100,"wires":[["eab5077b8975a825"]]},{"id":"eab5077b8975a825","type":"template","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"Set Message","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{{user}} has {{payload.event.state}} the {{lock}}.","output":"str","x":1310,"y":2020,"wires":[["675801b24024a5c6"]]},{"id":"3aaaeaecbb837998","type":"api-call-service","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"Notify user1's iPhone","server":"296c0678.b5f9ca","version":5,"debugenabled":false,"domain":"notify","service":"mobile_app_joshs_iphone","areaId":[],"deviceId":[],"entityId":[],"data":"{   \"title\": \"Home Assistant\",\t    \"message\": \"{{payload}}\"\t}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1900,"y":1980,"wires":[[]]},{"id":"401e4a4c8d50fae7","type":"template","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"Set Message","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"The {{lock}} has been {{payload.event.state}} {{method}}.","output":"str","x":1470,"y":1900,"wires":[["675801b24024a5c6"]]},{"id":"675801b24024a5c6","type":"api-current-state","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"No One Home?","server":"296c0678.b5f9ca","version":3,"outputs":2,"halt_if":"true","halt_if_type":"bool","halt_if_compare":"is","entity_id":"binary_sensor.no_one_home","state_type":"habool","blockInputOverrides":false,"outputProperties":[],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1680,"y":1960,"wires":[["5c767d42fb80c77e"],["3aaaeaecbb837998"]]},{"id":"5c767d42fb80c77e","type":"api-call-service","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"Notify user1's iPhone","server":"296c0678.b5f9ca","version":5,"debugenabled":false,"domain":"notify","service":"mobile_app_joshs_iphone","areaId":[],"deviceId":[],"entityId":[],"data":"{\"title\":\"Home Assistant\",\"message\":\"{{payload}}\",\"data\":{\"push\":{\"sound\":{\"critical\":1}}}}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1900,"y":1940,"wires":[[]]},{"id":"8f2ed5388d0eaa36","type":"debug","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"FRONT DOOR output","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1040,"y":2160,"wires":[]},{"id":"00e9e9586ec47c3f","type":"switch","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"Method","property":"payload.event.action_text","propertyType":"msg","rules":[{"t":"eq","v":"Manual unlock operation","vt":"str"},{"t":"eq","v":"Manual lock operation","vt":"str"},{"t":"eq","v":"RF unlock operation","vt":"str"},{"t":"eq","v":"RF lock operation","vt":"str"}],"checkall":"true","repair":false,"outputs":4,"x":1080,"y":1880,"wires":[["074db3ee2a88f015","326e40d98777a356"],["074db3ee2a88f015"],["72edc5645ccce85a"],["72edc5645ccce85a"]]},{"id":"72edc5645ccce85a","type":"change","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"RF","rules":[{"t":"set","p":"method","pt":"msg","to":"by a Z-wave command","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1270,"y":1940,"wires":[["401e4a4c8d50fae7"]]},{"id":"074db3ee2a88f015","type":"change","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"Manually","rules":[{"t":"set","p":"method","pt":"msg","to":"manually","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1260,"y":1900,"wires":[["401e4a4c8d50fae7","109edd8059f1029d"]]},{"id":"109edd8059f1029d","type":"debug","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"MANUALLY output","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1550,"y":2080,"wires":[]},{"id":"326e40d98777a356","type":"debug","z":"647eafda.c7cfa","g":"df3870764c87ac9a","name":"METHOD output","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1320,"y":2140,"wires":[]},{"id":"296c0678.b5f9ca","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30,"areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true}]

EDIT: I realized my function node wasnā€™t really adding anything to the flow, just changing the payload structure. Iā€™ve updated the flowā€¦ still stupid, but now less so. Also added differentiation between RF and manual operation.

1 Like

I setup an automation to give me an entity that reflects the last lock action in an easy to read format. This isnā€™t required, as you could just parse the keymaster_lock_state_changed event every time in any automation you need, but I wanted something a little simpler to be able to trigger automation off of when ā€œperson x unlocks the doorā€, etc. Create an input_text helper and then this automation will update the status of that helper with the last lock action. For example, if you have a user code ā€œJeffā€ and he unlocks the door via keypad, this input_text value will change to ā€œUnlocked (Jeff)ā€. Its helpful for me and it took a bit of struggling to get it working, so I thought I might pass it along.

alias: Status - Door Lock Status
description: ""
trigger:
  - platform: event
    event_type: keymaster_lock_state_changed
action:
  - if:
      - condition: template
        value_template: "{{ trigger.event.data.entity_id == 'lock.front_door' }}"
    then:
      - service: input_text.set_value
        data:
          value: >
            {% set user = trigger.event.data.code_slot_name %} 
            {% if trigger.event.data.code_slot_name == "" %} 
            {% set user = 'Keypad' %}
            {% endif %} 
            {% if trigger.event.data.action_text == 'Manual unlock operation' %} Unlocked (Manual)  
            {% elif trigger.event.data.action_text == 'Manual lock operation' %} Locked (Manual) 
            {% elif trigger.event.data.action_text == 'Keypad unlock operation' %} Unlocked ({{ user }}) 
            {% elif trigger.event.data.action_text == 'Keypad lock operation' %} Locked ({{ user }}) 
            {% endif %}
        target:
          entity_id: input_text.front_door_lock_status
1 Like

Any idea why I canā€™t program a specific pin code into a specific lock slot? When I specify slot 2 with 3039 as the 4 digit code and enable the lock, it gets stuck in ā€œAddingā€ mode, but the door is never configured. If I change the code to any other 4 digit PIN, it Adds and Connects just fine. However, I can set slot 5 of that lock to 3039.

Iā€™ve tried forcing the specific PIN into the lock using Developer Tools ā†’ States, but it wonā€™t stay programmed. I filter the list of entities so I can see sensor.opal_lock_code_slot_2 in the list, select that entity, enter the pin 3039, and click Set State. The pin updates in the filtered list below to 3039, but a few seconds later it reverts to blank.

Note that Iā€™ve had everything configured and operating well for over a year now. The only changes Iā€™ve made are applying updates, but the last time was 3 months ago. I have 7 Yale z-wave locks in the house configured with keymaster. Only this one lock and slot is having a problem. None of the other slots are programmed with this pin code.

Clueless what might be wrong. Ideas?

The newer zwavejs2mqtt versions has a very usable UI for managing user codes, and I find it much more reliable than keymaster. Better yet, getting rid of keymaster entities and automations has made HA so much easier to use and configure.

My Zooz Zwave stick died and had to be replaced, so I am rebuilding my entire Zwave network. Iā€™ve named all my devices as they were before and the network is up and running, except for my six Kwikset locks.
Iā€™ve excluded/included the first lock, but in Keymaster Iā€™m getting an error, ā€œThis entity does not have a unique ID.ā€
Am I approaching this the right way or am I missing a step somewhere?
Thanks much.

EDIT: I did miss a step. I forgot about the edit button on the dashboard. From there I can re-enter ā€œfront_doorā€ and that removes the error.

I have 4 zwave locks that I want to sync codes to and using Keymaster was unmanageable.

I created a trimmed down version, that does not support scheduling and just focused on updating codes and notifications. Its a simple package install and copy some YAML for a dashboard. You can create automations if you want to do scheduling.

Keymaster is awesome, and if I had 2 locks and needed scheduling I would absolutely use it.

I am getting keymaster_front Lock Notifications uses an unknown service even though I created the scripts for both front and read door. Rear door is working is working great, but itā€™s like it cannot find my front script. I assumed a simple misspelling but that doesnā€™t appear to be the case.

The automation ā€œkeymaster_front Lock Notificationsā€ (automation.keymaster_front_lock_notifications) has an action that calls an unknown service: script.keymaster_front_manual_notify.

This works (keymaster_rear_manual_notify):

alias: keymaster_rear_manual_notify
sequence:
  - service: notify.telegram
    data:
      title: "{{ title }}"
      message: "{{ message }}"
mode: parallel
max: 10

This is not working (keymaster_front_manual_notify). I checked and it is enabled. Not showing as having been triggered by the automation like rear has:

alias: keymaster_front_manual_notify
sequence:
  - service: notify.telegram
    data:
      title: "{{ title }}"
      message: "{{ message }}"
mode: parallel
max: 10

Automation front (keymaster_front Lock Notifications):

alias: keymaster_front Lock Notifications
trigger:
  - platform: event
    event_type: keymaster_lock_state_changed
    event_data:
      lockname: front
condition:
  - condition: state
    entity_id: input_boolean.front_lock_notifications
    state: "on"
action:
  - service: script.keymaster_front_manual_notify
    data_template:
      title: front
      message: >-
        {{ trigger.event.data.action_text }} {% if trigger.event.data.code_slot
        > 0 %}({{ trigger.event.data.code_slot_name }}){% endif %}

Any thoughts as to why it canā€™t trigger the script?

Does the script show up in your services list under the Dev tools?

Brilliant. It DOES show up but there it is listed as:

Script: keymaster_front_manual_notify
script.keymaster_front_manual_notify_duplicate

I had to nuke everything and start over at some point. I went through and manually deleted all of the entities and automations and everythingā€¦but apparently the service was left over and caused this one to be renamed duplicate.

I renamed it in Entities to remove ā€œ_duplicateā€ but after restarting it still shows up in Services as notated above.

Is there a way to correct this on the backend somehow or do I need to just change the automation to point to ā€œā€¦_duplicateā€? Iā€™d prefer the former but I if itā€™s going to be a major PITA I can just change the automation.

not sure whatā€™s going on there, something funky with your HA

EDIT:
check under Settings ā†’ Automations might be one you made via the UI previously

Yeah, itā€™s really bizarre. Nothing in automations. I searched for ā€œ_duplicateā€ everywhere I can.

Here are the screenshots for Settings > Entities and Dev Tools > Services.

services

I got it working. When I got home I opened up the app on my phone and went to scripts and both scripts (two versions of the front_door_manual_notify) were present (one with _duplicate). I was not able to delete or edit the _duplicate one because it ā€œdid not exist in scriptsā€ but I was able to delete the other one.

Then I restarted scripts and both were gone! I duplicated my rear door lock manual notify (now I remember how the _duplicate was made) and edited it and now it works.

1 Like

Hello, KeyMaster is awesome and many thanks to the creator(s). Install went well and my Kwikset lock has been working perfectly for a few months. But Iā€™ve got only one issue, I have 6 codes setup and 1 of those is configured for M-F & 8am-8pm. This Custom Workdays works well and I get a persistent notification everytime the ā€œSingle User Code Deletedā€ fires. Question: I would like to get a notification when that User Code is re-enabled. Is this missing or just not working in my setup?

Where does one find this in the new zwavejs2mqtt module?