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 (finalResult.type == "power") {
} else if (descMap.cluster.equalsIgnoreCase("0B04") && descMap.attrId.equalsIgnoreCase("050b")) { def powerValue = (finalResult.value as Integer)/10
def reportValue = descMap.value sendEvent(name: "power", value: powerValue)
name = "power" /*
//power divisor is 10 Dividing by 10 as the Divisor is 10000 and unit is kW for the device. AttrId: 0302 and 0300. Simplifying to 10
value = Integer.parseInt(reportValue, 16) / 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 {
sendEvent(name: finalResult.type, value: finalResult.value)
} }
} else if (description?.startsWith("on/off:")) {
log.debug "Switch command"
name = "switch"
value = description?.endsWith(" 1") ? "on" : "off"
} }
else {
def result = createEvent(name: name, value: value) log.warn "DID NOT PARSE MESSAGE for description : $description"
log.debug "Parse returned ${result?.descriptionText}" log.debug zigbee.parseDescriptionAsMap(description)
return result
}
def 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"
]
} }