From c7147205783853df0c76ed9ebc396068a483630f Mon Sep 17 00:00:00 2001 From: Tom Manley Date: Wed, 23 Mar 2016 09:51:02 -0500 Subject: [PATCH] Update zigbee-lock, zigbee-dimmer and zigbee-dimmer-power to use ZB lib API https://smartthings.atlassian.net/browse/DPROT-20 --- .../zigbee-dimmer-power.groovy | 18 ++--- .../zigbee-dimmer.src/zigbee-dimmer.groovy | 12 +--- .../zigbee-lock.src/zigbee-lock.groovy | 68 ++++++++----------- 3 files changed, 37 insertions(+), 61 deletions(-) diff --git a/devicetypes/smartthings/zigbee-dimmer-power.src/zigbee-dimmer-power.groovy b/devicetypes/smartthings/zigbee-dimmer-power.src/zigbee-dimmer-power.groovy index 14cac15..af8c227 100644 --- a/devicetypes/smartthings/zigbee-dimmer-power.src/zigbee-dimmer-power.groovy +++ b/devicetypes/smartthings/zigbee-dimmer-power.src/zigbee-dimmer-power.groovy @@ -56,21 +56,17 @@ metadata { def parse(String description) { log.debug "description is $description" - def resultMap = zigbee.getKnownDescription(description) - if (resultMap) { - log.info resultMap - if (resultMap.type == "update") { - log.info "$device updates: ${resultMap.value}" - } - else if (resultMap.type == "power") { - def powerValue + def event = zigbee.getEvent(description) + if (event) { + log.info event + if (event.name == "power") { if (device.getDataValue("manufacturer") != "OSRAM") { //OSRAM devices do not reliably update power - powerValue = (resultMap.value as Integer)/10 //TODO: The divisor value needs to be set as part of configuration - sendEvent(name: "power", value: powerValue) + event.value = (event.value as Integer) / 10 //TODO: The divisor value needs to be set as part of configuration + sendEvent(event) } } else { - sendEvent(name: resultMap.type, value: resultMap.value) + sendEvent(event) } } else { diff --git a/devicetypes/smartthings/zigbee-dimmer.src/zigbee-dimmer.groovy b/devicetypes/smartthings/zigbee-dimmer.src/zigbee-dimmer.groovy index 770639c..72809f5 100644 --- a/devicetypes/smartthings/zigbee-dimmer.src/zigbee-dimmer.groovy +++ b/devicetypes/smartthings/zigbee-dimmer.src/zigbee-dimmer.groovy @@ -51,15 +51,9 @@ metadata { def parse(String description) { log.debug "description is $description" - def resultMap = zigbee.getKnownDescription(description) - if (resultMap) { - log.info resultMap - if (resultMap.type == "update") { - log.info "$device updates: ${resultMap.value}" - } - else { - sendEvent(name: resultMap.type, value: resultMap.value) - } + def event = zigbee.getEvent(description) + if (event) { + sendEvent(event) } else { log.warn "DID NOT PARSE MESSAGE for description : $description" diff --git a/devicetypes/smartthings/zigbee-lock.src/zigbee-lock.groovy b/devicetypes/smartthings/zigbee-lock.src/zigbee-lock.groovy index 39e78d2..2c6bcfc 100644 --- a/devicetypes/smartthings/zigbee-lock.src/zigbee-lock.groovy +++ b/devicetypes/smartthings/zigbee-lock.src/zigbee-lock.groovy @@ -83,32 +83,19 @@ def uninstalled() { } def configure() { - /* def cmds = - zigbee.configSetup("${CLUSTER_DOORLOCK}", "${DOORLOCK_ATTR_LOCKSTATE}", - "${TYPE_ENUM8}", 0, 3600, "{01}") + - zigbee.configSetup("${CLUSTER_POWER}", "${POWER_ATTR_BATTERY_PERCENTAGE_REMAINING}", - "${TYPE_U8}", 600, 21600, "{01}") - */ - def zigbeeId = device.zigbeeId - def cmds = - [ - "zdo bind 0x${device.deviceNetworkId} 0x${device.endpointId} 1 ${CLUSTER_DOORLOCK} {$zigbeeId} {}", "delay 200", - "zcl global send-me-a-report ${CLUSTER_DOORLOCK} ${DOORLOCK_ATTR_LOCKSTATE} ${TYPE_ENUM8} 0 3600 {01}", "delay 200", - "send 0x${device.deviceNetworkId} 1 0x${device.endpointId}", "delay 200", - - "zdo bind 0x${device.deviceNetworkId} 0x${device.endpointId} 1 ${CLUSTER_POWER} {$zigbeeId} {}", "delay 200", - "zcl global send-me-a-report ${CLUSTER_POWER} ${POWER_ATTR_BATTERY_PERCENTAGE_REMAINING} ${TYPE_U8} 600 21600 {01}", "delay 200", - "send 0x${device.deviceNetworkId} 1 0x${device.endpointId}", "delay 200", - ] + zigbee.configureReporting(CLUSTER_DOORLOCK, DOORLOCK_ATTR_LOCKSTATE, + TYPE_ENUM8, 0, 3600, null) + + zigbee.configureReporting(CLUSTER_POWER, POWER_ATTR_BATTERY_PERCENTAGE_REMAINING, + TYPE_U8, 600, 21600, 0x01) log.info "configure() --- cmds: $cmds" return cmds + refresh() // send refresh cmds as part of config } def refresh() { def cmds = - zigbee.refreshData("${CLUSTER_DOORLOCK}", "${DOORLOCK_ATTR_LOCKSTATE}") + - zigbee.refreshData("${CLUSTER_POWER}", "${POWER_ATTR_BATTERY_PERCENTAGE_REMAINING}") + zigbee.readAttribute(CLUSTER_DOORLOCK, DOORLOCK_ATTR_LOCKSTATE) + + zigbee.readAttribute(CLUSTER_POWER, POWER_ATTR_BATTERY_PERCENTAGE_REMAINING) log.info "refresh() --- cmds: $cmds" return cmds } @@ -121,34 +108,27 @@ def parse(String description) { map = parseReportAttributeMessage(description) } - log.debug "parse() --- Parse returned $map" def result = map ? createEvent(map) : null + log.debug "parse() --- returned: $result" return result } // Lock capability commands def lock() { - //def cmds = zigbee.zigbeeCommand("${CLUSTER_DOORLOCK}", "${DOORLOCK_CMD_LOCK_DOOR}", "{}") - //log.info "lock() -- cmds: $cmds" - //return cmds - "st cmd 0x${device.deviceNetworkId} 0x${device.endpointId} ${CLUSTER_DOORLOCK} ${DOORLOCK_CMD_LOCK_DOOR} {}" + def cmds = zigbee.command(CLUSTER_DOORLOCK, DOORLOCK_CMD_LOCK_DOOR) + log.info "lock() -- cmds: $cmds" + return cmds } def unlock() { - //def cmds = zigbee.zigbeeCommand("${CLUSTER_DOORLOCK}", "${DOORLOCK_CMD_UNLOCK_DOOR}", "{}") - //log.info "unlock() -- cmds: $cmds" - //return cmds - "st cmd 0x${device.deviceNetworkId} 0x${device.endpointId} ${CLUSTER_DOORLOCK} ${DOORLOCK_CMD_UNLOCK_DOOR} {}" + def cmds = zigbee.command(CLUSTER_DOORLOCK, DOORLOCK_CMD_UNLOCK_DOOR) + log.info "unlock() -- cmds: $cmds" + return cmds } // Private methods private Map parseReportAttributeMessage(String description) { - log.trace "parseReportAttributeMessage() --- description: $description" - Map descMap = zigbee.parseDescriptionAsMap(description) - - log.debug "parseReportAttributeMessage() --- descMap: $descMap" - Map resultMap = [:] if (descMap.clusterInt == CLUSTER_POWER && descMap.attrInt == POWER_ATTR_BATTERY_PERCENTAGE_REMAINING) { resultMap.name = "battery" @@ -156,18 +136,24 @@ private Map parseReportAttributeMessage(String description) { if (device.getDataValue("manufacturer") == "Yale") { //Handling issue with Yale locks incorrect battery reporting resultMap.value = Integer.parseInt(descMap.value, 16) } - log.info "parseReportAttributeMessage() --- battery: ${resultMap.value}" } else if (descMap.clusterInt == CLUSTER_DOORLOCK && descMap.attrInt == DOORLOCK_ATTR_LOCKSTATE) { def value = Integer.parseInt(descMap.value, 16) + def linkText = getLinkText(device) resultMap.name = "lock" - resultMap.putAll([0:["value":"unknown", - "descriptionText":"Not fully locked"], - 1:["value":"locked"], - 2:["value":"unlocked"]].get(value, - ["value":"unknown", - "descriptionText":"Unknown lock state"])) - log.info "parseReportAttributeMessage() --- lock: ${resultMap.value}" + if (value == 0) { + resultMap.value = "unknown" + resultMap.descriptionText = "${linkText} is not fully locked" + } else if (value == 1) { + resultMap.value = "locked" + resultMap.descriptionText = "${linkText} is locked" + } else if (value == 2) { + resultMap.value = "unlocked" + resultMap.descriptionText = "${linkText} is unlocked" + } else { + resultMap.value = "unknown" + resultMap.descriptionText = "${linkText} is in unknown lock state" + } } else { log.debug "parseReportAttributeMessage() --- ignoring attribute"