//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 Event.Event import Logger.Logger import Location.locationVar import Location.Phrase import appTouch.Touch //GlobalVariables //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:[]] //Create a global logger object for methods @Field def log = new Logger() //Create a global object for app @Field def app = new Touch(1) //Create a global list for objects for events on subscribe methods @Field def ObjectList = [] //Create a global list for events @Field def EventList = [] //Create a global list for function calls based on corresponding events @Field def FunctionList = [] //Create a global list for function schedulers @Field def ListofTimersFunc = [] //Create a global list for timer schedulers @Field def ListofTimers = [] //ExtractedObjects //Global Object for class switch! @Field def switchesoff = new switching(1) //Global Object for class switch! @Field def switcheson = new switching(1) //Global Object for class lock! @Field def lock1 = new locking(1) //Global variable for mode! @Field def newMode = "away" //Global variable for number! @Field def waitfor = 5 //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 LHM) { println("IGNORE -- JUST SOME DEFINITION") } ///////////////////////////////////////////////////////////////////// def preferences(Closure Input) { println("IGNORE -- JUST SOME DEFINITION") } ///////////////////////////////////////////////////////////////////// def setLocationMode(String mode) { location.mode = mode } ///////////////////////////////////////////////////////////////////// ////subscribe(app, func) def subscribe(Object Obj, Closure Input) { ObjectList.add(Obj) EventList.add("Touched") FunctionList.add(Input) } ////subscribe(obj, string, func) def subscribe(Object Obj, String S, Closure Input) { ObjectList.add(Obj) EventList.add(S) FunctionList.add(Input) } ////subscribe(obj, string, func, hashmap) def subscribe(Object Obj, String S, Closure Input, LinkedHashMap LHM) { ObjectList.add(Obj) EventList.add(S) FunctionList.add(Input) } ///////////////////////////////////////////////////////////////////// def EventHandler() { while(true) { List evt = [] print "Waiting for an event...\n" def EVENT = System.in.newReader().readLine() SepLine = EVENT.split() for (int i = 0; i < EventList.size(); i++) { if (EventList[i] == SepLine[0]) { println("The following effect: \n") evt.add(new Event()) switch(SepLine[0]) { case "Touched": ObjectList[i].touched = 1 evt[-1].value = "Touched" evt[-1].linkText = "touched by user" evt[-1].name = "TouchSensor" evt[-1].descriptionText = "Touching" break case "lock": if (SepLine[1] == "0") { ObjectList[i][0].lock() evt[-1].deviceId = 0 evt[-1].value = "locked" evt[-1].linkText = "lock0" evt[-1].displayName = "lock0" evt[-1].name = "lock" evt[-1].descriptionText = "locking" } else if (SepLine[1] == "1") { ObjectList[i][1].lock() evt[-1].deviceId = 1 evt[-1].value = "locked" evt[-1].linkText = "lock1" evt[-1].displayName = "lock1" evt[-1].name = "lock" evt[-1].descriptionText = "locking" } else if (SepLine[1] == "2") { ObjectList[i][2].lock() evt[-1].deviceId = 2 evt[-1].value = "locked" evt[-1].linkText = "lock2" evt[-1].displayName = "lock2" evt[-1].name = "lock" evt[-1].descriptionText = "locking" } break case "unlock": if (SepLine[1] == "0") { ObjectList[i][0].unlock() evt[-1].deviceId = 0 evt[-1].value = "unlocked" evt[-1].linkText = "lock0" evt[-1].displayName = "lock0" evt[-1].name = "lock" evt[-1].descriptionText = "unlocking" } else if (SepLine[1] == "1") { ObjectList[i][1].unlock() evt[-1].deviceId = 0 evt[-1].value = "unlocked" evt[-1].linkText = "lock1" evt[-1].displayName = "lock1" evt[-1].name = "lock" evt[-1].descriptionText = "unlocking" } else if (SepLine[1] == "2") { ObjectList[i][2].unlock() evt[-1].deviceId = 2 evt[-1].value = "unlocked" evt[-1].linkText = "lock2" evt[-1].displayName = "lock2" evt[-1].name = "lock" evt[-1].descriptionText = "unlocking" } break case "contact.open": if (SepLine[1] == "0") { ObjectList[i][0].contactLatestValue = ObjectList[i].currentContact ObjectList[i][0].currentContact = "open" evt[-1].deviceId = 0 evt[-1].value = "contact.open" evt[-1].linkText = "contact0" evt[-1].displayName = "contact0" evt[-1].name = "ContactSensor" evt[-1].descriptionText = "opening" } else if (SepLine[1] == "1") { ObjectList[i][1].contactLatestValue = ObjectList[i].currentContact ObjectList[i][1].currentContact = "open" evt[-1].deviceId = 1 evt[-1].value = "contact.open" evt[-1].linkText = "contact1" evt[-1].displayName = "contact1" evt[-1].name = "ContactSensor" evt[-1].descriptionText = "opening" } else if (SepLine[1] == "2") { ObjectList[i][2].contactLatestValue = ObjectList[i].currentContact ObjectList[i][2].currentContact = "open" evt[-1].deviceId = 2 evt[-1].value = "contact.open" evt[-1].linkText = "contact2" evt[-1].displayName = "contact2" evt[-1].name = "ContactSensor" evt[-1].descriptionText = "opening" } break case "contact.closed": if (SepLine[1] == "0") { ObjectList[i][0].contactLatestValue = ObjectList[i].currentContact ObjectList[i][0].currentContact = "closed" evt[-1].deviceId = 0 evt[-1].value = "contact.closed" evt[-1].linkText = "contact0" evt[-1].displayName = "contact0" evt[-1].name = "ContactSensor" evt[-1].descriptionText = "closing" } else if (SepLine[1] == "1") { ObjectList[i][1].contactLatestValue = ObjectList[i].currentContact ObjectList[i][1].currentContact = "closed" evt[-1].deviceId = 1 evt[-1].value = "contact.closed" evt[-1].linkText = "contact1" evt[-1].displayName = "contact1" evt[-1].name = "ContactSensor" evt[-1].descriptionText = "closing" } else if (SepLine[1] == "2") { ObjectList[i][2].contactLatestValue = ObjectList[i].currentContact ObjectList[i][2].currentContact = "closed" evt[-1].deviceId = 2 evt[-1].value = "contact.closed" evt[-1].linkText = "contact2" evt[-1].displayName = "contact2" evt[-1].name = "ContactSensor" evt[-1].descriptionText = "closing" } break default: break } FunctionList[i](evt[-1]) } } } } ///////////////////////////////////////////////////////////////////// ////runIn(time, func) def runIn(int seconds, Closure Input) { ListofTimersFunc.add(Input) ListofTimers.add(new Timer()) def task = ListofTimers[-1].runAfter(1000*seconds, Input) } ///////////////////////////////////////////////////////////////////// ////unschedule(func) def unschedule(Closure Input) { for (int i = 0;i < ListofTimersFunc.size();i++) { if (ListofTimersFunc[i] == Input) { ListofTimers[i].cancel() } } } ///////////////////////////////////////////////////////////////////// ////sendNotificationToContacts(text, recipients) def sendNotificationToContacts(String S, 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 \""+S+"\" to "+location.PhoneNums[j].toString()) } } } } ///////////////////////////////////////////////////////////////////// ////sendNotificationToContacts(text, recipients) def sendSms(long Phone, String S) { println("Sending \""+S+"\" to "+Phone.toString()) } /** * 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() EventHandler()