mirror of
https://github.com/mtan93/SmartThingsPublic.git
synced 2026-03-08 05:31:56 +00:00
Updating smartpower outlet device type to use zigbee library
This commit is contained in:
@@ -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"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user