mirror of
https://github.com/mtan93/SmartThingsPublic.git
synced 2026-03-08 05:31:56 +00:00
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* Smart Windows
|
* Smart Windows
|
||||||
* Compares two temperatures – indoor vs outdoor, for example – then sends an alert if windows are open (or closed!).
|
* Compares two temperatures – indoor vs outdoor, for example – then sends an alert if windows are open (or closed!).
|
||||||
*
|
*
|
||||||
* Copyright 2014 Eric Gideon
|
* Copyright 2014 Eric Gideon
|
||||||
*
|
*
|
||||||
* Based in part on the "When it's going to rain" SmartApp by the SmartThings team,
|
* Based in part on the "When it's going to rain" SmartApp by the SmartThings team,
|
||||||
@@ -21,13 +21,18 @@ definition(
|
|||||||
name: "Smart Windows",
|
name: "Smart Windows",
|
||||||
namespace: "egid",
|
namespace: "egid",
|
||||||
author: "Eric Gideon",
|
author: "Eric Gideon",
|
||||||
description: "Compares two temperatures – indoor vs outdoor, for example – then sends an alert if windows are open (or closed!). If you don't use an external temperature device, your zipcode will be used instead.",
|
description: "Compares two temperatures – indoor vs outdoor, for example – then sends an alert if windows are open (or closed!). If you don't use an external temperature device, your location will be used instead.",
|
||||||
iconUrl: "https://s3.amazonaws.com/smartthings-device-icons/Home/home9-icn.png",
|
iconUrl: "https://s3.amazonaws.com/smartthings-device-icons/Home/home9-icn.png",
|
||||||
iconX2Url: "https://s3.amazonaws.com/smartthings-device-icons/Home/home9-icn@2x.png"
|
iconX2Url: "https://s3.amazonaws.com/smartthings-device-icons/Home/home9-icn@2x.png"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
preferences {
|
preferences {
|
||||||
|
|
||||||
|
if (!(location.zipCode || ( location.latitude && location.longitude )) && location.channelName == 'samsungtv') {
|
||||||
|
section { paragraph title: "Note:", "Location is required for this SmartApp. Go to 'Location Name' settings to setup your correct location." }
|
||||||
|
}
|
||||||
|
|
||||||
section( "Set the temperature range for your comfort zone..." ) {
|
section( "Set the temperature range for your comfort zone..." ) {
|
||||||
input "minTemp", "number", title: "Minimum temperature"
|
input "minTemp", "number", title: "Minimum temperature"
|
||||||
input "maxTemp", "number", title: "Maximum temperature"
|
input "maxTemp", "number", title: "Maximum temperature"
|
||||||
@@ -39,9 +44,11 @@ preferences {
|
|||||||
input "inTemp", "capability.temperatureMeasurement", title: "Indoor"
|
input "inTemp", "capability.temperatureMeasurement", title: "Indoor"
|
||||||
input "outTemp", "capability.temperatureMeasurement", title: "Outdoor (optional)", required: false
|
input "outTemp", "capability.temperatureMeasurement", title: "Outdoor (optional)", required: false
|
||||||
}
|
}
|
||||||
section( "Set your location" ) {
|
|
||||||
input "zipCode", "text", title: "Zip code"
|
if (location.channelName != 'samsungtv') {
|
||||||
}
|
section( "Set your location" ) { input "zipCode", "text", title: "Zip code" }
|
||||||
|
}
|
||||||
|
|
||||||
section( "Notifications" ) {
|
section( "Notifications" ) {
|
||||||
input "sendPushMessage", "enum", title: "Send a push notification?", metadata:[values:["Yes","No"]], required:false
|
input "sendPushMessage", "enum", title: "Send a push notification?", metadata:[values:["Yes","No"]], required:false
|
||||||
input "retryPeriod", "number", title: "Minutes between notifications:"
|
input "retryPeriod", "number", title: "Minutes between notifications:"
|
||||||
@@ -72,7 +79,7 @@ def temperatureHandler(evt) {
|
|||||||
|
|
||||||
def currentInTemp = evt.doubleValue
|
def currentInTemp = evt.doubleValue
|
||||||
def openWindows = sensors.findAll { it?.latestValue("contact") == 'open' }
|
def openWindows = sensors.findAll { it?.latestValue("contact") == 'open' }
|
||||||
|
|
||||||
log.trace "Temp event: $evt"
|
log.trace "Temp event: $evt"
|
||||||
log.info "In: $currentInTemp; Out: $currentOutTemp"
|
log.info "In: $currentInTemp; Out: $currentOutTemp"
|
||||||
|
|
||||||
@@ -98,7 +105,7 @@ def temperatureHandler(evt) {
|
|||||||
if ( currentOutTemp < maxTemp && !openWindows ) {
|
if ( currentOutTemp < maxTemp && !openWindows ) {
|
||||||
send( "Open some windows to cool down the house! Currently ${currentInTemp}°F inside and ${currentOutTemp}°F outside." )
|
send( "Open some windows to cool down the house! Currently ${currentInTemp}°F inside and ${currentOutTemp}°F outside." )
|
||||||
} else if ( currentOutTemp > maxTemp && openWindows ) {
|
} else if ( currentOutTemp > maxTemp && openWindows ) {
|
||||||
send( "It's gotten warmer outside! You should close these windows: ${openWindows.join(', ')}. Currently ${currentInTemp}°F inside and ${currentOutTemp}°F outside." )
|
send( "It's gotten warmer outside! You should close these windows: ${openWindows.join(', ')}. Currently ${currentInTemp}°F inside and ${currentOutTemp}°F outside." )
|
||||||
} else {
|
} else {
|
||||||
log.debug "No notifications sent. Everything is in the right place."
|
log.debug "No notifications sent. Everything is in the right place."
|
||||||
}
|
}
|
||||||
@@ -125,7 +132,11 @@ def temperatureHandler(evt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def weatherCheck() {
|
def weatherCheck() {
|
||||||
def json = getWeatherFeature("conditions", zipCode)
|
def json
|
||||||
|
if (location.channelName != 'samsungtv')
|
||||||
|
json = getWeatherFeature("conditions", zipCode)
|
||||||
|
else
|
||||||
|
json = getWeatherFeature("conditions")
|
||||||
def currentTemp = json?.current_observation?.temp_f
|
def currentTemp = json?.current_observation?.temp_f
|
||||||
|
|
||||||
if ( currentTemp ) {
|
if ( currentTemp ) {
|
||||||
@@ -150,4 +161,4 @@ private send(msg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
log.info msg
|
log.info msg
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,13 @@ definition(
|
|||||||
)
|
)
|
||||||
|
|
||||||
preferences {
|
preferences {
|
||||||
section("Zip code?") {
|
|
||||||
input "zipcode", "text", title: "Zipcode?"
|
if (!(location.zipCode || ( location.latitude && location.longitude )) && location.channelName == 'samsungtv') {
|
||||||
|
section { paragraph title: "Note:", "Location is required for this SmartApp. Go to 'Location Name' settings to setup your correct location." }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (location.channelName != 'samsungtv') {
|
||||||
|
section( "Set your location" ) { input "zipCode", "text", title: "Zip code" }
|
||||||
}
|
}
|
||||||
|
|
||||||
section("Things to check?") {
|
section("Things to check?") {
|
||||||
@@ -60,7 +65,11 @@ def scheduleCheck(evt) {
|
|||||||
// Only need to poll if we haven't checked in a while - and if something is left open.
|
// Only need to poll if we haven't checked in a while - and if something is left open.
|
||||||
if((now() - (30 * 60 * 1000) > state.lastCheck["time"]) && open) {
|
if((now() - (30 * 60 * 1000) > state.lastCheck["time"]) && open) {
|
||||||
log.info("Something's open - let's check the weather.")
|
log.info("Something's open - let's check the weather.")
|
||||||
def response = getWeatherFeature("forecast", zipcode)
|
def response
|
||||||
|
if (location.channelName != 'samsungtv')
|
||||||
|
response = getWeatherFeature("forecast", zipCode)
|
||||||
|
else
|
||||||
|
response = getWeatherFeature("forecast")
|
||||||
def weather = isStormy(response)
|
def weather = isStormy(response)
|
||||||
|
|
||||||
if(weather) {
|
if(weather) {
|
||||||
|
|||||||
@@ -26,17 +26,22 @@ definition(
|
|||||||
)
|
)
|
||||||
|
|
||||||
preferences {
|
preferences {
|
||||||
section ("In addition to push notifications, send text alerts to...") {
|
|
||||||
input("recipients", "contact", title: "Send notifications to") {
|
if (!(location.zipCode || ( location.latitude && location.longitude )) && location.channelName == 'samsungtv') {
|
||||||
input "phone1", "phone", title: "Phone Number 1", required: false
|
section { paragraph title: "Note:", "Location is required for this SmartApp. Go to 'Location Name' settings to setup your correct location." }
|
||||||
input "phone2", "phone", title: "Phone Number 2", required: false
|
|
||||||
input "phone3", "phone", title: "Phone Number 3", required: false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
section ("Zip code (optional, defaults to location coordinates)...") {
|
if (location.channelName != 'samsungtv') {
|
||||||
input "zipcode", "text", title: "Zip Code", required: false
|
section( "Set your location" ) { input "zipCode", "text", title: "Zip code" }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
section ("In addition to push notifications, send text alerts to...") {
|
||||||
|
input("recipients", "contact", title: "Send notifications to") {
|
||||||
|
input "phone1", "phone", title: "Phone Number 1", required: false
|
||||||
|
input "phone2", "phone", title: "Phone Number 2", required: false
|
||||||
|
input "phone3", "phone", title: "Phone Number 3", required: false
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def installed() {
|
def installed() {
|
||||||
@@ -61,7 +66,7 @@ def checkForSevereWeather() {
|
|||||||
def alerts
|
def alerts
|
||||||
if(locationIsDefined()) {
|
if(locationIsDefined()) {
|
||||||
if(zipcodeIsValid()) {
|
if(zipcodeIsValid()) {
|
||||||
alerts = getWeatherFeature("alerts", zipcode)?.alerts
|
alerts = getWeatherFeature("alerts", zipCode)?.alerts
|
||||||
} else {
|
} else {
|
||||||
log.warn "Severe Weather Alert: Invalid zipcode entered, defaulting to location's zipcode"
|
log.warn "Severe Weather Alert: Invalid zipcode entered, defaulting to location's zipcode"
|
||||||
alerts = getWeatherFeature("alerts")?.alerts
|
alerts = getWeatherFeature("alerts")?.alerts
|
||||||
|
|||||||
Reference in New Issue
Block a user