From 79b90d741f2fe2bf8967b142f008d4dcd7e2ea32 Mon Sep 17 00:00:00 2001 From: Zach Varberg Date: Tue, 23 Aug 2016 08:45:47 -0500 Subject: [PATCH] Revert "Update DTHs to use ZigBee library ZoneStatus" This reverts commit 7bfa0304afccb6b39e967eb7be80219b19f448f2. --- .../nyce-motion-sensor.groovy | 50 ++++++++++++++++--- .../nyce-open-closed-sensor.groovy | 33 +++++++----- .../smartsense-moisture-sensor.groovy | 39 +++++++++++++-- .../smartsense-motion-sensor.groovy | 42 ++++++++++++++-- .../smartsense-motion-temp-sensor.groovy | 41 +++++++++++++-- .../smartsense-multi-sensor.groovy | 43 ++++++++++++++-- ...se-open-closed-accelerometer-sensor.groovy | 36 +++++++++++-- .../smartsense-open-closed-sensor.groovy | 37 ++++++++++++-- .../tyco-door-window-sensor.groovy | 36 +++++++++++-- 9 files changed, 311 insertions(+), 46 deletions(-) diff --git a/devicetypes/smartthings/nyce-motion-sensor.src/nyce-motion-sensor.groovy b/devicetypes/smartthings/nyce-motion-sensor.src/nyce-motion-sensor.groovy index d372c38..c89bc03 100644 --- a/devicetypes/smartthings/nyce-motion-sensor.src/nyce-motion-sensor.groovy +++ b/devicetypes/smartthings/nyce-motion-sensor.src/nyce-motion-sensor.groovy @@ -13,7 +13,6 @@ * for the specific language governing permissions and limitations under the License. * */ -import physicalgraph.zigbee.clusters.iaszone.ZoneStatus metadata { definition (name: "NYCE Motion Sensor", namespace: "smartthings", author: "SmartThings") { @@ -144,14 +143,51 @@ private Map parseReportAttributeMessage(String description) { private Map parseIasMessage(String description) { - ZoneStatus zs = zigbee.parseZoneStatus(description) - Map resultMap = [:] + List parsedMsg = description.split(' ') + String msgCode = parsedMsg[2] + + Map resultMap = [:] + switch(msgCode) { + case '0x0030': // Closed/No Motion/Dry + log.debug 'no motion' + resultMap.name = 'motion' + resultMap.value = 'inactive' + break - result.name = 'motion' - result.value = zs.isAlarm2Set() ? 'active' : 'inactive' - log.debug(zs.isAlarm2Set() ? 'motion' : 'no motion') + case '0x0032': // Open/Motion/Wet + log.debug 'motion' + resultMap.name = 'motion' + resultMap.value = 'active' + break - return resultMap + case '0x0032': // Tamper Alarm + log.debug 'motion with tamper alarm' + resultMap.name = 'motion' + resultMap.value = 'active' + break + + case '0x0033': // Battery Alarm + break + + case '0x0034': // Supervision Report + log.debug 'no motion with tamper alarm' + resultMap.name = 'motion' + resultMap.value = 'inactive' + break + + case '0x0035': // Restore Report + break + + case '0x0036': // Trouble/Failure + log.debug 'motion with failure alarm' + resultMap.name = 'motion' + resultMap.value = 'active' + break + + case '0x0038': // Test Mode + break + } + return resultMap } def refresh() diff --git a/devicetypes/smartthings/nyce-open-closed-sensor.src/nyce-open-closed-sensor.groovy b/devicetypes/smartthings/nyce-open-closed-sensor.src/nyce-open-closed-sensor.groovy index 506ca89..eef9273 100644 --- a/devicetypes/smartthings/nyce-open-closed-sensor.src/nyce-open-closed-sensor.groovy +++ b/devicetypes/smartthings/nyce-open-closed-sensor.src/nyce-open-closed-sensor.groovy @@ -13,10 +13,7 @@ * for the specific language governing permissions and limitations under the License. * */ - -import physicalgraph.zigbee.clusters.iaszone.ZoneStatus - - + metadata { definition (name: "NYCE Open/Closed Sensor", namespace: "smartthings", author: "NYCE") { capability "Battery" @@ -222,33 +219,40 @@ private Map parseReportAttributeMessage(String description) { } private List parseIasMessage(String description) { - ZoneStatus zs = zigbee.parseZoneStatus(description) - log.debug "parseIasMessage: $description" + List parsedMsg = description.split(" ") + String msgCode = parsedMsg[2] List resultListMap = [] Map resultMap_battery = [:] Map resultMap_battery_state = [:] Map resultMap_sensor = [:] - resultMap_sensor.name = "contact" - resultMap_sensor.value = zs.isAlarm1Set() ? "open" : "closed" + // Relevant bit field definitions from ZigBee spec + def BATTERY_BIT = ( 1 << 3 ) + def TROUBLE_BIT = ( 1 << 6 ) + def SENSOR_BIT = ( 1 << 0 ) // it's ALARM1 bit from the ZCL spec + + // Convert hex string to integer + def zoneStatus = Integer.parseInt(msgCode[-4..-1],16) + + log.debug "parseIasMessage: zoneStatus: ${zoneStatus}" // Check each relevant bit, create map for it, and add to list - log.debug "parseIasMessage: Battery Status ${zs.battery}" - log.debug "parseIasMessage: Trouble Status ${zs.trouble}" - log.debug "parseIasMessage: Sensor Status ${zs.alarm1}" + log.debug "parseIasMessage: Battery Status ${zoneStatus & BATTERY_BIT}" + log.debug "parseIasMessage: Trouble Status ${zoneStatus & TROUBLE_BIT}" + log.debug "parseIasMessage: Sensor Status ${zoneStatus & SENSOR_BIT}" /* Comment out this path to check the battery state to avoid overwriting the battery value (Change log #2), but keep these conditions for later use resultMap_battery_state.name = "battery_state" - if (zs.isTroubleSet()) { + if (zoneStatus & TROUBLE_BIT) { resultMap_battery_state.value = "failed" resultMap_battery.name = "battery" resultMap_battery.value = 0 } else { - if (zs.isBatterySet()) { + if (zoneStatus & BATTERY_BIT) { resultMap_battery_state.value = "low" // to generate low battery notification by the platform @@ -266,6 +270,9 @@ private List parseIasMessage(String description) { } */ + resultMap_sensor.name = "contact" + resultMap_sensor.value = (zoneStatus & SENSOR_BIT) ? "open" : "closed" + resultListMap << resultMap_battery_state resultListMap << resultMap_battery resultListMap << resultMap_sensor diff --git a/devicetypes/smartthings/smartsense-moisture-sensor.src/smartsense-moisture-sensor.groovy b/devicetypes/smartthings/smartsense-moisture-sensor.src/smartsense-moisture-sensor.groovy index 26ff46f..c1be409 100644 --- a/devicetypes/smartthings/smartsense-moisture-sensor.src/smartsense-moisture-sensor.groovy +++ b/devicetypes/smartthings/smartsense-moisture-sensor.src/smartsense-moisture-sensor.groovy @@ -13,8 +13,6 @@ * License for the specific language governing permissions and limitations * under the License. */ -import physicalgraph.zigbee.clusters.iaszone.ZoneStatus - metadata { definition (name: "SmartSense Moisture Sensor",namespace: "smartthings", author: "SmartThings", category: "C2") { @@ -172,9 +170,42 @@ private Map parseCustomMessage(String description) { } private Map parseIasMessage(String description) { - ZoneStatus zs = zigbee.parseZoneStatus(description) + List parsedMsg = description.split(' ') + String msgCode = parsedMsg[2] - return zs.isAlarm1Set() ? getMoistureResult('wet') : getMoistureResult('dry') + Map resultMap = [:] + switch(msgCode) { + case '0x0020': // Closed/No Motion/Dry + resultMap = getMoistureResult('dry') + break + + case '0x0021': // Open/Motion/Wet + resultMap = getMoistureResult('wet') + break + + case '0x0022': // Tamper Alarm + break + + case '0x0023': // Battery Alarm + break + + case '0x0024': // Supervision Report + log.debug 'dry with tamper alarm' + resultMap = getMoistureResult('dry') + break + + case '0x0025': // Restore Report + log.debug 'water with tamper alarm' + resultMap = getMoistureResult('wet') + break + + case '0x0026': // Trouble/Failure + break + + case '0x0028': // Test Mode + break + } + return resultMap } def getTemperature(value) { diff --git a/devicetypes/smartthings/smartsense-motion-sensor.src/smartsense-motion-sensor.groovy b/devicetypes/smartthings/smartsense-motion-sensor.src/smartsense-motion-sensor.groovy index 1ee8143..342bd2e 100644 --- a/devicetypes/smartthings/smartsense-motion-sensor.src/smartsense-motion-sensor.groovy +++ b/devicetypes/smartthings/smartsense-motion-sensor.src/smartsense-motion-sensor.groovy @@ -13,8 +13,6 @@ * License for the specific language governing permissions and limitations * under the License. */ -import physicalgraph.zigbee.clusters.iaszone.ZoneStatus - metadata { definition (name: "SmartSense Motion Sensor", namespace: "smartthings", author: "SmartThings", category: "C2") { @@ -185,10 +183,44 @@ private Map parseCustomMessage(String description) { } private Map parseIasMessage(String description) { - ZoneStatus zs = zigbee.parseZoneStatus(description) + List parsedMsg = description.split(' ') + String msgCode = parsedMsg[2] - // Some sensor models that use this DTH use alarm1 and some use alarm2 to signify motion - return (zs.isAlarm1Set() || zs.isAlarm2Set()) ? getMotionResult('active') : getMotionResult('inactive') + Map resultMap = [:] + switch(msgCode) { + case '0x0020': // Closed/No Motion/Dry + resultMap = getMotionResult('inactive') + break + + case '0x0021': // Open/Motion/Wet + resultMap = getMotionResult('active') + break + + case '0x0022': // Tamper Alarm + log.debug 'motion with tamper alarm' + resultMap = getMotionResult('active') + break + + case '0x0023': // Battery Alarm + break + + case '0x0024': // Supervision Report + log.debug 'no motion with tamper alarm' + resultMap = getMotionResult('inactive') + break + + case '0x0025': // Restore Report + break + + case '0x0026': // Trouble/Failure + log.debug 'motion with failure alarm' + resultMap = getMotionResult('active') + break + + case '0x0028': // Test Mode + break + } + return resultMap } def getTemperature(value) { diff --git a/devicetypes/smartthings/smartsense-motion-temp-sensor.src/smartsense-motion-temp-sensor.groovy b/devicetypes/smartthings/smartsense-motion-temp-sensor.src/smartsense-motion-temp-sensor.groovy index f5ebc5f..446ec70 100644 --- a/devicetypes/smartthings/smartsense-motion-temp-sensor.src/smartsense-motion-temp-sensor.groovy +++ b/devicetypes/smartthings/smartsense-motion-temp-sensor.src/smartsense-motion-temp-sensor.groovy @@ -15,7 +15,6 @@ */ //DEPRECATED - Using the smartsense-motion-sensor.groovy DTH for this device. Users need to be moved before deleting this DTH -import physicalgraph.zigbee.clusters.iaszone.ZoneStatus metadata { definition (name: "SmartSense Motion/Temp Sensor", namespace: "smartthings", author: "SmartThings") { @@ -169,8 +168,44 @@ private Map parseCustomMessage(String description) { } private Map parseIasMessage(String description) { - ZoneStatus zs = zigbee.parseZoneStatus(description) - return zs.isAlarm1Set() ? getMotionResult('active') : getMotionResult('inactive') + List parsedMsg = description.split(' ') + String msgCode = parsedMsg[2] + + Map resultMap = [:] + switch(msgCode) { + case '0x0020': // Closed/No Motion/Dry + resultMap = getMotionResult('inactive') + break + + case '0x0021': // Open/Motion/Wet + resultMap = getMotionResult('active') + break + + case '0x0022': // Tamper Alarm + log.debug 'motion with tamper alarm' + resultMap = getMotionResult('active') + break + + case '0x0023': // Battery Alarm + break + + case '0x0024': // Supervision Report + log.debug 'no motion with tamper alarm' + resultMap = getMotionResult('inactive') + break + + case '0x0025': // Restore Report + break + + case '0x0026': // Trouble/Failure + log.debug 'motion with failure alarm' + resultMap = getMotionResult('active') + break + + case '0x0028': // Test Mode + break + } + return resultMap } def getTemperature(value) { diff --git a/devicetypes/smartthings/smartsense-multi-sensor.src/smartsense-multi-sensor.groovy b/devicetypes/smartthings/smartsense-multi-sensor.src/smartsense-multi-sensor.groovy index 9bb6d2b..02861cc 100644 --- a/devicetypes/smartthings/smartsense-multi-sensor.src/smartsense-multi-sensor.groovy +++ b/devicetypes/smartthings/smartsense-multi-sensor.src/smartsense-multi-sensor.groovy @@ -13,7 +13,6 @@ * License for the specific language governing permissions and limitations * under the License. */ -import physicalgraph.zigbee.clusters.iaszone.ZoneStatus metadata { definition (name: "SmartSense Multi Sensor", namespace: "smartthings", author: "SmartThings", category: "C2") { @@ -225,13 +224,47 @@ private Map parseCustomMessage(String description) { } private Map parseIasMessage(String description) { - ZoneStatus zs = zigbee.parseZoneStatus(description) + List parsedMsg = description.split(' ') + String msgCode = parsedMsg[2] + Map resultMap = [:] + switch(msgCode) { + case '0x0020': // Closed/No Motion/Dry + if (garageSensor != "Yes"){ + resultMap = getContactResult('closed') + } + break - if(garageSensor != "Yes") { - resultMap = zs.isAlarm1Set() ? getContactResult('open') : getContactResult('closed') + case '0x0021': // Open/Motion/Wet + if (garageSensor != "Yes"){ + resultMap = getContactResult('open') + } + break + + case '0x0022': // Tamper Alarm + break + + case '0x0023': // Battery Alarm + break + + case '0x0024': // Supervision Report + if (garageSensor != "Yes"){ + resultMap = getContactResult('closed') + } + break + + case '0x0025': // Restore Report + if (garageSensor != "Yes"){ + resultMap = getContactResult('open') + } + break + + case '0x0026': // Trouble/Failure + break + + case '0x0028': // Test Mode + break } - return resultMap } diff --git a/devicetypes/smartthings/smartsense-open-closed-accelerometer-sensor.src/smartsense-open-closed-accelerometer-sensor.groovy b/devicetypes/smartthings/smartsense-open-closed-accelerometer-sensor.src/smartsense-open-closed-accelerometer-sensor.groovy index ac82584..7668ff2 100644 --- a/devicetypes/smartthings/smartsense-open-closed-accelerometer-sensor.src/smartsense-open-closed-accelerometer-sensor.groovy +++ b/devicetypes/smartthings/smartsense-open-closed-accelerometer-sensor.src/smartsense-open-closed-accelerometer-sensor.groovy @@ -14,7 +14,6 @@ * */ //DEPRECATED - Using the smartsense-multi-sensor.groovy DTH for this device. Users need to be moved before deleting this DTH -import physicalgraph.zigbee.clusters.iaszone.ZoneStatus metadata { definition (name: "SmartSense Open/Closed Accelerometer Sensor", namespace: "smartthings", author: "SmartThings", category: "C2") { @@ -173,9 +172,40 @@ private Map parseCustomMessage(String description) { } private Map parseIasMessage(String description) { - ZoneStatus zs = zigbee.parseZoneStatus(description) + List parsedMsg = description.split(' ') + String msgCode = parsedMsg[2] - return zs.isAlarm1Set() ? getContactResult('open') : getContactResult('closed') + Map resultMap = [:] + switch(msgCode) { + case '0x0020': // Closed/No Motion/Dry + resultMap = getContactResult('closed') + break + + case '0x0021': // Open/Motion/Wet + resultMap = getContactResult('open') + break + + case '0x0022': // Tamper Alarm + break + + case '0x0023': // Battery Alarm + break + + case '0x0024': // Supervision Report + resultMap = getContactResult('closed') + break + + case '0x0025': // Restore Report + resultMap = getContactResult('open') + break + + case '0x0026': // Trouble/Failure + break + + case '0x0028': // Test Mode + break + } + return resultMap } def getTemperature(value) { diff --git a/devicetypes/smartthings/smartsense-open-closed-sensor.src/smartsense-open-closed-sensor.groovy b/devicetypes/smartthings/smartsense-open-closed-sensor.src/smartsense-open-closed-sensor.groovy index 8133463..7ff7cb8 100644 --- a/devicetypes/smartthings/smartsense-open-closed-sensor.src/smartsense-open-closed-sensor.groovy +++ b/devicetypes/smartthings/smartsense-open-closed-sensor.src/smartsense-open-closed-sensor.groovy @@ -13,7 +13,6 @@ * for the specific language governing permissions and limitations under the License. * */ -import physicalgraph.zigbee.clusters.iaszone.ZoneStatus metadata { definition (name: "SmartSense Open/Closed Sensor", namespace: "smartthings", author: "SmartThings", category: "C2") { @@ -168,8 +167,40 @@ private Map parseCustomMessage(String description) { } private Map parseIasMessage(String description) { - ZoneStatus zs = zigbee.parseZoneStatus(description) - return zs.isAlarm1Set() ? getContactResult('open') : getContactResult('closed') + List parsedMsg = description.split(' ') + String msgCode = parsedMsg[2] + + Map resultMap = [:] + switch(msgCode) { + case '0x0020': // Closed/No Motion/Dry + resultMap = getContactResult('closed') + break + + case '0x0021': // Open/Motion/Wet + resultMap = getContactResult('open') + break + + case '0x0022': // Tamper Alarm + break + + case '0x0023': // Battery Alarm + break + + case '0x0024': // Supervision Report + resultMap = getContactResult('closed') + break + + case '0x0025': // Restore Report + resultMap = getContactResult('open') + break + + case '0x0026': // Trouble/Failure + break + + case '0x0028': // Test Mode + break + } + return resultMap } def getTemperature(value) { diff --git a/devicetypes/smartthings/tyco-door-window-sensor.src/tyco-door-window-sensor.groovy b/devicetypes/smartthings/tyco-door-window-sensor.src/tyco-door-window-sensor.groovy index 4121630..627ab1d 100644 --- a/devicetypes/smartthings/tyco-door-window-sensor.src/tyco-door-window-sensor.groovy +++ b/devicetypes/smartthings/tyco-door-window-sensor.src/tyco-door-window-sensor.groovy @@ -13,7 +13,6 @@ * for the specific language governing permissions and limitations under the License. * */ -import physicalgraph.zigbee.clusters.iaszone.ZoneStatus metadata { definition (name: "Tyco Door/Window Sensor", namespace: "smartthings", author: "SmartThings") { @@ -162,9 +161,40 @@ private Map parseCustomMessage(String description) { } private Map parseIasMessage(String description) { - ZoneStatus zs = zigbee.parseZoneStatus(description) + List parsedMsg = description.split(' ') + String msgCode = parsedMsg[2] - return zs.isAlarm1Set() ? getContactResult('open') : getContactResult('closed') + Map resultMap = [:] + switch(msgCode) { + case '0x0020': // Closed/No Motion/Dry + resultMap = getContactResult('closed') + break + + case '0x0021': // Open/Motion/Wet + resultMap = getContactResult('open') + break + + case '0x0022': // Tamper Alarm + break + + case '0x0023': // Battery Alarm + break + + case '0x0024': // Supervision Report + resultMap = getContactResult('closed') + break + + case '0x0025': // Restore Report + resultMap = getContactResult('open') + break + + case '0x0026': // Trouble/Failure + break + + case '0x0028': // Test Mode + break + } + return resultMap } def getTemperature(value) {