I got it working. The only thing that I could not solve is a Error:
[ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule ‘Lock: Update lock states after Alarm Raw event’: cannot invoke method public abstract org.eclipse.smarthome.core.types.State org.eclipse.smarthome.core.persistence.HistoricItem.getState() on null
Here is my mapdb.persist
Strategies {
default = everyChange
}
Items {
* : strategy = everyChange, restoreOnStartup
}
For reference here is the lock.rules
import org.eclipse.xtext.xbase.lib.Functions
val Functions$Function1<GenericItem,Boolean> alarmRawParser = [
inputItem |
val actionItem = gLock.members.findFirst[ item | item.name.toString == inputItem.name.toString.replace("_Alarm_Raw","") ]
logInfo("Rules", "Lock: Alarm events: {}=[{}]",actionItem.name,inputItem.state.toString)
switch (transform("JSONPATH","$.type",inputItem.state.toString)) {
case "ACCESS_CONTROL" : {
switch (transform("JSONPATH", "$.event", inputItem.state.toString)) {
case "1", case "3", case "5" : {
actionItem.postUpdate(ON)
logInfo("Rules", "Lock: Alarm events: {} updated to ON (locked)",actionItem.name)
}
case "2", case "4" : {
actionItem.postUpdate(OFF)
logInfo("Rules", "Lock: Alarm events: {} updated to OFF (unlocked)",actionItem.name)
}
case "6" : {
val StringBuilder message = new StringBuilder(actionItem.name)
message.append(" was unlocked with")
switch (transform("JSONPATH", "$.code", inputItem.state.toString)) {
}
Thread::sleep(100)//wait for Presence state to update so alarm doesn't trigger
actionItem.postUpdate(OFF)
logInfo("Rules", "Lock: {}",message.toString)
//SMS_Notification.sendCommand(message.toString)
}
case "11" : {
logInfo("Rules", "Lock: Alarm events: {} is jammed, so setting lock to OFF (unlocked)",actionItem.label)
actionItem.postUpdate(OFF)
//SMS_Notification.sendCommand(actionItem.label + " is jammed")
}
case "16" : {
val String message = actionItem.label + " keypad is disabled due to too many failed codes"
logInfo("Rules", "Lock: Alarm events: {}",message)
//SMS_Notification.sendCommand(message)
}
default : {
val String message = "Unknown Event in alarmRawParser, " + inputItem.state.toString
logInfo("Rules", "Lock: Alarm events: {}",message)
//SMS_Notification.sendCommand(message)
}
}
if (transform("JSONPATH", "$.event", inputItem.previousState(true).state.toString) == "11" && transform("JSONPATH", "$.event", inputItem.state.toString) != "11") {
val String message = actionItem.label + " is no longer jammed"
logInfo("Rules", "Lock: Alarm events: {}",message)
//SMS_Notification.sendCommand(message)
}
}
case "BURGLAR" : {
val String message = "Intruder at " + actionItem.label
logInfo("Rules", "Lock: Alarm events: {}",message)
//SMS_Notification.sendCommand(message)
}
case "POWER_MANAGEMENT" : {
val String message = "Power Management alarm for " + actionItem.label + ", " + inputItem.state.toString
logDebug("Rules", "Lock: Alarm events: {}",message)
//SMS_Notification.sendCommand(message)
}
default : {
val String message = "Unknown Type in alarmRawParser, " + inputItem.state.toString
logInfo("Rules", "Lock: Alarm events: {}",message)
//SMS_Notification.sendCommand(message)
}
}
true
]
rule "Lock: Update lock states after Alarm Raw event"
when
Item Lock_EntranceFront_Alarm_Raw received update or
Item Lock_MediaRoom_Alarm_Raw received update
then
alarmRawParser.apply(triggeringItem as GenericItem)
end
The doorlock.items
Group:Switch:OR(OFF,ON) gLock "Locks [MAP(lock.map):%s]" <lock>
Switch Lock_EntranceFront "Front Entrance Door Lock [MAP(lock.map):%s]" <lock> (gLock) {channel="zwave:device:f2675c01:node20:lock_door"}
String Lock_EntranceFront_Alarm_Raw "Lock (Front Entrance): Alarm Raw [%s]" <shield> {channel="zwave:device:f2675c01:node20:alarm_raw"}
Switch Lock_MediaRoom "Media Room Door Lock [MAP(lock.map):%s]" <lock> (gLock) {channel="zwave:device:f2675c01:node24:lock_door"}
String Lock_MediaRoom_Alarm_Raw "Lock (Media Room): Alarm Raw [%s]" <shield> {channel="zwave:device:f2675c01:node24:alarm_raw"}
Thanks for all the help.