Updating smartpower outlet device type to use zigbee library

This commit is contained in:
Vinay Rao
2015-08-23 18:22:44 -07:00
parent d2fc763a0e
commit e453c337e2

View File

@@ -1,8 +1,19 @@
/** /**
* CentraLite Switch * Copyright 2015 SmartThings
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
* for the specific language governing permissions and limitations under the License.
*
* SmartPower Outlet (CentraLite)
* *
* Author: SmartThings * Author: SmartThings
* Date: 2013-12-02 * Date: 2015-08-23
*/ */
metadata { metadata {
// Automatically generated. Make future change here. // Automatically generated. Make future change here.
@@ -35,8 +46,10 @@ metadata {
tiles(scale: 2) { tiles(scale: 2) {
multiAttributeTile(name:"switch", type: "lighting", width: 6, height: 4){ multiAttributeTile(name:"switch", type: "lighting", width: 6, height: 4){
tileAttribute ("device.switch", key: "PRIMARY_CONTROL") { tileAttribute ("device.switch", key: "PRIMARY_CONTROL") {
attributeState "off", label: '${name}', action: "switch.on", icon: "st.switches.switch.off", backgroundColor: "#ffffff" attributeState "on", label: '${name}', action: "switch.off", icon: "st.switches.switch.on", backgroundColor: "#79b821", nextState: "turningOff"
attributeState "on", label: '${name}', action: "switch.off", icon: "st.switches.switch.on", backgroundColor: "#79b821" attributeState "off", label: '${name}', action: "switch.on", icon: "st.switches.switch.off", backgroundColor: "#ffffff", nextState: "turningOn"
attributeState "turningOn", label: '${name}', action: "switch.off", icon: "st.switches.switch.on", backgroundColor: "#79b821", nextState: "turningOff"
attributeState "turningOff", label: '${name}', action: "switch.on", icon: "st.switches.switch.off", backgroundColor: "#ffffff", nextState: "turningOn"
} }
tileAttribute ("power", key: "SECONDARY_CONTROL") { tileAttribute ("power", key: "SECONDARY_CONTROL") {
attributeState "power", label:'${currentValue} W' attributeState "power", label:'${currentValue} W'
@@ -54,67 +67,61 @@ metadata {
// Parse incoming device messages to generate events // Parse incoming device messages to generate events
def parse(String description) { def parse(String description) {
log.debug "Parse description $description" log.debug "description is $description"
def name = null
def value = null
// save heartbeat (i.e. last time we got a message from device) def finalResult = zigbee.getKnownDescription(description)
state.heartbeat = Calendar.getInstance().getTimeInMillis() //TODO: Remove this after getKnownDescription can parse it automatically
if (!finalResult)
finalResult = zigbee.getPowerDescription(zigbee.parseDescriptionAsMap(description))
if (description?.startsWith("read attr -")) { if (finalResult) {
def descMap = parseDescriptionAsMap(description) log.info finalResult
log.debug "Read attr: $description" if (finalResult.type == "update") {
if (descMap.cluster == "0006" && descMap.attrId == "0000") { log.info "$device updates: ${finalResult.value}"
name = "switch"
value = descMap.value.endsWith("01") ? "on" : "off"
} else if (descMap.cluster.equalsIgnoreCase("0B04") && descMap.attrId.equalsIgnoreCase("050b")) {
def reportValue = descMap.value
name = "power"
//power divisor is 10
value = Integer.parseInt(reportValue, 16) / 10
} }
} else if (description?.startsWith("on/off:")) { else if (finalResult.type == "power") {
log.debug "Switch command" def powerValue = (finalResult.value as Integer)/10
name = "switch" sendEvent(name: "power", value: powerValue)
value = description?.endsWith(" 1") ? "on" : "off" /*
Dividing by 10 as the Divisor is 10000 and unit is kW for the device. AttrId: 0302 and 0300. Simplifying to 10
power level is an integer. The exact power level with correct units needs to be handled in the device type
to account for the different Divisor value (AttrId: 0302) and POWER Unit (AttrId: 0300). CLUSTER for simple metering is 0702
*/
} }
else {
def result = createEvent(name: name, value: value) sendEvent(name: finalResult.type, value: finalResult.value)
log.debug "Parse returned ${result?.descriptionText}" }
return result }
} else {
log.warn "DID NOT PARSE MESSAGE for description : $description"
def parseDescriptionAsMap(description) { log.debug zigbee.parseDescriptionAsMap(description)
(description - "read attr - ").split(",").inject([:]) { map, param ->
def nameAndValue = param.split(":")
map += [(nameAndValue[0].trim()):nameAndValue[1].trim()]
} }
}
// Commands to device
def on() {
'zcl on-off on'
} }
def off() { def off() {
'zcl on-off off' zigbee.off()
} }
def meter() { def on() {
"st rattr 0x${device.deviceNetworkId} 1 0xB04 0x50B" zigbee.on()
} }
def refresh() { def refresh() {
sendEvent(name: "heartbeat", value: "alive", displayed:false) zigbee.onOffRefresh() + zigbee.refreshData("0x0B04", "0x050B")
[
"st rattr 0x${device.deviceNetworkId} 1 0xB04 0x50B"
]
} }
def configure() { def configure() {
def configCmds = [ zigbee.onOffConfig() + powerConfig() + refresh()
"zdo bind 0x${device.deviceNetworkId} 1 1 6 {${device.zigbeeId}} {}", "delay 200", }
"zdo bind 0x${device.deviceNetworkId} 1 1 0xB04 {${device.zigbeeId}} {}", "delay 200"
] //power config for devices with min reporting interval as 1 seconds and reporting interval if no activity as 10min (600s)
return configCmds + refresh() // send refresh cmds as part of config //min change in value is 01
def powerConfig() {
[
//Meter (Power) Reporting
"zdo bind 0x${device.deviceNetworkId} 1 ${endpointId} 0x0B04 {${device.zigbeeId}} {}", "delay 200",
"zcl global send-me-a-report 0x0B04 0x050B 0x2A 1 600 {01}",
"send 0x${device.deviceNetworkId} 1 ${endpointId}", "delay 1500"
]
} }