//Infrastructure for SmartThings Application //Importing Libraries import groovy.transform.Field //Importing Classes import ContactSensor.Contacting import ContactSensor.Contacts import Lock.Locking import Lock.Locks import Switch.Switching import Switch.Switches import Logger.Logger import Location.LocationVar import Location.Phrase import appTouch.Touched import Event.Event //GlobalVariables //Create a global variable for send event @Field def sendEvent = {eventDataMap -> eventHandler(eventDataMap)} //create a location object to change the variable inside the class @Field def location = new LocationVar() //Settings variable defined to settings on purpose @Field def settings = "Settings" //Global variable for state[mode] @Field def state = [home:[],away:[],night:[]] //Global object for touch @Field def app = new Touched(sendEvent, 0) //Create a global logger object for methods @Field def log = new Logger() //Create a global variable for Functions in Subscribe method @Field def functionList = [] //Create a global variable for Objects in Subscribe method @Field def objectList = [] //Create a global variable for Events in Subscribe method @Field def eventList = [] //Create a global list for function schedulers @Field def timersFuncList = [] //Create a global list for timer schedulers @Field def timersList = [] //Create a global list for events @Field def evt = [] //extractedObjects //Global Object for class switch! @Field def switchesoff = new Switching(sendEvent, 1) //Global Object for class switch! @Field def switcheson = new Switching(sendEvent, 1) //Global Object for class lock! @Field def lock1 = new Locking(sendEvent, 1) //Global variable for mode! @Field def newMode = "away" //Global variable for number! @Field def waitfor = 10 //Global Object for functions in subscribe method! @Field def installed = this.&installed //Global Object for functions in subscribe method! @Field def updated = this.&updated //Global Object for functions in subscribe method! @Field def appTouch = this.&appTouch //Methods ///////////////////////////////////////////////////////////////////// def definition(LinkedHashMap metaData) { println("IGNORE -- JUST SOME DEFINITION") } ///////////////////////////////////////////////////////////////////// def preferences(Closure metaData) { println("IGNORE -- JUST SOME DEFINITION") } ///////////////////////////////////////////////////////////////////// def setLocationMode(String mode) { location.mode = mode } ///////////////////////////////////////////////////////////////////// ////subscribe(obj, func) def subscribe(Object obj, Closure FunctionToCall) { objectList.add(obj) eventList.add("Touched") functionList.add(FunctionToCall) } ////subscribe(obj, event, func) def subscribe(Object obj, String event, Closure FunctionToCall) { objectList.add(obj) eventList.add(event) functionList.add(FunctionToCall) } ////subscribe(obj, event, func, data) def subscribe(Object obj, String event, Closure FunctionToCall, LinkedHashMap metaData) { objectList.add(obj) eventList.add(event) functionList.add(FunctionToCall) } ///////////////////////////////////////////////////////////////////// ////runIn(time, func) def runIn(int seconds, Closure functionToCall) { timersFuncList.add(functionToCall) timersList.add(new Timer()) def task = timersList[-1].runAfter(1000*seconds, functionToCall) } ///////////////////////////////////////////////////////////////////// ////unschedule(func) def unschedule(Closure functionToUnschedule) { for (int i = 0;i < timersFuncList.size();i++) { if (timersFuncList[i] == functionToUnschedule) { timersList[i].cancel() } } } ///////////////////////////////////////////////////////////////////// ////sendNotificationToContacts(text, recipients) def sendNotificationToContacts(String text, List recipients) { for (int i = 0;i < recipients.size();i++) { for (int j = 0;j < location.contacts.size();j++) { if (recipients[i] == location.contacts[j]) { println("Sending \""+text+"\" to "+location.phoneNumbers[j].toString()) } } } } ///////////////////////////////////////////////////////////////////// ////sendSms(phone, text) def sendSms(long phoneNumber, String text) { println("Sending \""+text+"\" to "+phoneNumber.toString()) } ///////////////////////////////////////////////////////////////////// def eventHandler(LinkedHashMap eventDataMap) { def value = eventDataMap["value"] def name = eventDataMap["name"] def deviceId = eventDataMap["deviceId"] def descriptionText = eventDataMap["descriptionText"] def displayed = eventDataMap["displayed"] def linkText = eventDataMap["linkText"] def isStateChange = eventDataMap["isStateChange"] def unit = eventDataMap["unit"] def data = eventDataMap["data"] for (int i = 0;i < eventList.size();i++) { if (eventList[i] == value) { evt.add(new Event()) evt[-1].value = value evt[-1].name = name evt[-1].deviceId = deviceId evt[-1].descriptionText = descriptionText evt[-1].displayed = displayed evt[-1].linkText = linkText evt[-1].displayName = linkText evt[-1].isStateChange = isStateChange evt[-1].unit = unit evt[-1].data = data functionList[i](evt[-1]) } } } /** * Good Night House * * Copyright 2014 Joseph Charette * * 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: "Good Night House", namespace: "charette.joseph@gmail.com", author: "Joseph Charette", description: "Some on, some off with delay for bedtime, Lock The Doors", category: "Convenience", iconUrl: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png", iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png" /** * Borrowed code from * Walk Gentle Into That Good Night * * Author: oneaccttorulethehouse@gmail.com * Date: 2014-02-01 */ ) preferences { section("When I touch the app turn these lights off…"){ input "switchesoff", "capability.switch", multiple: true, required:true } section("When I touch the app turn these lights on…"){ input "switcheson", "capability.switch", multiple: true, required:false } section("Lock theses locks...") { input "lock1","capability.lock", multiple: true } section("And change to this mode...") { input "newMode", "mode", title: "Mode?" } section("After so many seconds (optional)"){ input "waitfor", "number", title: "Off after (default 120)", required: true } } def installed() { log.debug "Installed with settings: ${settings}" log.debug "Current mode = ${location.mode}" subscribe(app, appTouch) } def updated() { log.debug "Updated with settings: ${settings}" log.debug "Current mode = ${location.mode}" unsubscribe() subscribe(app, appTouch) } def appTouch(evt) { log.debug "changeMode, location.mode = $location.mode, newMode = $newMode, location.modes = $location.modes" if (location.mode != newMode) { setLocationMode(newMode) log.debug "Changed the mode to '${newMode}'" } else { log.debug "New mode is the same as the old mode, leaving it be" } log.debug "appTouch: $evt" lock1.lock() switcheson.on() def delay = (waitfor != null && waitfor != "") ? waitfor * 1000 : 120000 switchesoff.off(delay: delay) } installed()