DEVFRWK-78 Fix First Alert smoke alarm check-in handling

This commit is contained in:
Duncan McKee
2016-02-22 13:52:56 -05:00
parent 85175eb298
commit 6123fbeea5

View File

@@ -61,37 +61,44 @@ def parse(String description) {
zwaveEvent(cmd, results) zwaveEvent(cmd, results)
} }
} }
// log.debug "\"$description\" parsed to ${results.inspect()}" log.debug "'$description' parsed to ${results.inspect()}"
return results return results
} }
def createSmokeOrCOEvents(name, results) { def createSmokeOrCOEvents(name, results) {
def text = null def text = null
if (name == "smoke") { switch (name) {
text = "$device.displayName smoke was detected!" case "smoke":
// these are displayed:false because the composite event is the one we want to see in the app text = "$device.displayName smoke was detected!"
results << createEvent(name: "smoke", value: "detected", descriptionText: text, displayed: false) // these are displayed:false because the composite event is the one we want to see in the app
} else if (name == "carbonMonoxide") { results << createEvent(name: "smoke", value: "detected", descriptionText: text, displayed: false)
text = "$device.displayName carbon monoxide was detected!" break
results << createEvent(name: "carbonMonoxide", value: "detected", descriptionText: text, displayed: false) case "carbonMonoxide":
} else if (name == "tested") { text = "$device.displayName carbon monoxide was detected!"
text = "$device.displayName was tested" results << createEvent(name: "carbonMonoxide", value: "detected", descriptionText: text, displayed: false)
results << createEvent(name: "smoke", value: "tested", descriptionText: text, displayed: false) break
results << createEvent(name: "carbonMonoxide", value: "tested", descriptionText: text, displayed: false) case "tested":
} else if (name == "smokeClear") { text = "$device.displayName was tested"
text = "$device.displayName smoke is clear" results << createEvent(name: "smoke", value: "tested", descriptionText: text, displayed: false)
results << createEvent(name: "smoke", value: "clear", descriptionText: text, displayed: false) results << createEvent(name: "carbonMonoxide", value: "tested", descriptionText: text, displayed: false)
name = "clear" break
} else if (name == "carbonMonoxideClear") { case "smokeClear":
text = "$device.displayName carbon monoxide is clear" text = "$device.displayName smoke is clear"
results << createEvent(name: "carbonMonoxide", value: "clear", descriptionText: text, displayed: false) results << createEvent(name: "smoke", value: "clear", descriptionText: text, displayed: false)
name = "clear" name = "clear"
} else if (name == "testClear") { break
text = "$device.displayName smoke is clear" case "carbonMonoxideClear":
results << createEvent(name: "smoke", value: "clear", descriptionText: text, displayed: false) text = "$device.displayName carbon monoxide is clear"
results << createEvent(name: "carbonMonoxide", value: "clear", displayed: false) results << createEvent(name: "carbonMonoxide", value: "clear", descriptionText: text, displayed: false)
name = "clear" name = "clear"
break
case "testClear":
text = "$device.displayName test cleared"
results << createEvent(name: "smoke", value: "clear", descriptionText: text, displayed: false)
results << createEvent(name: "carbonMonoxide", value: "clear", displayed: false)
name = "clear"
break
} }
// This composite event is used for updating the tile // This composite event is used for updating the tile
results << createEvent(name: "alarmState", value: name, descriptionText: text) results << createEvent(name: "alarmState", value: name, descriptionText: text)
@@ -117,8 +124,10 @@ def zwaveEvent(physicalgraph.zwave.commands.alarmv2.AlarmReport cmd, results) {
createSmokeOrCOEvents(cmd.alarmLevel ? "tested" : "testClear", results) createSmokeOrCOEvents(cmd.alarmLevel ? "tested" : "testClear", results)
break break
case 13: // sent every hour -- not sure what this means, just a wake up notification? case 13: // sent every hour -- not sure what this means, just a wake up notification?
if (cmd.alarmLevel != 255) { if (cmd.alarmLevel == 255) {
results << createEvent(descriptionText: "$device.displayName code 13 is $cmd.alarmLevel", displayed: true) results << createEvent(descriptionText: "$device.displayName checked in", isStateChange: false)
} else {
results << createEvent(descriptionText: "$device.displayName code 13 is $cmd.alarmLevel", isStateChange:true, displayed:false)
} }
// Clear smoke in case they pulled batteries and we missed the clear msg // Clear smoke in case they pulled batteries and we missed the clear msg
@@ -127,9 +136,8 @@ def zwaveEvent(physicalgraph.zwave.commands.alarmv2.AlarmReport cmd, results) {
} }
// Check battery if we don't have a recent battery event // Check battery if we don't have a recent battery event
def prevBattery = device.currentState("battery") if (!state.lastbatt || (now() - state.lastbatt) >= 48*60*60*1000) {
if (!prevBattery || (new Date().time - prevBattery.date.time)/60000 >= 60 * 53) { results << response(zwave.batteryV1.batteryGet())
results << new physicalgraph.device.HubAction(zwave.batteryV1.batteryGet().format())
} }
break break
default: default:
@@ -158,12 +166,17 @@ def zwaveEvent(physicalgraph.zwave.commands.sensoralarmv1.SensorAlarmReport cmd,
} }
def zwaveEvent(physicalgraph.zwave.commands.wakeupv1.WakeUpNotification cmd, results) { def zwaveEvent(physicalgraph.zwave.commands.wakeupv1.WakeUpNotification cmd, results) {
results << new physicalgraph.device.HubAction(zwave.wakeUpV1.wakeUpNoMoreInformation().format())
results << createEvent(descriptionText: "$device.displayName woke up", isStateChange: false) results << createEvent(descriptionText: "$device.displayName woke up", isStateChange: false)
if (!state.lastbatt || (now() - state.lastbatt) >= 56*60*60*1000) {
results << response(zwave.batteryV1.batteryGet(), "delay 2000", zwave.wakeUpV1.wakeUpNoMoreInformation())
} else {
results << response(zwave.wakeUpV1.wakeUpNoMoreInformation())
}
} }
def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd, results) { def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd, results) {
def map = [ name: "battery", unit: "%" ] def map = [ name: "battery", unit: "%", isStateChange: true ]
state.lastbatt = now()
if (cmd.batteryLevel == 0xFF) { if (cmd.batteryLevel == 0xFF) {
map.value = 1 map.value = 1
map.descriptionText = "$device.displayName battery is low!" map.descriptionText = "$device.displayName battery is low!"