Smart Security


(Elmo Phillip) #1

Im trying to convert the “smart Security” app to use presence sensor instead of the Resident motion detectors. However, no matter how I set it up, it still sets off alarm when residents are present. Does anyone have an app that works like this or can someone instruct me on how to change it?


(Brian) #2

Are you writing your own app based on smart security? If so, can you post your code?
I have my ST set up to only alert on door contact and motion events when presence sensors arent present.


(Troy Kelly) #3

As well as posting your code, it would be great if you could let us know in as much detail as possible what you are trying to achieve.

Are you trying to use a mix of presence sensing and motion detectors to detect valid residents, and then use other motion detectors as intrusion alarms?

As @docwisdom said - including your code here would be most helpful, along with information from the log about what is triggering the event - would be most helpful.


(Elmo Phillip) #4

I was using the “Smart Security” app and trying to convert the code. The only thing I would like changed is remove the “Motion detectors detecting residents” and replace with some sort of code to detect presence. My wife and I use our iPhones as presence detectors when we arrive and leave. I have converted the “Smart Security” app to allow for multiple phone texts but couldn’t get the presence code to work. Therefore, I reverted back to the original code. See below for code.

preferences {
section(“Sensors detecting an intruder”) {
input “intrusionMotions”, “capability.motionSensor”, title: “Motion Sensors”, multiple: true, required: false
input “intrusionContacts”, “capability.contactSensor”, title: “Contact Sensors”, multiple: true, required: false
}
section(“Sensors detecting residents”) {
input “residentMotions”, “capability.motionSensor”, title: “Motion Sensors”, multiple: true, required: false
}
section(“Alarm settings and actions”) {
input “alarms”, “capability.alarm”, title: “Which Alarm(s)”, multiple: true, required: false
input “silent”, “text”, title: "Silent alarm only (Yes/No)"
input “seconds”, “number”, title: "Delay in seconds before siren sounds"
input “lights”, “capability.switch”, title: “Flash these lights (optional)”, multiple: true, required: false
input “newMode”, “mode”, title: “Change to this mode (optional)”, required: false
}
section(“Notify others (optional)”) {
input “textMessage”, “text”, title: “Send this message”, multiple: false, required: false
input “phone”, “text”, title: “To this phone”, multiple: true, required: false
}
section(“Notify others (optional)”) {
input “textMessage”, “text”, title: “Send this message”, multiple: false, required: false
input “phone2”, “text”, title: “To this phone”, multiple: true, required: false
}
section(“Arm system when residents quiet for (default 3 minutes)”) {
input “residentsQuietThreshold”, “number”, title: “Time in minutes”, required: false
}
}

def installed() {
log.debug "INSTALLED"
subscribeToEvents()
state.alarmActive = null
}

def updated() {
log.debug "UPDATED"
unsubscribe()
subscribeToEvents()
unschedule()
state.alarmActive = null
state.residentsAreUp = null
state.lastIntruderMotion = null
alarms?.off()
}

private subscribeToEvents()
{
subscribe intrusionMotions, “motion”, intruderMotion
subscribe residentMotions, “motion”, residentMotion
subscribe intrusionContacts, “contact”, contact
subscribe alarms, “alarm”, alarm
subscribe(app, appTouch)
}

private residentsHaveBeenQuiet()
{
def threshold = ((residentsQuietThreshold != null && residentsQuietThreshold != “”) ? residentsQuietThreshold : 3) * 60 * 1000
def result = true
def t0 = new Date(now() - threshold)
for (sensor in residentMotions) {
def recentStates = sensor.statesSince(“motion”, t0)
if (recentStates.find{it.value == “active”}) {
result = false
break
}
}
log.debug "residentsHaveBeenQuiet: $result"
result
}

private intruderMotionInactive()
{
def result = true
for (sensor in intrusionMotions) {
if (sensor.currentMotion == “active”) {
result = false
break
}
}
result
}

private isResidentMotionSensor(evt)
{
residentMotions?.find{it.id == evt.deviceId} != null
}

def appTouch(evt)
{
alarms?.off()
state.alarmActive = false
}

// Here to handle old subscriptions
def motion(evt)
{
if (isResidentMotionSensor(evt)) {
log.debug "resident motion, $evt.name: $evt.value"
residentMotion(evt)
}
else {
log.debug "intruder motion, $evt.name: $evt.value"
intruderMotion(evt)
}
}

def intruderMotion(evt)
{
if (evt.value == “active”) {
log.debug "motion by potential intruder, residentsAreUp: $state.residentsAreUp"
if (!state.residentsAreUp) {
log.trace "checking if residents have been quiet"
if (residentsHaveBeenQuiet()) {
log.trace "calling startAlarmSequence"
startAlarmSequence()
}
else {
log.trace "calling disarmIntrusionDetection"
disarmIntrusionDetection()
}
}
}
state.lastIntruderMotion = now()
}

def residentMotion(evt)
{
// Don’t think we need this any more
//if (evt.value == “inactive”) {
// if (state.residentsAreUp) {
// startReArmSequence()
// }
//}
}

def contact(evt)
{
if (evt.value == “open”) {
// TODO - check for residents being up?
if (!state.residentsAreUp) {
if (residentsHaveBeenQuiet()) {
startAlarmSequence()
}
else {
disarmIntrusionDetection()
}
}
}
}

def alarm(evt)
{
log.debug "$evt.name: $evt.value"
if (evt.value == “off”) {
alarms?.off()
state.alarmActive = false
}
}

private disarmIntrusionDetection()
{
log.debug "residents are up, disarming intrusion detection"
state.residentsAreUp = true
scheduleReArmCheck()
}

private scheduleReArmCheck()
{
def cron = "0 * * * * ?"
schedule(cron, “checkForReArm”)
log.debug “Starting re-arm check, cron: $cron”
}

def checkForReArm()
{
def threshold = ((residentsQuietThreshold != null && residentsQuietThreshold != “”) ? residentsQuietThreshold : 3) * 60 * 1000
log.debug “checkForReArm: threshold is $threshold”
// check last intruder motion
def lastIntruderMotion = state.lastIntruderMotion
log.debug "checkForReArm: lastIntruderMotion=$lastIntruderMotion"
if (lastIntruderMotion != null)
{
log.debug "checkForReArm, time since last intruder motion: ${now() - lastIntruderMotion}"
if (now() - lastIntruderMotion > threshold) {
log.debug "re-arming intrusion detection"
state.residentsAreUp = false
unschedule()
}
}
else {
log.warn “checkForReArm: lastIntruderMotion was null, unable to check for re-arming intrusion detection”
}
}

private startAlarmSequence()
{
if (state.alarmActive) {
log.debug “alarm already active”
}
else {
state.alarmActive = true
log.debug "starting alarm sequence"
sendPush(“Potential intruder detected!”)

	if (newMode) {
		setLocationMode(newMode)
	}

	if (silentAlarm()) {
		log.debug "Silent alarm only"
		alarms?.strobe()
		if (phone) {
			sendSms(phone, textMessage ?: "Potential intruder detected")
		}
        if (phone2){
        	sendSms(phone2,textMessage ?: "Potential intruder detected")
        }
	}
	else {
		def delayTime = seconds
		if (delayTime) {
			alarms?.strobe()
			runIn(delayTime, "soundSiren")
			log.debug "Sounding siren in $delayTime seconds"
		}
		else {
			soundSiren()
		}
	}

	if (lights) {
		flashLights(Math.min((seconds/2) as Integer, 10))
	}
}

}

def soundSiren()
{
if (state.alarmActive) {
log.debug "Sounding siren"
if (phone) {
sendSms(phone, textMessage ?: “Potential intruder detected”)
}
if (phone2){
sendSms(phone2,textMessage ?: “Potential intruder detected”)
}
alarms?.both()
if (lights) {
log.debug "continue flashing lights"
continueFlashing()
}
}
else {
log.debug “alarm activation aborted”
}
unschedule(“soundSiren”) // Temporary work-around to scheduling bug
}

def continueFlashing()
{
unschedule()
if (state.alarmActive) {
flashLights(10)
schedule(util.cronExpression(now() + 10000), “continueFlashing”)
}
}

private flashLights(numFlashes) {
def onFor = 1000
def offFor = 1000

log.debug "FLASHING $numFlashes times"
def delay = 1L
numFlashes.times {
	log.trace "Switch on after  $delay msec"
	lights?.on(delay: delay)
	delay += onFor
	log.trace "Switch off after $delay msec"
	lights?.off(delay: delay)
	delay += offFor
}

}

private silentAlarm()
{
silent?.toLowerCase() in [“yes”,“true”,“y”]
}


(Elmo Phillip) #5

The only thing that should trigger the alarm are the motion detectors and open/close sensors. Presence not detected should arm system and Presence detected should disarm the system.