MSA-1383: I developed this to work with GE Z-Wave switches. The application will use your presence to turn on some outside light when you arrive home only if the sun is down. When leaving the house if you turn the light switch on and off, on and off, then your outside light is in a timer mode. Additionally you can set another switch in your house to confirm that the outside lights are in timer mode.

This commit is contained in:
Kevin Hill
2016-07-03 01:11:17 -05:00
parent fc38c534f9
commit 179500f40b

View File

@@ -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)
//}
}