Schlage BE469 - Zwave binding with security - missing features

Disclaimer: most of the clever stuff here is borrowed heavily from @5iver - his rule can be viewed here:

Here is my rule. I too use a lambda since I have multiple locks of the same type:

val Functions$Function3<String, String, SwitchItem, Void> ProcessAlarmRaw = [lockName, alarmRawMessage, remoteLockItem |
	logDebug("Rules-DoorLocks", "Lock: {} updated AlarmRawMessage to: {}", lockName, alarmRawMessage)
	
	val HashMap<Integer, String> userCodeNames = newHashMap(
		1 -> "User1",
		2 -> "User2")
	
	val String typeString = transform("JSONPATH", "$.type", alarmRawMessage)
	switch (typeString) {
		case "BURGLAR" : {
			logDebug("Rules-DoorLocks", "{} sent 'BURGLAR' message: {}", lockName, alarmRawMessage)
			// TODO Sound siren
			// TODO Trigger Elk
			gDoorLocks.sendCommand(ON) // Lock all doors
			val message = "Intruder alert triggered by " + lockName;
			sendBroadcastNotification(message)
			return null
		}
		case "ACCESS_CONTROL" : {
			logDebug("Rules-DoorLocks", "{} sent ACCESS_CONTROL message: {}", lockName, alarmRawMessage)
		}
		default : {
			logDebug("Rules-DoorLocks", "Unknown event with unknown 'type' detected from: {}", lockName)
			return null
		}
	}
	
	val String eventString = transform("JSONPATH", "$.event", alarmRawMessage)
	val Integer eventNumber = Integer::parseInt(eventString)
	
	var String state = UNDEF.toString
	var String userCodeName = null
	switch (eventNumber) {
		case 1,
	//	case 3,
		case 5,
		case 9 : {
			state = ON.toString
		}
		case 2,
	//	case 4,
		case 6 : {
			state = OFF.toString
			if (eventNumber == 6) {
				val String userCodeString = transform("JSONPATH", "$.code", alarmRawMessage)
				val Integer userCodeNumber = Integer::parseInt(userCodeString)
				userCodeName = userCodeNames.getOrDefault(userCodeNumber, "Unknown")
				val String debugMessage = lockName + " granted access to user: " + userCodeName + " with user code index: " + userCodeNumber
				logDebug("Rules-DoorLocks", debugMessage)
				if (userCodeName == "Unknown") {
					sendBroadcastNotification(debugMessage)
				}
			}
		}
		case 11,
		case 16 : {
			val String eventDescription = if (eventNumber == 11) "jammed" else "keypad disabled due to too many failed user code attempts"
			state = UNDEF.toString
			logDebug("Rules-DoorLocks", "{} {}" , lockName, eventDescription)
			sendBroadcastNotification(lockName + " " + eventDescription)
		}
	}
	logDebug("Rules-DoorLocks", "Updating remoteLockItem: {} to {}", remoteLockItem.name, state)	
	remoteLockItem.postUpdate(state)
	
	return null
]


rule "Door Lock - Commanded"
when
	Item Lock1__RemoteLock received command
then
	val notificationNumber = if (receivedCommand == ON) 3 else 4
	Lock1__AccessControlNotification.postUpdate(notificationNumber)	
end

rule "Door Lock - State Changed"
when
	Item Lock1__AlarmRaw received update
then
	ProcessAlarmRaw.apply(
		"Lock1",
		Lock1__AlarmRaw.state.toString,
		Lock1__RemoteLock)
end

Note that you will need an instance of ‘Door Lock - Commanded’ and an instance of ‘Door Lock - State Changed’ for each of your locks.

1 Like