From 4b44460b0b5c572880a1b6de907817cf91d3dde4 Mon Sep 17 00:00:00 2001 From: marstorp Date: Tue, 11 Oct 2016 10:58:49 -0700 Subject: [PATCH 1/8] CHF-420 Add device health check to Bose DTH --- .../bose-soundtouch.groovy | 46 +++++++++++++++---- .../bose-soundtouch-connect.groovy | 10 ++-- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/devicetypes/smartthings/bose-soundtouch.src/bose-soundtouch.groovy b/devicetypes/smartthings/bose-soundtouch.src/bose-soundtouch.groovy index 38d624c..090be56 100644 --- a/devicetypes/smartthings/bose-soundtouch.src/bose-soundtouch.groovy +++ b/devicetypes/smartthings/bose-soundtouch.src/bose-soundtouch.groovy @@ -27,7 +27,7 @@ metadata { capability "Switch" capability "Refresh" capability "Music Player" - capability "Polling" + capability "Health Check" /** * Define all commands, ie, if you have a custom action not @@ -236,7 +236,33 @@ def parse(String event) { * @return action(s) to take or null */ def installed() { - onAction("refresh") + // Notify health check about this device with timeout interval 12 minutes + sendEvent(name: "checkInterval", value: 12 * 60, data: [protocol: "lan", hubHardwareId: device.hub.hardwareID], displayed: false) + startPoll() +} + +/** + * Called by health check if no events been generated in the last 12 minutes + * If device doesn't respond it will be marked offline (not available) + */ +def ping() { + TRACE("ping") + boseSendGetNowPlaying() +} + +/** + * Schedule a 2 minute poll of the device to refresh the + * tiles so the user gets the correct information. + */ +def startPoll() { + TRACE("startPoll") + unschedule() + // Schedule 2 minute polling of speaker status (song average length is 3-4 minutes) + def sec = Math.round(Math.floor(Math.random() * 60)) + //def cron = "$sec 0/5 * * * ?" // every 5 min + def cron = "$sec 0/2 * * * ?" // every 2 min + log.debug "schedule('$cron', boseSendGetNowPlaying)" + schedule(cron, boseSendGetNowPlaying) } /** @@ -316,14 +342,6 @@ def onAction(String user, data=null) { return actions } -/** - * Called every so often (every 5 minutes actually) to refresh the - * tiles so the user gets the correct information. - */ -def poll() { - return boseRefreshNowPlaying() -} - /** * Joins this speaker into the everywhere zone */ @@ -837,6 +855,10 @@ def boseRefreshNowPlaying(delay=0) { return boseGET("/now_playing") } +def boseSendGetNowPlaying() { + sendHubCommand(boseGET("/now_playing")) +} + /** * Requests the list of presets * @@ -1014,4 +1036,8 @@ def boseGetDeviceID() { */ def getDeviceIP() { return parent.resolveDNI2Address(device.deviceNetworkId) +} + +def TRACE(text) { + log.trace "${text}" } \ No newline at end of file diff --git a/smartapps/smartthings/bose-soundtouch-connect.src/bose-soundtouch-connect.groovy b/smartapps/smartthings/bose-soundtouch-connect.src/bose-soundtouch-connect.groovy index 2916215..883c6e8 100644 --- a/smartapps/smartthings/bose-soundtouch-connect.src/bose-soundtouch-connect.groovy +++ b/smartapps/smartthings/bose-soundtouch-connect.src/bose-soundtouch-connect.groovy @@ -19,9 +19,9 @@ author: "SmartThings", description: "Control your Bose SoundTouch speakers", category: "SmartThings Labs", - iconUrl: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png", - iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png", - iconX3Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png", + iconUrl: "https://d3azp77rte0gip.cloudfront.net/smartapps/fcf1d93a-ba0b-4324-b96f-e5b5487dfaf5/images/BoseST_icon.png", + iconX2Url: "https://d3azp77rte0gip.cloudfront.net/smartapps/fcf1d93a-ba0b-4324-b96f-e5b5487dfaf5/images/BoseST_icon@2x.png", + iconX3Url: "https://d3azp77rte0gip.cloudfront.net/smartapps/fcf1d93a-ba0b-4324-b96f-e5b5487dfaf5/images/BoseST_icon@2x-1.png", singleInstance: true ) @@ -104,7 +104,7 @@ def deviceDiscovery() return dynamicPage(name:"deviceDiscovery", title:"Discovery Started!", nextPage:"", refreshInterval:refreshInterval, install:true, uninstall: true) { section("Please wait while we discover your ${getDeviceName()}. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.") { - input "selecteddevice", "enum", required:false, title:"Select ${getDeviceName()} (${numFound} found)", multiple:true, options:devices + input "selecteddevice", "enum", required:false, title:"Select ${getDeviceName()} (${numFound} found)", multiple:true, options:devices, submitOnChange: true } } } @@ -196,6 +196,8 @@ def addDevice(){ d = addChildDevice(getNameSpace(), getDeviceName(), dni, newDevice?.value.hub, [label:"${deviceName}"]) d.boseSetDeviceID(newDevice.value.deviceID) log.trace "Created ${d.displayName} with id $dni" + // sync DTH with device, done here as it currently don't work from the DTH's installed() method + d.refresh() } else { log.trace "${d.displayName} with id $dni already exists" } From 0b4d555d335874fb460200ba287f2866052c978e Mon Sep 17 00:00:00 2001 From: Michael Struck Date: Wed, 9 Nov 2016 09:33:31 -0800 Subject: [PATCH 2/8] MSA-1576: Fixes various bugs and adds a random color feature. --- .../color-coordinator.groovy | 83 ++++++++++++++----- 1 file changed, 60 insertions(+), 23 deletions(-) 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 From 7978f45996d8812af14a31de30c7ef7be885c972 Mon Sep 17 00:00:00 2001 From: Juan Pablo Risso Date: Fri, 11 Nov 2016 14:09:04 -0500 Subject: [PATCH 3/8] DVCSMP-2221 - Replace display with displayed (#1457) --- .../dimmer-switch.src/dimmer-switch.groovy | 6 +- .../fibaro-rgbw-controller.groovy | 202 +++++++++--------- .../momentary-button-tile.groovy | 4 +- .../zwave-relay.src/zwave-relay.groovy | 2 +- .../zwave-switch.src/zwave-switch.groovy | 8 +- .../logitech-harmony-connect.groovy | 6 +- 6 files changed, 114 insertions(+), 114 deletions(-) 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/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/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) } } } From 1db5f75ec5ada327ddad153a12cae12c4e473286 Mon Sep 17 00:00:00 2001 From: Juan Pablo Risso Date: Fri, 11 Nov 2016 16:10:44 -0500 Subject: [PATCH 4/8] DVCSMP-2211 - Update Button Number and Holdable capability (#1458) --- .../aeon-key-fob.src/aeon-key-fob.groovy | 5 ++++ .../aeon-minimote.src/aeon-minimote.groovy | 5 ++++ .../cooper-rf9500.src/cooper-rf9500.groovy | 26 +++++++++------- .../simulated-minimote.groovy | 30 +++++++++++-------- .../zigbee-button.src/zigbee-button.groovy | 1 + 5 files changed, 43 insertions(+), 24 deletions(-) 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/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" From 439dd634bdf3a3972b25bb9fb9640dba4ac46475 Mon Sep 17 00:00:00 2001 From: Ben Bodenmiller Date: Sat, 12 Nov 2016 00:19:55 -0800 Subject: [PATCH 5/8] Github -> GitHub --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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) From 0c040120ccf2b231751e6fa23c13651ed94cefe5 Mon Sep 17 00:00:00 2001 From: Zhang Yafen Date: Tue, 15 Nov 2016 18:55:32 +0800 Subject: [PATCH 6/8] MSA-1587: 1.New Device Handle for Osram Lightify Light saled in Europe market(ZLL) (1) OSRAM LIGHTIFY Gardenpole RGBW (2) OSRAM LIGHTIFY Outdoor Flex RGBW (3) OSRAM LIGHTIFY RGBW PAR 16 50 (4) OSRAM LIGHTIFY Flex RGBW, this product uses ZLL, so move it from zigbee-white-color-temperature-bulb to zll-white-color-temperature-bulb (5) OSRAM LIGHTIFY Classic B40 Tunable White, this product uses ZLL, so move it from zigbee-white-color-temperature-bulb to zll-white-color-temperature-bulb --- .../smartthings/zll-rgbw-bulb.src/zll-rgbw-bulb.groovy | 4 ++++ .../zll-white-color-temperature-bulb.groovy | 1 + 2 files changed, 5 insertions(+) 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 From b9229c6ef8bf5e762047b940969cb62c623582cc Mon Sep 17 00:00:00 2001 From: Donald Kirker Date: Tue, 15 Nov 2016 12:05:44 -0800 Subject: [PATCH 7/8] Add Element Plus bulb. --- .../zigbee-white-color-temperature-bulb.groovy | 1 + 1 file changed, 1 insertion(+) 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 123a203..ea35f73 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 From e443cb641cb0a2d69ea2337aa1b82e85512ba9cb Mon Sep 17 00:00:00 2001 From: juano2310 Date: Fri, 18 Nov 2016 11:28:30 -0500 Subject: [PATCH 8/8] DVCSMP-2211 - Update Button Number --- .../smartthings/aeon-key-fob.src/aeon-key-fob.groovy | 9 +++++++++ .../smartthings/aeon-minimote.src/aeon-minimote.groovy | 9 +++++++++ .../smartthings/cooper-rf9500.src/cooper-rf9500.groovy | 9 +++++++++ .../simulated-minimote.src/simulated-minimote.groovy | 9 +++++++++ 4 files changed, 36 insertions(+) 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 b6d376f..40f5403 100644 --- a/devicetypes/smartthings/aeon-key-fob.src/aeon-key-fob.groovy +++ b/devicetypes/smartthings/aeon-key-fob.src/aeon-key-fob.groovy @@ -120,6 +120,15 @@ def configure() { return cmd } + +def installed() { + initialize() +} + def updated() { + initialize() +} + +def initialize() { 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 4906fac..f1a0c0b 100644 --- a/devicetypes/smartthings/aeon-minimote.src/aeon-minimote.groovy +++ b/devicetypes/smartthings/aeon-minimote.src/aeon-minimote.groovy @@ -109,6 +109,15 @@ def configure() { return cmds } + +def installed() { + initialize() +} + def updated() { + initialize() +} + +def initialize() { 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 2f83f77..5e22791 100644 --- a/devicetypes/smartthings/cooper-rf9500.src/cooper-rf9500.groovy +++ b/devicetypes/smartthings/cooper-rf9500.src/cooper-rf9500.groovy @@ -183,6 +183,15 @@ def updateState(String name, String value) { device.updateDataValue(name, value) } + +def installed() { + initialize() +} + def updated() { + initialize() +} + +def initialize() { sendEvent(name: "numberOfButtons", value: 3) } diff --git a/devicetypes/smartthings/testing/simulated-minimote.src/simulated-minimote.groovy b/devicetypes/smartthings/testing/simulated-minimote.src/simulated-minimote.groovy index c2bb0cd..a538f81 100644 --- a/devicetypes/smartthings/testing/simulated-minimote.src/simulated-minimote.groovy +++ b/devicetypes/smartthings/testing/simulated-minimote.src/simulated-minimote.groovy @@ -126,6 +126,15 @@ private hold(button) { sendEvent(name: "button", value: "held", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was held", isStateChange: true) } + +def installed() { + initialize() +} + def updated() { + initialize() +} + +def initialize() { sendEvent(name: "numberOfButtons", value: 4) }