case "enum":
def randomVariable = Math.abs(new Random().nextInt() % 2)
def modes = ["Yes", "No"]
- def userInput = modes[randomVariable]
+ //def userInput = modes[randomVariable]
+ // TODO: We
+ //def modes = metaData['options']
+ def userInput = modes[0]
if (enumVariables == 0) {
enum0 = metaData['name']
while (Temp != "EOF"):
if (Temp == "def" or Temp == "private"):
Temp = GetToken(F)
- if (Temp == "def" or Temp == "private"):
- Temp = GetToken(F)
NameofFunc = Temp
- if (GetToken(F) == "("): #We have a function to create object for
+ if (GetToken(F) != "="): #We have a function to create object for
if (appName == "App1"):
extractedFunctionsApp1.write("//Global Object for functions in subscribe method!\n")
extractedFunctionsApp1.write("def %s = this.&" % NameofFunc)
extractedFunctionsApp2.write("//Global Object for functions in subscribe method!\n")
extractedFunctionsApp2.write("def %s = this.&" % NameofFunc)
extractedFunctionsApp2.write("%s\n" % NameofFunc)
-
+
#Check subscribed events
if (Temp == "subscribe"):
- counter = 0
- while (counter < 5 and Temp != "\""):
+ while (Temp != "\"" and Temp != "app" and Temp != "location"):
+ Temp = GetToken(F)
+ if Temp == "\"":
Temp = GetToken(F)
- counter = counter + 1
- Temp = GetToken(F)
- #If counter >= 5 that means it is not found, so it must be appTouch
- if (counter >= 5):
- Temp = "Touched"
if Temp not in eventMap:
eventMap.append(Temp)
AnalyzeCapabilities(Temp, appName)
Temp = GetToken(F)
-
+
#Warn if there is a potential for physical interaction
AnalyzePhysicalInteraction(app1Capabilities, app2Capabilities)
AnalyzePhysicalInteraction(app2Capabilities, app1Capabilities)
+
def AnalyzeCapabilities(Temp, appName):
#Illuminance related
def ExtractEvents(extractedEvents):
global eventMap
- extractedEvents.write("Random random = new Random(42)\n")
- extractedEvents.write("counter = 1000\n")
- extractedEvents.write("while(counter > 0) {\n")
- extractedEvents.write("\tdef eventNumber = random.nextInt(%d)\n" % (len(eventMap) - 1))
+ #extractedEvents.write("while(true) {\n")
+ extractedEvents.write("for(int i=0; i<100; i++) {\n")
+ extractedEvents.write("\tdef eventNumber = Verify.getInt(0,%d)\n" % (len(eventMap) - 1))
extractedEvents.write("\tswitch(eventNumber) {\n")
- eventCounter = 0;
for i in range(len(eventMap)):
- extractedEvents.write("\t\tcase %d:\n" % eventCounter)
+ extractedEvents.write("\t\tcase %d:\n" % i)
if eventMap[i] == "lock":
event = open("eventSimulator/lockEvent.groovy", "r")
for line in event:
for line in event:
extractedEvents.write(line)
event.close()
- elif eventMap[i] == "switch.on":
- event = open("eventSimulator/switchOnEvent.groovy", "r")
- for line in event:
- extractedEvents.write(line)
- event.close()
- elif eventMap[i] == "switch.off":
- event = open("eventSimulator/switchOffEvent.groovy", "r")
- for line in event:
- extractedEvents.write(line)
- event.close()
elif eventMap[i] == "nfcTouch":
event = open("eventSimulator/nfcTouchEvent.groovy", "r")
for line in event:
extractedEvents.write(line)
event.close()
- elif eventMap[i] == "Touched":
+ elif eventMap[i] == "app": #Case for Touched event
event = open("eventSimulator/appTouchEvent.groovy", "r")
for line in event:
extractedEvents.write(line)
event.close()
elif eventMap[i] == "button":
#Write two events subsequently
- event = open("eventSimulator/buttonPushedEvent.groovy", "r")
+ extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
+ extractedEvents.write("\t\t\tif (event == 0) {\n")
+ event = open("eventSimulator/buttonPushedEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- extractedEvents.write("\t\t\tbreak\n")
- eventCounter = eventCounter + 1
- extractedEvents.write("\t\tcase %d:\n" % eventCounter)
+ extractedEvents.write("\t\t\t} else {\n")
event = open("eventSimulator/buttonHeldEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
+ extractedEvents.write("\t\t\t}\n")
elif eventMap[i] == "presence":
#Write two events subsequently
- event = open("eventSimulator/presencePresentEvent.groovy", "r")
+ extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
+ extractedEvents.write("\t\t\tif (event == 0) {\n")
+ event = open("eventSimulator/presencePresentEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- extractedEvents.write("\t\t\tbreak\n")
- eventCounter = eventCounter + 1
- extractedEvents.write("\t\tcase %d:\n" % eventCounter)
+ extractedEvents.write("\t\t\t} else {\n")
event = open("eventSimulator/presenceLeftEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
+ extractedEvents.write("\t\t\t}\n")
elif eventMap[i] == "doorState":
#Write two events subsequently
- event = open("eventSimulator/doorOpenEvent.groovy", "r")
+ extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
+ extractedEvents.write("\t\t\tif (event == 0) {\n")
+ event = open("eventSimulator/doorOpenEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- extractedEvents.write("\t\t\tbreak\n")
- eventCounter = eventCounter + 1
- extractedEvents.write("\t\tcase %d:\n" % eventCounter)
+ extractedEvents.write("\t\t\t} else {\n")
event = open("eventSimulator/doorClosedEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- eventCounter = eventCounter + 1
-
- ###TODO: Add more events later
- extractedEvents.write("\n\t\t\tbreak\n")
- extractedEvents.write("\t}\n")
- extractedEvents.write("\tcounter--\n")
- extractedEvents.write("}\n")
-
-
-def AnalyzeCapabilities(Temp, appName):
- #Illuminance related
- if (Temp == "capability.switch" or
- Temp == "capability.switchLevel" or
- Temp == "capability.illuminanceMeasurement" or
- #Motion related
- Temp == "capability.motionSensor" or
- #Water related
- Temp == "capability.valve" or
- Temp == "capability.waterSensor" or
- #Sound related
- Temp == "capability.musicPlayer" or
- Temp == "capability.alarm" or
- Temp == "capability.speechSynthesis" or
- Temp == "capability.soundSensor"):
- if (appName == "App1"):
- app1Capabilities.append(Temp)
- else:
- app2Capabilities.append(Temp)
-
-def AnalyzePhysicalInteraction(app1Capab, app2Capab):
- #Light
- if ("capability.illuminanceMeasurement" in app1Capab) and ("capability.switch" in app2Capab or
- "capability.switchLevel" in app2Capab):
- print ("\nWARNING: Potential PHYSICAL CONFLICT (light) detected between App1 and App2!\n")
- #Motion
- if ("capability.motionSensor" in app1Capab):
- print ("\nWARNING: Potential PHYSICAL CONFLICT (motion) detected between App1 and App2!\n")
- #Water
- if ("capability.waterSensor" in app1Capab) and ("capability.valve" in app2Capab or
- "capability.switch" in app2Capab):
- print ("\nWARNING: Potential PHYSICAL CONFLICT (water) detected between App1 and App2!\n")
- #Sound
- if ("capability.soundSensor" in app1Capab) and ("capability.musicPlayer" in app2Capab or
- "capability.alarm" in app2Capab or "capability.speechSynthesis" in app2Capab):
- print ("\nWARNING: Potential PHYSICAL CONFLICT (sound) detected between App1 and App2!\n")
-
-def ExtractEvents(extractedEvents):
- global eventMap
- extractedEvents.write("Random random = new Random(42)\n")
- extractedEvents.write("counter = 1000\n")
- extractedEvents.write("while(counter > 0) {\n")
- extractedEvents.write("\tdef eventNumber = random.nextInt(%d)\n" % (len(eventMap) - 1))
- extractedEvents.write("\tswitch(eventNumber) {\n")
- eventCounter = 0;
- for i in range(len(eventMap)):
- extractedEvents.write("\t\tcase %d:\n" % eventCounter)
- if eventMap[i] == "lock":
- event = open("eventSimulator/lockEvent.groovy", "r")
+ extractedEvents.write("\t\t\t}\n")
+ elif eventMap[i] == "motion":
+ #Write two events subsequently
+ extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
+ extractedEvents.write("\t\t\tif (event == 0) {\n")
+ event = open("eventSimulator/motionActiveEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- elif eventMap[i] == "unlock":
- event = open("eventSimulator/unlockEvent.groovy", "r")
+ extractedEvents.write("\t\t\t} else {\n")
+ event = open("eventSimulator/motionInactiveEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- elif eventMap[i] == "contact.open":
- event = open("eventSimulator/contactOpenEvent.groovy", "r")
+ extractedEvents.write("\t\t\t}\n")
+ elif eventMap[i] == "smoke":
+ #Write three events subsequently
+ extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
+ extractedEvents.write("\t\t\tif (event == 0) {\n")
+ event = open("eventSimulator/smokeClearEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- elif eventMap[i] == "contact.closed":
- event = open("eventSimulator/contactClosedEvent.groovy", "r")
+ extractedEvents.write("\t\t\t} else if (event == 1) {\n")
+ event = open("eventSimulator/smokeDetectedEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- elif eventMap[i] == "switch.on":
- event = open("eventSimulator/switchOnEvent.groovy", "r")
+ extractedEvents.write("\t\t\t} else {\n")
+ event = open("eventSimulator/smokeTestedEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- elif eventMap[i] == "switch.off":
- event = open("eventSimulator/switchOffEvent.groovy", "r")
+ extractedEvents.write("\t\t\t}\n")
+ elif eventMap[i] == "carbonMonoxide":
+ #Write three events subsequently
+ extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
+ extractedEvents.write("\t\t\tif (event == 0) {\n")
+ event = open("eventSimulator/carbonMonoxideClearEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- elif eventMap[i] == "nfcTouch":
- event = open("eventSimulator/nfcTouchEvent.groovy", "r")
+ extractedEvents.write("\t\t\t} else if (event == 1) {\n")
+ event = open("eventSimulator/carbonMonoxideDetectedEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- elif eventMap[i] == "Touched":
- event = open("eventSimulator/appTouchEvent.groovy", "r")
+ extractedEvents.write("\t\t\t} else {\n")
+ event = open("eventSimulator/carbonMonoxideTestedEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- elif eventMap[i] == "button":
- #Write two events subsequently
- event = open("eventSimulator/buttonPushedEvent.groovy", "r")
+ extractedEvents.write("\t\t\t}\n")
+ elif eventMap[i] == "battery":
+ event = open("eventSimulator/batteryChargeEvent.groovy", "r")
for line in event:
extractedEvents.write(line)
event.close()
- extractedEvents.write("\t\t\tbreak\n")
- eventCounter = eventCounter + 1
- extractedEvents.write("\t\tcase %d:\n" % eventCounter)
- event = open("eventSimulator/buttonHeldEvent.groovy", "r")
+ elif eventMap[i] == "thermostatMode":
+ #Write five events subsequently
+ extractedEvents.write("\t\t\tdef event = Verify.getInt(0,4)\n")
+ extractedEvents.write("\t\t\tif (event == 0) {\n")
+ event = open("eventSimulator/thermostatAutoModeEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- elif eventMap[i] == "presence":
- #Write two events subsequently
- event = open("eventSimulator/presencePresentEvent.groovy", "r")
+ extractedEvents.write("\t\t\t} else if (event == 1) {\n")
+ event = open("eventSimulator/thermostatCoolModeEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- extractedEvents.write("\t\t\tbreak\n")
- eventCounter = eventCounter + 1
- extractedEvents.write("\t\tcase %d:\n" % eventCounter)
- event = open("eventSimulator/presenceLeftEvent.groovy", "r")
+ extractedEvents.write("\t\t\t} else if (event == 2) {\n")
+ event = open("eventSimulator/thermostatEmergencyHeatModeEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- elif eventMap[i] == "doorState":
+ extractedEvents.write("\t\t\t} else if (event == 3) {\n")
+ event = open("eventSimulator/thermostatHeatModeEvent.groovy", "r")
+ for line in event:
+ extractedEvents.write("\t\t" + line)
+ event.close()
+ extractedEvents.write("\t\t\t} else {\n")
+ event = open("eventSimulator/thermostatOffModeEvent.groovy", "r")
+ for line in event:
+ extractedEvents.write("\t\t" + line)
+ event.close()
+ extractedEvents.write("\t\t\t}\n")
+ elif eventMap[i] == "switch":
#Write two events subsequently
- event = open("eventSimulator/doorOpenEvent.groovy", "r")
+ extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
+ extractedEvents.write("\t\t\tif (event == 0) {\n")
+ event = open("eventSimulator/switchOnEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
event.close()
- extractedEvents.write("\t\t\tbreak\n")
- eventCounter = eventCounter + 1
- extractedEvents.write("\t\tcase %d:\n" % eventCounter)
- event = open("eventSimulator/doorClosedEvent.groovy", "r")
+ extractedEvents.write("\t\t\t} else {\n")
+ event = open("eventSimulator/switchOffEvent.groovy", "r")
for line in event:
- extractedEvents.write(line)
+ extractedEvents.write("\t\t" + line)
+ event.close()
+ extractedEvents.write("\t\t\t}\n")
+ elif eventMap[i] == "location": #Case for Location event
+ #Write three events subsequently
+ extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
+ extractedEvents.write("\t\t\tif (event == 0) {\n")
+ event = open("eventSimulator/locationHomeEvent.groovy", "r")
+ for line in event:
+ extractedEvents.write("\t\t" + line)
+ event.close()
+ extractedEvents.write("\t\t\t} else if (event == 1) {\n")
+ event = open("eventSimulator/locationAwayEvent.groovy", "r")
+ for line in event:
+ extractedEvents.write("\t\t" + line)
+ event.close()
+ extractedEvents.write("\t\t\t} else {\n")
+ event = open("eventSimulator/locationNightEvent.groovy", "r")
+ for line in event:
+ extractedEvents.write("\t\t" + line)
event.close()
- eventCounter = eventCounter + 1
+ extractedEvents.write("\t\t\t}\n")
###TODO: Add more events later
- extractedEvents.write("\n\t\t\tbreak\n")
+ extractedEvents.write("\t\t\tbreak\n")
extractedEvents.write("\t}\n")
- extractedEvents.write("\tcounter--\n")
+ #extractedEvents.write("\tcounter--\n")
extractedEvents.write("}\n")
#Extract objects to call functions from App1
case "enum":
def randomVariable = Math.abs(new Random().nextInt() % 2)
def modes = ["Yes", "No"]
- def userInput = modes[randomVariable]
+ //def userInput = modes[randomVariable]
+ // TODO: We
+ //def modes = metaData['options']
+ def userInput = modes[0]
if (enumVariables == 0) {
enum0 = metaData['name']
/**
- * NFC Tag Toggle
- *
- * Copyright 2014 SmartThings
+ * 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:
* 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.
*
+ * Make it So
+ *
+ * Author: SmartThings
+ * Date: 2013-03-06
*/
-
definition(
- name: "NFC Tag Toggle",
+ name: "Make It So",
namespace: "smartthings",
author: "SmartThings",
- description: "Allows toggling of a switch, lock, or garage door based on an NFC Tag touch event",
- category: "SmartThings Internal",
- iconUrl: "https://s3.amazonaws.com/smartapp-icons/Developers/nfc-tag-executor.png",
- iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Developers/nfc-tag-executor@2x.png",
- iconX3Url: "https://s3.amazonaws.com/smartapp-icons/Developers/nfc-tag-executor@2x.png")
-
+ description: "Saves the states of a specified set switches and thermostat setpoints and restores them at each mode change. To use 1) Set the mode, 2) Change switches and setpoint to where you want them for that mode, and 3) Install or update the app. Changing to that mode or touching the app will set the devices to the saved state.",
+ category: "Convenience",
+ iconUrl: "https://s3.amazonaws.com/smartapp-icons/Meta/light_thermo-switch.png",
+ iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Meta/light_thermo-switch@2x.png"
+)
preferences {
- page(name: "pageOne", title: "Device selection", uninstall: true, nextPage: "pageTwo") {
- section("Select an NFC tag") {
- input "tag", "capability.touchSensor", title: "NFC Tag"
- }
- section("Select devices to control") {
- input "switch1", "capability.switch", title: "Light or switch", required: false, multiple: true
- input "lock", "capability.lock", title: "Lock", required: false, multiple: true
- input "garageDoor", "capability.doorControl", title: "Garage door controller", required: false, multiple: true
- }
- }
-
- page(name: "pageTwo", title: "Master devices", install: true, uninstall: true)
-}
-
-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
- }
- }
+ section("Switches") {
+ input "switches", "capability.switch", multiple: true, required: false
+ }
+ section("Thermostats") {
+ input "thermostats", "capability.thermostat", multiple: true, required: false
+ }
+ section("Locks") {
+ input "locks", "capability.lock", multiple: true, required: false
+ }
}
def installed() {
- log.debug "Installed with settings: ${settings}"
-
- initialize()
+ subscribe(location, changedLocationMode)
+ subscribe(app, appTouch)
+ saveState()
}
def updated() {
- log.debug "Updated with settings: ${settings}"
-
unsubscribe()
- initialize()
+ subscribe(location, changedLocationMode)
+ subscribe(app, appTouch)
+ saveState()
}
-def initialize() {
- subscribe tag, "nfcTouch", touchHandler
- subscribe app, touchHandler
+def appTouch(evt)
+{
+ restoreState(currentMode)
}
-private currentStatus(devices, master, attribute) {
- log.trace "currentStatus($devices, $master, $attribute)"
- def result = null
- if (master) {
- result = devices.find{it.id == master}?.currentValue(attribute)
- }
- 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 changedLocationMode(evt)
+{
+ restoreState(evt.value)
}
-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()
- }
- }
- }
-
- if (lock) {
- def status = currentStatus(lock, masterLock, "lock")
- lock.each {
- if (status == "locked") {
- lock.unlock()
- }
- else {
- lock.lock()
- }
- }
- }
-
- if (garageDoor) {
- def status = currentStatus(garageDoor, masterDoor, "status")
- garageDoor.each {
- if (status == "open") {
- it.close()
- }
- else {
- it.open()
- }
- }
- }
+private restoreState(mode)
+{
+ log.info "restoring state for mode '$mode'"
+ def map = state[mode] ?: [:]
+ switches?.each {
+ def value = map[it.id]
+ if (value?.switch == "on") {
+ def level = value.level
+ if (level) {
+ log.debug "setting $it.label level to $level"
+ it.setLevel(level)
+ }
+ else {
+ log.debug "turning $it.label on"
+ it.on()
+ }
+ }
+ else if (value?.switch == "off") {
+ log.debug "turning $it.label off"
+ it.off()
+ }
+ }
+
+ thermostats?.each {
+ def value = map[it.id]
+ if (value?.coolingSetpoint) {
+ log.debug "coolingSetpoint = $value.coolingSetpoint"
+ it.setCoolingSetpoint(value.coolingSetpoint)
+ }
+ if (value?.heatingSetpoint) {
+ log.debug "heatingSetpoint = $value.heatingSetpoint"
+ it.setHeatingSetpoint(value.heatingSetpoint)
+ }
+ }
+
+ locks?.each {
+ def value = map[it.id]
+ if (value) {
+ if (value?.locked) {
+ it.lock()
+ }
+ else {
+ it.unlock()
+ }
+ }
+ }
+}
+
+
+private saveState()
+{
+ def mode = currentMode
+ def map = state[mode] ?: [:]
+
+ switches?.each {
+ map[it.id] = [switch: it.currentSwitch, level: it.currentLevel]
+ }
+
+ thermostats?.each {
+ map[it.id] = [coolingSetpoint: it.currentCoolingSetpoint, heatingSetpoint: it.currentHeatingSetpoint]
+ }
+
+ locks?.each {
+ map[it.id] = [locked: it.currentLock == "locked"]
+ }
+
+ state[mode] = map
+ log.debug "saved state for mode ${mode}: ${state[mode]}"
+ log.debug "state: $state"
}
+
+private getCurrentMode()
+{
+ location.mode ?: "_none_"
+}
\ No newline at end of file
--- /dev/null
+#!/usr/bin/python
+
+import itertools
+import sys
+import os
+
+# Input parameters:
+# - JPF directory
+# - JPF logs directory
+# - app directory
+# - list #1
+# - list #2 (if needed)
+
+# Index 0 is always for the Python script itself
+jpfDir = sys.argv[1]
+jpfLogDir = sys.argv[2]
+appDir = sys.argv[3]
+firstList = sys.argv[4]
+
+# PART 1: Generate the permutations of app pairs
+print "PHASE 1: Extracting the app pairs from the app lists ...\n"
+appList1 = []
+appList2 = []
+# Extract the first list
+extractAppList = open(firstList, "r")
+for app in extractAppList:
+ if '#' not in app:
+ appList1.append(app.strip())
+extractAppList.close()
+
+# Try to create pairs
+appPairs = []
+# Extract the second list if provided (this is for combinations between two lists)
+if (len(sys.argv) == 6):
+ secondList = sys.argv[5]
+ extractAppList = open(secondList, "r")
+ for app in extractAppList:
+ if '#' not in app:
+ appList2.append(app.strip())
+ extractAppList.close()
+# Just copy the first list to the second list
+else:
+ appList2 = appList1
+
+# Generate the permutations of pairs
+for i in range(len(appList1)):
+ for j in range(i + 1, len(appList2)):
+ appPairs.append((appList1[i], appList2[j]))
+
+# PART 2:
+print "PHASE 2: Running JPF ...\n"
+# List down all the log file names
+writeLogList = open(jpfLogDir + "logList", "w+")
+for item in appPairs:
+
+ # Copy apps into Extractor/App1 and Extractor/App2
+ os.system("cp " + appDir + item[0] + " Extractor/App1/App1.groovy")
+ os.system("cp " + appDir + item[1] + " Extractor/App2/App2.groovy")
+
+ # Run Runner.py to extract things and create main.groovy, then compile it
+ print "==> Compiling the apps ...\n"
+ os.system("make Runner")
+ os.system("make main")
+
+ # Call JPF
+ print "==> Calling JPF and generate logs ...\n"
+ logName = jpfLogDir + item[0] + "--" + item[1] + ".log"
+ writeLogList.write(logName + "\n")
+ os.system("cd " + jpfDir + ";./run.sh " + logName + " main.jpf")
+
+writeLogList.close()
Out.write("import Event.Event\n")
Out.write("import Timer.SimulatedTimer\n")
Out.write("\n")
+Out.write("//JPF's Verify API\n")
+Out.write("import gov.nasa.jpf.vm.Verify\n")
+Out.write("\n")
Out.write("//Global eventHandler\n")
for line in eventHandler:
Out.write(line)
\r
//By Apps\r
def runAfter(int delay, Closure closure) {\r
- thread = new Thread() {\r
+ /*thread = new Thread() {\r
\r
@Override\r
public void run() {\r
closure()\r
}\r
}.start()\r
- return thread\r
+ return thread*/\r
+ closure()\r
}\r
\r
def cancel() {\r
- if (thread != null)\r
- thread.stop()\r
+ //if (thread != null)\r
+ // thread.stop()\r
}\r
}\r
- appObject.setValue([name: "Touched", value: "Touched", deviceId: 0, descriptionText: "",
- displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
+ appObject.setValue([name: "Touched", value: "touched", deviceId: "touchedSensorID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ smokeDetectorObject.setValue([name: "battery", value: "5"/*A number between 0 to 100 as a charge*/, deviceId: "smokeDetectorID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
- aeonKeyFobObject.setValue([name: "button", value: "held", deviceId: 0, descriptionText: "",
- displayed: true, linkText: "", isStateChange: false, unit: "", data: [value: "held"]])
+ aeonKeyFobObject.setValue([name: "button", value: "held", deviceId: "aeonKeyFobID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
- aeonKeyFobObject.setValue([name: "button", value: "pushed", deviceId: 0, descriptionText: "",
- displayed: true, linkText: "", isStateChange: false, unit: "", data: [value: "pushed"]])
+ aeonKeyFobObject.setValue([name: "button", value: "pushed", deviceId: "aeonKeyFobID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ smokeDetectorObject.setValue([name: "carbonMonoxide", value: "clear", deviceId: "smokeDetectorID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ smokeDetectorObject.setValue([name: "carbonMonoxide", value: "detected", deviceId: "smokeDetectorID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ smokeDetectorObject.setValue([name: "carbonMonoxide", value: "tested", deviceId: "smokeDetectorID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
- contactObject.setValue([name: "contact.closed", value: "closed", deviceId: 0, descriptionText: "",
- displayed: true, linkText: "", isStateChange: false, unit: "", data: [value: "closed"]])
+ contactObject.setValue([name: "contact.closed", value: "closed", deviceId: "contactSensorID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
- contactObject.setValue([name: "contact.open", value: "closed", deviceId: 0, descriptionText: "",
- displayed: true, linkText: "", isStateChange: false, unit: "", data: [value: "open"]])
+ contactObject.setValue([name: "contact.open", value: "open", deviceId: "contactSensorID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
- doorControlObject.setValue([name: "doorState", value: "closed", deviceId: 0, descriptionText: "",
- displayed: true, linkText: "", isStateChange: false, unit: "", data: [value: "closed"]])
+ doorControlObject.setValue([name: "doorState", value: "closed", deviceId: "doorControlID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
- doorControlObject.setValue([name: "doorState", value: "open", deviceId: 0, descriptionText: "",
- displayed: true, linkText: "", isStateChange: false, unit: "", data: [value: "open"]])
+ doorControlObject.setValue([name: "doorState", value: "open", deviceId: "doorControlID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ locationObject.setValue([name: "Location", value: "away", deviceId: "locationID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ locationObject.setValue([name: "Location", value: "home", deviceId: "locationID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ locationObject.setValue([name: "Location", value: "night", deviceId: "locationID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
- lockObject.setValue([name: "lock", value: "locked", deviceId: 0, descriptionText: "",
- displayed: true, linkText: "", isStateChange: false, unit: "", data: [value: "locked"]])
+ lockObject.setValue([name: "lock", value: "locked", deviceId: "lockID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ motionSensorObject.setValue([name: "motion", value: "active", deviceId: "motionSensorID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ motionSensorObject.setValue([name: "motion", value: "inactive", deviceId: "motionSensorID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
- appObject.setValue([name: "nfcTouch", value: "Touched", deviceId: 0, descriptionText: "",
- displayed: true, linkText: "", isStateChange: false, unit: "", data: [value: "Touched"]])
+ appObject.setValue([name: "nfcTouch", value: "touched", deviceId: "nfcSensorID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
- presenceSensorObject.setValue([name: "presence", value: "not present", deviceId: 0, descriptionText: "",
- displayed: true, linkText: "", isStateChange: false, unit: "", data: [value: "not present"]])
+ presenceSensorObject.setValue([name: "presence", value: "not present", deviceId: "presenceSensorID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
- presenceSensorObject.setValue([name: "presence", value: "present", deviceId: 0, descriptionText: "",
- displayed: true, linkText: "", isStateChange: false, unit: "", data: [value: "present"]])
+ presenceSensorObject.setValue([name: "presence", value: "present", deviceId: "presenceSensorID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ smokeDetectorObject.setValue([name: "smoke", value: "clear", deviceId: "smokeDetectorID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ smokeDetectorObject.setValue([name: "smoke", value: "detected", deviceId: "smokeDetectorID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ smokeDetectorObject.setValue([name: "smoke", value: "tested", deviceId: "smokeDetectorID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ switchObject.setValue([name: "switch", value: "off", deviceId: "switchID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ switchObject.setValue([name: "switch", value: "on", deviceId: "switchID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ thermostatObject.setValue([name: "thermostatMode", value: "auto", deviceId: "thermostatID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ thermostatObject.setValue([name: "thermostatMode", value: "cool", deviceId: "thermostatID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ thermostatObject.setValue([name: "thermostatMode", value: "emergencyHeat", deviceId: "thermostatID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ thermostatObject.setValue([name: "thermostatMode", value: "heat", deviceId: "thermostatID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+ thermostatObject.setValue([name: "thermostatMode", value: "off", deviceId: "thermostatID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
- lockObject.setValue([name: "unlock", value: "unlocked ", deviceId: 0, descriptionText: "",
- displayed: true, linkText: "", isStateChange: false, unit: "", data: [value: "locked"]])
+ lockObject.setValue([name: "unlock", value: "unlocked ", deviceId: "lockID0", descriptionText: "",
+ displayed: true, linkText: "", isStateChange: false, unit: "", data: [info: "info"]])
--- /dev/null
+#!/bin/bash
+python ModelCheck.py ../jpf-core/ ../logs/ ../smartapps/ ../smartapps/appList1