Code Entry Event Data

Has anyone tried the iris keypad to see if the default driver throws an event with either the code entered (ideal) or the user linked to that code? I know the locks don't handle this properly, but wondering if it's the same approach on the keypad.

Ideally, I'd like to be able to automate things off of a code entered, to support notions like silent panic (enter a code that gives the appearance of an unlock but still alerts for help.)

I've also used the keypads in the past as simple login devices, folks can "key in" to the house for things like setting preferences for automation or tracking who is coming and going and when.

1 Like

The current keypad driver does create events for lock code usage and changes, it follows the eventing schema that's shown in the virtualLock driver linked below.

Keypads have their own capability to distinguish them from locks ( capability "Security Keypad")
Actual Lock drivers will follow suite, however these aren't completed at this time.

We have a virtual lock driver that is complete using the final lockCode schema and is currently included in the hub, this driver is also published here:

Capability Lock Codes and capability Security Keypad both produce events named "lockCodes" which always contain all known device lock codes.
Usage events for Locks are published under the event name "lock", usage events for keypads are published under events named securityKeypad, in both cases code usage is contained in the events data map.

Hi Mike. I have the exact same scenario as the OP. I would like to subscribe to an event which is triggered on any code entry on a security keypad (centralite et. al) or door keypad (schalge et. al). The security keypad lock code trigger "almost" works. The lock code doesn't trigger if the security keypad is already in disarmed state; only triggers during succesful state transitions.

Basically, any way to get access to the code that was entered on any kind of code entry device without anything else getting in the way. This would be impossible to do if the device itself ate up the code that are entered without communicating to the hub, but that's not the case (at least for the centralite device) as I can see the entered code (valid or invalid) in the debug log. All I need is an event that captures this entered code and if I can subscribe to it.

Basically, in the attached screenshot for a centralite keypa, you can see that the debug log has 3 pieces of information

  1. valid or invalid entry
  2. actual key code
  3. command to which the key code was to be applied

I need an event to which I can subscribe and always get the entered keycode

Correct, and this follows what actual locks do in they only provide code usage when unlocked, or in the case of a security keypad, when disarmed.

This has nothing to do with the driver, this is the way that all locks, and the tested keypads work.
Some but not all the keypads report bad codes, no locks do this.

Thank you for the lighting fast response :slight_smile: . I am not saying that the current driver is doing anything wrong or unexpected. All I am requesting is access to an event which tells me of any code entered on a code entry device. Given that the driver is printing the entered code, it is obviously getting that information from the remote hardware. Is it feasible to expose it as a separate event; say something called "enteredCode" ?

The actual code used to unlock a lock or disarm a keypad is already included in the event's data attribute, this attribute is not displayed in the event view in the ui, but is accessable programmatically via an event subscription to "securityKeypad.disarmed" for keypads and
"lock.unlocked" for locks.

For obvious reasons we aren't going to expose the pin code in the driver ui...

But IIUC, "securityKeypad.disarmed" event will only be triggered when the keypad is actually successfully disarmed; furthermore, it only triggers when the state on the device actually transitions to disarmed. Again all that is completely the expected behaviour for a standard security keypad.

My only request here is for an event which is triggered on every code entry (regardless of the validity of the code or the state of the device). Basically, instead of treating the device as a semi-smart securityKeypad, I want it to be a dumb code entry device. It doesn't seem like there is such an event available. Would it be very difficult to define and expose such an event?

For my use case, I just need some device (and driver) which can reliably tell me when any code has been entered on the device. Unfortunately no such device exists :disappointed:

The following code only prints anything on successful state transitions; I would like it to print the data on every code input. The device driver gets that information and prints it in the debug log (screenshot earlier in the thread), is it possible to also wrap that information (code entered irrespective of state of the device) in a separate event and make it available?

import groovy.json.*

definition(
    name: "Lock Code Reader",
    namespace: "security",
    author: "Mainak Mandal",
    description: "Read the lock code and print",
    category: "My Apps",
    iconUrl: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png",
    iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png",
    iconX3Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png")


preferences {
    page(name: "prefs")
}


def prefs() {
    dynamicPage(name: "prefs", title: "Select keypad", install:true, uninstall: true) {
        section {
            input (
                type: "capability.securityKeypad",
                name: "keypad",
                title: "Read entries from",
                required: true,
            )
        }
    }
}

def installed() {
    log.debug "Installed with settings: ${settings}"
    initialize()
}

def updated() {
    log.debug "Updated with settings: ${settings}"
    unsubscribe()
    initialize()
}

def initialize() {
    log.debug "subscribed"
    subscribe(keypad, "securityKeypad", handler)
}

def handler(evt) {
    log.debug "invoked"
    def data = evt.getJsonData();
    log.debug "$evt ; $data"
}

Sure, but that's not how the device itself works, the newer models (and I'm speaking of the centralite and it's variants, which we have drivers for) only allow codes on disarm, as I said for the devices we currently have drivers for its not possible to use them as dumb keypads...
The keypad you have does allow codes for arm ect, however the actual keypad is also changing modes, it's not possible to separate the code from the arm button, the device does not submit the code unless one of the arm mode buttons is pressed.

Hmm. Good thing we are all engineers :slight_smile: . I did figure out a clunky way of making it a code entry device. I will wrap the securityKeypad device in my own device driver. This wrapper will always set the underlying keypad to "Home" state. This way every time a correct code is entered, it will generate a disarm event. It's clunky, but that that's the best I can think of

Im sure something could be done for the particular device you have, but I'm explaining why we won't be changing any of the inbuilt drivers...

I can understand. BTW, is the driver source available anywhere?

Ours isnt, but i beleive there is a community port of a smartthings dth.

1 Like