Merge pull request #1947 from SmartThingsCommunity/staging

Rolling up staging to production
This commit is contained in:
Vinay Rao
2017-04-25 15:32:36 -07:00
committed by GitHub
7 changed files with 89 additions and 42 deletions

View File

@@ -0,0 +1,2 @@
.st-ignore
README.md

View File

@@ -0,0 +1,44 @@
# Express Controls EZMultiPli
Works with:
* [Express Controls EZMultiPli](https://www.smartthings.com/works-with-smartthings/)
## Table of contents
* [Release Notes](#release-notes)
* [Capabilities](#capabilities)
* [Troubleshooting](#troubleshooting)
## Release Notes
* **2017-04-19** - _dkirker_ - Update default config values in config value range check functions, use lux if lum option is null, fix NullPointerException on initial pairing when color data has not been set (and set the default color data!)
* **2017-04-10** - _DrZwave_ (with help from Donald Kirker) - changed fingerprint to the new format, lowered the OnTime and other parameters to be "more in line with ST user expectations", get the luminance in LUX so it reports in lux all the time.
* **2016-10-06** - _erocm1231_ - Added "updated" method to run when configuration options are changed. Depending on model of unit, luminance is being reported as a relative percentace or as a lux value. Added the option to configure this in the handler.
* **2016-01-28** - _erocm1231_ - Changed the configuration method to use scaledConfiguration so that it properly formatted negative numbers. Also, added configurationGet and a configurationReport method so that config values can be verified.
* **2015-12-04** - _erocm1231_ - added range value to preferences as suggested by @Dela-Rick.
* **2015-11-26** - _erocm1231_ - Fixed null condition error when adding as a new device.
* **2015-11-24** - _erocm1231_ - Added refresh command. Made a few changes to how the handler maps colors to the LEDs. Fixed the device not having its on/off status updated when colors are changed.
* **2015-11-23** - _erocm1231_ - Changed the look to match SmartThings v2 devices.
* **2015-11-21** - _erocm1231_ - Made code much more efficient. Also made it compatible when setColor is passed a hex value. Mapping of special colors: Soft White - Default - Yellow, White - Concentrate - White, Daylight - Energize - Teal, Warm White - Relax - Yellow
* **2015-11-19** - _erocm1231_ - Fixed a couple incorrect colors, changed setColor to be more compatible with other apps
* **2015-11-18** - _erocm1231_ - Added to setColor for compatibility with Smart Lighting
* **v0.1.0** - _DrZWave_ - chose better icons, Got color LED to work - first fully functional version
* **v0.0.9** - _jrs_ - got the temp and luminance to work. Motion works. Debugging the color wheel.
* **v0.0.8** - _DrZWave_ 2/25/2015 - change the color control to be tiles since there are only 8 colors.
* **v0.0.7** - _jrs_ - 02/23/2015 - Jim Sulin
## Capabilities
* **Actuator** - represents that a Device has commands
* **Sensor** - detects sensor events
* **Motion Sensor** - can detect motion
* **Temperature Measurement** - defines device measures current temperature
* **Illuminance Measurement** - gives the illuminance reading from devices that support it
* **Switch** - can detect state (possible values: on/off)
* **Color Control** - represents that the color attributes of a device can be controlled (hue, saturation, color value
* **Configuration** - configure() command called when device is installed or device preferences updated
* **Refresh** - refresh() command for status updates
## Troubleshooting

View File

@@ -2,27 +2,6 @@
// Motion Sensor - Temperature - Light level - 8 Color Indicator LED - Z-Wave Range Extender - Wall Powered // Motion Sensor - Temperature - Light level - 8 Color Indicator LED - Z-Wave Range Extender - Wall Powered
// driver for SmartThings // driver for SmartThings
// The EZMultiPli is also known as the HSM200 from HomeSeer.com // The EZMultiPli is also known as the HSM200 from HomeSeer.com
//
// 2017-04-10 - DrZwave (with help from Don Kirker) - changed fingerprint to the new format, lowered the OnTime
// and other parameters to be "more in line with ST user expectations", get the luminance in LUX so it reports in lux all the time.
// 2016-10-06 - erocm1231 - Added "updated" method to run when configuration options are changed. Depending on model of unit, luminance is being
// reported as a relative percentace or as a lux value. Added the option to configure this in the handler.
// 2016-01-28 - erocm1231 - Changed the configuration method to use scaledConfiguration so that it properly formatted negative numbers.
// Also, added configurationGet and a configurationReport method so that config values can be verified.
// 2015-12-04 - erocm1231 - added range value to preferences as suggested by @Dela-Rick.
// 2015-11-26 - erocm1231 - Fixed null condition error when adding as a new device.
// 2015-11-24 - erocm1231 - Added refresh command. Made a few changes to how the handler maps colors to the LEDs. Fixed
// the device not having its on/off status updated when colors are changed.
// 2015-11-23 - erocm1231 - Changed the look to match SmartThings v2 devices.
// 2015-11-21 - erocm1231 - Made code much more efficient. Also made it compatible when setColor is passed a hex value.
// Mapping of special colors: Soft White - Default - Yellow, White - Concentrate - White,
// Daylight - Energize - Teal, Warm White - Relax - Yellow
// 2015-11-19 - erocm1231 - Fixed a couple incorrect colors, changed setColor to be more compatible with other apps
// 2015-11-18 - erocm1231 - Added to setColor for compatibility with Smart Lighting
// v0.1.0 - DrZWave - chose better icons, Got color LED to work - first fully functional version
// v0.0.9 - jrs - got the temp and luminance to work. Motion works. Debugging the color wheel.
// v0.0.8 - DrZWave 2/25/2015 - change the color control to be tiles since there are only 8 colors.
// v0.0.7 - jrs - 02/23/2015 - Jim Sulin
metadata { metadata {
definition (name: "EZmultiPli", namespace: "DrZWave", author: "Eric Ryherd", oauth: true) { definition (name: "EZmultiPli", namespace: "DrZWave", author: "Eric Ryherd", oauth: true) {
@@ -131,7 +110,6 @@ metadata {
} // end metadata } // end metadata
// Parse incoming device messages from device to generate events // Parse incoming device messages from device to generate events
def parse(String description){ def parse(String description){
//log.debug "==> New Zwave Event: ${description}" //log.debug "==> New Zwave Event: ${description}"
@@ -145,7 +123,7 @@ def parse(String description){
def statusTextmsg = "" def statusTextmsg = ""
if (device.currentState('temperature') != null && device.currentState('illuminance') != null) { if (device.currentState('temperature') != null && device.currentState('illuminance') != null) {
statusTextmsg = "${device.currentState('temperature').value} ° - ${device.currentState('illuminance').value} ${(lum == "" || lum == null || lum == 1) ? "%" : "LUX"}" statusTextmsg = "${device.currentState('temperature').value} ° - ${device.currentState('illuminance').value} ${(lum == 1) ? "%" : "LUX"}"
sendEvent("name":"statusText", "value":statusTextmsg, displayed:false) sendEvent("name":"statusText", "value":statusTextmsg, displayed:false)
} }
if (result != [null] && result != []) log.debug "Parse returned ${result}" if (result != [null] && result != []) log.debug "Parse returned ${result}"
@@ -168,7 +146,7 @@ def zwaveEvent(physicalgraph.zwave.commands.sensormultilevelv5.SensorMultilevelR
break; break;
case 0x03 : // SENSOR_TYPE_LUMINANCE_VERSION_1 case 0x03 : // SENSOR_TYPE_LUMINANCE_VERSION_1
map.value = cmd.scaledSensorValue.toInteger().toString() map.value = cmd.scaledSensorValue.toInteger().toString()
if(lum == "" || lum == null || lum == 1) map.unit = "%" if(lum == 1) map.unit = "%"
else map.unit = "lux" else map.unit = "lux"
map.name = "illuminance" map.name = "illuminance"
log.debug "Luminance report" log.debug "Luminance report"
@@ -203,7 +181,8 @@ def zwaveEvent(physicalgraph.zwave.commands.notificationv3.NotificationReport cm
} }
def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd) { def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd) {
if (cmd.value == 0 && device.latestState("color").value != "#ffffff") { // The EZMultiPli sets the color back to #ffffff on "off" or at init, so update the ST device to reflect this.
if (device.latestState("color") == null || (cmd.value == 0 && device.latestState("color").value != "#ffffff")) {
sendEvent(name: "color", value: "#ffffff", displayed: true) sendEvent(name: "color", value: "#ffffff", displayed: true)
} }
[name: "switch", value: cmd.value ? "on" : "off", type: "digital"] [name: "switch", value: cmd.value ? "on" : "off", type: "digital"]
@@ -296,12 +275,12 @@ def zwaveEvent(physicalgraph.zwave.Command cmd) {
// ensure we are passing acceptable param values for LiteMin & TempMin configs // ensure we are passing acceptable param values for LiteMin & TempMin configs
def checkLiteTempInput(value) { def checkLiteTempInput(value) {
if (value == null) { if (value == null) {
value=60 value=6
} }
def liteTempVal = value.toInteger() def liteTempVal = value.toInteger()
switch (liteTempVal) { switch (liteTempVal) {
case { it < 0 }: case { it < 0 }:
return 60 // bad value, set to default return 6 // bad value, set to default
break break
case { it > 127 }: case { it > 127 }:
return 127 // bad value, greater then MAX, set to MAX return 127 // bad value, greater then MAX, set to MAX
@@ -314,12 +293,12 @@ def checkLiteTempInput(value) {
// ensure we are passing acceptable param value for OnTime config // ensure we are passing acceptable param value for OnTime config
def checkOnTimeInput(value) { def checkOnTimeInput(value) {
if (value == null) { if (value == null) {
value=10 value=2
} }
def onTimeVal = value.toInteger() def onTimeVal = value.toInteger()
switch (onTimeVal) { switch (onTimeVal) {
case { it < 0 }: case { it < 0 }:
return 10 // bad value set to default return 2 // bad value set to default
break break
case { it > 127 }: case { it > 127 }:
return 127 // bad value, greater then MAX, set to MAX return 127 // bad value, greater then MAX, set to MAX

View File

@@ -33,7 +33,6 @@ metadata {
fingerprint inClusters: "0000,0001,0003,0402,0500,0020,0B05,FC02", outClusters: "0019", manufacturer: "CentraLite", model: "3320" fingerprint inClusters: "0000,0001,0003,0402,0500,0020,0B05,FC02", outClusters: "0019", manufacturer: "CentraLite", model: "3320"
fingerprint inClusters: "0000,0001,0003,0402,0500,0020,0B05,FC02", outClusters: "0019", manufacturer: "CentraLite", model: "3321" fingerprint inClusters: "0000,0001,0003,0402,0500,0020,0B05,FC02", outClusters: "0019", manufacturer: "CentraLite", model: "3321"
fingerprint inClusters: "0000,0001,0003,0402,0500,0020,0B05,FC02", outClusters: "0019", manufacturer: "CentraLite", model: "3321-S", deviceJoinName: "Multipurpose Sensor" fingerprint inClusters: "0000,0001,0003,0402,0500,0020,0B05,FC02", outClusters: "0019", manufacturer: "CentraLite", model: "3321-S", deviceJoinName: "Multipurpose Sensor"
fingerprint inClusters: "0000,0001,0003,0020,0402,0500,0B05", outClusters: "0019", manufacturer: "CentraLite", model: "3323-G", deviceJoinName: "Centralite Micro Door Sensor"
fingerprint inClusters: "0000,0001,0003,000F,0020,0402,0500,FC02", outClusters: "0019", manufacturer: "SmartThings", model: "multiv4", deviceJoinName: "Multipurpose Sensor" fingerprint inClusters: "0000,0001,0003,000F,0020,0402,0500,FC02", outClusters: "0019", manufacturer: "SmartThings", model: "multiv4", deviceJoinName: "Multipurpose Sensor"
attribute "status", "string" attribute "status", "string"

View File

@@ -31,6 +31,7 @@ metadata {
fingerprint inClusters: "0000,0001,0003,0402,0500,0020,0B05", outClusters: "0019", manufacturer: "CentraLite", model: "3300-S" fingerprint inClusters: "0000,0001,0003,0402,0500,0020,0B05", outClusters: "0019", manufacturer: "CentraLite", model: "3300-S"
fingerprint inClusters: "0000,0001,0003,0402,0500,0020,0B05", outClusters: "0019", manufacturer: "CentraLite", model: "3300" fingerprint inClusters: "0000,0001,0003,0402,0500,0020,0B05", outClusters: "0019", manufacturer: "CentraLite", model: "3300"
fingerprint inClusters: "0000,0001,0003,0020,0402,0500,0B05", outClusters: "0019", manufacturer: "CentraLite", model: "3320-L", deviceJoinName: "Iris Contact Sensor" fingerprint inClusters: "0000,0001,0003,0020,0402,0500,0B05", outClusters: "0019", manufacturer: "CentraLite", model: "3320-L", deviceJoinName: "Iris Contact Sensor"
fingerprint inClusters: "0000,0001,0003,0020,0402,0500,0B05", outClusters: "0019", manufacturer: "CentraLite", model: "3323-G", deviceJoinName: "Centralite Micro Door Sensor"
} }
simulator { simulator {

View File

@@ -28,6 +28,7 @@ metadata {
command "enrollResponse" command "enrollResponse"
fingerprint inClusters: "0000, 0001, 0003, 0020, 0402, 0B05", outClusters: "0003, 0006, 0008, 0019", manufacturer: "OSRAM", model: "LIGHTIFY Dimming Switch", deviceJoinName: "OSRAM LIGHTIFY Dimming Switch" fingerprint inClusters: "0000, 0001, 0003, 0020, 0402, 0B05", outClusters: "0003, 0006, 0008, 0019", manufacturer: "OSRAM", model: "LIGHTIFY Dimming Switch", deviceJoinName: "OSRAM LIGHTIFY Dimming Switch"
fingerprint inClusters: "0000, 0001, 0003, 0020, 0402, 0B05", outClusters: "0003, 0006, 0008, 0019", manufacturer: "CentraLite", model: "3130", deviceJoinName: "Centralite Zigbee Smart Switch"
//fingerprint inClusters: "0000, 0001, 0003, 0020, 0500", outClusters: "0003,0019", manufacturer: "CentraLite", model: "3455-L", deviceJoinName: "Iris Care Pendant" //fingerprint inClusters: "0000, 0001, 0003, 0020, 0500", outClusters: "0003,0019", manufacturer: "CentraLite", model: "3455-L", deviceJoinName: "Iris Care Pendant"
fingerprint inClusters: "0000, 0001, 0003, 0007, 0020, 0402, 0B05", outClusters: "0003, 0006, 0019", manufacturer: "CentraLite", model: "3460-L", deviceJoinName: "Iris Smart Button" fingerprint inClusters: "0000, 0001, 0003, 0007, 0020, 0402, 0B05", outClusters: "0003, 0006, 0019", manufacturer: "CentraLite", model: "3460-L", deviceJoinName: "Iris Smart Button"
fingerprint inClusters: "0000, 0001, 0003, 0007, 0020, 0B05", outClusters: "0003, 0006, 0019", manufacturer: "CentraLite", model:"3450-L", deviceJoinName: "Iris KeyFob" fingerprint inClusters: "0000, 0001, 0003, 0007, 0020, 0B05", outClusters: "0003, 0006, 0019", manufacturer: "CentraLite", model:"3450-L", deviceJoinName: "Iris KeyFob"
@@ -251,12 +252,19 @@ def initialize() {
if ((device.getDataValue("manufacturer") == "OSRAM") && (device.getDataValue("model") == "LIGHTIFY Dimming Switch")) { if ((device.getDataValue("manufacturer") == "OSRAM") && (device.getDataValue("model") == "LIGHTIFY Dimming Switch")) {
sendEvent(name: "numberOfButtons", value: 2) sendEvent(name: "numberOfButtons", value: 2)
} }
else if ((device.getDataValue("manufacturer") == "CentraLite") && else if (device.getDataValue("manufacturer") == "CentraLite") {
((device.getDataValue("model") == "3455-L") || (device.getDataValue("model") == "3460-L"))) { if (device.getDataValue("model") == "3130") {
sendEvent(name: "numberOfButtons", value: 1) sendEvent(name: "numberOfButtons", value: 2)
} }
else if ((device.getDataValue("manufacturer") == "CentraLite") && (device.getDataValue("model") == "3450-L")) { else if ((device.getDataValue("model") == "3455-L") || (device.getDataValue("model") == "3460-L")) {
sendEvent(name: "numberOfButtons", value: 4) sendEvent(name: "numberOfButtons", value: 1)
}
else if (device.getDataValue("model") == "3450-L") {
sendEvent(name: "numberOfButtons", value: 4)
}
else {
sendEvent(name: "numberOfButtons", value: 4) //default case. can be changed later.
}
} }
else { else {
//default. can be changed //default. can be changed

View File

@@ -136,10 +136,20 @@ def getDataForChild(child, startDate, endDate) {
def wattvisionURL = wattvisionURL(child.deviceNetworkId, startDate, endDate) def wattvisionURL = wattvisionURL(child.deviceNetworkId, startDate, endDate)
if (wattvisionURL) { if (wattvisionURL) {
httpGet(uri: wattvisionURL) { response -> try {
def json = new org.json.JSONObject(response.data.toString()) httpGet(uri: wattvisionURL) { response ->
child.addWattvisionData(json) def json = new org.json.JSONObject(response.data.toString())
return "success" child.addWattvisionData(json)
return "success"
}
} catch (groovyx.net.http.HttpResponseException httpE) {
log.error "Wattvision getDataForChild HttpResponseException: ${httpE} -> ${httpE.response.data}"
//log.debug "wattvisionURL = ${wattvisionURL}"
return "fail"
} catch (e) {
log.error "Wattvision getDataForChild General Exception: ${e}"
//log.debug "wattvisionURL = ${wattvisionURL}"
return "fail"
} }
} }
} }
@@ -164,9 +174,14 @@ def wattvisionURL(senorId, startDate, endDate) {
if (diff > 259200000) { // 3 days in milliseconds if (diff > 259200000) { // 3 days in milliseconds
// Wattvision only allows pulling 3 hours of data at a time // Wattvision only allows pulling 3 hours of data at a time
startDate = new Date(hours: endDate.hours - 3) startDate = new Date(hours: endDate.hours - 3)
} else if (diff < 10000) { // 10 seconds in milliseconds
// Wattvision throws errors when the difference between start_time and end_time is 5 seconds or less
// So we are going to make sure that we have a few more seconds of breathing room
use (groovy.time.TimeCategory) {
startDate = endDate - 10.seconds
}
} }
def params = [ def params = [
"sensor_id" : senorId, "sensor_id" : senorId,
"api_id" : wattvisionApiAccess.id, "api_id" : wattvisionApiAccess.id,
@@ -480,4 +495,3 @@ def connectionSuccessful(deviceName, iconSrc) {
render contentType: 'text/html', data: html render contentType: 'text/html', data: html
} }