Created
March 14, 2014 21:33
-
-
Save rappleg/9557444 to your computer and use it in GitHub Desktop.
Button Lord
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Button Lord | |
* | |
* Author: SmartThings | |
* Date: 2013-11-27 | |
*/ | |
preferences { | |
page(name: "selectButton") | |
page(name: "configureButton1") | |
page(name: "configureButton2") | |
page(name: "configureButton3") | |
page(name: "configureButton4") | |
} | |
def selectButton() { | |
dynamicPage(name: "selectButton", title: "First, select your button device", nextPage: "configureButton1", uninstall: configured()) { | |
section { | |
input "buttonDevice", "capability.button", title: "Button", multiple: false, required: true | |
} | |
} | |
} | |
def configureButton1() { | |
dynamicPage(name: "configureButton1", title: "Now let's decide how to use the first button", | |
nextPage: "configureButton2", uninstall: configured(), getButtonSections(1)) | |
} | |
def configureButton2() { | |
dynamicPage(name: "configureButton2", title: "If you have a second button, set it up here", | |
nextPage: "configureButton3", uninstall: configured(), getButtonSections(2)) | |
} | |
def configureButton3() { | |
dynamicPage(name: "configureButton3", title: "If you have a third button, you can do even more here", | |
nextPage: "configureButton4", uninstall: configured(), getButtonSections(3)) | |
} | |
def configureButton4() { | |
dynamicPage(name: "configureButton4", title: "If you have a fouth button, you rule, and can set it up here", | |
install: true, uninstall: true, getButtonSections(4)) | |
} | |
def getButtonSections(buttonNumber) { | |
return { | |
section("Lights") { | |
input "lights_${buttonNumber}_pushed", "capability.switch", title: "Pushed", multiple: true, required: false | |
input "lights_${buttonNumber}_held", "capability.switch", title: "Held", multiple: true, required: false | |
} | |
section("Locks") { | |
input "locks_${buttonNumber}_pushed", "capability.lock", title: "Pushed", multiple: true, required: false | |
input "locks_${buttonNumber}_held", "capability.lock", title: "Held", multiple: true, required: false | |
} | |
section("Sonos") { | |
input "sonos_${buttonNumber}_pushed", "capability.musicPlayer", title: "Pushed", multiple: true, required: false | |
input "sonos_${buttonNumber}_held", "capability.musicPlayer", title: "Held", multiple: true, required: false | |
} | |
section("Modes") { | |
input "mode_${buttonNumber}_pushed", "mode", title: "Pushed", required: false | |
input "mode_${buttonNumber}_held", "mode", title: "Held", required: false | |
} | |
} | |
} | |
def installed() { | |
initialize() | |
} | |
def updated() { | |
unsubscribe() | |
initialize() | |
} | |
def initialize() { | |
subscribe(buttonDevice, "button", buttonEvent) | |
} | |
def configured() { | |
return buttonDevice || buttonConfigured(1) || buttonConfigured(2) || buttonConfigured(3) || buttonConfigured(4) | |
} | |
def buttonConfigured(idx) { | |
return settings["lights_$idx_pushed"] || | |
settings["locks_$idx_pushed"] || | |
settings["sonos_$idx_pushed"] || | |
settings["mode_$idx_pushed"] | |
} | |
def buttonEvent(evt){ | |
def buttonNumber = evt.data // why doesn't jsonData work? always returning [:] | |
def value = evt.value | |
log.debug "buttonEvent: $evt.name = $evt.value ($evt.data)" | |
log.debug "button: $buttonNumber, value: $value" | |
def recentEvents = buttonDevice.eventsSince(new Date(now() - 3000)).findAll{it.value == evt.value && it.data == evt.data} | |
log.debug "Found ${recentEvents.size()?:0} events in past 3 seconds" | |
if(recentEvents.size <= 1){ | |
switch(buttonNumber) { | |
case ~/.*1.*/: | |
executeHandlers(1, value) | |
break | |
case ~/.*2.*/: | |
executeHandlers(2, value) | |
break | |
case ~/.*3.*/: | |
executeHandlers(3, value) | |
break | |
case ~/.*4.*/: | |
executeHandlers(4, value) | |
break | |
} | |
} else { | |
log.debug "Found recent button press events for $buttonNumber with value $value" | |
} | |
} | |
def executeHandlers(buttonNumber, value) { | |
log.debug "executeHandlers: $buttonNumber - $value" | |
def lights = find('lights', buttonNumber, value) | |
if (lights != null) toggle(lights) | |
def locks = find('locks', buttonNumber, value) | |
if (locks != null) toggle(locks) | |
def sonos = find('sonos', buttonNumber, value) | |
if (sonos != null) toggle(sonos) | |
def mode = find('mode', buttonNumber, value) | |
if (mode != null) changeMode(mode) | |
} | |
def find(type, buttonNumber, value) { | |
def preferenceName = type + "_" + buttonNumber + "_" + value | |
def pref = settings[preferenceName] | |
if(pref != null) { | |
log.debug "Found: $pref for $preferenceName" | |
} | |
return pref | |
} | |
def toggle(devices) { | |
log.debug "toggle: $devices = ${devices*.currentValue('switch')}" | |
if (devices*.currentValue('switch').contains('on')) { | |
devices.off() | |
} | |
else if (devices*.currentValue('switch').contains('off')) { | |
devices.on() | |
} | |
else if (devices*.currentValue('lock').contains('locked')) { | |
devices.unlock() | |
} | |
else if (devices*.currentValue('lock').contains('unlocked')) { | |
devices.lock() | |
} | |
else { | |
devices.on() | |
} | |
} | |
def changeMode(mode) { | |
log.debug "changeMode: $mode, location.mode = $location.mode, location.modes = $location.modes" | |
if (location.mode != mode && location.modes?.find { it.name == mode }) { | |
setLocationMode(mode) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment