Created
October 10, 2013 15:48
-
-
Save mckeed/6920627 to your computer and use it in GitHub Desktop.
SmartThings device type handler for the BRK First Alert ZSMOKE
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
metadata { | |
simulator { | |
} | |
tiles { | |
standardTile("smoke", "device.smoke", width: 2, height: 2) { | |
state("clear", label:"clear", icon:"st.alarm.smoke.clear", backgroundColor:"#ffffff") | |
state("detected", label:"SMOKE", icon:"st.alarm.smoke.smoke", backgroundColor:"#e86d13") | |
state("tested", label:"TEST", icon:"st.alarm.smoke.test", backgroundColor:"#e86d13") | |
} | |
valueTile("battery", "device.battery", inactiveLabel: false, decoration: "flat") { | |
state "battery", label:'${currentValue}% battery', unit:"" | |
} | |
main "smoke" | |
details(["smoke", "battery"]) | |
} | |
} | |
def parse(String description) { | |
def results = [] | |
if (description.startsWith("Err")) { | |
results << createEvent(descriptionText:description, displayed:true) | |
} else { | |
def cmd = zwave.parse(description, [ 0x80: 1, 0x84: 1, 0x71: 2, 0x72: 1 ]) | |
if (cmd) { | |
zwaveEvent(cmd, results) | |
} | |
} | |
// log.debug "\"$description\" parsed to ${results.inspect()}" | |
return results | |
} | |
def smokeEventMap(map, wasDetected) { | |
map.name = "smoke" | |
if (wasDetected) { | |
map.value = "detected" | |
map.descriptionText = "$device.displayName smoke was detected!" | |
} else { | |
map.value = "clear" | |
} | |
map | |
} | |
def zwaveEvent(physicalgraph.zwave.commands.alarmv2.AlarmReport cmd, results) { | |
def map = [:] | |
if (cmd.zwaveAlarmType == physicalgraph.zwave.commands.alarmv2.AlarmReport.ZWAVE_ALARM_TYPE_SMOKE) { | |
if (cmd.zwaveAlarmEvent == 3) { | |
map = [ name: "smoke", value: "tested", descriptionText: "$device.displayName was tested" ] | |
} else { | |
smokeEventMap(map, cmd.zwaveAlarmEvent != 0 && cmd.zwaveAlarmEvent != 0xFE) | |
} | |
} else switch(cmd.alarmType) { | |
case 1: | |
smokeEventMap(map, cmd.alarmLevel) | |
break | |
case 12: // test button pressed | |
map.name = "smoke" | |
if (cmd.alarmLevel) { | |
map.value = "tested" | |
map.descriptionText = "$device.displayName was tested" | |
} else { | |
map.value = "clear" | |
} | |
break | |
case 13: // not sure what this means, just a wake up notification? | |
map = [ descriptionText: "$device.displayName code 13 is $cmd.alarmLevel", displayed: (cmd.alarmLevel != 255) ] | |
def prevBattery = device.currentState("battery") | |
if (!prevBattery || (new Date().time - prevBattery.date.time)/60000 >= 600) { | |
results << new physicalgraph.device.HubAction(zwave.batteryV1.batteryGet().format()) | |
} | |
break | |
default: | |
map = [ displayed: true, descriptionText: "Alarm $cmd.alarmType ${cmd.alarmLevel == 255 ? 'activated' : cmd.alarmLevel ?: 'deactivated'}".toString() ] | |
break | |
} | |
results << createEvent(map) | |
} | |
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) | |
} | |
def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd, results) { | |
def map = [ name: "battery", unit: "%" ] | |
if (cmd.batteryLevel == 0xFF) { | |
map.value = 1 | |
map.descriptionText = "$device.displayName has a low battery" | |
} else { | |
map.value = cmd.batteryLevel | |
} | |
results << createEvent(map) | |
} | |
def zwaveEvent(physicalgraph.zwave.Command cmd, results) { | |
def event = [ displayed: false ] | |
event.linkText = device.label ?: device.name | |
event.descriptionText = "$event.linkText: $cmd" | |
results << createEvent(event) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment