Compare commits

...

2 Commits

Author SHA1 Message Date
PASCI
93219abcc8 Modifying 'Slightly smarter use of motion sensor' 2017-01-10 09:55:02 -08:00
PASCI
4b8e94b7ca MSA-1693: It control a SWITCH combining a MOTION SENSOR and a TIMEFRAME interval.
The MOTION works as expected outside the TIMEFRAME interval.
The SWITCH is always ON during the TIMEFRAME interval.
If there is no MOTION the SWITCH is turned OFF at the end of the TIMEFRAME interval.
2017-01-09 10:18:57 -08:00

View File

@@ -0,0 +1,125 @@
//==================================================================================
/**
* Motion-Switch-Sched SmartApp
*
* Copyright 2017 PASCI Ciro Ippolito 2017
***********************************************************************************
* 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.
*
*/
//==================================================================================
definition(
name: "Motion Switch SmartTimeframe",
namespace: "PASCI",
author: "PASCI",
description: "Motion Activated switch + Override timeframe.",
category: "Convenience",
iconUrl: "http://cdn.device-icons.smartthings.com/Home/home30-icn@2x.png",
iconX2Url: "http://cdn.device-icons.smartthings.com/Home/home30-icn@2x.png",
iconX3Url: "http://cdn.device-icons.smartthings.com/Home/home30-icn@2x.png"
)
//iconUrl: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png",
//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 {
section("When MOTION is detected") {
input "themotion", "capability.motionSensor", required: true, title: "WHERE"
}
section("Turn ON this SWITCH") {
input "OUTLE", "capability.switch", required: true, title: "WHICH"
}
section("ON for how long") {
input "minutes", "number", required: true, title: "MINUTES)"
}
section("ON OVERRIDE time frame (if there is no motion)") {
input "FROMTime", "time", title: "From", required: true
input "TOTime", "time", title: "To", required: true
}
}
//==================================================================================
def installed() {
log.debug "Installed with settings: ${settings}"
initialize()
}
//==================================================================================
def updated() {
log.debug "Updated with settings: ${settings}"
unsubscribe()
initialize()
}
//==================================================================================
def initialize() {
log.debug "Installata at: " + now()
schedule(FROMTime, handlerFROMTIME)
schedule(TOTime, handlerTOTime)
subscribe(themotion, "motion.active", handler_Motion___Active)
subscribe(themotion, "motion.inactive", handler_motion_inactive)
}
// HANDLERS
//==================================================================================
def handlerFROMTIME() {
log.debug "FROM TIME at ${new Date()}"
OUTLE.on()
}
//==================================================================================
def handlerTOTime() {
log.debug "TO TIME at ${new Date()}"
checkMotion();
/*
def motionState = themotion.currentState("motion")
log.debug "state of motion sensor is: " + motionState.value
log.debug "TURN OFF at ${new Date()}"
log.debug "state of motion sensor is: " + themotion.motion
if (motionState.value == "active"){
log.debug "state of motion sensor is ACTIVE"
}else{
OUTLE.off()
log.debug "state of motion sensor is INACTIVE"
}
*/
}
//==================================================================================
def handler_Motion___Active(evt) {
log.debug("MOT Active")
OUTLE.on()
}
//==================================================================================
def handler_motion_inactive(evt) {
log.debug("MOT Inactive")
def between = timeOfDayIsBetween(FROMTime, TOTime, new Date(), location.timeZone)
if (between) {
log.debug("It dasan't mattar Christopha")
OUTLE.on()
} else {
runIn(60 * minutes, checkMotion)
}
}
//==================================================================================
def checkMotion() {
log.debug "In checkMotion scheduled method"
// get the current state object for the motion sensor
def motionState = themotion.currentState("motion")
if (motionState.value == "inactive") {
def elapsed = now() - motionState.date.time // time elapsed between now and when the motion reported inactive
def threshold = 1000 * 60 * minutes // elapsed time is in milliseconds
if (elapsed >= threshold) {
log.debug "Motion has stayed inactive long enough since last check ($elapsed ms): turning switch off"
OUTLE.off()
} else {
log.debug "Motion has not stayed inactive long enough since last check ($elapsed ms): doing nothing"
}
} else {
// Motion active; just log it and do nothing
log.debug "Motion is active, do nothing and wait for inactive"
}
}
//==================================================================================
//==================================================================================