Compare commits

...

7 Commits

Author SHA1 Message Date
Vinay Rao
8e37b1fce7 Merge pull request #1460 from bbodenmiller/patch-1
Github -> GitHub (Text change, no ticket)
2016-11-13 05:34:47 -08:00
Ben Bodenmiller
439dd634bd Github -> GitHub 2016-11-12 00:19:55 -08:00
Juan Pablo Risso
1db5f75ec5 DVCSMP-2211 - Update Button Number and Holdable capability (#1458) 2016-11-11 16:10:44 -05:00
Juan Pablo Risso
7978f45996 DVCSMP-2221 - Replace display with displayed (#1457) 2016-11-11 14:09:04 -05:00
Vinay Rao
0ab657d5f2 Merge pull request #1456 from SmartThingsCommunity/staging
Rolling down staging hotfix to master
2016-11-11 02:47:42 -08:00
tslagle13
0ae836b023 Merge pull request #1442 from MichaelStruck/MSA-1576-14
MSA-1576: Color Coordinator
2016-11-09 11:18:22 -08:00
Michael Struck
0b4d555d33 MSA-1576: Fixes various bugs and adds a random color feature. 2016-11-09 09:33:31 -08:00
13 changed files with 219 additions and 163 deletions

View File

@@ -1,10 +1,10 @@
# SmartThings Public Github Repo # SmartThings Public GitHub Repo
An official list of SmartApps and Device Types from SmartThings. An official list of SmartApps and Device Types from SmartThings.
Here are some links to help you get started coding right away: 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) * [Full Documentation](http://docs.smartthings.com)
* [IDE & Simulator](http://ide.smartthings.com) * [IDE & Simulator](http://ide.smartthings.com)
* [Community Forums](http://community.smartthings.com) * [Community Forums](http://community.smartthings.com)

View File

@@ -15,6 +15,7 @@ metadata {
definition (name: "Aeon Key Fob", namespace: "smartthings", author: "SmartThings") { definition (name: "Aeon Key Fob", namespace: "smartthings", author: "SmartThings") {
capability "Actuator" capability "Actuator"
capability "Button" capability "Button"
capability "Holdable Button"
capability "Configuration" capability "Configuration"
capability "Sensor" capability "Sensor"
capability "Battery" capability "Battery"
@@ -118,3 +119,7 @@ def configure() {
log.debug("Sending configuration: $cmd") log.debug("Sending configuration: $cmd")
return cmd return cmd
} }
def updated() {
sendEvent(name: "numberOfButtons", value: 4)
}

View File

@@ -15,6 +15,7 @@ metadata {
definition (name: "Aeon Minimote", namespace: "smartthings", author: "SmartThings") { definition (name: "Aeon Minimote", namespace: "smartthings", author: "SmartThings") {
capability "Actuator" capability "Actuator"
capability "Button" capability "Button"
capability "Holdable Button"
capability "Configuration" capability "Configuration"
capability "Sensor" capability "Sensor"
@@ -107,3 +108,7 @@ def configure() {
log.debug("Sending configuration: $cmds") log.debug("Sending configuration: $cmds")
return cmds return cmds
} }
def updated() {
sendEvent(name: "numberOfButtons", value: 4)
}

View File

@@ -16,7 +16,7 @@ metadata {
capability "Switch" capability "Switch"
capability "Switch Level" capability "Switch Level"
capability "Button" capability "Button"
capability "Actuator" capability "Actuator"
//fingerprint deviceId: "0x1200", inClusters: "0x77 0x86 0x75 0x73 0x85 0x72 0xEF", outClusters: "0x26" //fingerprint deviceId: "0x1200", inClusters: "0x77 0x86 0x75 0x73 0x85 0x72 0xEF", outClusters: "0x26"
} }
@@ -182,3 +182,7 @@ def updateState(String name, String value) {
state[name] = value state[name] = value
device.updateDataValue(name, value) device.updateDataValue(name, value)
} }
def updated() {
sendEvent(name: "numberOfButtons", value: 3)
}

View File

@@ -236,17 +236,17 @@ def refresh() {
} }
void indicatorWhenOn() { 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())) sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [1], parameterNumber: 3, size: 1).format()))
} }
void indicatorWhenOff() { 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())) sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [0], parameterNumber: 3, size: 1).format()))
} }
void indicatorNever() { 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())) sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [2], parameterNumber: 3, size: 1).format()))
} }

View File

@@ -546,7 +546,7 @@ def zwaveEvent(physicalgraph.zwave.commands.configurationv1.ConfigurationReport
def value = "when off" def value = "when off"
if (cmd.configurationValue[0] == 1) {value = "when on"} if (cmd.configurationValue[0] == 1) {value = "when on"}
if (cmd.configurationValue[0] == 2) {value = "never"} 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) { def createEvent(physicalgraph.zwave.Command cmd, Map map) {
@@ -829,7 +829,7 @@ def toggleTiles(color) {
state.colorTiles.each({ state.colorTiles.each({
if ( it == color ) { if ( it == color ) {
log.debug "Turning ${it} on" 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 { } else {
//log.debug "Turning ${it} off" //log.debug "Turning ${it} off"
cmds << sendEvent(name: it, value: "off${it}", displayed: false) cmds << sendEvent(name: it, value: "off${it}", displayed: false)

View File

@@ -43,8 +43,8 @@ def parse(String description) {
} }
def push() { def push() {
sendEvent(name: "switch", value: "on", isStateChange: true, display: false) sendEvent(name: "switch", value: "on", isStateChange: true, displayed: false)
sendEvent(name: "switch", value: "off", isStateChange: true, display: false) sendEvent(name: "switch", value: "off", isStateChange: true, displayed: false)
sendEvent(name: "momentary", value: "pushed", isStateChange: true) sendEvent(name: "momentary", value: "pushed", isStateChange: true)
} }

View File

@@ -15,6 +15,7 @@ metadata {
definition (name: "Simulated Minimote", namespace: "smartthings/testing", author: "SmartThings") { definition (name: "Simulated Minimote", namespace: "smartthings/testing", author: "SmartThings") {
capability "Actuator" capability "Actuator"
capability "Button" capability "Button"
capability "Holdable Button"
capability "Configuration" capability "Configuration"
capability "Sensor" capability "Sensor"
@@ -125,3 +126,6 @@ private hold(button) {
sendEvent(name: "button", value: "held", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was held", isStateChange: true) sendEvent(name: "button", value: "held", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was held", isStateChange: true)
} }
def updated() {
sendEvent(name: "numberOfButtons", value: 4)
}

View File

@@ -19,6 +19,7 @@ metadata {
capability "Actuator" capability "Actuator"
capability "Battery" capability "Battery"
capability "Button" capability "Button"
capability "Holdable Button"
capability "Configuration" capability "Configuration"
capability "Refresh" capability "Refresh"
capability "Sensor" capability "Sensor"

View File

@@ -81,7 +81,7 @@ def zwaveEvent(physicalgraph.zwave.commands.configurationv1.ConfigurationReport
def value = "when off" def value = "when off"
if (cmd.configurationValue[0] == 1) {value = "when on"} if (cmd.configurationValue[0] == 1) {value = "when on"}
if (cmd.configurationValue[0] == 2) {value = "never"} 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) { def zwaveEvent(physicalgraph.zwave.commands.hailv1.Hail cmd) {

View File

@@ -114,7 +114,7 @@ def zwaveEvent(physicalgraph.zwave.commands.configurationv1.ConfigurationReport
def value = "when off" def value = "when off"
if (cmd.configurationValue[0] == 1) {value = "when on"} if (cmd.configurationValue[0] == 1) {value = "when on"}
if (cmd.configurationValue[0] == 2) {value = "never"} 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) { def zwaveEvent(physicalgraph.zwave.commands.hailv1.Hail cmd) {
@@ -174,17 +174,17 @@ def refresh() {
} }
void indicatorWhenOn() { 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())) sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [1], parameterNumber: 3, size: 1).format()))
} }
void indicatorWhenOff() { 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())) sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [0], parameterNumber: 3, size: 1).format()))
} }
void indicatorNever() { 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())) sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [2], parameterNumber: 3, size: 1).format()))
} }

View File

@@ -1,9 +1,10 @@
/** /**
* Color Coordinator * Color Coordinator
* Version 1.0.0 - 7/4/15 * Version 1.1.0 - 11/9/16
* By Michael Struck * By Michael Struck
* *
* 1.0.0 - Initial release * 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 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
@@ -31,27 +32,35 @@ preferences {
} }
def mainPage() { def mainPage() {
dynamicPage(name: "mainPage", title: "", install: true, uninstall: true) { dynamicPage(name: "mainPage", title: "", install: true, uninstall: false) {
section("Master Light") { 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" input "master", "capability.colorControl", title: "Colored Light"
} }
section("Lights that follow the master settings") { 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") { 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" 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 { section {
paragraph "${textVersion()}\n${textCopyright()}\n\n${textLicense()}\n" paragraph "${textVersion()}\n${textCopyright()}\n\n${textLicense()}\n"
} }
section("Instructions") { section("Instructions") {
paragraph textHelp() paragraph textHelp()
} }
section("Tap button below to remove application"){
}
} }
def installed() { def installed() {
@@ -72,27 +81,55 @@ def init() {
} }
//----------------------------------- //-----------------------------------
def onOffHandler(evt){ def onOffHandler(evt){
if (master.currentValue("switch") == "on"){ if (!slaves.id.find{it==master.id}){
slaves?.on() if (master.currentValue("switch") == "on"){
} if (randomYes) getRandomColorMaster()
else { else slaves?.on()
slaves?.off() }
} else {
slaves?.off()
}
}
} }
def colorHandler(evt) { def colorHandler(evt) {
def dimLevel = master.currentValue("level") if (!slaves.id.find{it==master.id} && master.currentValue("switch") == "on"){
def hueLevel = master.currentValue("hue") log.debug "Changing Slave units H,S,L"
def saturationLevel = master.currentValue("saturation") 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] def newValue = [hue: hueLevel, saturation: saturationLevel, level: dimLevel as Integer]
log.debug hueLevel
log.debug saturationLevel
master.setColor(newValue)
slaves?.setColor(newValue) slaves?.setColor(newValue)
} }
def tempHandler(evt){ def tempHandler(evt){
if (evt.value != "--") { if (!slaves.id.find{it==master.id} && master.currentValue("switch") == "on"){
def tempLevel = master.currentValue("colorTemperature") if (evt.value != "--") {
slaves?.setColorTemperature(tempLevel) log.debug "Changing Slave color temp based on Master change"
} def tempLevel = master.currentValue("colorTemperature")
slaves?.setColorTemperature(tempLevel)
}
}
} }
//Version/Copyright/Information/Help //Version/Copyright/Information/Help
@@ -102,11 +139,11 @@ private def textAppName() {
} }
private def textVersion() { private def textVersion() {
def text = "Version 1.0.0 (07/04/2015)" def text = "Version 1.1.0 (11/09/2016)"
} }
private def textCopyright() { private def textCopyright() {
def text = "Copyright © 2015 Michael Struck" def text = "Copyright © 2016 Michael Struck"
} }
private def textLicense() { private def textLicense() {
@@ -128,5 +165,5 @@ private def textHelp() {
def text = def text =
"This application will allow you to control the settings of multiple colored lights with one control. " + "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, "+ "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."
} }

View File

@@ -516,7 +516,7 @@ def pollResponse(response, data) {
def hub = getChildDevice("harmony-${it.key}") def hub = getChildDevice("harmony-${it.key}")
if (hub) { if (hub) {
if (it.value.response.data.currentAvActivity == "-1") { 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 { } else {
def currentActivity def currentActivity
def activityDTH = getChildDevice("harmony-${it.key}-${it.value.response.data.currentAvActivity}") def activityDTH = getChildDevice("harmony-${it.key}-${it.value.response.data.currentAvActivity}")
@@ -524,7 +524,7 @@ def pollResponse(response, data) {
currentActivity = activityDTH.device.displayName currentActivity = activityDTH.device.displayName
else else
currentActivity = getActivityName(it.value.response.data.currentAvActivity,it.key) 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 { } else {
@@ -576,7 +576,7 @@ def getActivityList() {
} }
activities += [id: "off", name: "Activity OFF", type: "0"] 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)
} }
} }
} }