From 3f74c8fd4d8e34aa570842bdde1b6aa29e398abe Mon Sep 17 00:00:00 2001 From: Qblinks Date: Thu, 10 Aug 2017 04:29:06 -0700 Subject: [PATCH] MSA-2155: Quantum is an iPaaS (integration platform as a service) designed for your Smart Home products. With Quantum, you can easily integrate your product with different 3rd party smart home products around the world through a single API call. Smart home features of Qblinks Inc. products are powered by Quantum. --- smartapps/quantum/quantum.src/quantum.groovy | 203 +++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 smartapps/quantum/quantum.src/quantum.groovy diff --git a/smartapps/quantum/quantum.src/quantum.groovy b/smartapps/quantum/quantum.src/quantum.groovy new file mode 100644 index 0000000..61c6f1a --- /dev/null +++ b/smartapps/quantum/quantum.src/quantum.groovy @@ -0,0 +1,203 @@ +import grails.converters.JSON + +/** +* JSON API Access App +*/ + +definition( + name: "Quantum", + namespace: "Quantum", + author: "Qblinks", + description: "Quantum is an iPaaS (integration platform as a service) designed for your Smart Home products. With Quantum, you can easily integrate your product with different 3rd party smart home products around the world through a single API call. Smart home features of Qblinks Inc. products are powered by Quantum.", + category: "Convenience", + iconUrl: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png", + iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png", + iconX3Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png", + oauth: true +) + +preferences { + section("Allow these things to be exposed via JSON...") { + input "switches", "capability.colorControl", title: "Switches", multiple: true, required: false, hideWhenEmpty: true + input "outlets", "capability.outlet", title: "Outlets", multiple: true, required: false, hideWhenEmpty: true + } +} + +mappings { + path("/switchDiscovery") { + action: [ + GET: "listSwitches" + ] + } + path("/outletDiscovery") { + action: [ + GET: "listOutlets" + ] + } + path("/switchAction/:id/:command/:value") { + action: [ + PUT: "actionSwitches" + ] + } + path("/outletAction/:id/:command") { + action: [ + PUT: "actionOutlets" + ] + } + path("/switchStat/:id") { + action: [ + GET: "statSwitches" + ] + } + path("/outletStat/:id") { + action: [ + GET: "statOutlets" + ] + } +} + +def listSwitches() { + [ switches: switches.collect{device(it, "switch")} ] +} + +def listOutlets() { + [ outlets: outlets.collect{device(it, "outlet")} ] +} + +void actionSwitches() { + def device = switches.find { it.id == params.id } + def command = params.command + + switch(command) { + case "on": + if (!device) { + httpError(404, "Device not found") + } else { + device.on() + //def newValue = [level: body.level as Integer ?: 100] + //device.setColor(newValue) + } + break + case "off": + if (!device) { + httpError(404, "Device not found") + } else { + device.off() + } + break + case "bri": + if (!device) { + httpError(404, "Device not found") + } else { + def newValue = [level: params.value as Integer ?: 0] + device.setColor(newValue) + } + break + case "sat": + if (!device) { + httpError(404, "Device not found") + } else { + def newValue = [saturation: params.value as Integer ?: 0] + device.setColor(newValue) + } + break + case "hue": + if (!device) { + httpError(404, "Device not found") + } else { + def newValue = [hue: params.value as Integer ?: 0] + device.setColor(newValue) + } + break + case "allOn": + switches.on() + break + case "allOff": + switches.off() + break + default: + httpError(404, "$command is not a valid command for all outlets specified") + } +} + +def statSwitches() { + show(switches, "switch") +} + +void actionOutlets() { + def device = outlets.find { it.id == params.id } + def command = params.command + + switch(command) { + case "on": + if (!device) { + httpError(404, "Device not found") + } else { + device.on() + result:true + } + break + case "off": + if (!device) { + httpError(404, "Device not found") + } else { + device.off() + result:true + } + break + case "onoff": + if (!device) { + httpError(404, "Device not found") + } else { + device.on() + device.off() + result:true + } + break + case "allOn": + outlets.on() + break + case "allOff": + outlets.off() + break + default: + httpError(404, "$command is not a valid command for all outlets specified") + } +} + +def statOutlets() { + show(outlets, "outlet") +} + +private show(devices, type) { + def device = devices.find { it.id == params.id } + if (!device) { + httpError(404, "Device not found") + } + else { + def device_state = [ label: device.name, type: type, id: device.id, network: device.getDeviceNetworkId() ] + + for (attribute in device.supportedAttributes) { + device_state."${attribute}" = device.currentValue("${attribute}") + } + + device_state ? device_state : null + } +} + +private device(it, type) { + def device_state = [ label: it.name, type: type, id: it.id, network: it.getDeviceNetworkId()] + + + for (attribute in it.supportedAttributes) { + device_state."${attribute}" = it.currentValue("${attribute}") + } + + device_state ? device_state : null +} + +def installed() { +} + +def updated() { +}