Compare commits

...

1 Commits

View File

@@ -0,0 +1,200 @@
/**
* Copyright 2015 SmartThings
*
* 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.
*
* lg kahn smart app to turn device on when temp is between two values
* and off otherwise. Also has to be between 2 date ranges.
* also give alerts when turning on off.
* I use for a roof heater wire/coil.
*
* Author: LGKahn kahn-st@lgk.com
*/
definition(
name: "Roof Coil Controller",
namespace: "smartthings",
author: "lgkahn",
description: "Control a roof coil or othe device(s) when temperature is between two values turns on and also has to be within a date range. Automatically turns off if one of the conditions is not met. Alerting option also.",
category: "Green Living",
iconUrl: "https://s3.amazonaws.com/smartapp-icons/Meta/temp_thermo-switch.png",
iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Meta/temp_thermo-switch@2x.png"
)
preferences {
section("Choose a temperature sensor... "){
input "sensor", "capability.temperatureMeasurement", title: "Sensor"
}
section("Select the outlet(s)... "){
input "outlets", "capability.switch", title: "Outlets", multiple: true
}
section("Turn on when temp is above ..."){
input "onSetPoint", "decimal", title: "Set On Temp"
}
section("Turn off when temp is above ..."){
input "offSetPoint", "decimal", title: "Set Off Temp"
}
section("Start after Date format (yyyymmdd)..."){
input "startDate", "number", title: "Date?"
}
section("End after Date format (yyyymmdd)..."){
input "endDate", "number", title: "Date?"
}
section("Time Zone Offset ie -5 etc...."){
input "tzOffset", "number", title: "Offset?", range: "-12..12"
}
section( "Notifications" ) {
input("recipients", "contact", title: "Send notifications to") {
input "sendPushMessage", "enum", title: "Send a push notification?", options: ["Yes", "No"], required: false
input "phone1", "phone", title: "Send a Text Message?", required: false
}
}
}
def installed()
{
log.debug "in coil controller installed ... currenttemp = $sensor.currentTemperature"
subscribe(sensor, "temperature", temperatureHandler)
}
def updated()
{
log.debug "in coil controller updated ... currenttemp = $sensor.currentTemperature"
unsubscribe()
subscribe(sensor, "temperature", temperatureHandler)
// for debugging and testing uncomment temperatureHandlerTest()
}
def temperatureHandler(evt)
{
def currenttemp = sensor.currentTemperature
/*
log.debug "in temp handler"
log.debug "current temp = $currenttemp"
log.debug "onSetPoint = $onSetPoint"
log.debug "offSetPoint = $offSetPoint"
log.debug "set offset = $tzOffset"
*/
def today = new Date();
def ltf = new java.text.SimpleDateFormat("yyyyMMdd")
ltf.setTimeZone(TimeZone.getTimeZone("GMT${tzOffset}"))
String date1 = ltf.format(today);
int intdate = Integer.parseInt(date1)
// log.debug "int date = $intdate"
//log.debug "enddate = $endDate"
// log.debug "startdate = $startDate"
def currSwitches = outlets.currentSwitch
def onOutlets = currSwitches.findAll { switchVal ->
switchVal == "on" ? true : false }
if (((intdate >= startDate) && (intdate <= endDate))
&& ((currenttemp > onSetPoint) && (currenttemp < offSetPoint)))
{
// dont do anything if already on
if (onOutlets.size() != outlets.size())
{
log.debug "turning outlets On as $sensor.displayName is reporting $currenttemp which is between $onSetPoint and $offSetPoint, and we are within the date range ($startDate - $endDate)!"
mysend("Turning device(s) On as $sensor.displayName is reporting a temperature of $currenttemp which is between $onSetPoint and $offSetPoint, and we are within the date range ($startDate - $endDate)!")
outlets.on()
}
else log.debug "Not turning on again, all already on!"
}
else
{
// dont do anything if already off
if (onOutlets.size() != 0)
{
log.debug "turning outlets Off! as $sensor.displayName is reporting $currenttemp which is Not between $onSetPoint and $offSetPoint, or we are no longer within the date range ($startDate - $endDate)!"
mysend("Turning device(s) Off as $sensor.displayName is reporting a temperature of $currenttemp which is not between $onSetPoint and $offSetPoint, or we are no longer within the date range ($startDate - $endDate)!")
outlets.off()
}
else log.debug "All outlets already off!"
}
}
def temperatureHandlerTest()
{
//log.trace "temperature: $evt.value, $evt"
// this routine is only for testing and debugging. to test or make changes uncomment the call in update.
// this is so we dont have to wait 15 minutes till a half an hour for the event to fire for testing.
def currenttemp = sensor.currentTemperature
log.debug "in temp handler test"
log.debug "current temp = $currenttemp"
log.debug "onSetPoint = $onSetPoint"
log.debug "offSetPoint = $offSetPoint"
log.debug "set offset = $tzOffset"
def today = new Date();
def ltf = new java.text.SimpleDateFormat("yyyyMMdd")
ltf.setTimeZone(TimeZone.getTimeZone("GMT${tzOffset}"))
String date1 = ltf.format(today);
int intdate = Integer.parseInt(date1)
log.debug "int date = $intdate"
log.debug "enddate = $endDate"
log.debug "startdate = $startDate"
def currSwitches = outlets.currentSwitch
def onOutlets = currSwitches.findAll { switchVal ->
switchVal == "on" ? true : false }
log.debug "how many on = ${onOutlets.size()} "
if (((intdate >= startDate) && (intdate <= endDate))
&& ((currenttemp > onSetPoint) && (currenttemp < offSetPoint)))
{
// dont do anything if already on
if (onOutlets.size() != outlets.size())
{
log.debug "turning outlets On as $sensor.displayName is reporting $currenttemp which is between $onSetPoint and $offSetPoint, and we are within the date range ($startDate - $endDate)!"
//mysend("Turning device(s) On as $sensor.displayName is reporting a temperature of $currenttemp which is between $onSetPoint and $offSetPoint, and we are within the date range ($startDate - $endDate)!")
outlets.on()
}
else log.debug "Not turning on again, all already on!"
}
else
{
// dont do anything if already off
if (onOutlets.size() != 0)
{
log.debug "turning outlets Off! as $sensor.displayName is reporting $currenttemp which is Not between $onSetPoint and $offSetPoint, or we are no longer within the date range ($startDate - $endDate)!"
//mysend("Turning device(s) Off as $sensor.displayName is reporting a temperature of $currenttemp which is not between $onSetPoint and $offSetPoint, or we are no longer within the date range ($startDate - $endDate)!")
outlets.off()
}
else log.debug "All outlets already off!"
}
}
private mysend(msg) {
if (location.contactBookEnabled) {
log.debug("sending notifications to: ${recipients?.size()}")
sendNotificationToContacts(msg, recipients)
}
else {
if (sendPushMessage != "No") {
log.debug("sending push message")
sendPush(msg)
}
if (phone1) {
log.debug("sending text message")
sendSms(phone1, msg)
}
}
log.debug msg
}