Updated heartbeat for OSRAM bulb and Smartpower Outlet

-OSRAM bulb config updated to make it check in every 5 min
-Update attribute heartbeat once after configuration is done
-Store timestamp each time data is received from device
-Removed polling from OSRAM bulb
This commit is contained in:
larsfinander
2015-08-06 12:16:30 -07:00
parent 0a9a86ee99
commit ab75af8cf2
2 changed files with 41 additions and 36 deletions

View File

@@ -13,12 +13,12 @@ metadata {
capability "Switch" capability "Switch"
capability "Switch Level" capability "Switch Level"
capability "Configuration" capability "Configuration"
capability "Polling"
capability "Refresh" capability "Refresh"
capability "Sensor" capability "Sensor"
attribute "colorName", "string" attribute "colorName", "string"
// heartbeat is updated at every poll
// indicates that device keeps track of heartbeat (in state.heartbeat)
attribute "heartbeat", "string" attribute "heartbeat", "string"
@@ -75,6 +75,10 @@ metadata {
// Parse incoming device messages to generate events // Parse incoming device messages to generate events
def parse(String description) { def parse(String description) {
//log.trace description //log.trace description
// save heartbeat (i.e. last time we got a message from device)
state.heartbeat = Calendar.getInstance().getTimeInMillis()
if (description?.startsWith("catchall:")) { if (description?.startsWith("catchall:")) {
if(description?.endsWith("0100") ||description?.endsWith("1001") || description?.matches("on/off\\s*:\\s*1")) if(description?.endsWith("0100") ||description?.endsWith("1001") || description?.matches("on/off\\s*:\\s*1"))
{ {
@@ -95,21 +99,16 @@ def parse(String description) {
log.trace "descMap : $descMap" log.trace "descMap : $descMap"
if (descMap.cluster == "0300") { if (descMap.cluster == "0300") {
// trigger heartbeat
def hb = createEvent(name: "heartbeat", value: "alive", isStateChange: true, displayed:false)
log.debug descMap.value log.debug descMap.value
def tempInMired = convertHexToInt(descMap.value) def tempInMired = convertHexToInt(descMap.value)
def tempInKelvin = Math.round(1000000/tempInMired) def tempInKelvin = Math.round(1000000/tempInMired)
log.trace "temp in kelvin: $tempInKelvin" log.trace "temp in kelvin: $tempInKelvin"
def result = createEvent(name: "colorTemperature", value: tempInKelvin, displayed:false) sendEvent(name: "colorTemperature", value: tempInKelvin, displayed:false)
return [result, hb]
} }
else if(descMap.cluster == "0008"){ else if(descMap.cluster == "0008"){
def dimmerValue = Math.round(convertHexToInt(descMap.value) * 100 / 255) def dimmerValue = Math.round(convertHexToInt(descMap.value) * 100 / 255)
log.debug "dimmer value is $dimmerValue" log.debug "dimmer value is $dimmerValue"
def result = createEvent(name: "level", value: dimmerValue) sendEvent(name: "level", value: dimmerValue)
return result
} }
} }
else { else {
@@ -119,8 +118,6 @@ def parse(String description) {
log.debug "Parse returned ${result?.descriptionText}" log.debug "Parse returned ${result?.descriptionText}"
return result return result
} }
} }
def on() { def on() {
@@ -136,6 +133,7 @@ def off() {
} }
def refresh() { def refresh() {
sendEvent(name: "heartbeat", value: "alive", displayed:false)
[ [
"st rattr 0x${device.deviceNetworkId} ${endpointId} 6 0", "delay 500", "st rattr 0x${device.deviceNetworkId} ${endpointId} 6 0", "delay 500",
"st rattr 0x${device.deviceNetworkId} ${endpointId} 8 0", "delay 500", "st rattr 0x${device.deviceNetworkId} ${endpointId} 8 0", "delay 500",
@@ -146,22 +144,29 @@ def refresh() {
def configure() { def configure() {
state.levelValue = 100 state.levelValue = 100
log.debug "Confuguring Reporting and Bindings." log.debug "Configuring Reporting and Bindings."
def configCmds = [ def configCmds = [
//Switch Reporting
"zcl global send-me-a-report 6 0 0x10 0 3600 {01}", "delay 500",
"send 0x${device.deviceNetworkId} ${endpointId} 1", "delay 1000",
//Level Control Reporting
"zcl global send-me-a-report 8 0 0x20 5 3600 {0010}", "delay 200",
"send 0x${device.deviceNetworkId} ${endpointId} 1", "delay 1500",
"zdo bind 0x${device.deviceNetworkId} ${endpointId} 1 6 {${device.zigbeeId}} {}", "delay 1000",
"zdo bind 0x${device.deviceNetworkId} ${endpointId} 1 8 {${device.zigbeeId}} {}", "delay 500",
"zdo bind 0x${device.deviceNetworkId} ${endpointId} 1 0x0300 {${device.zigbeeId}} {}", "delay 500" "zdo bind 0x${device.deviceNetworkId} ${endpointId} 1 0x0300 {${device.zigbeeId}} {}", "delay 500"
] ]
return configCmds + refresh() // send refresh cmds as part of config return onOffConfig() + levelConfig() + configCmds + refresh() // send refresh cmds as part of config
}
def onOffConfig() {
[
"zdo bind 0x${device.deviceNetworkId} ${endpointId} 1 6 {${device.zigbeeId}} {}", "delay 200",
"zcl global send-me-a-report 6 0 0x10 0 300 {01}",
"send 0x${device.deviceNetworkId} 1 ${endpointId}", "delay 1500"
]
}
//level config for devices with min reporting interval as 5 seconds and reporting interval if no activity as 1hour (3600s)
//min level change is 01
def levelConfig() {
[
"zdo bind 0x${device.deviceNetworkId} ${endpointId} 1 8 {${device.zigbeeId}} {}", "delay 200",
"zcl global send-me-a-report 8 0 0x20 5 3600 {01}",
"send 0x${device.deviceNetworkId} 1 ${endpointId}", "delay 1500"
]
} }
def setColorTemperature(value) { def setColorTemperature(value) {
@@ -190,11 +195,6 @@ def parseDescriptionAsMap(description) {
} }
} }
def poll(){
log.debug "Poll is calling refresh"
refresh()
}
def setLevel(value) { def setLevel(value) {
state.levelValue = (value==null) ? 100 : value state.levelValue = (value==null) ? 100 : value
log.trace "setLevel($value)" log.trace "setLevel($value)"

View File

@@ -14,7 +14,7 @@ metadata {
capability "Refresh" capability "Refresh"
capability "Sensor" capability "Sensor"
// heartbeat is updated every time device checks in // indicates that device keeps track of heartbeat (in state.heartbeat)
attribute "heartbeat", "string" attribute "heartbeat", "string"
fingerprint profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0B04,0B05", outClusters: "0019" fingerprint profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0B04,0B05", outClusters: "0019"
@@ -54,6 +54,10 @@ def parse(String description) {
log.debug "Parse description $description" log.debug "Parse description $description"
def name = null def name = null
def value = null def value = null
// save heartbeat (i.e. last time we got a message from device)
state.heartbeat = Calendar.getInstance().getTimeInMillis()
if (description?.startsWith("read attr -")) { if (description?.startsWith("read attr -")) {
def descMap = parseDescriptionAsMap(description) def descMap = parseDescriptionAsMap(description)
log.debug "Read attr: $description" log.debug "Read attr: $description"
@@ -63,11 +67,8 @@ def parse(String description) {
} else if (descMap.cluster.equalsIgnoreCase("0B04") && descMap.attrId.equalsIgnoreCase("050b")) { } else if (descMap.cluster.equalsIgnoreCase("0B04") && descMap.attrId.equalsIgnoreCase("050b")) {
def reportValue = descMap.value def reportValue = descMap.value
name = "power" name = "power"
// assume 16 bit signed for encoding and power divisor is 10 //power divisor is 10
value = Integer.parseInt(reportValue, 16) / 10 value = Integer.parseInt(reportValue, 16) / 10
// trigger heartbeat
sendEvent(name: "heartbeat", value: "alive", isStateChange: true, displayed:false)
} }
} else if (description?.startsWith("on/off:")) { } else if (description?.startsWith("on/off:")) {
log.debug "Switch command" log.debug "Switch command"
@@ -101,12 +102,16 @@ def meter() {
} }
def refresh() { def refresh() {
"st rattr 0x${device.deviceNetworkId} 1 0xB04 0x50B" sendEvent(name: "heartbeat", value: "alive", displayed:false)
[
"st rattr 0x${device.deviceNetworkId} 1 0xB04 0x50B"
]
} }
def configure() { def configure() {
[ def configCmds = [
"zdo bind 0x${device.deviceNetworkId} 1 1 6 {${device.zigbeeId}} {}", "delay 200", "zdo bind 0x${device.deviceNetworkId} 1 1 6 {${device.zigbeeId}} {}", "delay 200",
"zdo bind 0x${device.deviceNetworkId} 1 1 0xB04 {${device.zigbeeId}} {}" "zdo bind 0x${device.deviceNetworkId} 1 1 0xB04 {${device.zigbeeId}} {}"
] ]
return configCmds + refresh() // send refresh cmds as part of config
} }