Pass unhandled messages up to the cloud

Currently these DTHs return null when they parse a message that they
don't have specific handling for.  This ends up sending the message up
to the cloud as an event, which prevented us from potentially parsing
that message in the cloud.  By instead returning an empty map we can
instead send the message up to the cloud to be parsed there.  This
allows us to add handling in the cloud for new message without requiring
and AppEngine deploy for them to work.

This resolves: https://smartthings.atlassian.net/browse/DPROT-200
This commit is contained in:
Zach Varberg
2016-11-02 11:06:13 -05:00
parent 96659f0a73
commit 4115d8c65f
10 changed files with 38 additions and 27 deletions

View File

@@ -69,15 +69,17 @@ metadata {
def parse(String description) { def parse(String description) {
log.debug "description is $description" log.debug "description is $description"
def event = [:]
def finalResult = isKnownDescription(description) def finalResult = isKnownDescription(description)
if (finalResult != "false") { if (finalResult != "false") {
log.info finalResult log.info finalResult
if (finalResult.type == "update") { if (finalResult.type == "update") {
log.info "$device updates: ${finalResult.value}" log.info "$device updates: ${finalResult.value}"
event = null
} }
else if (finalResult.type == "power") { else if (finalResult.type == "power") {
def powerValue = (finalResult.value as Integer)/10 def powerValue = (finalResult.value as Integer)/10
sendEvent(name: "power", value: powerValue) event = createEvent(name: "power", value: powerValue)
/* /*
Dividing by 10 as the Divisor is 10000 and unit is kW for the device. AttrId: 0302 and 0300. Simplifying to 10 Dividing by 10 as the Divisor is 10000 and unit is kW for the device. AttrId: 0302 and 0300. Simplifying to 10
@@ -87,13 +89,14 @@ def parse(String description) {
*/ */
} }
else { else {
sendEvent(name: finalResult.type, value: finalResult.value) event = createEvent(name: finalResult.type, value: finalResult.value)
} }
} }
else { else {
log.warn "DID NOT PARSE MESSAGE for description : $description" log.warn "DID NOT PARSE MESSAGE for description : $description"
log.debug parseDescriptionAsMap(description) log.debug parseDescriptionAsMap(description)
} }
return event
} }
// Commands to device // Commands to device

View File

@@ -79,6 +79,7 @@ def parse(String description) {
log.debug "description is $description" log.debug "description is $description"
def finalResult = zigbee.getKnownDescription(description) def finalResult = zigbee.getKnownDescription(description)
def event = [:]
//TODO: Remove this after getKnownDescription can parse it automatically //TODO: Remove this after getKnownDescription can parse it automatically
if (!finalResult && description!="updated") if (!finalResult && description!="updated")
@@ -88,10 +89,11 @@ def parse(String description) {
log.info "final result = $finalResult" log.info "final result = $finalResult"
if (finalResult.type == "update") { if (finalResult.type == "update") {
log.info "$device updates: ${finalResult.value}" log.info "$device updates: ${finalResult.value}"
event = null
} }
else if (finalResult.type == "power") { else if (finalResult.type == "power") {
def powerValue = (finalResult.value as Integer)/10 def powerValue = (finalResult.value as Integer)/10
sendEvent(name: "power", value: powerValue, descriptionText: '{{ device.displayName }} power is {{ value }} Watts', translatable: true ) event = createEvent(name: "power", value: powerValue, descriptionText: '{{ device.displayName }} power is {{ value }} Watts', translatable: true)
/* /*
Dividing by 10 as the Divisor is 10000 and unit is kW for the device. AttrId: 0302 and 0300. Simplifying to 10 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 power level is an integer. The exact power level with correct units needs to be handled in the device type
@@ -100,7 +102,7 @@ def parse(String description) {
} }
else { else {
def descriptionText = finalResult.value == "on" ? '{{ device.displayName }} is On' : '{{ device.displayName }} is Off' def descriptionText = finalResult.value == "on" ? '{{ device.displayName }} is On' : '{{ device.displayName }} is Off'
sendEvent(name: finalResult.type, value: finalResult.value, descriptionText: descriptionText, translatable: true) event = createEvent(name: finalResult.type, value: finalResult.value, descriptionText: descriptionText, translatable: true)
} }
} }
else { else {
@@ -109,10 +111,11 @@ def parse(String description) {
if (cluster && cluster.clusterId == 0x0006 && cluster.command == 0x07){ if (cluster && cluster.clusterId == 0x0006 && cluster.command == 0x07){
if (cluster.data[0] == 0x00) { if (cluster.data[0] == 0x00) {
log.debug "ON/OFF REPORTING CONFIG RESPONSE: " + cluster log.debug "ON/OFF REPORTING CONFIG RESPONSE: " + cluster
sendEvent(name: "checkInterval", value: 60 * 12, displayed: false, data: [protocol: "zigbee", hubHardwareId: device.hub.hardwareID]) event = createEvent(name: "checkInterval", value: 60 * 12, displayed: false, data: [protocol: "zigbee", hubHardwareId: device.hub.hardwareID])
} }
else { else {
log.warn "ON/OFF REPORTING CONFIG FAILED- error code:${cluster.data[0]}" log.warn "ON/OFF REPORTING CONFIG FAILED- error code:${cluster.data[0]}"
event = null
} }
} }
else { else {
@@ -120,6 +123,7 @@ def parse(String description) {
log.debug "${cluster}" log.debug "${cluster}"
} }
} }
return event
} }
def off() { def off() {

View File

@@ -86,7 +86,7 @@ metadata {
def parse(String description) { def parse(String description) {
log.debug "parse($description)" log.debug "parse($description)"
def results = null def results = [:]
if (!isSupportedDescription(description) || zigbee.isZoneType19(description)) { if (!isSupportedDescription(description) || zigbee.isZoneType19(description)) {
// Ignore this in favor of orientation-based state // Ignore this in favor of orientation-based state

View File

@@ -102,7 +102,7 @@ def parse(String description) {
} }
log.debug "Parse returned $map" log.debug "Parse returned $map"
def result = map ? createEvent(map) : null def result = map ? createEvent(map) : [:]
if (description?.startsWith('enroll request')) { if (description?.startsWith('enroll request')) {
List cmds = enrollResponse() List cmds = enrollResponse()

View File

@@ -106,7 +106,7 @@ def parse(String description) {
} }
log.debug "Parse returned $map" log.debug "Parse returned $map"
def result = map ? createEvent(map) : null def result = map ? createEvent(map) : [:]
if (description?.startsWith('enroll request')) { if (description?.startsWith('enroll request')) {
List cmds = enrollResponse() List cmds = enrollResponse()

View File

@@ -90,7 +90,7 @@ def parse(String description) {
} }
log.debug "Parse returned $map" log.debug "Parse returned $map"
def result = map ? createEvent(map) : null def result = map ? createEvent(map) : [:]
if (description?.startsWith('enroll request')) { if (description?.startsWith('enroll request')) {
List cmds = enrollResponse() List cmds = enrollResponse()

View File

@@ -44,7 +44,7 @@ metadata {
} }
def parse(String description) { def parse(String description) {
def results def results = [:]
if (isZoneType19(description) || !isSupportedDescription(description)) { if (isZoneType19(description) || !isSupportedDescription(description)) {
results = parseBasicMessage(description) results = parseBasicMessage(description)
} }
@@ -57,21 +57,25 @@ def parse(String description) {
private Map parseBasicMessage(description) { private Map parseBasicMessage(description) {
def name = parseName(description) def name = parseName(description)
def value = parseValue(description) if (name != null) {
def linkText = getLinkText(device) def value = parseValue(description)
def descriptionText = parseDescriptionText(linkText, value, description) def linkText = getLinkText(device)
def handlerName = value def descriptionText = parseDescriptionText(linkText, value, description)
def isStateChange = isStateChange(device, name, value) def handlerName = value
def isStateChange = isStateChange(device, name, value)
def results = [ def results = [
name: name, name : name,
value: value, value : value,
linkText: linkText, linkText : linkText,
descriptionText: descriptionText, descriptionText: descriptionText,
handlerName: handlerName, handlerName : handlerName,
isStateChange: isStateChange, isStateChange : isStateChange,
displayed: displayed(description, isStateChange) displayed : displayed(description, isStateChange)
] ]
} else {
results = [:]
}
log.debug "Parse returned $results.descriptionText" log.debug "Parse returned $results.descriptionText"
return results return results
} }

View File

@@ -127,7 +127,7 @@ def parse(String description) {
map = parseIasMessage(description) map = parseIasMessage(description)
} }
def result = map ? createEvent(map) : null def result = map ? createEvent(map) : [:]
if (description?.startsWith('enroll request')) { if (description?.startsWith('enroll request')) {
List cmds = enrollResponse() List cmds = enrollResponse()

View File

@@ -93,7 +93,7 @@ def parse(String description) {
} }
log.debug "Parse returned $map" log.debug "Parse returned $map"
def result = map ? createEvent(map) : null def result = map ? createEvent(map) : [:]
if (description?.startsWith('enroll request')) { if (description?.startsWith('enroll request')) {
List cmds = enrollResponse() List cmds = enrollResponse()

View File

@@ -84,7 +84,7 @@ def parse(String description) {
} }
log.debug "Parse returned $map" log.debug "Parse returned $map"
return map ? createEvent(map) : null return map ? createEvent(map) : [:]
} }
private Map parseCatchAllMessage(String description) { private Map parseCatchAllMessage(String description) {