import AeonKeyFob.AeonKeyFobs
import MusicPlayer.MusicPlayer
import MusicPlayer.MusicPlayers
+import MotionSensor.MotionSensor
+import MotionSensor.MotionSensors
+import ImageCapture.ImageCapture
+import ImageCapture.ImageCaptures
+import SmokeDetector.SmokeDetector
+import SmokeDetector.SmokeDetectors
+import Alarm.Alarm
+import Alarm.Alarms
+import SpeechSynthesis.SpeechSynthesis
+import SpeechSynthesis.SpeechSynthesises
+import AccelerationSensor.AccelerationSensor
+import AccelerationSensor.AccelerationSensors
+import Battery.Battery
+import Battery.Batteries
+import BeaconSensor.BeaconSensor
+import BeaconSensor.BeaconSensors
+import CarbonMonoxideDetector.CarbonMonoxideDetector
+import CarbonMonoxideDetector.CarbonMonoxideDetectors
+import ColorControl.ColorControl
+import ColorControl.ColorControls
+import EnergyMeter.EnergyMeter
+import EnergyMeter.EnergyMeters
+import IlluminanceMeasurement.IlluminanceMeasurement
+import IlluminanceMeasurement.IlluminanceMeasurements
+import PowerMeter.PowerMeter
+import PowerMeter.PowerMeters
+import RelativeHumidityMeasurement.RelativeHumidityMeasurement
+import RelativeHumidityMeasurement.RelativeHumidityMeasurements
+import RelaySwitch.RelaySwitch
+import RelaySwitch.RelaySwitches
+import SleepSensor.SleepSensor
+import SleepSensor.SleepSensors
+import StepSensor.StepSensor
+import StepSensor.StepSensors
+import SwitchLevel.SwitchLevel
+import SwitchLevel.SwitchLevels
+import TemperatureMeasurement.TemperatureMeasurement
+import TemperatureMeasurement.TemperatureMeasurements
+import WaterSensor.WaterSensor
+import WaterSensor.WaterSensors
+import Valve.Valve
+import Valve.Valves
+import MobilePresence.MobilePresence
+import MobilePresence.MobilePresences
import Timer.SimulatedTimer
//GlobalVariables
@Field def state = [home:[],away:[],night:[]]
//Create a global logger object for methods
@Field def log = new Logger()
+//Create a global variable for optional property
+@Field def optional = false //by default for now
//Global variables for files
+//Some of methods-May be needed even in install
+/////////////////////////////////////////////////////////////////////
+def timeToday(String time, Object timeZone) {
+ def timeOfDay = new Date()
+ def _inputTime = time.split(':')
+ def inputTime = Integer.parseInt(_inputTime[0])*3600+Integer.parseInt(_inputTime[1])*60+1564191100415
+ timeOfDay.time = inputTime
+ return timeOfDay
+}
+
//Global objects
@Field def musicPlayerObject0
@Field def musicPlayerObject1
@Field def musicPlayerObject2
-//Global Object for class music player!
+//Global Object for class aeon key fob!
@Field aeonKeyFobObjects = 0
@Field def aeonKeyFobObject0
@Field def aeonKeyFobObject1
@Field def aeonKeyFobObject2
+//Global Object for class motion sensor!
+@Field motionSensorObjects = 0
+@Field def motionSensorObject0
+@Field def motionSensorObject1
+@Field def motionSensorObject2
+//Global Object for class image capture!
+@Field imageCaptureObjects = 0
+@Field def imageCaptureObject0
+@Field def imageCaptureObject1
+@Field def imageCaptureObject2
+//Global Object for class smoke detector!
+@Field smokeDetectorObjects = 0
+@Field def smokeDetectorObject0
+@Field def smokeDetectorObject1
+@Field def smokeDetectorObject2
+//Global Object for class alarm!
+@Field alarmObjects = 0
+@Field def alarmObject0
+@Field def alarmObject1
+@Field def alarmObject2
+//Global Object for class speech synthesis!
+@Field speechSynthesisObjects = 0
+@Field def speechSynthesisObject0
+@Field def speechSynthesisObject1
+@Field def speechSynthesisObject2
+//Global Object for class acceleration sensor!
+@Field accelerationSensorObjects = 0
+@Field def accelerationSensorObject0
+@Field def accelerationSensorObject1
+@Field def accelerationSensorObject2
+//Global Object for class battery!
+@Field batteryObjects = 0
+@Field def batteryObject0
+@Field def batteryObject1
+@Field def batteryObject2
+//Global Object for class beacon sensor!
+@Field beaconSensorObjects = 0
+@Field def beaconSensorObject0
+@Field def beaconSensorObject1
+@Field def beaconSensorObject2
+//Global Object for class carbon monoxide detector!
+@Field carbonMonoxideDetectorObjects = 0
+@Field def carbonMonoxideDetectorObject0
+@Field def carbonMonoxideDetectorObject1
+@Field def carbonMonoxideDetectorObject2
+//Global Object for class color control!
+@Field colorControlObjects = 0
+@Field def colorControlObject0
+@Field def colorControlObject1
+@Field def colorControlObject2
+//Global Object for class energy meter!
+@Field energyMeterObjects = 0
+@Field def energyMeterObject0
+@Field def energyMeterObject1
+@Field def energyMeterObject2
+//Global Object for class energy meter!
+@Field illuminanceMeasurementObjects = 0
+@Field def illuminanceMeasurementObject0
+@Field def illuminanceMeasurementObject1
+@Field def illuminanceMeasurementObject2
+//Global Object for class power meter!
+@Field powerMeterObjects = 0
+@Field def powerMeterObject0
+@Field def powerMeterObject1
+@Field def powerMeterObject2
+//Global Object for class power meter!
+@Field humidityMeasurementObjects = 0
+@Field def humidityMeasurementObject0
+@Field def humidityMeasurementObject1
+@Field def humidityMeasurementObject2
+//Global Object for class relay switch!
+@Field relaySwitchObjects = 0
+@Field def relaySwitchObject0
+@Field def relaySwitchObject1
+@Field def relaySwitchObject2
+//Global Object for class sleep sensor!
+@Field sleepSensorObjects = 0
+@Field def sleepSensorObject0
+@Field def sleepSensorObject1
+@Field def sleepSensorObject2
+//Global Object for class sleep sensor!
+@Field stepSensorObjects = 0
+@Field def stepSensorObject0
+@Field def stepSensorObject1
+@Field def stepSensorObject2
+//Global Object for class switch level!
+@Field switchLevelObjects = 0
+@Field def switchLevelObject0
+@Field def switchLevelObject1
+@Field def switchLevelObject2
+//Global Object for class temperature measurement!
+@Field temperatureMeasurementObjects = 0
+@Field def temperatureMeasurementObject0
+@Field def temperatureMeasurementObject1
+@Field def temperatureMeasurementObject2
+//Global Object for class temperature measurement!
+@Field waterSensorObjects = 0
+@Field def waterSensorObject0
+@Field def waterSensorObject1
+@Field def waterSensorObject2
+//Global Object for class valve!
+@Field valveObjects = 0
+@Field def valveObject0
+@Field def valveObject1
+@Field def valveObject2
+//Global Object for class valve!
+@Field mobilePresenceObjects = 0
+@Field def mobilePresenceObject0
+@Field def mobilePresenceObject1
+@Field def mobilePresenceObject2
+
//Global variables
@Field number3
@Field number4
@Field number5
+//For decimal
+@Field decimalVariables = 0
+@Field decimal0
+@Field decimal1
+@Field decimal2
+@Field decimal3
+@Field decimal4
+@Field decimal5
//For time
@Field timeVariables = 0
@Field time0
@Field contact3
@Field contact4
@Field contact5
-
+//For text
+@Field textVariables = 0
+@Field textVariable0
+@Field textVariable1
+@Field textVariable2
+@Field textVariable3
+@Field textVariable4
+@Field textVariable5
+//For boolean
+@Field boolVariables = 0
+@Field boolVariable0
+@Field boolVariable1
+@Field boolVariable2
+@Field boolVariable3
+@Field boolVariable4
+@Field boolVariable5
/////Input Methods/////
input(metaData)
}
+//input "", "", linkedHashMap, Closure
+def input(LinkedHashMap metaData, String name, String type, Closure Input) {
+ metaData.put('name',name)
+ metaData.put('type',type)
+ input(metaData)
+ find(Input)
+}
+
//input linkedHashMap
def input(LinkedHashMap metaData) {
if (metaData.containsKey('title')) {
}
break
case "capability.alarm":
+ if (alarmObjects == 0) {
+ alarmObject0 = metaData['name']
+ this[alarmObject0] = new Alarms({}, 1)
+ } else if (alarmObjects == 1) {
+ alarmObject1 = metaData['name']
+ this[alarmObject1] = new Alarms({}, 1)
+ } else if (alarmObjects == 2) {
+ alarmObject2 = metaData['name']
+ this[alarmObject2] = new Alarms({}, 1)
+ }
+
+ alarmObjects=alarmObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class alarm!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.alarmObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class alarm!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.alarmObject\n")
+ }
break
case "capability.battery":
+ if (batteryObjects == 0) {
+ batteryObject0 = metaData['name']
+ this[batteryObject0] = new Batteries({}, 1)
+ } else if (batteryObjects == 1) {
+ batteryObject1 = metaData['name']
+ this[batteryObject1] = new Batteries({}, 1)
+ } else if (batteryObjects == 2) {
+ batteryObject2 = metaData['name']
+ this[batteryObject2] = new Batteries({}, 1)
+ }
+
+ batteryObjects=batteryObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class Battery!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.batteryObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class Battery!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.batteryObject\n")
+ }
break
case "capability.beacon":
+ if (beaconSensorObjects == 0) {
+ beaconSensorObject0 = metaData['name']
+ this[beaconSensorObject0] = new BeaconSensors({}, 1)
+ } else if (beaconSensorObjects == 1) {
+ beaconSensorObject1 = metaData['name']
+ this[beaconSensorObject1] = new BeaconSensors({}, 1)
+ } else if (beaconSensorObjects == 2) {
+ beaconSensorObject2 = metaData['name']
+ this[beaconSensorObject2] = new BeaconSensors({}, 1)
+ }
+
+ beaconSensorObjects=beaconSensorObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class beacon sensor!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.beaconSensorObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class beacon sensor!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.beaconSensorObject\n")
+ }
break
case "capability.carbonMonoxideDetector":
+ if (carbonMonoxideDetectorObjects == 0) {
+ carbonMonoxideDetectorObject0 = metaData['name']
+ this[carbonMonoxideDetectorObject0] = new CarbonMonoxideDetectors({}, 1)
+ } else if (carbonMonoxideDetectorObjects == 1) {
+ carbonMonoxideDetectorObject1 = metaData['name']
+ this[carbonMonoxideDetectorObject1] = new CarbonMonoxideDetectors({}, 1)
+ } else if (carbonMonoxideDetectorObjects == 2) {
+ carbonMonoxideDetectorObject2 = metaData['name']
+ this[carbonMonoxideDetectorObject2] = new CarbonMonoxideDetectors({}, 1)
+ }
+
+ carbonMonoxideDetectorObjects=carbonMonoxideDetectorObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class carbon monoxide detector!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.carbonMonoxideDetectorObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class carbon monoxide detector!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.carbonMonoxideDetectorObject\n")
+ }
break
case "capability.colorControl":
+ if (colorControlObjects == 0) {
+ colorControlObject0 = metaData['name']
+ this[colorControlObject0] = new ColorControls({}, 1)
+ } else if (colorControlObjects == 1) {
+ colorControlObject1 = metaData['name']
+ this[colorControlObject1] = new ColorControls({}, 1)
+ } else if (colorControlObjects == 2) {
+ colorControlObject2 = metaData['name']
+ this[colorControlObject2] = new ColorControls({}, 1)
+ }
+
+ colorControlObjects=colorControlObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class color control!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.colorControlObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class color control!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.colorControlObject\n")
+ }
break
case "capability.contactSensor":
if (contactObjects == 0) {
}
break
case "capability.energyMeter":
+ if (energyMeterObjects == 0) {
+ energyMeterObject0 = metaData['name']
+ this[energyMeterObject0] = new EnergyMeters({}, 1)
+ } else if (energyMeterObjects == 1) {
+ energyMeterObject1 = metaData['name']
+ this[energyMeterObject1] = new EnergyMeters({}, 1)
+ } else if (energyMeterObjects == 2) {
+ energyMeterObject2 = metaData['name']
+ this[energyMeterObject2] = new EnergyMeters({}, 1)
+ }
+
+ energyMeterObjects=energyMeterObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class energy meter!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.energyMeterObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class energy meter!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.energyMeterObject\n")
+ }
break
case "capability.illuminanceMeasurement":
+ if (illuminanceMeasurementObjects == 0) {
+ illuminanceMeasurementObject0 = metaData['name']
+ this[illuminanceMeasurementObject0] = new IlluminanceMeasurements({}, 1)
+ } else if (illuminanceMeasurementObjects == 1) {
+ illuminanceMeasurementObject1 = metaData['name']
+ this[illuminanceMeasurementObject1] = new IlluminanceMeasurements({}, 1)
+ } else if (illuminanceMeasurementObjects == 2) {
+ illuminanceMeasurementObject2 = metaData['name']
+ this[illuminanceMeasurementObject2] = new IlluminanceMeasurements({}, 1)
+ }
+
+ illuminanceMeasurementObjects=illuminanceMeasurementObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class illuminance measurement!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.illuminanceMeasurementObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class illuminance measurement!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.illuminanceMeasurementObject\n")
+ }
break
case "capability.accelerationSensor":
+ if (accelerationSensorObjects == 0) {
+ accelerationSensorObject0 = metaData['name']
+ this[accelerationSensorObject0] = new AccelerationSensors({}, 1)
+ } else if (accelerationSensorObjects == 1) {
+ accelerationSensorObject1 = metaData['name']
+ this[accelerationSensorObject1] = new AccelerationSensors({}, 1)
+ } else if (accelerationSensorObjects == 2) {
+ accelerationSensorObject2 = metaData['name']
+ this[accelerationSensorObject2] = new AccelerationSensors({}, 1)
+ }
+
+ accelerationSensorObjects=accelerationSensorObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class Acceleration Sensor!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.accelerationSensorObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class Acceleration Sensor!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.accelerationSensorObject\n")
+ }
break
case "capability.motionSensor":
+ if (motionSensorObjects == 0) {
+ motionSensorObject0 = metaData['name']
+ this[motionSensorObject0] = new MotionSensors({}, 1)
+ } else if (motionSensorObjects == 1) {
+ motionSensorObject1 = metaData['name']
+ this[motionSensorObject1] = new MotionSensors({}, 1)
+ } else if (motionSensorObjects == 2) {
+ motionSensorObject2 = metaData['name']
+ this[motionSensorObject2] = new MotionSensors({}, 1)
+ }
+
+ motionSensorObjects=motionSensorObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class Motion Sensor!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.motionSensorObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class Motion Sensor!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.motionSensorObject\n")
+ }
break
case "capability.musicPlayer":
if (musicPlayerObjects == 0) {
}
break
case "capability.powerMeter":
+ if (powerMeterObjects == 0) {
+ powerMeterObject0 = metaData['name']
+ this[powerMeterObject0] = new PowerMeters({}, 1)
+ } else if (powerMeterObjects == 1) {
+ powerMeterObject1 = metaData['name']
+ this[powerMeterObject1] = new PowerMeters({}, 1)
+ } else if (powerMeterObjects == 2) {
+ powerMeterObject2 = metaData['name']
+ this[powerMeterObject2] = new PowerMeters({}, 1)
+ }
+
+ powerMeterObjects=powerMeterObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class power meter!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.powerMeterObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class power meter!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.powerMeterObject\n")
+ }
break
case "capability.presenceSensor":
if (presenceSensorObjects == 0) {
}
break
case "capability.relativeHumidityMeasurement":
+ if (humidityMeasurementObjects == 0) {
+ humidityMeasurementObject0 = metaData['name']
+ this[humidityMeasurementObject0] = new RelativeHumidityMeasurements({}, 1)
+ } else if (humidityMeasurementObjects == 1) {
+ humidityMeasurementObject1 = metaData['name']
+ this[humidityMeasurementObject1] = new RelativeHumidityMeasurements({}, 1)
+ } else if (humidityMeasurementObjects == 2) {
+ humidityMeasurementObject2 = metaData['name']
+ this[humidityMeasurementObject2] = new RelativeHumidityMeasurements({}, 1)
+ }
+
+ humidityMeasurementObjects=humidityMeasurementObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class humidity measurement!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.humidityMeasurementObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class humidity measurement!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.humidityMeasurementObject\n")
+ }
break
case "capability.relaySwitch":
+ if (relaySwitchObjects == 0) {
+ relaySwitchObject0 = metaData['name']
+ this[relaySwitchObject0] = new RelaySwitches({}, 1)
+ } else if (relaySwitchObjects == 1) {
+ relaySwitchObject1 = metaData['name']
+ this[relaySwitchObject1] = new RelaySwitches({}, 1)
+ } else if (relaySwitchObjects == 2) {
+ relaySwitchObject2 = metaData['name']
+ this[relaySwitchObject2] = new RelaySwitches({}, 1)
+ }
+
+ relaySwitchObjects=relaySwitchObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class relay switch!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.relaySwitchObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class relay switch!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.relaySwitchObject\n")
+ }
break
case "capability.sleepSensor":
+ if (sleepSensorObjects == 0) {
+ sleepSensorObject0 = metaData['name']
+ this[sleepSensorObject0] = new SleepSensors({}, 1)
+ } else if (sleepSensorObjects == 1) {
+ sleepSensorObject1 = metaData['name']
+ this[sleepSensorObject1] = new SleepSensors({}, 1)
+ } else if (sleepSensorObjects == 2) {
+ sleepSensorObject2 = metaData['name']
+ this[sleepSensorObject2] = new SleepSensors({}, 1)
+ }
+
+ sleepSensorObjects=sleepSensorObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class sleep sensor!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.sleepSensorObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class sleep sensor!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.sleepSensorObject\n")
+ }
break
case "capability.smokeDetector":
+ if (smokeDetectorObjects == 0) {
+ smokeDetectorObject0 = metaData['name']
+ this[smokeDetectorObject0] = new SmokeDetectors({}, 1)
+ } else if (smokeDetectorObjects == 1) {
+ smokeDetectorObject1 = metaData['name']
+ this[smokeDetectorObject1] = new SmokeDetectors({}, 1)
+ } else if (smokeDetectorObjects == 2) {
+ smokeDetectorObject2 = metaData['name']
+ this[smokeDetectorObject2] = new SmokeDetectors({}, 1)
+ }
+
+ smokeDetectorObjects=smokeDetectorObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class smoke detector!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.smokeDetectorObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class smoke detector!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.smokeDetectorObject\n")
+ }
break
case "capability.stepSensor":
+ if (stepSensorObjects == 0) {
+ stepSensorObject0 = metaData['name']
+ this[stepSensorObject0] = new StepSensors({}, 1)
+ } else if (stepSensorObjects == 1) {
+ stepSensorObject1 = metaData['name']
+ this[stepSensorObject1] = new StepSensors({}, 1)
+ } else if (stepSensorObjects == 2) {
+ stepSensorObject2 = metaData['name']
+ this[stepSensorObject2] = new StepSensors({}, 1)
+ }
+
+ stepSensorObjects=stepSensorObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class step sensor!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.stepSensorObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class step sensor!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.stepSensorObject\n")
+ }
break
case "capability.switch":
if (switchObjects == 0) {
}
break
case "capability.switchLevel":
+ if (switchLevelObjects == 0) {
+ switchLevelObject0 = metaData['name']
+ this[switchLevelObject0] = new SwitchLevels({}, 1)
+ } else if (switchLevelObjects == 1) {
+ switchLevelObject1 = metaData['name']
+ this[switchLevelObject1] = new SwitchLevels({}, 1)
+ } else if (switchLevelObjects == 2) {
+ switchLevelObject2 = metaData['name']
+ this[switchLevelObject2] = new SwitchLevels({}, 1)
+ }
+
+ switchLevelObjects=switchLevelObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class switch level!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.switchLevelObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class switch level!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.switchLevelObject\n")
+ }
break
case "capability.temperatureMeasurement":
+ if (temperatureMeasurementObjects == 0) {
+ temperatureMeasurementObject0 = metaData['name']
+ this[temperatureMeasurementObject0] = new TemperatureMeasurements({}, 1)
+ } else if (temperatureMeasurementObjects == 1) {
+ temperatureMeasurementObject1 = metaData['name']
+ this[temperatureMeasurementObject1] = new TemperatureMeasurements({}, 1)
+ } else if (temperatureMeasurementObjects == 2) {
+ temperatureMeasurementObject2 = metaData['name']
+ this[temperatureMeasurementObject2] = new TemperatureMeasurements({}, 1)
+ }
+
+ temperatureMeasurementObjects=temperatureMeasurementObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class temperature measurement!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.temperatureMeasurementObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class temperature measurement!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.temperatureMeasurementObject\n")
+ }
break
case "capability.thermostat":
if (thermostatObjects == 0) {
}
break
case "capability.valve":
+ if (valveObjects == 0) {
+ valveObject0 = metaData['name']
+ this[valveObject0] = new Valves({}, 1)
+ } else if (valveObjects == 1) {
+ valveObject1 = metaData['name']
+ this[valveObject1] = new Valves({}, 1)
+ } else if (valveObjects == 2) {
+ valveObject2 = metaData['name']
+ this[valveObject2] = new Valves({}, 1)
+ }
+
+ valveObjects=valveObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class valve!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.valveObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class valve!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.valveObject\n")
+ }
+ break
+ case "capability.speechSynthesis":
+ if (speechSynthesisObjects == 0) {
+ speechSynthesisObject0 = metaData['name']
+ this[speechSynthesisObject0] = new SpeechSynthesises({}, 1)
+ } else if (speechSynthesisObjects == 1) {
+ speechSynthesisObject1 = metaData['name']
+ this[speechSynthesisObject1] = new SpeechSynthesises({}, 1)
+ } else if (speechSynthesisObjects == 2) {
+ speechSynthesisObject2 = metaData['name']
+ this[speechSynthesisObject2] = new SpeechSynthesises({}, 1)
+ }
+
+ speechSynthesisObjects=speechSynthesisObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class speech synthesis!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.speechSynthesisObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class speech synthesis!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.speechSynthesisObject\n")
+ }
break
case "capability.waterSensor":
+ if (waterSensorObjects == 0) {
+ waterSensorObject0 = metaData['name']
+ this[waterSensorObject0] = new WaterSensors({}, 1)
+ } else if (waterSensorObjects == 1) {
+ waterSensorObject1 = metaData['name']
+ this[waterSensorObject1] = new WaterSensors({}, 1)
+ } else if (waterSensorObjects == 2) {
+ waterSensorObject2 = metaData['name']
+ this[waterSensorObject2] = new WaterSensors({}, 1)
+ }
+
+ waterSensorObjects=waterSensorObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class water sensor!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.waterSensorObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class water sensor!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.waterSensorObject\n")
+ }
break
case "capability.touchSensor":
if (touchSensorObjects == 0) {
}
break
case "capability.imageCapture":
+ if (imageCaptureObjects == 0) {
+ imageCaptureObject0 = metaData['name']
+ this[imageCaptureObject0] = new ImageCaptures({}, 1)
+ } else if (imageCaptureObjects == 1) {
+ imageCaptureObject1 = metaData['name']
+ this[imageCaptureObject1] = new ImageCaptures({}, 1)
+ } else if (imageCaptureObjects == 2) {
+ imageCaptureObject2 = metaData['name']
+ this[imageCaptureObject2] = new ImageCaptures({}, 1)
+ }
+
+ imageCaptureObjects=imageCaptureObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class Image Capture!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.imageCaptureObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class Image Capture!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.imageCaptureObject\n")
+ }
break
case "device.mobilePresence":
+ if (mobilePresenceObjects == 0) {
+ mobilePresenceObject0 = metaData['name']
+ this[mobilePresenceObject0] = new MobilePresences({}, 1)
+ } else if (mobilePresenceObjects == 1) {
+ mobilePresenceObject1 = metaData['name']
+ this[mobilePresenceObject1] = new MobilePresences({}, 1)
+ } else if (mobilePresenceObjects == 2) {
+ mobilePresenceObject2 = metaData['name']
+ this[mobilePresenceObject2] = new MobilePresences({}, 1)
+ }
+
+ mobilePresenceObjects=mobilePresenceObjects+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Object for class mobile presence!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp1.append(metaData['name']+" = obj.mobilePresenceObject\n")
+ } else {
+ extractedObjectsApp2.append("//Object for class mobile presence!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+"\n")
+ extractedObjectsConstructorApp2.append(metaData['name']+" = obj.mobilePresenceObject\n")
+ }
break
case "device.aeonKeyFob":
if (aeonKeyFobObjects == 0) {
}
break
case "mode":
- def userInput = System.console().readLine 'Enter the mode:'
+ def randomVariable = Math.abs(new Random().nextInt() % 3)
+ def modes = ["away", "home", "night"]
+ def userInput = modes[randomVariable]
if (modeVariables == 0) {
mode0 = metaData['name']
}
break
case "decimal":
+ def userInput = Math.abs(new Random().nextInt() % 60) + 40
+
+ if (decimalVariables == 0) {
+ decimal0 = metaData['name']
+ this[decimal0] = userInput
+ } else if (decimalVariables == 1) {
+ decimal1 = metaData['name']
+ this[decimal1] = userInput
+ } else if (decimalVariables == 2) {
+ decimal2 = metaData['name']
+ this[decimal2] = userInput
+ } else if (decimalVariables == 3) {
+ decimal3 = metaData['name']
+ this[decimal3] = userInput
+ } else if (decimalVariables == 4) {
+ decimal4 = metaData['name']
+ this[decimal4] = userInput
+ } else if (decimalVariables == 5) {
+ decimal5 = metaData['name']
+ this[decimal5] = userInput
+ }
+
+ decimalVariables=decimalVariables+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Global variable for decimal number!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
+ } else {
+ extractedObjectsApp2.append("//Global variable for decimal number!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+" = "+userInput+"\n")
+ }
break
case "text":
+ def userInput = "This is just a text!"
+
+ if (textVariables == 0) {
+ text0 = metaData['name']
+ this[text0] = userInput
+ } else if (textVariables == 1) {
+ text1 = metaData['name']
+ this[text1] = userInput
+ } else if (textVariables == 2) {
+ text2 = metaData['name']
+ this[text2] = userInput
+ } else if (textVariables == 3) {
+ text3 = metaData['name']
+ this[text3] = userInput
+ } else if (textVariables == 4) {
+ text4 = metaData['name']
+ this[text4] = userInput
+ } else if (textVariables == 5) {
+ text5 = metaData['name']
+ this[text5] = userInput
+ }
+
+ textVariables=textVariables+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Global variable for text!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
+ } else {
+ extractedObjectsApp2.append("//Global variable for text!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
+ }
break
case "number":
- def userInput = System.console().readLine 'Enter the number:'
+ def userInput = Math.abs(new Random().nextInt() % 60) + 40
if (numberVariables == 0) {
number0 = metaData['name']
}
break
case "time":
- def userInput = System.console().readLine 'Enter the time:'
+ def userInput = "15:00"
if (timeVariables == 0) {
time0 = metaData['name']
}
break
case "enum":
- def userInput = System.console().readLine 'Enter the enum:'
+ if (metaData['options'] != null)
+ modes = metaData['options']
+ else // If it is not named 'options' then it is captured as 'metadata'
+ modes = metaData['metadata']
+ def userInput = modes[0]
if (enumVariables == 0) {
enum0 = metaData['name']
}
break
case "bool":
+ def userInput = Math.abs(new Random().nextInt() % 2)
+
+ if (boolVariables == 0) {
+ bool0 = metaData['name']
+ this[bool0] = userInput
+ } else if (boolVariables == 1) {
+ bool1 = metaData['name']
+ this[bool1] = userInput
+ } else if (boolVariables == 2) {
+ bool2 = metaData['name']
+ this[bool2] = userInput
+ } else if (boolVariables == 3) {
+ bool3 = metaData['name']
+ this[bool3] = userInput
+ } else if (boolVariables == 4) {
+ bool4 = metaData['name']
+ this[bool4] = userInput
+ } else if (boolVariables == 5) {
+ bool5 = metaData['name']
+ this[bool5] = userInput
+ }
+
+ boolVariables=boolVariables+1
+
+ settings.put(metaData['name'], metaData['name'])
+
+ if (App == "App1") {
+ extractedObjectsApp1.append("//Global variable for boolean!\n")
+ extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
+ } else {
+ extractedObjectsApp2.append("//Global variable for boolean!\n")
+ extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
+ }
break
case "phone":
- def userInput = System.console().readLine 'Enter the phone:'
+ def userInput = 9495379373
if (phoneVariables == 0) {
phone0 = metaData['name']
}
break
case "contact":
- def userInput = System.console().readLine 'Enter the metaData['name'] of the contact:'
+ def userInput = "AJ"
if (contactVariables == 0) {
contact0 = metaData['name']
println("//IGNORE--ForMobileUse//")
}
+
+def href(LinkedHashMap metaData) {
+ println("//IGNORE--some data//")
+}
+
+def href(LinkedHashMap metaData, String name) {
+ println("//IGNORE--some data//")
+}
/////Input Methods/////
find(inputData) //Run the closure to extract sections/inputMethods
}
+def paragraph(String paragraphText) {
+ println(paragraphText)
+}
+
def section(String title, Closure inputData) {
println(title)
find(inputData) //Run the closure to extract inputMethods
def section(LinkedHashMap metaData, Closure inputData) {
find(inputData) //Run the closure to extract inputMethods
}
+
+def mappings(Closure inputData) {
+ println("//IGNORE--some data//")
+}
/////MethodsForExtraction/////
-////////////////
+/**
+ * Beacon Control
+ *
+ * Copyright 2014 Physical Graph Corporation
+ *
+ * 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: "NFC Tag Toggle",
- 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")
-
+ name: "Beacon Control",
+ category: "SmartThings Internal",
+ namespace: "smartthings",
+ author: "SmartThings",
+ description: "Execute a Hello, Home phrase, turn on or off some lights, and/or lock or unlock your door when you enter or leave a monitored region",
+ iconUrl: "https://s3.amazonaws.com/smartapp-icons/MiscHacking/mindcontrol.png",
+ iconX2Url: "https://s3.amazonaws.com/smartapp-icons/MiscHacking/mindcontrol@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)
+ page(name: "timeIntervalInput", title: "Only during a certain time") {
+ section {
+ input "starting", "time", title: "Starting", required: false
+ input "ending", "time", title: "Ending", required: false
+ }
+ }
+
+ page(name: "mainPage")
}
-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.") {
+def mainPage() {
+ dynamicPage(name: "mainPage", install: true, uninstall: true) {
- 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("Where do you want to watch?") {
+ input name: "beacons", type: "capability.beacon", title: "Select your beacon(s)",
+ multiple: true, required: true
}
- section([mobileOnly:true]) {
- label title: "Assign a name", required: false
- mode title: "Set for specific mode(s)", required: false
+
+ section("Who do you want to watch for?") {
+ input name: "phones", type: "device.mobilePresence", title: "Select your phone(s)",
+ multiple: true, required: true
+ }
+
+ section("What do you want to do on arrival?") {
+ input name: "arrivalPhrase", type: "enum", title: "Execute a phrase",
+ options: listPhrases(), required: false
+ input "arrivalOnSwitches", "capability.switch", title: "Turn on some switches",
+ multiple: true, required: false
+ input "arrivalOffSwitches", "capability.switch", title: "Turn off some switches",
+ multiple: true, required: false
+ input "arrivalLocks", "capability.lock", title: "Unlock the door",
+ multiple: true, required: false
}
- }
+
+ section("What do you want to do on departure?") {
+ input name: "departPhrase", type: "enum", title: "Execute a phrase",
+ options: listPhrases(), required: false
+ input "departOnSwitches", "capability.switch", title: "Turn on some switches",
+ multiple: true, required: false
+ input "departOffSwitches", "capability.switch", title: "Turn off some switches",
+ multiple: true, required: false
+ input "departLocks", "capability.lock", title: "Lock the door",
+ multiple: true, required: false
+ }
+
+ section("Do you want to be notified?") {
+ input "pushNotification", "bool", title: "Send a push notification"
+ input "phone", "phone", title: "Send a text message", description: "Tap to enter phone number",
+ required: false
+ }
+
+ section {
+ label title: "Give your automation a name", description: "e.g. Goodnight Home, Wake Up"
+ }
+
+ def timeLabel = timeIntervalLabel()
+ section(title: "More options", hidden: hideOptionsSection(), hideable: true) {
+ href "timeIntervalInput", title: "Only during a certain time",
+ description: timeLabel ?: "Tap to set", state: timeLabel ? "complete" : "incomplete"
+
+ input "days", "enum", title: "Only on certain days of the week", multiple: true, required: false,
+ options: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
+
+ input "modes", "mode", title: "Only when mode is", multiple: true, required: false
+ }
+ }
}
+// Lifecycle management
def installed() {
- log.debug "Installed with settings: ${settings}"
-
+ log.debug "<beacon-control> Installed with settings: ${settings}"
initialize()
}
def updated() {
- log.debug "Updated with settings: ${settings}"
-
+ log.debug "<beacon-control> Updated with settings: ${settings}"
unsubscribe()
initialize()
}
def initialize() {
- subscribe tag, "nfcTouch", touchHandler
- subscribe app, touchHandler
-}
-
-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 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()
- }
- }
- }
+ subscribe(beacons, "presence", beaconHandler)
+}
- if (lock) {
- def status = currentStatus(lock, masterLock, "lock")
- lock.each {
- if (status == "locked") {
- lock.unlock()
- }
- else {
- lock.lock()
- }
- }
- }
+// Event handlers
+def beaconHandler(evt) {
+ log.debug "<beacon-control> beaconHandler: $evt"
+
+ if (allOk) {
+ def data = new groovy.json.JsonSlurper().parseText(evt.data)
+ // removed logging of device names. can be added back for debugging
+ //log.debug "<beacon-control> data: $data - phones: " + phones*.deviceNetworkId
+
+ def beaconName = getBeaconName(evt)
+ // removed logging of device names. can be added back for debugging
+ //log.debug "<beacon-control> beaconName: $beaconName"
- if (garageDoor) {
- def status = currentStatus(garageDoor, masterDoor, "status")
- garageDoor.each {
- if (status == "open") {
- it.close()
+ def phoneName = getPhoneName(data)
+ // removed logging of device names. can be added back for debugging
+ //log.debug "<beacon-control> phoneName: $phoneName"
+ if (phoneName != null) {
+ def action = data.presence == "1" ? "arrived" : "left"
+ def msg = "$phoneName has $action ${action == 'arrived' ? 'at ' : ''}the $beaconName"
+
+ if (action == "arrived") {
+ msg = arriveActions(msg)
+ }
+ else if (action == "left") {
+ msg = departActions(msg)
}
- else {
- it.open()
+ log.debug "<beacon-control> msg: $msg"
+
+ if (pushNotification || phone) {
+ def options = [
+ method: (pushNotification && phone) ? "both" : (pushNotification ? "push" : "sms"),
+ phone: phone
+ ]
+ sendNotification(msg, options)
}
}
- }
+ }
+}
+
+// Helpers
+private arriveActions(msg) {
+ if (arrivalPhrase || arrivalOnSwitches || arrivalOffSwitches || arrivalLocks) msg += ", so"
+
+ if (arrivalPhrase) {
+ log.debug "<beacon-control> executing: $arrivalPhrase"
+ executePhrase(arrivalPhrase)
+ msg += " ${prefix('executed')} $arrivalPhrase."
+ }
+ if (arrivalOnSwitches) {
+ log.debug "<beacon-control> turning on: $arrivalOnSwitches"
+ arrivalOnSwitches.on()
+ msg += " ${prefix('turned')} ${list(arrivalOnSwitches)} on."
+ }
+ if (arrivalOffSwitches) {
+ log.debug "<beacon-control> turning off: $arrivalOffSwitches"
+ arrivalOffSwitches.off()
+ msg += " ${prefix('turned')} ${list(arrivalOffSwitches)} off."
+ }
+ if (arrivalLocks) {
+ log.debug "<beacon-control> unlocking: $arrivalLocks"
+ arrivalLocks.unlock()
+ msg += " ${prefix('unlocked')} ${list(arrivalLocks)}."
+ }
+ msg
+}
+
+private departActions(msg) {
+ if (departPhrase || departOnSwitches || departOffSwitches || departLocks) msg += ", so"
+
+ if (departPhrase) {
+ log.debug "<beacon-control> executing: $departPhrase"
+ executePhrase(departPhrase)
+ msg += " ${prefix('executed')} $departPhrase."
+ }
+ if (departOnSwitches) {
+ log.debug "<beacon-control> turning on: $departOnSwitches"
+ departOnSwitches.on()
+ msg += " ${prefix('turned')} ${list(departOnSwitches)} on."
+ }
+ if (departOffSwitches) {
+ log.debug "<beacon-control> turning off: $departOffSwitches"
+ departOffSwitches.off()
+ msg += " ${prefix('turned')} ${list(departOffSwitches)} off."
+ }
+ if (departLocks) {
+ log.debug "<beacon-control> unlocking: $departLocks"
+ departLocks.lock()
+ msg += " ${prefix('locked')} ${list(departLocks)}."
+ }
+ msg
+}
+
+private prefix(word) {
+ def result
+ def index = settings.prefixIndex == null ? 0 : settings.prefixIndex + 1
+ switch (index) {
+ case 0:
+ result = "I $word"
+ break
+ case 1:
+ result = "I also $word"
+ break
+ case 2:
+ result = "And I $word"
+ break
+ default:
+ result = "And $word"
+ break
+ }
+
+ settings.prefixIndex = index
+ log.trace "prefix($word'): $result"
+ result
+}
+
+private listPhrases() {
+ location.helloHome.getPhrases().label
+}
+
+private executePhrase(phraseName) {
+ if (phraseName) {
+ location.helloHome.execute(phraseName)
+ log.debug "<beacon-control> executed phrase: $phraseName"
+ }
+}
+
+private getBeaconName(evt) {
+ def beaconName = beacons.find { b -> b.id == evt.deviceId }
+ return beaconName
+}
+
+private getPhoneName(data) {
+ def phoneName = phones.find { phone ->
+ // Work around DNI bug in data
+ def pParts = phone.deviceNetworkId.split('\\|')
+ def dParts = data.dni.split('\\|')
+ pParts[0] == dParts[0]
+ }
+ return phoneName
+}
+
+private hideOptionsSection() {
+ (starting || ending || days || modes) ? false : true
+}
+
+private getAllOk() {
+ modeOk && daysOk && timeOk
+}
+
+private getModeOk() {
+ def result = !modes || modes.contains(location.mode)
+ log.trace "<beacon-control> modeOk = $result"
+ result
+}
+
+private getDaysOk() {
+ def result = true
+ if (days) {
+ def df = new java.text.SimpleDateFormat("EEEE")
+ if (location.timeZone) {
+ df.setTimeZone(location.timeZone)
+ }
+ else {
+ df.setTimeZone(TimeZone.getTimeZone("America/New_York"))
+ }
+ def day = df.format(new Date())
+ result = days.contains(day)
+ }
+ log.trace "<beacon-control> daysOk = $result"
+ result
+}
+
+private getTimeOk() {
+ def result = true
+ if (starting && ending) {
+ def currTime = now()
+ def start = timeToday(starting, location?.timeZone).time
+ def stop = timeToday(ending, location?.timeZone).time
+ result = start < stop ? currTime >= start && currTime <= stop : currTime <= stop || currTime >= start
+ }
+ log.trace "<beacon-control> timeOk = $result"
+ result
+}
+
+private hhmm(time, fmt = "h:mm a") {
+ def t = timeToday(time, location.timeZone)
+ def f = new java.text.SimpleDateFormat(fmt)
+ f.setTimeZone(location.timeZone ?: timeZone(time))
+ f.format(t)
+}
+
+private timeIntervalLabel() {
+ (starting && ending) ? hhmm(starting) + "-" + hhmm(ending, "h:mm a z") : ""
+}
+
+private list(Object names) {
+ return names[0]
}