Compare commits

..

1 Commits

Author SHA1 Message Date
Gary Johnson 2cc7135d3a MSA-1662: Sends a notification if something is still open when a mode changes. 2016-12-21 21:46:09 -08:00
2 changed files with 119 additions and 48 deletions
@@ -16,15 +16,12 @@
* *
* Date: 2013-04-30 * Date: 2013-04-30
*/ */
// for the UI
metadata { metadata {
// Automatically generated. Make future change here.
definition (name: "SmartWeather Station Tile", namespace: "smartthings", author: "SmartThings") { definition (name: "SmartWeather Station Tile", namespace: "smartthings", author: "SmartThings") {
capability "Illuminance Measurement" capability "Illuminance Measurement"
capability "Temperature Measurement" capability "Temperature Measurement"
capability "Relative Humidity Measurement" capability "Relative Humidity Measurement"
capability "Sensor" capability "Sensor"
capability "Polling"
attribute "localSunrise", "string" attribute "localSunrise", "string"
attribute "localSunset", "string" attribute "localSunset", "string"
@@ -217,7 +214,7 @@ def poll() {
send(name: "localSunrise", value: localSunrise, descriptionText: "Sunrise today is at $localSunrise") send(name: "localSunrise", value: localSunrise, descriptionText: "Sunrise today is at $localSunrise")
send(name: "localSunset", value: localSunset, descriptionText: "Sunset today at is $localSunset") send(name: "localSunset", value: localSunset, descriptionText: "Sunset today at is $localSunset")
send(name: "illuminance", value: estimateLux(obs.solarradiation, sunriseDate, sunsetDate, weatherIcon) as Integer) send(name: "illuminance", value: estimateLux(sunriseDate, sunsetDate, weatherIcon))
// Forecast // Forecast
def f = get("forecast") def f = get("forecast")
@@ -308,54 +305,49 @@ private send(map) {
sendEvent(map) sendEvent(map)
} }
private estimateLux(solarradiation, sunriseDate, sunsetDate, weatherIcon) { private estimateLux(sunriseDate, sunsetDate, weatherIcon) {
def lux = 0 def lux = 0
def now = new Date().time
if (solarradiation != '--') { if (now > sunriseDate.time && now < sunsetDate.time) {
lux = solarradiation.toDouble() / 0.0079 //day
} else { switch(weatherIcon) {
def now = new Date().time case 'tstorms':
if (now > sunriseDate.time && now < sunsetDate.time) { lux = 200
//day break
switch(weatherIcon) { case ['cloudy', 'fog', 'rain', 'sleet', 'snow', 'flurries',
case 'tstorms': 'chanceflurries', 'chancerain', 'chancesleet',
lux = 200 'chancesnow', 'chancetstorms']:
break lux = 1000
case ['cloudy', 'fog', 'rain', 'sleet', 'snow', 'flurries', break
'chanceflurries', 'chancerain', 'chancesleet', case 'mostlycloudy':
'chancesnow', 'chancetstorms']: lux = 2500
lux = 1000 break
break case ['partlysunny', 'partlycloudy', 'hazy']:
case 'mostlycloudy': lux = 7500
lux = 2500 break
break default:
case ['partlysunny', 'partlycloudy', 'hazy']: //sunny, clear
lux = 7500 lux = 10000
break
default:
//sunny, clear
lux = 10000
}
//adjust for dusk/dawn
def afterSunrise = now - sunriseDate.time
def beforeSunset = sunsetDate.time - now
def oneHour = 1000 * 60 * 60
if(afterSunrise < oneHour) {
//dawn
lux = (long)(lux * (afterSunrise/oneHour))
} else if (beforeSunset < oneHour) {
//dusk
lux = (long)(lux * (beforeSunset/oneHour))
}
} }
else {
//night - always set to 10 for now //adjust for dusk/dawn
//could do calculations for dusk/dawn too def afterSunrise = now - sunriseDate.time
lux = 10 def beforeSunset = sunsetDate.time - now
def oneHour = 1000 * 60 * 60
if(afterSunrise < oneHour) {
//dawn
lux = (long)(lux * (afterSunrise/oneHour))
} else if (beforeSunset < oneHour) {
//dusk
lux = (long)(lux * (beforeSunset/oneHour))
} }
} }
else {
//night - always set to 10 for now
//could do calculations for dusk/dawn too
lux = 10
}
lux lux
} }
@@ -0,0 +1,79 @@
/**
* Did I Leave It Open?
*
* Copyright 2016 Gary Johnson
*
* 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: "Did I Leave It Open?",
namespace: "garyjohnson",
author: "Gary Johnson",
description: "Sends a notification if something is still open when a mode changes.",
category: "Mode Magic",
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() {
input "modes", "mode", title: "When I enter these modes", multiple: true
}
section("And I left this open") {
input "contactSensor", "capability.contactSensor"
}
section("Notify these people") {
input("recipients", "contact", title: "Send notifications to") {
input "phone", "phone", title: "Send notifications to",
description: "Phone Number", required: false
}
}
}
def installed() {
log.debug "Installed with settings: ${settings}"
initialize()
}
def updated() {
log.debug "Updated with settings: ${settings}"
unsubscribe()
initialize()
}
def initialize() {
log.debug "init with mode ${location.mode}"
subscribe(location, "mode", modeChangeHandler)
}
def modeChangeHandler(evt) {
log.debug "contactState: $contactSensor.contactState.stringValue"
log.debug "modes: $modes"
log.debug "value: $evt.value"
if(modes.contains(evt.value) && contactSensor.contactState.stringValue == "open") {
log.debug "You left it open!"
def message = "You left the ${contactSensor.displayName} open!"
if (location.contactBookEnabled && recipients) {
log.debug "contact book enabled!"
sendNotificationToContacts(message, recipients)
} else {
log.debug "contact book not enabled"
if (phone) {
sendSms(phone, message)
}
}
}
}
// TODO: implement event handlers