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.