Created
January 4, 2015 22:57
-
-
Save jmdaly/02367112114ce1dbe972 to your computer and use it in GitHub Desktop.
This is a modification of the SmartThings The Flasher app to allow flashing at specified times.
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
/** | |
* The Flasher II | |
* | |
* Author: jmdaly | |
* Date: 2015-01-03 | |
*/ | |
definition( | |
name: "The Flasher II", | |
namespace: "jmdaly", | |
author: "John M. Daly", | |
description: "Flashes a set of lights in response to motion, an open/close event, a switch, or at set times.", | |
category: "Convenience", | |
iconUrl: "https://s3.amazonaws.com/smartapp-icons/Meta/light_motion-outlet-contact.png", | |
iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Meta/light_motion-outlet-contact@2x.png" | |
) | |
preferences { | |
section("When any of the following devices trigger..."){ | |
input "motion", "capability.motionSensor", title: "Motion Sensor?", required: false | |
input "contact", "capability.contactSensor", title: "Contact Sensor?", required: false | |
input "acceleration", "capability.accelerationSensor", title: "Acceleration Sensor?", required: false | |
input "mySwitch", "capability.switch", title: "Switch?", required: false | |
input "myPresence", "capability.presenceSensor", title: "Presence Sensor?", required: false | |
} | |
section("Or at these times...") { | |
input "time1", "time", title: "When?", required: false | |
input "time2", "time", title: "When?", required: false | |
} | |
section("Then flash..."){ | |
input "switches", "capability.switch", title: "These lights", multiple: true | |
input "numFlashes", "number", title: "This number of times (default 3)", required: false | |
} | |
section("Time settings in milliseconds (optional)..."){ | |
input "onFor", "number", title: "On for (default 1000)", required: false | |
input "offFor", "number", title: "Off for (default 1000)", required: false | |
} | |
} | |
def installed() { | |
log.debug "Installed with settings: ${settings}" | |
subscribe() | |
} | |
def updated() { | |
log.debug "Updated with settings: ${settings}" | |
unschedule() | |
unsubscribe() | |
subscribe() | |
} | |
def subscribe() { | |
if (contact) { | |
subscribe(contact, "contact.open", contactOpenHandler) | |
} | |
if (acceleration) { | |
subscribe(acceleration, "acceleration.active", accelerationActiveHandler) | |
} | |
if (motion) { | |
subscribe(motion, "motion.active", motionActiveHandler) | |
} | |
if (mySwitch) { | |
subscribe(mySwitch, "switch.on", switchOnHandler) | |
} | |
if (myPresence) { | |
subscribe(myPresence, "presence", presenceHandler) | |
} | |
if (time1) { | |
schedule(time1, scheduleHandler) | |
} | |
if (time2) { | |
schedule(time2, scheduleHandler) | |
} | |
} | |
def motionActiveHandler(evt) { | |
log.debug "motion $evt.value" | |
flashLights() | |
} | |
def contactOpenHandler(evt) { | |
log.debug "contact $evt.value" | |
flashLights() | |
} | |
def accelerationActiveHandler(evt) { | |
log.debug "acceleration $evt.value" | |
flashLights() | |
} | |
def switchOnHandler(evt) { | |
log.debug "switch $evt.value" | |
flashLights() | |
} | |
def presenceHandler(evt) { | |
log.debug "presence $evt.value" | |
if (evt.value == "present") { | |
flashLights() | |
} else if (evt.value == "not present") { | |
flashLights() | |
} | |
} | |
def scheduleHandler() { | |
log.debug "scheduled time to flash lights" | |
flashLights() | |
} | |
private flashLights() { | |
def doFlash = true | |
def onFor = onFor ?: 1000 | |
def offFor = offFor ?: 1000 | |
def numFlashes = numFlashes ?: 3 | |
log.debug "LAST ACTIVATED IS: ${state.lastActivated}" | |
if (state.lastActivated) { | |
def elapsed = now() - state.lastActivated | |
def sequenceTime = (numFlashes + 1) * (onFor + offFor) | |
doFlash = elapsed > sequenceTime | |
log.debug "DO FLASH: $doFlash, ELAPSED: $elapsed, LAST ACTIVATED: ${state.lastActivated}" | |
} | |
if (doFlash) { | |
log.debug "FLASHING $numFlashes times" | |
state.lastActivated = now() | |
log.debug "LAST ACTIVATED SET TO: ${state.lastActivated}" | |
def initialActionOn = switches.collect{it.currentSwitch != "on"} | |
def delay = 0L | |
numFlashes.times { | |
log.trace "Switch on after $delay msec" | |
switches.eachWithIndex {s, i -> | |
if (initialActionOn[i]) { | |
s.on(delay: delay) | |
} | |
else { | |
s.off(delay:delay) | |
} | |
} | |
delay += onFor | |
log.trace "Switch off after $delay msec" | |
switches.eachWithIndex {s, i -> | |
if (initialActionOn[i]) { | |
s.off(delay: delay) | |
} | |
else { | |
s.on(delay:delay) | |
} | |
} | |
delay += offFor | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment