Skip to content

Instantly share code, notes, and snippets.

@mckeed
Created October 10, 2013 15:48
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mckeed/6920627 to your computer and use it in GitHub Desktop.
Save mckeed/6920627 to your computer and use it in GitHub Desktop.
SmartThings device type handler for the BRK First Alert ZSMOKE
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