mirror of
https://github.com/mtan93/SmartThingsPublic.git
synced 2026-04-18 22:05:40 +01:00
Modifying 'Billion Single Phase Smart Meter Device Type'
This commit is contained in:
@@ -89,9 +89,22 @@ def parse(String description) {
|
||||
def events = []
|
||||
|
||||
if (description?.startsWith("catchall:")) {
|
||||
def msg = zigbee.parse(description)
|
||||
log.trace msg
|
||||
log.trace "data: $msg.data"
|
||||
def descMap = parseCatchAllAsMap(description)
|
||||
log.debug "Catch all parsing: $description"
|
||||
// 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 -")) {
|
||||
def descMap = parseDescriptionAsMap(description)
|
||||
log.debug "Read attr: $description"
|
||||
@@ -103,6 +116,22 @@ def parse(String description) {
|
||||
// Payload length is 21 bytes, which is 42 characters
|
||||
def payload = descMap.raw.substring(descMap.raw.length() - 42, descMap.raw.length())
|
||||
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
|
||||
def voltage = Integer.parseInt(payload.substring(0, 4), 16) / 100
|
||||
@@ -139,15 +168,7 @@ def parse(String description) {
|
||||
log.trace "mainEnergy is $mainEnergy"
|
||||
def energyEvent = createEvent(name: "energy", value: mainEnergy)
|
||||
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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
def on() {
|
||||
// Fire event for on since meter doesn't suppport zigbee bind
|
||||
|
||||
Reference in New Issue
Block a user