diff --git a/README.md b/README.md index 7469ed5..7dc22a4 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -# SmartThings Public Github Repo +# SmartThings Public GitHub Repo An official list of SmartApps and Device Types from SmartThings. Here are some links to help you get started coding right away: -* [Github-specific Documentation](http://docs.smartthings.com/en/latest/tools-and-ide/github-integration.html) +* [GitHub-specific Documentation](http://docs.smartthings.com/en/latest/tools-and-ide/github-integration.html) * [Full Documentation](http://docs.smartthings.com) * [IDE & Simulator](http://ide.smartthings.com) * [Community Forums](http://community.smartthings.com) diff --git a/devicetypes/smartthings/aeon-key-fob.src/aeon-key-fob.groovy b/devicetypes/smartthings/aeon-key-fob.src/aeon-key-fob.groovy index eac8651..b6d376f 100644 --- a/devicetypes/smartthings/aeon-key-fob.src/aeon-key-fob.groovy +++ b/devicetypes/smartthings/aeon-key-fob.src/aeon-key-fob.groovy @@ -15,6 +15,7 @@ metadata { definition (name: "Aeon Key Fob", namespace: "smartthings", author: "SmartThings") { capability "Actuator" capability "Button" + capability "Holdable Button" capability "Configuration" capability "Sensor" capability "Battery" @@ -118,3 +119,7 @@ def configure() { log.debug("Sending configuration: $cmd") return cmd } + +def updated() { + sendEvent(name: "numberOfButtons", value: 4) +} diff --git a/devicetypes/smartthings/aeon-minimote.src/aeon-minimote.groovy b/devicetypes/smartthings/aeon-minimote.src/aeon-minimote.groovy index e12be97..4906fac 100644 --- a/devicetypes/smartthings/aeon-minimote.src/aeon-minimote.groovy +++ b/devicetypes/smartthings/aeon-minimote.src/aeon-minimote.groovy @@ -15,6 +15,7 @@ metadata { definition (name: "Aeon Minimote", namespace: "smartthings", author: "SmartThings") { capability "Actuator" capability "Button" + capability "Holdable Button" capability "Configuration" capability "Sensor" @@ -107,3 +108,7 @@ def configure() { log.debug("Sending configuration: $cmds") return cmds } + +def updated() { + sendEvent(name: "numberOfButtons", value: 4) +} diff --git a/devicetypes/smartthings/cooper-rf9500.src/cooper-rf9500.groovy b/devicetypes/smartthings/cooper-rf9500.src/cooper-rf9500.groovy index a669426..2f83f77 100644 --- a/devicetypes/smartthings/cooper-rf9500.src/cooper-rf9500.groovy +++ b/devicetypes/smartthings/cooper-rf9500.src/cooper-rf9500.groovy @@ -16,7 +16,7 @@ metadata { capability "Switch" capability "Switch Level" capability "Button" - capability "Actuator" + capability "Actuator" //fingerprint deviceId: "0x1200", inClusters: "0x77 0x86 0x75 0x73 0x85 0x72 0xEF", outClusters: "0x26" } @@ -74,20 +74,20 @@ def off() { } def levelup() { - def curlevel = device.currentValue('level') as Integer + def curlevel = device.currentValue('level') as Integer if (curlevel <= 90) - setLevel(curlevel + 10); + setLevel(curlevel + 10); } def leveldown() { - def curlevel = device.currentValue('level') as Integer + def curlevel = device.currentValue('level') as Integer if (curlevel >= 10) - setLevel(curlevel - 10) + setLevel(curlevel - 10) } def setLevel(value) { log.trace "setLevel($value)" - sendEvent(name: "level", value: value) + sendEvent(name: "level", value: value) } def zwaveEvent(physicalgraph.zwave.commands.wakeupv1.WakeUpNotification cmd) { @@ -106,11 +106,11 @@ def zwaveEvent(physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelS if (cmd.upDown == true) { Integer buttonid = 2 leveldown() - checkbuttonEvent(buttonid) + checkbuttonEvent(buttonid) } else if (cmd.upDown == false) { Integer buttonid = 3 levelup() - checkbuttonEvent(buttonid) + checkbuttonEvent(buttonid) } } @@ -140,12 +140,12 @@ def buttonEvent(button) { def result = [] if (button == 1) { def mystate = device.currentValue('switch'); - if (mystate == "on") + if (mystate == "on") off() else - on() + on() } - updateState("currentButton", "$button") + updateState("currentButton", "$button") // update the device state, recording the button press result << createEvent(name: "button", value: "pushed", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was pushed", isStateChange: true) result @@ -182,3 +182,7 @@ def updateState(String name, String value) { state[name] = value device.updateDataValue(name, value) } + +def updated() { + sendEvent(name: "numberOfButtons", value: 3) +} diff --git a/devicetypes/smartthings/dimmer-switch.src/dimmer-switch.groovy b/devicetypes/smartthings/dimmer-switch.src/dimmer-switch.groovy index bcf0146..98510ca 100644 --- a/devicetypes/smartthings/dimmer-switch.src/dimmer-switch.groovy +++ b/devicetypes/smartthings/dimmer-switch.src/dimmer-switch.groovy @@ -236,17 +236,17 @@ def refresh() { } void indicatorWhenOn() { - sendEvent(name: "indicatorStatus", value: "when on", display: false) + sendEvent(name: "indicatorStatus", value: "when on", displayed: false) sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [1], parameterNumber: 3, size: 1).format())) } void indicatorWhenOff() { - sendEvent(name: "indicatorStatus", value: "when off", display: false) + sendEvent(name: "indicatorStatus", value: "when off", displayed: false) sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [0], parameterNumber: 3, size: 1).format())) } void indicatorNever() { - sendEvent(name: "indicatorStatus", value: "never", display: false) + sendEvent(name: "indicatorStatus", value: "never", displayed: false) sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [2], parameterNumber: 3, size: 1).format())) } diff --git a/devicetypes/smartthings/fibaro-rgbw-controller.src/fibaro-rgbw-controller.groovy b/devicetypes/smartthings/fibaro-rgbw-controller.src/fibaro-rgbw-controller.groovy index 89e842b..cd40f10 100644 --- a/devicetypes/smartthings/fibaro-rgbw-controller.src/fibaro-rgbw-controller.groovy +++ b/devicetypes/smartthings/fibaro-rgbw-controller.src/fibaro-rgbw-controller.groovy @@ -29,10 +29,10 @@ capability "Polling" capability "Refresh" capability "Sensor" - capability "Configuration" + capability "Configuration" capability "Color Control" capability "Power Meter" - + command "getDeviceData" command "softwhite" command "daylight" @@ -54,12 +54,12 @@ command "setAdjustedColor" command "setWhiteLevel" command "test" - + attribute "whiteLevel", "string" - + fingerprint deviceId: "0x1101", inClusters: "0x27,0x72,0x86,0x26,0x60,0x70,0x32,0x31,0x85,0x33" } - + simulator { status "on": "command: 2003, payload: FF" status "off": "command: 2003, payload: 00" @@ -84,7 +84,7 @@ } controlTile("levelSliderControl", "device.level", "slider", height: 1, width: 2, inactiveLabel: false) { state "level", action:"switch level.setLevel" - } + } controlTile("whiteSliderControl", "device.whiteLevel", "slider", height: 1, width: 3, inactiveLabel: false) { state "whiteLevel", action:"setWhiteLevel", label:'White Level' } @@ -183,24 +183,24 @@ valueTile("hue", "device.hue", inactiveLabel: false, decoration: "flat") { state "hue", label: 'Hue ${currentValue} ' } - + main(["switch"]) - details(["switch", - "levelSliderControl", - "rgbSelector", - "whiteSliderControl", + details(["switch", + "levelSliderControl", + "rgbSelector", + "whiteSliderControl", /*"softwhite", "daylight", "warmwhite", - "red", - "green", + "red", + "green", "blue", "white", "cyan", "magenta", "orange", "purple", - "yellow", + "yellow", "fireplace", "storm", "deepfade", @@ -214,7 +214,7 @@ def setAdjustedColor(value) { log.debug "setAdjustedColor: ${value}" - + toggleTiles("off") //turn off the hard color tiles def level = device.latestValue("level") @@ -223,19 +223,19 @@ def setAdjustedColor(value) { log.debug "level is: ${level}" value.level = level - def c = hexToRgb(value.hex) + def c = hexToRgb(value.hex) value.rh = hex(c.r * (level/100)) value.gh = hex(c.g * (level/100)) value.bh = hex(c.b * (level/100)) - - setColor(value) + + setColor(value) } def setColor(value) { log.debug "setColor: ${value}" log.debug "hue is: ${value.hue}" log.debug "saturation is: ${value.saturation}" - + if (value.size() < 8) toggleTiles("off") @@ -246,22 +246,22 @@ def setColor(value) { value.gh = hex(rgb.g) value.bh = hex(rgb.b) } - + if ((value.size() == 3) && (value.hue != null) && (value.saturation != null) && (value.level)) { //user passed in a level value too from outside (App) def rgb = hslToRGB(value.hue, value.saturation, 0.5) value.hex = rgbToHex(rgb) value.rh = hex(rgb.r * value.level/100) value.gh = hex(rgb.g * value.level/100) - value.bh = hex(rgb.b * value.level/100) + value.bh = hex(rgb.b * value.level/100) } - + if (( value.size() == 1) && (value.hex)) { //being called from outside of device (App) with only hex def rgbInt = hexToRgb(value.hex) value.rh = hex(rgbInt.r) value.gh = hex(rgbInt.g) value.bh = hex(rgbInt.b) } - + if (( value.size() == 2) && (value.hex) && (value.level)) { //being called from outside of device (App) with only hex and level def rgbInt = hexToRgb(value.hex) @@ -269,7 +269,7 @@ def setColor(value) { value.gh = hex(rgbInt.g * value.level/100) value.bh = hex(rgbInt.b * value.level/100) } - + if (( value.size() == 1) && (value.colorName)) { //being called from outside of device (App) with only color name def colorData = getColorData(value.colorName) value.rh = colorData.rh @@ -277,7 +277,7 @@ def setColor(value) { value.bh = colorData.bh value.hex = "#${value.rh}${value.gh}${value.bh}" } - + if (( value.size() == 2) && (value.colorName) && (value.level)) { //being called from outside of device (App) with only color name and level def colorData = getColorData(value.colorName) value.rh = hex(colorData.r * value.level/100) @@ -285,7 +285,7 @@ def setColor(value) { value.bh = hex(colorData.b * value.level/100) value.hex = "#${hex(colorData.r)}${hex(colorData.g)}${hex(colorData.b)}" } - + if (( value.size() == 3) && (value.red != null) && (value.green != null) && (value.blue != null)) { //being called from outside of device (App) with only color values (0-255) value.rh = hex(value.red) value.gh = hex(value.green) @@ -299,7 +299,7 @@ def setColor(value) { value.bh = hex(value.blue * value.level/100) value.hex = "#${hex(value.red)}${hex(value.green)}${hex(value.blue)}" } - + sendEvent(name: "hue", value: value.hue, displayed: false) sendEvent(name: "saturation", value: value.saturation, displayed: false) sendEvent(name: "color", value: value.hex, displayed: false) @@ -309,26 +309,26 @@ def setColor(value) { if (value.switch) { sendEvent(name: "switch", value: value.switch) } - + sendRGB(value.rh, value.gh, value.bh) } def setLevel(level) { log.debug "setLevel($level)" - + if (level == 0) { off() } else if (device.latestValue("switch") == "off") { on() } - + def colorHex = device.latestValue("color") if (colorHex == null) colorHex = "#FFFFFF" - + def c = hexToRgb(colorHex) - + def r = hex(c.r * (level/100)) def g = hex(c.g * (level/100)) def b = hex(c.b * (level/100)) - + sendEvent(name: "level", value: level) sendEvent(name: "setLevel", value: level, displayed: false) sendRGB(r, g, b) @@ -337,14 +337,14 @@ def setLevel(level) { def setWhiteLevel(value) { log.debug "setWhiteLevel: ${value}" - def level = Math.min(value as Integer, 99) + def level = Math.min(value as Integer, 99) level = 255 * level/99 as Integer def channel = 0 if (device.latestValue("switch") == "off") { on() } - + sendEvent(name: "whiteLevel", value: value) - sendWhite(channel, value) + sendWhite(channel, value) } def sendWhite(channel, value) { @@ -367,20 +367,20 @@ def sendRGBW(redHex, greenHex, blueHex, whiteHex) { def configure() { log.debug "Configuring Device For SmartThings Use" - - + + def cmds = [] - + // send associate to group 3 to get sensor data reported only to hub cmds << zwave.associationV2.associationSet(groupingIdentifier:5, nodeId:[zwaveHubNodeId]).format() - - + + //cmds << sendEvent(name: "level", value: 50) //cmds << on() //cmds << doColorButton("Green") delayBetween(cmds, 500) - + } def parse(String description) { @@ -411,11 +411,11 @@ def parse(String description) { def getDeviceData() { def cmd = [] - - cmd << response(zwave.manufacturerSpecificV2.manufacturerSpecificGet()) + + cmd << response(zwave.manufacturerSpecificV2.manufacturerSpecificGet()) cmd << response(zwave.versionV1.versionGet()) cmd << response(zwave.firmwareUpdateMdV1.firmwareMdGet()) - + delayBetween(cmd, 500) } @@ -426,7 +426,7 @@ def createEvent(physicalgraph.zwave.commands.manufacturerspecificv2.Manufacturer log.debug "productTypeId: ${cmd.productTypeId}" } -def createEvent(physicalgraph.zwave.commands.versionv1.VersionReport cmd, Map item1) { +def createEvent(physicalgraph.zwave.commands.versionv1.VersionReport cmd, Map item1) { updateDataValue("applicationVersion", "${cmd.applicationVersion}") log.debug "applicationVersion: ${cmd.applicationVersion}" log.debug "applicationSubVersion: ${cmd.applicationSubVersion}" @@ -435,13 +435,13 @@ def createEvent(physicalgraph.zwave.commands.versionv1.VersionReport cmd, Map it log.debug "zWaveProtocolSubVersion: ${cmd.zWaveProtocolSubVersion}" } -def createEvent(physicalgraph.zwave.commands.firmwareupdatemdv1.FirmwareMdReport cmd, Map item1) { +def createEvent(physicalgraph.zwave.commands.firmwareupdatemdv1.FirmwareMdReport cmd, Map item1) { log.debug "checksum: ${cmd.checksum}" log.debug "firmwareId: ${cmd.firmwareId}" log.debug "manufacturerId: ${cmd.manufacturerId}" } -def zwaveEvent(physicalgraph.zwave.commands.colorcontrolv1.CapabilityReport cmd, Map item1) { +def zwaveEvent(physicalgraph.zwave.commands.colorcontrolv1.CapabilityReport cmd, Map item1) { log.debug "In CapabilityReport" } @@ -546,7 +546,7 @@ def zwaveEvent(physicalgraph.zwave.commands.configurationv1.ConfigurationReport def value = "when off" if (cmd.configurationValue[0] == 1) {value = "when on"} if (cmd.configurationValue[0] == 2) {value = "never"} - [name: "indicatorStatus", value: value, display: false] + [name: "indicatorStatus", value: value, displayed: false] } */ def createEvent(physicalgraph.zwave.Command cmd, Map map) { @@ -557,7 +557,7 @@ def createEvent(physicalgraph.zwave.Command cmd, Map map) { def on() { log.debug "on()" sendEvent(name: "switch", value: "on") - delayBetween([zwave.basicV1.basicSet(value: 0xFF).format(), + delayBetween([zwave.basicV1.basicSet(value: 0xFF).format(), zwave.switchMultilevelV1.switchMultilevelGet().format()], 5000) } @@ -593,7 +593,7 @@ def refresh() { * @return none */ def updateZwaveParam(params) { - if ( params ) { + if ( params ) { def pNumber = params.paramNumber def pSize = params.size def pValue = [params.value] @@ -601,9 +601,9 @@ def updateZwaveParam(params) { def cmds = [] cmds << zwave.configurationV1.configurationSet(configurationValue: pValue, parameterNumber: pNumber, size: pSize).format() - + cmds << zwave.configurationV1.configurationGet(parameterNumber: pNumber).format() - delayBetween(cmds, 1500) + delayBetween(cmds, 1500) } } @@ -612,22 +612,22 @@ def test() { //value = [hue: 0, saturation: 100, level: 5] //value = [red: 255, green: 0, blue: 255, level: 60] //setColor(value) - + def cmd = [] - + if ( !state.cnt ) { state.cnt = 6 } else { state.cnt = state.cnt + 1 } - + if ( state.cnt > 10 ) state.cnt = 6 - + // run programmed light show cmd << zwave.configurationV1.configurationSet(configurationValue: [state.cnt], parameterNumber: 72, size: 1).format() - cmd << zwave.configurationV1.configurationGet(parameterNumber: 72).format() - + cmd << zwave.configurationV1.configurationGet(parameterNumber: 72).format() + delayBetween(cmd, 500) } @@ -638,23 +638,23 @@ def colorNameToRgb(color) { [name:"Soft White", r: 255, g: 241, b: 224 ], [name:"Daylight", r: 255, g: 255, b: 251 ], [name:"Warm White", r: 255, g: 244, b: 229 ], - + [name:"Red", r: 255, g: 0, b: 0 ], [name:"Green", r: 0, g: 255, b: 0 ], [name:"Blue", r: 0, g: 0, b: 255 ], - + [name:"Cyan", r: 0, g: 255, b: 255 ], - [name:"Magenta", r: 255, g: 0, b: 33 ], + [name:"Magenta", r: 255, g: 0, b: 33 ], [name:"Orange", r: 255, g: 102, b: 0 ], - + [name:"Purple", r: 170, g: 0, b: 255 ], [name:"Yellow", r: 255, g: 255, b: 0 ], [name:"White", r: 255, g: 255, b: 255 ] ] - - def colorData = [:] + + def colorData = [:] colorData = colors.find { it.name == color } - + colorData } @@ -670,7 +670,7 @@ def hexToRgb(colorHex) { def rrInt = Integer.parseInt(colorHex.substring(1,3),16) def ggInt = Integer.parseInt(colorHex.substring(3,5),16) def bbInt = Integer.parseInt(colorHex.substring(5,7),16) - + def colorData = [:] colorData = [r: rrInt, g: ggInt, b: bbInt] colorData @@ -681,7 +681,7 @@ def rgbToHex(rgb) { def g = hex(rgb.g) def b = hex(rgb.b) def hexColor = "#${r}${g}${b}" - + hexColor } @@ -689,11 +689,11 @@ def hslToRGB(float var_h, float var_s, float var_l) { float h = var_h / 100 float s = var_s / 100 float l = var_l - + def r = 0 def g = 0 def b = 0 - + if (s == 0) { r = l * 255 g = l * 255 @@ -705,26 +705,26 @@ def hslToRGB(float var_h, float var_s, float var_l) { } else { var_2 = (l + s) - (s * l) } - + float var_1 = 2 * l - var_2 - + r = 255 * hueToRgb(var_1, var_2, h + (1 / 3)) g = 255 * hueToRgb(var_1, var_2, h) - b = 255 * hueToRgb(var_1, var_2, h - (1 / 3)) + b = 255 * hueToRgb(var_1, var_2, h - (1 / 3)) } - + def rgb = [:] rgb = [r: r, g: g, b: b] - rgb + rgb } def hueToRgb(v1, v2, vh) { - if (vh < 0) { vh += 1 } + if (vh < 0) { vh += 1 } if (vh > 1) { vh -= 1 } if ((6 * vh) < 1) { return (v1 + (v2 - v1) * 6 * vh) } if ((2 * vh) < 1) { return (v2) } - if ((3 * vh) < 2) { return (v1 + (v2 - $v1) * ((2 / 3 - vh) * 6)) } + if ((3 * vh) < 2) { return (v1 + (v2 - $v1) * ((2 / 3 - vh) * 6)) } return (v1) } @@ -735,49 +735,49 @@ def rgbToHSL(rgb) { def h = 0 def s = 0 def l = 0 - + def var_min = [r,g,b].min() def var_max = [r,g,b].max() def del_max = var_max - var_min - + l = (var_max + var_min) / 2 - + if (del_max == 0) { h = 0 s = 0 } else { - if (l < 0.5) { s = del_max / (var_max + var_min) } + if (l < 0.5) { s = del_max / (var_max + var_min) } else { s = del_max / (2 - var_max - var_min) } def del_r = (((var_max - r) / 6) + (del_max / 2)) / del_max def del_g = (((var_max - g) / 6) + (del_max / 2)) / del_max def del_b = (((var_max - b) / 6) + (del_max / 2)) / del_max - if (r == var_max) { h = del_b - del_g } - else if (g == var_max) { h = (1 / 3) + del_r - del_b } + if (r == var_max) { h = del_b - del_g } + else if (g == var_max) { h = (1 / 3) + del_r - del_b } else if (b == var_max) { h = (2 / 3) + del_g - del_r } - + if (h < 0) { h += 1 } if (h > 1) { h -= 1 } } - def hsl = [:] + def hsl = [:] hsl = [h: h * 100, s: s * 100, l: l] - + hsl } def getColorData(colorName) { log.debug "getColorData: ${colorName}" - + def colorRGB = colorNameToRgb(colorName) def colorHex = rgbToHex(colorRGB) def colorHSL = rgbToHSL(colorRGB) - + def colorData = [:] - colorData = [h: colorHSL.h, - s: colorHSL.s, - l: device.latestValue("level"), - r: colorRGB.r, + colorData = [h: colorHSL.h, + s: colorHSL.s, + l: device.latestValue("level"), + r: colorRGB.r, g: colorRGB.g, b: colorRGB.b, rh: hex(colorRGB.r), @@ -785,8 +785,8 @@ def getColorData(colorName) { bh: hex(colorRGB.b), hex: colorHex, alpha: 1] - - colorData + + colorData } def doColorButton(colorName) { @@ -798,7 +798,7 @@ def doColorButton(colorName) { def maxLevel = hex(99) toggleTiles(colorName.toLowerCase().replaceAll("\\s","")) - + if ( colorName == "Fire Place" ) { updateZwaveParam([paramNumber:72, value:6, size:1]) } else if ( colorName == "Storm" ) { updateZwaveParam([paramNumber:72, value:7, size:1]) } else if ( colorName == "Deep Fade" ) { updateZwaveParam([paramNumber:72, value:8, size:1]) } @@ -808,8 +808,8 @@ def doColorButton(colorName) { else if ( colorName == "Daylight" ) { String.format("33050400${maxLevel}02${maxLevel}03${maxLevel}04${maxLevel}%02X", 100) } else { def c = getColorData(colorName) - def newValue = ["hue": c.h, "saturation": c.s, "level": level, "red": c.r, "green": c.g, "blue": c.b, "hex": c.hex, "alpha": c.alpha] - setColor(newValue) + def newValue = ["hue": c.h, "saturation": c.s, "level": level, "red": c.r, "green": c.g, "blue": c.b, "hex": c.hex, "alpha": c.alpha] + setColor(newValue) def r = hex(c.r * (level/100)) def g = hex(c.g * (level/100)) def b = hex(c.b * (level/100)) @@ -823,19 +823,19 @@ def toggleTiles(color) { if ( !state.colorTiles ) { state.colorTiles = ["softwhite","daylight","warmwhite","red","green","blue","cyan","magenta","orange","purple","yellow","white","fireplace","storm","deepfade","litefade","police"] } - + def cmds = [] - + state.colorTiles.each({ if ( it == color ) { log.debug "Turning ${it} on" - cmds << sendEvent(name: it, value: "on${it}", display: True, descriptionText: "${device.displayName} ${color} is 'ON'", isStateChange: true) + cmds << sendEvent(name: it, value: "on${it}", displayed: True, descriptionText: "${device.displayName} ${color} is 'ON'", isStateChange: true) } else { //log.debug "Turning ${it} off" cmds << sendEvent(name: it, value: "off${it}", displayed: false) } }) - + delayBetween(cmds, 2500) } diff --git a/devicetypes/smartthings/momentary-button-tile.src/momentary-button-tile.groovy b/devicetypes/smartthings/momentary-button-tile.src/momentary-button-tile.groovy index b968457..7a164fa 100644 --- a/devicetypes/smartthings/momentary-button-tile.src/momentary-button-tile.groovy +++ b/devicetypes/smartthings/momentary-button-tile.src/momentary-button-tile.groovy @@ -43,8 +43,8 @@ def parse(String description) { } def push() { - sendEvent(name: "switch", value: "on", isStateChange: true, display: false) - sendEvent(name: "switch", value: "off", isStateChange: true, display: false) + sendEvent(name: "switch", value: "on", isStateChange: true, displayed: false) + sendEvent(name: "switch", value: "off", isStateChange: true, displayed: false) sendEvent(name: "momentary", value: "pushed", isStateChange: true) } diff --git a/devicetypes/smartthings/testing/simulated-minimote.src/simulated-minimote.groovy b/devicetypes/smartthings/testing/simulated-minimote.src/simulated-minimote.groovy index 6205723..c2bb0cd 100644 --- a/devicetypes/smartthings/testing/simulated-minimote.src/simulated-minimote.groovy +++ b/devicetypes/smartthings/testing/simulated-minimote.src/simulated-minimote.groovy @@ -15,9 +15,10 @@ metadata { definition (name: "Simulated Minimote", namespace: "smartthings/testing", author: "SmartThings") { capability "Actuator" capability "Button" + capability "Holdable Button" capability "Configuration" capability "Sensor" - + command "push1" command "push2" command "push3" @@ -45,42 +46,42 @@ metadata { } standardTile("push1", "device.button", width: 1, height: 1, decoration: "flat") { state "default", label: "Push 1", backgroundColor: "#ffffff", action: "push1" - } + } standardTile("push2", "device.button", width: 1, height: 1, decoration: "flat") { state "default", label: "Push 2", backgroundColor: "#ffffff", action: "push2" - } + } standardTile("push3", "device.button", width: 1, height: 1, decoration: "flat") { state "default", label: "Push 3", backgroundColor: "#ffffff", action: "push3" - } + } standardTile("push4", "device.button", width: 1, height: 1, decoration: "flat") { state "default", label: "Push 4", backgroundColor: "#ffffff", action: "push4" - } + } standardTile("dummy1", "device.button", width: 1, height: 1, decoration: "flat") { state "default", label: " ", backgroundColor: "#ffffff", action: "push4" - } + } standardTile("hold1", "device.button", width: 1, height: 1, decoration: "flat") { state "default", label: "Hold 1", backgroundColor: "#ffffff", action: "hold1" - } + } standardTile("hold2", "device.button", width: 1, height: 1, decoration: "flat") { state "default", label: "Hold 2", backgroundColor: "#ffffff", action: "hold2" - } + } standardTile("dummy2", "device.button", width: 1, height: 1, decoration: "flat") { state "default", label: " ", backgroundColor: "#ffffff", action: "push4" - } + } standardTile("hold3", "device.button", width: 1, height: 1, decoration: "flat") { state "default", label: "Hold 3", backgroundColor: "#ffffff", action: "hold3" - } + } standardTile("hold4", "device.button", width: 1, height: 1, decoration: "flat") { state "default", label: "Hold 4", backgroundColor: "#ffffff", action: "hold4" - } - + } + main "button" details(["push1","push2","button","push3","push4","dummy1","hold1","hold2","dummy2","hold3","hold4"]) } } def parse(String description) { - + } def push1() { @@ -125,3 +126,6 @@ private hold(button) { sendEvent(name: "button", value: "held", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was held", isStateChange: true) } +def updated() { + sendEvent(name: "numberOfButtons", value: 4) +} diff --git a/devicetypes/smartthings/zigbee-button.src/zigbee-button.groovy b/devicetypes/smartthings/zigbee-button.src/zigbee-button.groovy index 6bd1858..3f68e62 100644 --- a/devicetypes/smartthings/zigbee-button.src/zigbee-button.groovy +++ b/devicetypes/smartthings/zigbee-button.src/zigbee-button.groovy @@ -19,6 +19,7 @@ metadata { capability "Actuator" capability "Battery" capability "Button" + capability "Holdable Button" capability "Configuration" capability "Refresh" capability "Sensor" diff --git a/devicetypes/smartthings/zigbee-white-color-temperature-bulb.src/zigbee-white-color-temperature-bulb.groovy b/devicetypes/smartthings/zigbee-white-color-temperature-bulb.src/zigbee-white-color-temperature-bulb.groovy index e6c6c7e..bced45f 100644 --- a/devicetypes/smartthings/zigbee-white-color-temperature-bulb.src/zigbee-white-color-temperature-bulb.groovy +++ b/devicetypes/smartthings/zigbee-white-color-temperature-bulb.src/zigbee-white-color-temperature-bulb.groovy @@ -37,6 +37,7 @@ metadata { fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "Classic A60 TW", deviceJoinName: "OSRAM LIGHTIFY LED Tunable White 60W" fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY A19 Tunable White", deviceJoinName: "OSRAM LIGHTIFY LED Tunable White 60W" fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "Classic B40 TW - LIGHTIFY", deviceJoinName: "OSRAM LIGHTIFY Classic B40 Tunable White" + fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0702, 0B05", outClusters: "0019", manufacturer: "sengled", model: "Z01-A19NAE26", deviceJoinName: "Sengled Element plus" } // UI tile definitions diff --git a/devicetypes/smartthings/zll-rgbw-bulb.src/zll-rgbw-bulb.groovy b/devicetypes/smartthings/zll-rgbw-bulb.src/zll-rgbw-bulb.groovy index e02d48d..5d9e700 100644 --- a/devicetypes/smartthings/zll-rgbw-bulb.src/zll-rgbw-bulb.groovy +++ b/devicetypes/smartthings/zll-rgbw-bulb.src/zll-rgbw-bulb.groovy @@ -27,6 +27,10 @@ metadata { fingerprint profileId: "C05E", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300", outClusters: "0019" fingerprint profileId: "C05E", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 1000", outClusters: "0019" fingerprint profileId: "C05E", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 1000", outClusters: "0019", "manufacturer":"OSRAM", "model":"Classic A60 RGBW", deviceJoinName: "OSRAM LIGHTIFY LED Classic A60 RGBW" + fingerprint profileId: "C05E", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "PAR 16 50 RGBW - LIGHTIFY", deviceJoinName: "OSRAM LIGHTIFY RGBW PAR 16 50" + fingerprint profileId: "C05E", inClusters: "0000,0003,0004,0005,0006,0008,0300,1000,FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "Flex RGBW", deviceJoinName: "OSRAM LIGHTIFY Flex RGBW" + fingerprint profileId: "C05E", inClusters: "0000,0003,0004,0005,0006,0008,0300,1000,FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "Gardenpole RGBW-Lightify", deviceJoinName: "OSRAM LIGHTIFY Gardenpole RGBW" + fingerprint profileId: "C05E", inClusters: "0000,0003,0004,0005,0006,0008,0300,1000,FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY Outdoor Flex RGBW", deviceJoinName: "OSRAM LIGHTIFY Outdoor Flex RGBW" } // UI tile definitions diff --git a/devicetypes/smartthings/zll-white-color-temperature-bulb.src/zll-white-color-temperature-bulb.groovy b/devicetypes/smartthings/zll-white-color-temperature-bulb.src/zll-white-color-temperature-bulb.groovy index ab9575b..98ddddd 100644 --- a/devicetypes/smartthings/zll-white-color-temperature-bulb.src/zll-white-color-temperature-bulb.groovy +++ b/devicetypes/smartthings/zll-white-color-temperature-bulb.src/zll-white-color-temperature-bulb.groovy @@ -32,6 +32,7 @@ metadata { fingerprint profileId: "C05E", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 1000, 0B04, FC0F", outClusters: "0019", "manufacturer":"OSRAM", "model":"Classic A60 TW", deviceJoinName: "OSRAM LIGHTIFY LED Classic A60 Tunable White" fingerprint profileId: "C05E", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 1000, FC0F", outClusters: "0019", "manufacturer":"OSRAM", "model":"PAR16 50 TW", deviceJoinName: "OSRAM LIGHTIFY LED PAR16 50 Tunable White" + fingerprint profileId: "C05E", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 1000, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "Classic B40 TW - LIGHTIFY", deviceJoinName: "OSRAM LIGHTIFY Classic B40 Tunable White" } // UI tile definitions diff --git a/devicetypes/smartthings/zwave-relay.src/zwave-relay.groovy b/devicetypes/smartthings/zwave-relay.src/zwave-relay.groovy index c68812f..7088340 100644 --- a/devicetypes/smartthings/zwave-relay.src/zwave-relay.groovy +++ b/devicetypes/smartthings/zwave-relay.src/zwave-relay.groovy @@ -81,7 +81,7 @@ def zwaveEvent(physicalgraph.zwave.commands.configurationv1.ConfigurationReport def value = "when off" if (cmd.configurationValue[0] == 1) {value = "when on"} if (cmd.configurationValue[0] == 2) {value = "never"} - [name: "indicatorStatus", value: value, display: false] + [name: "indicatorStatus", value: value, displayed: false] } def zwaveEvent(physicalgraph.zwave.commands.hailv1.Hail cmd) { diff --git a/devicetypes/smartthings/zwave-switch.src/zwave-switch.groovy b/devicetypes/smartthings/zwave-switch.src/zwave-switch.groovy index df56c69..ac0f46d 100644 --- a/devicetypes/smartthings/zwave-switch.src/zwave-switch.groovy +++ b/devicetypes/smartthings/zwave-switch.src/zwave-switch.groovy @@ -114,7 +114,7 @@ def zwaveEvent(physicalgraph.zwave.commands.configurationv1.ConfigurationReport def value = "when off" if (cmd.configurationValue[0] == 1) {value = "when on"} if (cmd.configurationValue[0] == 2) {value = "never"} - [name: "indicatorStatus", value: value, display: false] + [name: "indicatorStatus", value: value, displayed: false] } def zwaveEvent(physicalgraph.zwave.commands.hailv1.Hail cmd) { @@ -174,17 +174,17 @@ def refresh() { } void indicatorWhenOn() { - sendEvent(name: "indicatorStatus", value: "when on", display: false) + sendEvent(name: "indicatorStatus", value: "when on", displayed: false) sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [1], parameterNumber: 3, size: 1).format())) } void indicatorWhenOff() { - sendEvent(name: "indicatorStatus", value: "when off", display: false) + sendEvent(name: "indicatorStatus", value: "when off", displayed: false) sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [0], parameterNumber: 3, size: 1).format())) } void indicatorNever() { - sendEvent(name: "indicatorStatus", value: "never", display: false) + sendEvent(name: "indicatorStatus", value: "never", displayed: false) sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [2], parameterNumber: 3, size: 1).format())) } diff --git a/smartapps/michaelstruck/color-coordinator.src/color-coordinator.groovy b/smartapps/michaelstruck/color-coordinator.src/color-coordinator.groovy index f6be7eb..f3d6ce2 100644 --- a/smartapps/michaelstruck/color-coordinator.src/color-coordinator.groovy +++ b/smartapps/michaelstruck/color-coordinator.src/color-coordinator.groovy @@ -1,9 +1,10 @@ /** * Color Coordinator - * Version 1.0.0 - 7/4/15 + * Version 1.1.0 - 11/9/16 * By Michael Struck * * 1.0.0 - Initial release + * 1.1.0 - Fixed issue where master can be part of slaves. This causes a loop that impacts SmartThings. * * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except @@ -31,27 +32,35 @@ preferences { } def mainPage() { - dynamicPage(name: "mainPage", title: "", install: true, uninstall: true) { - section("Master Light") { + dynamicPage(name: "mainPage", title: "", install: true, uninstall: false) { + def masterInList = slaves.id.find{it==master.id} + if (masterInList) { + section ("**WARNING**"){ + paragraph "You have included the Master Light in the Slave Group. This will cause a loop in execution. Please remove this device from the Slave Group.", image: "https://raw.githubusercontent.com/MichaelStruck/SmartThingsPublic/master/img/caution.png" + } + } + section("Master Light") { input "master", "capability.colorControl", title: "Colored Light" } section("Lights that follow the master settings") { - input "slaves", "capability.colorControl", title: "Colored Lights", multiple: true, required: false + input "slaves", "capability.colorControl", title: "Colored Lights", multiple: true, required: false, submitOnChange: true } section([mobileOnly:true], "Options") { - label(title: "Assign a name", required: false) + input "randomYes", "bool",title: "When Master Turned On, Randomize Color", defaultValue: false href "pageAbout", title: "About ${textAppName()}", description: "Tap to get application version, license and instructions" } } } -page(name: "pageAbout", title: "About ${textAppName()}") { +page(name: "pageAbout", title: "About ${textAppName()}", uninstall: true) { section { paragraph "${textVersion()}\n${textCopyright()}\n\n${textLicense()}\n" } section("Instructions") { paragraph textHelp() } + section("Tap button below to remove application"){ + } } def installed() { @@ -72,27 +81,55 @@ def init() { } //----------------------------------- def onOffHandler(evt){ - if (master.currentValue("switch") == "on"){ - slaves?.on() - } - else { - slaves?.off() - } + if (!slaves.id.find{it==master.id}){ + if (master.currentValue("switch") == "on"){ + if (randomYes) getRandomColorMaster() + else slaves?.on() + } + else { + slaves?.off() + } + } } def colorHandler(evt) { - def dimLevel = master.currentValue("level") - def hueLevel = master.currentValue("hue") - def saturationLevel = master.currentValue("saturation") + if (!slaves.id.find{it==master.id} && master.currentValue("switch") == "on"){ + log.debug "Changing Slave units H,S,L" + def dimLevel = master.currentValue("level") + def hueLevel = master.currentValue("hue") + def saturationLevel = master.currentValue("saturation") + def newValue = [hue: hueLevel, saturation: saturationLevel, level: dimLevel as Integer] + slaves?.setColor(newValue) + try { + log.debug "Changing Slave color temp" + def tempLevel = master.currentValue("colorTemperature") + slaves?.setColorTemperature(tempLevel) + } + catch (e){ + log.debug "Color temp for master --" + } + } +} + +def getRandomColorMaster(){ + def hueLevel = Math.floor(Math.random() *1000) + def saturationLevel = Math.floor(Math.random() * 100) + def dimLevel = master.currentValue("level") def newValue = [hue: hueLevel, saturation: saturationLevel, level: dimLevel as Integer] - slaves?.setColor(newValue) + log.debug hueLevel + log.debug saturationLevel + master.setColor(newValue) + slaves?.setColor(newValue) } def tempHandler(evt){ - if (evt.value != "--") { - def tempLevel = master.currentValue("colorTemperature") - slaves?.setColorTemperature(tempLevel) - } + if (!slaves.id.find{it==master.id} && master.currentValue("switch") == "on"){ + if (evt.value != "--") { + log.debug "Changing Slave color temp based on Master change" + def tempLevel = master.currentValue("colorTemperature") + slaves?.setColorTemperature(tempLevel) + } + } } //Version/Copyright/Information/Help @@ -102,11 +139,11 @@ private def textAppName() { } private def textVersion() { - def text = "Version 1.0.0 (07/04/2015)" + def text = "Version 1.1.0 (11/09/2016)" } private def textCopyright() { - def text = "Copyright © 2015 Michael Struck" + def text = "Copyright © 2016 Michael Struck" } private def textLicense() { @@ -128,5 +165,5 @@ private def textHelp() { def text = "This application will allow you to control the settings of multiple colored lights with one control. " + "Simply choose a master control light, and then choose the lights that will follow the settings of the master, "+ - "including on/off conditions, hue, saturation, level and color temperature." + "including on/off conditions, hue, saturation, level and color temperature. Also includes a random color feature." } \ No newline at end of file diff --git a/smartapps/smartthings/logitech-harmony-connect.src/logitech-harmony-connect.groovy b/smartapps/smartthings/logitech-harmony-connect.src/logitech-harmony-connect.groovy index 9df77ca..43c55fa 100644 --- a/smartapps/smartthings/logitech-harmony-connect.src/logitech-harmony-connect.groovy +++ b/smartapps/smartthings/logitech-harmony-connect.src/logitech-harmony-connect.groovy @@ -516,7 +516,7 @@ def pollResponse(response, data) { def hub = getChildDevice("harmony-${it.key}") if (hub) { if (it.value.response.data.currentAvActivity == "-1") { - hub.sendEvent(name: "currentActivity", value: "--", descriptionText: "There isn't any activity running", display: false) + hub.sendEvent(name: "currentActivity", value: "--", descriptionText: "There isn't any activity running", displayed: false) } else { def currentActivity def activityDTH = getChildDevice("harmony-${it.key}-${it.value.response.data.currentAvActivity}") @@ -524,7 +524,7 @@ def pollResponse(response, data) { currentActivity = activityDTH.device.displayName else currentActivity = getActivityName(it.value.response.data.currentAvActivity,it.key) - hub.sendEvent(name: "currentActivity", value: currentActivity, descriptionText: "Current activity is ${currentActivity}", display: false) + hub.sendEvent(name: "currentActivity", value: currentActivity, descriptionText: "Current activity is ${currentActivity}", displayed: false) } } } else { @@ -576,7 +576,7 @@ def getActivityList() { } activities += [id: "off", name: "Activity OFF", type: "0"] } - hub.sendEvent(name: "activities", value: new groovy.json.JsonBuilder(activities).toString(), descriptionText: "Activities are ${activities.collect { it.name }?.join(', ')}", display: false) + hub.sendEvent(name: "activities", value: new groovy.json.JsonBuilder(activities).toString(), descriptionText: "Activities are ${activities.collect { it.name }?.join(', ')}", displayed: false) } } }