Commit #8: New version of extractor with running the preferences method make things...
[smartthings-infrastructure.git] / main.groovy
index d0d579664406ff6254a92e6a19b2d419b996152a..e282ed898bdaa5ef71e779d2b0902564e7705ad1 100644 (file)
@@ -3,16 +3,23 @@
 import groovy.transform.Field
 
 //Importing Classes
-import ContactSensor.Contacting
-import ContactSensor.Contacts
-import Lock.Locking
+import ContactSensor.ContactSensor
+import ContactSensor.ContactSensors
+import DoorControl.DoorControl
+import DoorControl.DoorControls
+import Lock.Lock
 import Lock.Locks
-import Switch.Switching
+import Thermostat.Thermostat
+import Thermostat.Thermostats
+import Switch.Switch
 import Switch.Switches
+import PresenceSensor.PresenceSensor
+import PresenceSensor.PresenceSensors
 import Logger.Logger
 import Location.LocationVar
 import Location.Phrase
 import appTouch.Touched
+import NfcTouch.NfcTouch
 import Event.Event
 import Timer.SimulatedTimer
 
@@ -53,18 +60,24 @@ def eventHandler(LinkedHashMap eventDataMap) {
                        }
 //Object for location
 @Field def locationObject = new LocationVar()
-//Object for touch
+//Object for touch to call function
 @Field def appObject = new Touched(sendEvent, 0)
 //Create a global list for events
 @Field def evt = []
-
-//Extracted global objects for both Apps
-//Global Object for class lock!
-@Field def lockObject = new Locking(sendEvent,1)
-//Global Object for class contactSensor!
-@Field def contactObject = new Contacting(sendEvent,1)
+//Global Object for class Touch Sensor!
+@Field def touchSensorObject = new NfcTouch(sendEvent, 1)
 //Global Object for class switch!
-@Field def switchObject = new Switching(sendEvent, 1)
+@Field def switchObject = new Switches(sendEvent, 1)
+//Global Object for class lock!
+@Field def lockObject = new Locks(sendEvent, 1)
+//Global Object for class door control!
+@Field def doorControlObject = new DoorControls(sendEvent, 1)
+//Global Object for class contact sensor!
+@Field def contactObject = new ContactSensors(sendEvent, 1)
+//Global Object for class presence sensor!
+@Field def presenceSensorObject = new PresenceSensors(sendEvent, 1)
+//Global Object for class thermostat!
+@Field def thermostatObject = new Thermostats(sendEvent, 1)
 
 //Application #1
 class App1 {
@@ -73,39 +86,43 @@ class App1 {
        def app
 
        //Extracted objects for App1
+       //Object for class Touch Sensor!
+       def tag
+       //Object for class switch!
+       def switch1
        //Object for class lock!
-       def lock1
-       //Object for class contactSensor!
-       def contact
-       //Global variable for number!
-       def minutesLater = 1
-       //Global variable for number!
-       def secondsLater = 10
-       //Global variable for contact!
-       def recipients = "AJ"
-       //Global variable for phone!
-       def phoneNumber = 9495379373
+       def lock
+       //Object for class door control!
+       def garageDoor
+       //Global variable for enum!
+       def masterSwitch = "40"
+       //Global variable for enum!
+       def masterLock = "20"
+       //Global variable for enum!
+       def masterDoor = "40"
 
        //Extracted objects for functions for App1
        //Global Object for functions in subscribe method!
+       def pageTwo = this.&pageTwo
+       //Global Object for functions in subscribe method!
        def installed = this.&installed
        //Global Object for functions in subscribe method!
        def updated = this.&updated
        //Global Object for functions in subscribe method!
        def initialize = this.&initialize
        //Global Object for functions in subscribe method!
-       def lockDoor = this.&lockDoor
+       def currentStatus = this.&currentStatus
        //Global Object for functions in subscribe method!
-       def unlockDoor = this.&unlockDoor
-       //Global Object for functions in subscribe method!
-       def doorHandler = this.&doorHandler
+       def touchHandler = this.&touchHandler
 
        App1(Object obj) {
                reference = obj
                location = obj.locationObject
                app = obj.appObject
-               lock1 = obj.lockObject
-               contact = obj.contactObject
+               tag = obj.touchSensorObject
+               switch1 = obj.switchObject
+               lock = obj.lockObject
+               garageDoor = obj.doorControlObject
        }
        //Global variables for each app
        //Settings variable defined to settings on purpose
@@ -134,9 +151,15 @@ class App1 {
        /////////////////////////////////////////////////////////////////////
        ////subscribe(obj, func)
        def subscribe(Object obj, Closure FunctionToCall) {
-               objectList.add(obj)
-               eventList.add("Touched")
-               functionList.add(FunctionToCall)
+               if (obj == app) {
+                       objectList.add(obj)
+                       eventList.add("Touched")
+                       functionList.add(FunctionToCall)
+               } else if (obj == location) {
+                       objectList.add(obj)
+                       eventList.add("Location")
+                       functionList.add(FunctionToCall)
+               }
        }
        ////subscribe(obj, event, func)
        def subscribe(Object obj, String event, Closure FunctionToCall) {
@@ -252,88 +275,104 @@ class App1 {
                }
        }
 
-       def installed(){
-           initialize()
+       def pageTwo() {
+               dynamicPage(name: "pageTwo") {
+               section("If set, the state of these devices will be toggled each time the tag is touched, " + 
+                       "e.g. a light that's on will be turned off and one that's off will be turned on, " +
+                       "other devices of the same type will be set to the same state as their master device. " +
+                       "If no master is designated then the majority of devices of the same type will be used " +
+                       "to determine whether to turn on or off the devices.") {
+                   
+                   if (switch1 || masterSwitch) {
+                       input "masterSwitch", "enum", title: "Master switch", options: switch1.collect{[(it.id): it.displayName]}, required: false
+                   }
+                   if (lock || masterLock) {
+                       input "masterLock", "enum", title: "Master lock", options: lock.collect{[(it.id): it.displayName]}, required: false
+                   }
+                   if (garageDoor || masterDoor) {
+                       input "masterDoor", "enum", title: "Master door", options: garageDoor.collect{[(it.id): it.displayName]}, required: false
+                   }            
+                       }
+                       section([mobileOnly:true]) {
+                               label title: "Assign a name", required: false
+                               mode title: "Set for specific mode(s)", required: false
+                       }        
+           }
        }
        
-       def updated(){
-           unsubscribe()
-           unschedule()
-           initialize()
+       def installed() {
+               log.debug "Installed with settings: ${settings}"
+       
+               initialize()
        }
        
-       def initialize(){
-           log.debug "Settings: ${settings}"
-           subscribe(lock1, "lock", doorHandler, [filterEvents: false])
-           subscribe(lock1, "unlock", doorHandler, [filterEvents: false])  
-           subscribe(contact, "contact.open", doorHandler)
-           subscribe(contact, "contact.closed", doorHandler)
+       def updated() {
+               log.debug "Updated with settings: ${settings}"
+       
+               unsubscribe()
+               initialize()
        }
        
-       def lockDoor(){
-           log.debug "Locking the door."
-           lock1.lock()
-           if(location.contactBookEnabled) {
-               if ( recipients ) {
-                   log.debug ( "Sending Push Notification..." ) 
-                   sendNotificationToContacts( "${lock1} locked after ${contact} was closed for ${minutesLater} minutes!", recipients)
-               }
-           }
-           if (phoneNumber) {
-               log.debug("Sending text message...")
-               sendSms( phoneNumber, "${lock1} locked after ${contact} was closed for ${minutesLater} minutes!")
-           }
+       def initialize() {
+               subscribe tag, "nfcTouch", touchHandler
+           subscribe app, touchHandler
        }
        
-       def unlockDoor(){
-           log.debug "Unlocking the door."
-           lock1.unlock()
-           if(location.contactBookEnabled) {
-               if ( recipients ) {
-                   log.debug ( "Sending Push Notification..." ) 
-                   sendNotificationToContacts( "${lock1} unlocked after ${contact} was opened for ${secondsLater} seconds!", recipients)
-               }
+       private currentStatus(devices, master, attribute) {
+               log.trace "currentStatus($devices, $master, $attribute)"
+               def result = null
+               if (master) {
+               result = devices.find{it.id == master}?.currentValue(attribute)
            }
-           if ( phoneNumber ) {
-               log.debug("Sending text message...")
-               sendSms( phoneNumber, "${lock1} unlocked after ${contact} was opened for ${secondsLater} seconds!")
+           else {
+               def map = [:]
+               devices.each {
+                       def value = it.currentValue(attribute)
+                   map[value] = (map[value] ?: 0) + 1
+                   log.trace "$it.displayName: $value"
+               }
+               log.trace map
+               result = map.collect{it}.sort{it.value}[-1].key
            }
+           log.debug "$attribute = $result"
+           result
        }
        
-       def doorHandler(evt){
-           if ((contact.latestValue("contact") == "open") && (evt.value == "locked")) { // If the door is open and a person locks the door then...  
-               //def delay = (secondsLater) // runIn uses seconds
-               runIn( secondsLater, unlockDoor )   // ...schedule (in minutes) to unlock...  We don't want the door to be closed while the lock is engaged. 
-           }
-           else if ((contact.latestValue("contact") == "open") && (evt.value == "unlocked")) { // If the door is open and a person unlocks it then...
-               unschedule( unlockDoor ) // ...we don't need to unlock it later.
-           }
-           else if ((contact.latestValue("contact") == "closed") && (evt.value == "locked")) { // If the door is closed and a person manually locks it then...
-               unschedule( lockDoor ) // ...we don't need to lock it later.
-           }   
-           else if ((contact.latestValue("contact") == "closed") && (evt.value == "unlocked")) { // If the door is closed and a person unlocks it then...
-              //def delay = (minutesLater * 60) // runIn uses seconds
-               runIn( (minutesLater * 60), lockDoor ) // ...schedule (in minutes) to lock.
-           }
-           else if ((lock1.latestValue("lock") == "unlocked") && (evt.value == "open")) { // If a person opens an unlocked door...
-               unschedule( lockDoor ) // ...we don't need to lock it later.
-           }
-           else if ((lock1.latestValue("lock") == "unlocked") && (evt.value == "closed")) { // If a person closes an unlocked door...
-               //def delay = (minutesLater * 60) // runIn uses seconds
-               runIn( (minutesLater * 60), lockDoor ) // ...schedule (in minutes) to lock.
+       def touchHandler(evt) {
+               log.trace "touchHandler($evt.descriptionText)"
+           if (switch1) {
+               def status = currentStatus(switch1, masterSwitch, "switch")
+               switch1.each {
+                   if (status == "on") {
+                       it.off()
+                   }
+                   else {
+                       it.on()
+                   }
+               }
            }
-           else { //Opening or Closing door when locked (in case you have a handle lock)
-               log.debug "Unlocking the door."
-               lock1.unlock()
-               if(location.contactBookEnabled) {
-                   if ( recipients ) {
-                       log.debug ( "Sending Push Notification..." ) 
-                       sendNotificationToContacts( "${lock1} unlocked after ${contact} was opened or closed when ${lock1} was locked!", recipients)
+           
+           if (lock) {
+               def status = currentStatus(lock, masterLock, "lock")
+               lock.each {
+                   if (status == "locked") {
+                       lock.unlock()
+                   }
+                   else {
+                       lock.lock()
                    }
                }
-               if ( phoneNumber ) {
-                   log.debug("Sending text message...")
-                   sendSms( phoneNumber, "${lock1} unlocked after ${contact} was opened or closed when ${lock1} was locked!")
+           }
+           
+           if (garageDoor) {
+               def status = currentStatus(garageDoor, masterDoor, "status")
+               garageDoor.each {
+                       if (status == "open") {
+                       it.close()
+                   }
+                   else {
+                       it.open()
+                   }
                }
            }
        }
@@ -354,9 +393,9 @@ class App2 {
        //Object for class lock!
        def lock1
        //Global variable for mode!
-       def newMode = "away"
+       def newMode = "home"
        //Global variable for number!
-       def waitfor = 4
+       def waitfor = 10
 
        //Extracted objects for functions for App2
        //Global Object for functions in subscribe method!
@@ -401,9 +440,15 @@ class App2 {
        /////////////////////////////////////////////////////////////////////
        ////subscribe(obj, func)
        def subscribe(Object obj, Closure FunctionToCall) {
-               objectList.add(obj)
-               eventList.add("Touched")
-               functionList.add(FunctionToCall)
+               if (obj == app) {
+                       objectList.add(obj)
+                       eventList.add("Touched")
+                       functionList.add(FunctionToCall)
+               } else if (obj == location) {
+                       objectList.add(obj)
+                       eventList.add("Location")
+                       functionList.add(FunctionToCall)
+               }
        }
        ////subscribe(obj, event, func)
        def subscribe(Object obj, String event, Closure FunctionToCall) {
@@ -551,71 +596,48 @@ class App2 {
 app1.installed()
 app2.installed()
 
-       // Generate a random variable
-       Random random = new Random(1131)
-       int nextRandom = 10
-       
-       // Touch events
-       new Thread() {
-               @Override
-               public void run() {
-                       while(true) {
-                               appObject.setValue([name: "Touched", value: "Touched", deviceId: 0, descriptionText: "",
-                                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
-                               Thread.sleep(random.nextInt(nextRandom));       
-                               
-                       }
-               }
-       }.start()
-       
-       // Lock events
-       new Thread() {
-               
-               @Override
-               public void run() {
-                       while(true) {
-                               lockObject.setValue([name: "lock", value: "locked", deviceId: 0, descriptionText: "",
-                                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
-                               Thread.sleep(random.nextInt(nextRandom));       
-                       }
-               }
-       }.start()
-       
-       new Thread() {
-               
-               @Override
-               public void run() {
-                       while(true) {
-                               lockObject.setValue([name: "unlock", value: "unlocked", deviceId: 0, descriptionText: "",
-                                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
-                               Thread.sleep(random.nextInt(nextRandom));       
-                       }
-               }
-       }.start()
-       
-       // Contact sensor events
-       new Thread() {
-               
-               @Override
-               public void run() {
-                       while(true) {
-                               contactObject.setValue([name: "contact.open", value: "open", deviceId: 0, descriptionText: "",
-                                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
-                               Thread.sleep(random.nextInt(nextRandom));       
-                               
-                       }
-               }
-       }.start()
-       
-       new Thread() {
-               
-               @Override
-               public void run() {
-                       while(true) {
-                               contactObject.setValue([name: "contact.closed", value: "closed", deviceId: 0, descriptionText: "",
-                                                  displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
-                               Thread.sleep(random.nextInt(nextRandom));       
-                               
-                       }
-               }
-       }.start()
+def events = [1,2,3,4,5,6,7]
+def list = events.permutations()
+int count = Verify.getInt(0,list.size()-1)
+println "COUNT: " + count
+
+list[count].each {
+  switch(it) {
+    case 1:
+      appObject.setValue([name: "Touched", value: "Touched", deviceId: 0, descriptionText: "",
+                                          displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
+      println "1"
+      break
+    case 2:
+      lockObject.setValue([name: "lock0", value: "locked", deviceId: 0, descriptionText: "",
+                                          displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
+      println "   2"
+                       break
+    case 3:
+      lockObject.setValue([name: "lock0", value: "unlocked", deviceId: 0, descriptionText: "",
+                                          displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
+      println "      3"
+      break
+    case 4:
+      contactObject.setValue([name: "contact0", value: "open", deviceId: 0, descriptionText: "",
+                                          displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
+      println "         4"
+      break
+    case 5:
+      contactObject.setValue([name: "contact0", value: "closed", deviceId: 0, descriptionText: "",
+                                          displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
+      println "            5"
+      break
+    case 6:
+      switchObject.setValue([name: "switch0", value: "on", deviceId: 0, descriptionText: "",
+                                          displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
+      println "               6"
+      break
+    case 7:
+      switchObject.setValue([name: "switch0", value: "off", deviceId: 0, descriptionText: "",
+                                          displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
+      println "                   7"
+    default:
+      break
+  }
+}