Files
2016-09-14 09:43:26 -04:00

132 lines
3.6 KiB
Groovy

/**
* Safe Watch
*
* Author: brian@bevey.org
* Date: 2013-11-17
*
* Watch a series of sensors for any anomalies for securing a safe or room.
*/
definition(
name: "Safe Watch",
namespace: "imbrianj",
author: "brian@bevey.org",
description: "Watch a series of sensors for any anomalies for securing a safe.",
category: "Safety & Security",
iconUrl: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png",
iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience%402x.png"
)
preferences {
section("Things to secure?") {
input "contact", "capability.contactSensor", title: "Contact Sensor", required: false
input "motion", "capability.motionSensor", title: "Motion Sensor", required: false
input "knock", "capability.accelerationSensor", title: "Knock Sensor", required: false
input "axis", "capability.threeAxis", title: "Three-Axis Sensor", required: false
}
section("Temperature monitor?") {
input "temp", "capability.temperatureMeasurement", title: "Temperature Sensor", required: false
input "maxTemp", "number", title: "Max Temperature (°${location.temperatureScale})", required: false
input "minTemp", "number", title: "Min Temperature (°${location.temperatureScale})", required: false
}
section("When which people are away?") {
input "people", "capability.presenceSensor", multiple: true
}
section("Notifications?") {
input "sendPushMessage", "enum", title: "Send a push notification?", metadata: [values: ["Yes", "No"]], required: false
input "phone", "phone", title: "Send a Text Message?", required: false
}
section("Message interval?") {
input name: "messageDelay", type: "number", title: "Minutes (default to every message)", required: false
}
}
def installed() {
init()
}
def updated() {
unsubscribe()
init()
}
def init() {
subscribe(contact, "contact.open", triggerContact)
subscribe(motion, "motion.active", triggerMotion)
subscribe(knock, "acceleration.active", triggerKnock)
subscribe(temp, "temperature", triggerTemp)
subscribe(axis, "threeAxis", triggerAxis)
}
def triggerContact(evt) {
if(everyoneIsAway()) {
send("Safe Watch: ${contact.label ?: contact.name} was opened!")
}
}
def triggerMotion(evt) {
if(everyoneIsAway()) {
send("Safe Watch: ${motion.label ?: motion.name} sensed motion!")
}
}
def triggerKnock(evt) {
if(everyoneIsAway()) {
send("Safe Watch: ${knock.label ?: knock.name} was knocked!")
}
}
def triggerTemp(evt) {
def temperature = evt.doubleValue
if((maxTemp && maxTemp < temperature) ||
(minTemp && minTemp > temperature)) {
send("Safe Watch: ${temp.label ?: temp.name} is ${temperature}")
}
}
def triggerAxis(evt) {
if(everyoneIsAway()) {
send("Safe Watch: ${axis.label ?: axis.name} was tilted!")
}
}
private everyoneIsAway() {
def result = true
if(people.findAll { it?.currentPresence == "present" }) {
result = false
}
log.debug("everyoneIsAway: ${result}")
return result
}
private send(msg) {
def delay = (messageDelay != null && messageDelay != "") ? messageDelay * 60 * 1000 : 0
if(now() - delay > state.lastMessage) {
state.lastMessage = now()
if(sendPushMessage == "Yes") {
log.debug("Sending push message.")
sendPush(msg)
}
if(phone) {
log.debug("Sending text message.")
sendSms(phone, msg)
}
log.debug(msg)
}
else {
log.info("Have a message to send, but user requested to not get it.")
}
}