diff --git a/smartapps/gr8gitsby/timer-light.src/timer-light.groovy b/smartapps/gr8gitsby/timer-light.src/timer-light.groovy new file mode 100644 index 0000000..799623c --- /dev/null +++ b/smartapps/gr8gitsby/timer-light.src/timer-light.groovy @@ -0,0 +1,178 @@ +/** + * Timer Light + * + * Copyright 2016 Kevin Hill + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License + * for the specific language governing permissions and limitations under the License. + * + */ + +import groovy.time.* + +definition( + name: "Timer Light", + namespace: "gr8gitsby", + author: "Kevin Hill", + description: "This puts outside lights on a timer", + category: "Convenience", + iconUrl: "https://source.unsplash.com/category/nature/60x60", + iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png", + iconX3Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png") + + +preferences { + // Use a light swtich + section("Light Switch") { + // Capabilities link: http://docs.smartthings.com/en/latest/capabilities-reference.html + // Input data types: http://docs.smartthings.com/en/latest/device-type-developers-guide/device-preferences.html?highlight=input#supported-input-types + input "theSwitch", "capability.switch", title: "Pick your light switch" + input "confirmationSwitch", "capability.switch", title: "Pick the notification switch" + input "minutes", "number", title: "Enter the number of minutes you'd like the lights on" + input "person", "capability.presenceSensor", title: "When who arrives?" + + // When arrival is detected, if it is dark, turn on the outside lights + } +} + +def installed() { + log.debug "Installed with settings: ${settings}" + subscribe(theSwitch, "switch", switchHandler) + subscribe(confirmationSwitch, "switch", confirmationSwitchHandler) + initialize() +} + +def updated() { + log.debug "Updated with settings: ${settings}" + unsubscribe() + initialize() +} + +def initialize() { + // This method sets up the app + subscribe(person, "presence", presenceChange) + state.Flashes = 4 + initialSunPosition() +} + +def presenceChange(evt){ + log.debug("presenceChange") + // if someone arrives at night the lights will turn on + if("present" == evt.value){ + timerLight() + } +} + +// Function to set lights on timer for person arriving +def timerLight() { + log.debug(state.sunPosition) + if(state.sunPosition == "down"){ + light.on() + runIn(60 * minutes, turnOff) + } +} + +def turnOff(){ + // This method turns off the ligt + theSwitch.off() + confirmationSwitch.off() +} + +def initialSunPosition() { + // This method determines if sun is down at time of initializtion and run sunsetHandler() if so + + def s = getSunriseAndSunset(zipCode: "98052") + def now = new Date() + def riseTime = s.sunrise + def setTime = s.sunset + + if(setTime.before(now)) { + sunsetHandler() + log.info "Sun is already down, run sunsetHandler" + } + else + { if (riseTime.after(now)) { + sunriseHandler() + log.info "Sun is up, run sunriseHandler" + } + } +} + +def sunriseHandler() { + // method to set the sun position when the sun rises + state.sunPosition = "up" +} + +def sunsetHandler() { + // method to set the sun position when the sunsets + state.sunPosition = "down" +} + +/* +def switchHandler(evt) { + log.debug("switch Handler Fired") +} +*/ +def confirmationSwitchHandler(evt) { + state.Flashes = state.Flashes - 1 + log.debug("Flashes: ${state.Flashes}") + log.debug("Event State: ${evt.value}") + if(evt.value == "on" && state.Flashes > 0) { + runIn(2, turnOffConfirmationSwitch) + } else if(evt.value == "off" && state.Flashes > 0) { + runIn(2, turnOnConfirmationSwitch) + } + + if(state.Flashes == 0){ + state.Flashes = 4 + } +} + +def turnOnConfirmationSwitch(){ + confirmationSwitch.on() +} + +def turnOffConfirmationSwitch(){ + confirmationSwitch.off() +} + +def switchHandler(evt){ + log.debug("light Event handler fired") + // use Event rather than DeviceState because we may be changing DeviceState to only store changed values + def recentStates = theSwitch.eventsSince(new Date(now() - 4000), [all:true, max: 10]).findAll{it.name == "switch"} + log.debug "${recentStates?.size()} STATES FOUND, LAST AT ${recentStates ? recentStates[0].dateCreated : ''}" + //sendPush("Attempting to check light presses") + + if (evt.value == "on") { + log.debug("==== ON ====") + } + + log.debug(recentStates.size()) + //if (evt.isPhysical()) { + + if (recentStates.size() >= 2) { + + log.debug "Outside light timer mode engaged" + def switchattr = confirmationSwitch.currentValue("switch") + log.debug "confirmationSwitch: $switchattr" + + confirmationSwitch.on() + + //alternativeSwitch.off() + //def message = "${location.name} executed ${settings.onPhrase} because ${evt.title} was tapped twice." + runIn(60 * minutes, turnOff) + } else { + log.trace "Skipping digital on/off event" + } + + //log.debug("switch is on, turn off in $minutes") + //runIn(60*minutes, turnOff) + + //} +} \ No newline at end of file