Modifying 'Billion Single Phase Smart Meter Device Type'

This commit is contained in:
Sai
2015-10-14 22:53:17 -05:00
parent 395989785a
commit 3e738ba82e

View File

@@ -89,9 +89,22 @@ def parse(String description) {
def events = [] def events = []
if (description?.startsWith("catchall:")) { if (description?.startsWith("catchall:")) {
def msg = zigbee.parse(description) def descMap = parseCatchAllAsMap(description)
log.trace msg log.debug "Catch all parsing: $description"
log.trace "data: $msg.data" // Command 01 is Read Attributes response and Command 0A is Report Attributes response.
if (descMap.command == "01" || descMap.command == "0A") {
if (descMap.clusterId == "0006") {
// The last byte is the on/off value = 01/00.
def value = descMap.raw.endsWith("01") ? "on" : "off"
def event = createEvent(name: "switch", value: value)
events.add(event)
} else if (descMap.clusterId == "0702") {
// The last 21 bytes are the energy data payload, which is 42 characters.
def payload = descMap.raw.substring(descMap.raw.length() - 42, descMap.raw.length())
log.debug "payload is $payload"
events.addAll(parseEnergyPayload(payload))
}
}
} else if (description?.startsWith("read attr -")) { } else if (description?.startsWith("read attr -")) {
def descMap = parseDescriptionAsMap(description) def descMap = parseDescriptionAsMap(description)
log.debug "Read attr: $description" log.debug "Read attr: $description"
@@ -103,6 +116,22 @@ def parse(String description) {
// Payload length is 21 bytes, which is 42 characters // Payload length is 21 bytes, which is 42 characters
def payload = descMap.raw.substring(descMap.raw.length() - 42, descMap.raw.length()) def payload = descMap.raw.substring(descMap.raw.length() - 42, descMap.raw.length())
log.trace "payload is $payload" log.trace "payload is $payload"
events.addAll(parseEnergyPayload(payload))
}
} else if (description?.startsWith("on/off:")) {
log.debug "Switch command"
def value = description?.endsWith(" 1") ? "on" : "off"
def event = createEvent(name: "switch", value: value)
events.add(event)
}
log.debug "Parse returned ${events}"
return events
}
def parseEnergyPayload(payload) {
def events = []
// Decode the various parameters from the payload // Decode the various parameters from the payload
def voltage = Integer.parseInt(payload.substring(0, 4), 16) / 100 def voltage = Integer.parseInt(payload.substring(0, 4), 16) / 100
@@ -139,15 +168,7 @@ def parse(String description) {
log.trace "mainEnergy is $mainEnergy" log.trace "mainEnergy is $mainEnergy"
def energyEvent = createEvent(name: "energy", value: mainEnergy) def energyEvent = createEvent(name: "energy", value: mainEnergy)
events.add(energyEvent) events.add(energyEvent)
}
} else if (description?.startsWith("on/off:")) {
log.debug "Switch command"
def value = description?.endsWith(" 1") ? "on" : "off"
def event = createEvent(name: "switch", value: value)
events.add(event)
}
log.debug "Parse returned ${events}"
return events return events
} }
@@ -158,6 +179,29 @@ def parseDescriptionAsMap(description) {
} }
} }
def parseCatchAllAsMap(description) {
def seg = (description - "catchall: ").split(" ")
def zigbeeMap = [:]
zigbeeMap += [raw: (description - "catchall: ")]
zigbeeMap += [profileId: seg[0]]
zigbeeMap += [clusterId: seg[1]]
zigbeeMap += [sourceEndpoint: seg[2]]
zigbeeMap += [destinationEndpoint: seg[3]]
zigbeeMap += [options: seg[4]]
zigbeeMap += [messageType: seg[5]]
zigbeeMap += [dni: seg[6]]
zigbeeMap += [isClusterSpecific: Short.valueOf(seg[7], 16) != 0]
zigbeeMap += [isManufacturerSpecific: Short.valueOf(seg[8], 16) != 0]
zigbeeMap += [manufacturerId: seg[9]]
zigbeeMap += [command: seg[10]]
zigbeeMap += [direction: seg[11]]
zigbeeMap += [data: seg.size() > 12 ? seg[12].split("").findAll { it }.collate(2).collect {
it.join('')
} : []]
zigbeeMap
}
// Commands to device // Commands to device
def on() { def on() {
// Fire event for on since meter doesn't suppport zigbee bind // Fire event for on since meter doesn't suppport zigbee bind