From 4ad0a6fd9d56e26894812c54b34f656ba62eccfc Mon Sep 17 00:00:00 2001 From: Nicola Russo Date: Sun, 12 Jun 2016 08:35:14 -0500 Subject: [PATCH] MSA-1351: The Gideon AI smart app allows you to connect and control all of your smartThings devices with the Gideon AI app. Gideon AI smart app makes your smartThings device even smarter adding features like energy monitoring, vdeo surveillance history etc.. --- smartapps/gideon-api/gideon.src/gideon.groovy | 253 ++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 smartapps/gideon-api/gideon.src/gideon.groovy diff --git a/smartapps/gideon-api/gideon.src/gideon.groovy b/smartapps/gideon-api/gideon.src/gideon.groovy new file mode 100644 index 0000000..b277d25 --- /dev/null +++ b/smartapps/gideon-api/gideon.src/gideon.groovy @@ -0,0 +1,253 @@ +/** + * Gideon + * + * Copyright 2016 Nicola Russo + * + * 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: "Gideon", + namespace: "gideon.api", + author: "Braindrain Solutions", + description: "Gideon AI Smart app allows you to connect and control all of your SmartThings devices through the Gideon AI app, making your SmartThings devices even smarter.", + category: "Family", + iconUrl: "http://s33.postimg.org/t77u7y7v3/logo.png", + iconX2Url: "http://s33.postimg.org/t77u7y7v3/logo.png", + iconX3Url: "http://s33.postimg.org/t77u7y7v3/logo.png", + oauth: [displayName: "Gideon AI API", displayLink: "gideon.ai"]) + + +preferences { + section("Control these switches...") { + input "switches", "capability.switch", multiple:true + } + section("Control these motion sensors...") { + input "motions", "capability.motionSensor", multiple:true + } + section("Control these presence sensors...") { + input "presence_sensors", "capability.presenceSensor", multiple:true + } + section("Control these outlets...") { + input "outlets", "capability.switch", multiple:true + } + section("Control these locks...") { + input "locks", "capability.lock", multiple:true + } + section("Control these locks...") { + input "temperature_sensors", "capability.temperatureMeasurement" + } +} + +def installed() { + log.debug "Installed with settings: ${settings}" + + initialize() +} + +def updated() { + log.debug "Updated with settings: ${settings}" + + unsubscribe() + initialize() +} + +def initialize() { + // TODO: subscribe to attributes, devices, locations, etc. + subscribe(outlet, "energy", outletHandler) + subscribe(outlet, "switch", outletHandler) +} + +// TODO: implement event handlers +def outletHandler(evt) { + log.debug "$outlet.currentEnergy" + //TODO call G API +} + + +private device(it, type) { + it ? [id: it.id, label: it.label, type: type] : null +} + +//API Mapping +mappings { + path("/getalldevices") { + action: [ + GET: "getAllDevices" + ] + } + path("/doorlocks/:id/:command") { + action: [ + GET: "updateDoorLock" + ] + } + path("/doorlocks/:id") { + action: [ + GET: "getDoorLockStatus" + ] + } + path("/tempsensors/:id") { + action: [ + GET: "getTempSensorsStatus" + ] + } + path("/presences/:id") { + action: [ + GET: "getPresenceStatus" + ] + } + path("/motions/:id") { + action: [ + GET: "getMotionStatus" + ] + } + path("/outlets/:id") { + action: [ + GET: "getOutletStatus" + ] + } + path("/outlets/:id/:command") { + action: [ + GET: "updateOutlet" + ] + } + path("/switches/:command") { + action: [ + PUT: "updateSwitch" + ] + } +} + +//API Methods +def getAllDevices() { + def locks_list = locks.collect{device(it,"Lock")} + def presences_list = presence_sensors.collect{device(it,"Presence")} + def motions_list = motions.collect{device(it,"Motion")} + def outlets_list = outlets.collect{device(it,"Outlet")} + def switches_list = switches.collect{device(it,"Switch")} + def temp_list = temperature_sensors.collect{device(it,"Temperature")} + return [Locks: locks_list, Presences: presences_list, Motions: motions_list, Outlets: outlets_list, Switches: switches_list, Temperatures: temp_list] +} + +//LOCKS +def getDoorLockStatus() { + def device = locks.find { it.id == params.id } + if (!device) { + httpError(404, "Device not found") + } else { + return [Device_state: device.currentValue('lock')] + } +} + +def updateDoorLock() { + def command = params.command + def device = locks.find { it.id == params.id } + if (command){ + if (!device) { + httpError(404, "Device not found") + } else { + if(command == "toggle") + { + if(device.currentValue('lock') == "locked") + device.unlock(); + else + device.lock(); + + return [Device_id: params.id, result_action: "200"] + } + } + } +} + +//PRESENCE +def getPresenceStatus() { + + def device = presence_sensors.find { it.id == params.id } + if (!device) { + httpError(404, "Device not found") + } else { + return [Device_state: device.currentValue('presence')] + } +} + +//MOTION +def getMotionStatus() { + + def device = motions.find { it.id == params.id } + if (!device) { + httpError(404, "Device not found") + } else { + return [Device_state: device.currentValue('motion')] + } +} + +//OUTLET +def getOutletStatus() { + + def device = outlets.find { it.id == params.id } + if (!device) { + httpError(404, "Device not found") + } else { + return [Device_state: device.currentSwitch, Current_watt: device.currentValue("energy")] + } +} + +def updateOutlet() { + + def command = params.command + def device = outlets.find { it.id == params.id } + if (command){ + if (!device) { + httpError(404, "Device not found") + } else { + if(command == "toggle") + { + if(device.currentSwitch == "on") + device.off(); + else + device.on(); + + return [Device_id: params.id, result_action: "200"] + } + } + } +} + +//SWITCH +def updateSwitch() { + def command = params.command + def device = switches.find { it.id == params.id } + if (command){ + if (!device) { + httpError(404, "Device not found") + } else { + if(command == "toggle") + { + if(device.currentSwitch == "on") + device.off(); + else + device.on(); + + return [Device_id: params.id, result_action: "200"] + } + } + } +} + +//TEMPERATURE +def getTempSensorsStatus() { + + def device = temperature_sensors.find { it.id == params.id } + if (!device) { + httpError(404, "Device not found") + } else { + return [Device_state: device.currentValue('temperature')] + } +} \ No newline at end of file