4 * Copyright 2016 Nicola Russo
6 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
7 * in compliance with the License. You may obtain a copy of the License at:
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
12 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
13 * for the specific language governing permissions and limitations under the License.
17 name: "Gideon Smart Home",
18 namespace: "gideon.api",
19 author: "Braindrain Solutions ltd",
20 description: "Gideon Smart Home SmartApp allows you to connect and control all of your SmartThings devices through the Gideon app, making your SmartThings devices even smarter.",
22 iconUrl: "http://s33.postimg.org/t77u7y7v3/logo.png",
23 iconX2Url: "http://s33.postimg.org/t77u7y7v3/logo.png",
24 iconX3Url: "http://s33.postimg.org/t77u7y7v3/logo.png",
25 oauth: [displayName: "Gideon Smart Home API app", displayLink: "gideon.ai"])
28 section("Control these contact sensors...") {
29 input "contact", "capability.contactSensor", multiple:true, required:false
31 section("Control these switch levels...") {
32 input "switchlevels", "capability.switchLevel", multiple:true, required:false
34 /* section("Control these thermostats...") {
35 input "thermostats", "capability.thermostat", multiple:true, required:false
37 section("Control the color for these devices...") {
38 input "colors", "capability.colorControl", multiple:true, required:false
40 section("Control the color temperature for these devices...") {
41 input "kelvin", "capability.colorTemperature", multiple:true, required:false
43 section("Control these switches...") {
44 input "switches", "capability.switch", multiple:true, required:false
46 section("Control these smoke alarms...") {
47 input "smoke_alarms", "capability.smokeDetector", multiple:true, required:false
49 section("Control these window shades...") {
50 input "shades", "capability.windowShade", multiple:true, required:false
52 section("Control these garage doors...") {
53 input "garage", "capability.garageDoorControl", multiple:true, required:false
55 section("Control these water sensors...") {
56 input "water_sensors", "capability.waterSensor", multiple:true, required:false
58 section("Control these motion sensors...") {
59 input "motions", "capability.motionSensor", multiple:true, required:false
61 section("Control these presence sensors...") {
62 input "presence_sensors", "capability.presenceSensor", multiple:true, required:false
64 section("Control these outlets...") {
65 input "outlets", "capability.outlet", multiple:true, required:false
67 section("Control these power meters...") {
68 input "meters", "capability.powerMeter", multiple:true, required:false
70 section("Control these locks...") {
71 input "locks", "capability.lock", multiple:true, required:false
73 section("Control these temperature sensors...") {
74 input "temperature_sensors", "capability.temperatureMeasurement", multiple:true, required:false
76 section("Control these batteries...") {
77 input "batteries", "capability.battery", multiple:true, required:false
83 path("/getalldevices") {
89 path("/thermostat/setcool/:id/:temp") {
94 path("/thermostat/setheat/:id/:temp") {
99 path("/thermostat/setfanmode/:id/:mode") {
104 path("/thermostat/setmode/:id/:mode") {
106 GET: "setThermostatMode"
109 path("/thermostat/:id") {
111 GET: "getThermostatStatus"
115 path("/light/dim/:id/:dim") {
117 GET: "setLevelStatus"
120 path("/light/kelvin/:id/:kelvin") {
125 path("/colorlight/:id/:hue/:sat") {
130 path("/light/status/:id") {
132 GET: "getLightStatus"
135 path("/light/on/:id") {
140 path("/light/off/:id") {
145 path("/doorlocks/lock/:id") {
150 path("/doorlocks/unlock/:id") {
152 GET: "unlockDoorLock"
155 path("/doorlocks/:id") {
157 GET: "getDoorLockStatus"
160 path("/contacts/:id") {
162 GET: "getContactStatus"
167 GET: "getSmokeStatus"
170 path("/shades/open/:id") {
175 path("/shades/preset/:id") {
180 path("/shades/close/:id") {
185 path("/shades/:id") {
187 GET: "getShadeStatus"
190 path("/garage/open/:id") {
195 path("/garage/close/:id") {
200 path("/garage/:id") {
202 GET: "getGarageStatus"
205 path("/watersensors/:id") {
207 GET: "getWaterSensorStatus"
210 path("/tempsensors/:id") {
212 GET: "getTempSensorsStatus"
215 path("/meters/:id") {
217 GET: "getMeterStatus"
220 path("/batteries/:id") {
222 GET: "getBatteryStatus"
225 path("/presences/:id") {
227 GET: "getPresenceStatus"
230 path("/motions/:id") {
232 GET: "getMotionStatus"
235 path("/outlets/:id") {
237 GET: "getOutletStatus"
240 path("/outlets/turnon/:id") {
245 path("/outlets/turnoff/:id") {
250 path("/switches/turnon/:id") {
255 path("/switches/turnoff/:id") {
260 path("/switches/:id") {
262 GET: "getSwitchStatus"
268 log.debug "Installed with settings: ${settings}"
274 log.debug "Updated with settings: ${settings}"
283 private device(it, type) {
284 it ? [id: it.id, label: it.label, type: type] : null
289 def getAllDevices() {
290 def locks_list = locks.collect{device(it,"Lock")}
291 /*def thermo_list = thermostats.collect{device(it,"Thermostat")}*/
292 def colors_list = colors.collect{device(it,"Color")}
293 def kelvin_list = kelvin.collect{device(it,"Kelvin")}
294 def contact_list = contact.collect{device(it,"Contact Sensor")}
295 def smokes_list = smoke_alarms.collect{device(it,"Smoke Alarm")}
296 def shades_list = shades.collect{device(it,"Window Shade")}
297 def garage_list = garage.collect{device(it,"Garage Door")}
298 def water_sensors_list = water_sensors.collect{device(it,"Water Sensor")}
299 def presences_list = presence_sensors.collect{device(it,"Presence")}
300 def motions_list = motions.collect{device(it,"Motion")}
301 def outlets_list = outlets.collect{device(it,"Outlet")}
302 def switches_list = switches.collect{device(it,"Switch")}
303 def switchlevels_list = switchlevels.collect{device(it,"Switch Level")}
304 def temp_list = temperature_sensors.collect{device(it,"Temperature")}
305 def meters_list = meters.collect{device(it,"Power Meters")}
306 def battery_list = batteries.collect{device(it,"Batteries")}
307 return outlets_list + kelvin_list + colors_list + switchlevels_list + smokes_list + contact_list + water_sensors_list + shades_list + garage_list + locks_list + presences_list + motions_list + switches_list + temp_list + meters_list + battery_list
313 def device = thermostats.find { it.id == params.id }
315 httpError(404, "Device not found")
317 if(device.hasCommand("setCoolingSetpoint")) {
318 device.setCoolingSetpoint(params.temp.toInteger());
319 return [result_action: "200"]
322 httpError(510, "Not supported!")
327 def device = thermostats.find { it.id == params.id }
329 httpError(404, "Device not found")
331 if(device.hasCommand("setHeatingSetpoint")) {
332 device.setHeatingSetpoint(params.temp.toInteger());
333 return [result_action: "200"]
336 httpError(510, "Not supported!")
341 def device = thermostats.find { it.id == params.id }
343 httpError(404, "Device not found")
345 if(device.hasCommand("setThermostatFanMode")) {
346 device.setThermostatFanMode(params.mode);
347 return [result_action: "200"]
350 httpError(510, "Not supported!")
354 def setThermostatMode() {
355 def device = thermostats.find { it.id == params.id }
357 httpError(404, "Device not found")
359 if(device.hasCommand("setThermostatMode")) {
360 device.setThermostatMode(params.mode);
361 return [result_action: "200"]
364 httpError(510, "Not supported!")
368 def getThermostatStatus() {
369 def device = thermostats.find{ it.id == params.id }
371 httpError(404, "Device not found")
373 return [ThermostatOperatingState: device.currentValue('thermostatOperatingState'), ThermostatSetpoint: device.currentValue('thermostatSetpoint'),
374 ThermostatFanMode: device.currentValue('thermostatFanMode'), ThermostatMode: device.currentValue('thermostatMode')]
380 def device = switches.find { it.id == params.id }
382 httpError(404, "Device not found")
386 return [Device_id: params.id, result_action: "200"]
391 def device = switches.find { it.id == params.id }
393 httpError(404, "Device not found")
397 return [Device_id: params.id, result_action: "200"]
401 def getLightStatus() {
402 def device = switches.find{ it.id == params.id }
404 httpError(404, "Device not found")
406 return [Status: device.currentValue('switch'), Dim: getLevelStatus(params.id), Color: getColorStatus(params.id), Kelvin: getKelvinStatus(params.id)]
412 def device = colors.find { it.id == params.id }
414 httpError(404, "Device not found")
417 def map = [hue:params.hue.toInteger(), saturation:params.sat.toInteger()]
419 device.setColor(map);
421 return [Device_id: params.id, result_action: "200"]
425 def getColorStatus(id) {
426 def device = colors.find { it.id == id }
428 return [Color: "none"]
430 return [hue: device.currentValue('hue'), saturation: device.currentValue('saturation')]
436 def device = kelvin.find { it.id == params.id }
438 httpError(404, "Device not found")
441 device.setColorTemperature(params.kelvin.toInteger());
443 return [Device_id: params.id, result_action: "200"]
447 def getKelvinStatus(id) {
448 def device = kelvin.find { it.id == id }
450 return [kelvin: "none"]
452 return [kelvin: device.currentValue('colorTemperature')]
457 def getLevelStatus() {
458 def device = switchlevels.find { it.id == params.id }
462 return [Level: device.currentValue('level')]
466 def getLevelStatus(id) {
467 def device = switchlevels.find { it.id == id }
471 return [Level: device.currentValue('level')]
476 def setLevelStatus() {
477 def device = switchlevels.find { it.id == params.id }
478 def level = params.dim
480 httpError(404, "Device not found")
482 device.setLevel(level.toInteger())
483 return [result_action: "200", Level: device.currentValue('level')]
489 def getContactStatus() {
490 def device = contact.find { it.id == params.id }
492 httpError(404, "Device not found")
494 def args = getTempSensorsStatus(device.id)
495 return [Device_state: device.currentValue('contact')] + args
500 def getSmokeStatus() {
501 def device = smoke_alarms.find { it.id == params.id }
503 httpError(404, "Device not found")
505 def bat = getBatteryStatus(device.id)
506 return [Device_state: device.currentValue('smoke')] + bat
511 def getGarageStatus() {
512 def device = garage.find { it.id == params.id }
514 httpError(404, "Device not found")
516 return [Device_state: device.currentValue('door')]
521 def device = garage.find { it.id == params.id }
523 httpError(404, "Device not found")
528 return [Device_id: params.id, result_action: "200"]
533 def device = garage.find { it.id == params.id }
535 httpError(404, "Device not found")
540 return [Device_id: params.id, result_action: "200"]
544 def getShadeStatus() {
545 def device = shades.find { it.id == params.id }
547 httpError(404, "Device not found")
549 return [Device_state: device.currentValue('windowShade')]
554 def device = shades.find { it.id == params.id }
556 httpError(404, "Device not found")
561 return [Device_id: params.id, result_action: "200"]
566 def device = shades.find { it.id == params.id }
568 httpError(404, "Device not found")
571 device.presetPosition();
573 return [Device_id: params.id, result_action: "200"]
578 def device = shades.find { it.id == params.id }
580 httpError(404, "Device not found")
585 return [Device_id: params.id, result_action: "200"]
590 def getWaterSensorStatus() {
591 def device = water_sensors.find { it.id == params.id }
593 httpError(404, "Device not found")
595 def bat = getBatteryStatus(device.id)
596 return [Device_state: device.currentValue('water')] + bat
600 def getBatteryStatus() {
601 def device = batteries.find { it.id == params.id }
603 httpError(404, "Device not found")
605 return [Device_state: device.latestValue("battery")]
609 def getBatteryStatus(id) {
610 def device = batteries.find { it.id == id }
614 return [battery_state: device.latestValue("battery")]
619 def getDoorLockStatus() {
620 def device = locks.find { it.id == params.id }
622 httpError(404, "Device not found")
624 def bat = getBatteryStatus(device.id)
625 return [Device_state: device.currentValue('lock')] + bat
630 def device = locks.find { it.id == params.id }
632 httpError(404, "Device not found")
637 return [Device_id: params.id, result_action: "200"]
641 def unlockDoorLock() {
642 def device = locks.find { it.id == params.id }
644 httpError(404, "Device not found")
649 return [Device_id: params.id, result_action: "200"]
653 def getPresenceStatus() {
655 def device = presence_sensors.find { it.id == params.id }
657 httpError(404, "Device not found")
659 def bat = getBatteryStatus(device.id)
660 return [Device_state: device.currentValue('presence')] + bat
665 def getMotionStatus() {
667 def device = motions.find { it.id == params.id }
669 httpError(404, "Device not found")
671 def args = getTempSensorsStatus(device.id)
672 return [Device_state: device.currentValue('motion')] + args
677 def getOutletStatus() {
679 def device = outlets.find { it.id == params.id }
681 device = switches.find { it.id == params.id }
683 httpError(404, "Device not found")
686 def watt = getMeterStatus(device.id)
688 return [Device_state: device.currentValue('switch')] + watt
691 def getMeterStatus() {
693 def device = meters.find { it.id == params.id }
695 httpError(404, "Device not found")
697 return [Device_id: device.id, Device_type: device.type, Current_watt: device.currentValue("power")]
701 def getMeterStatus(id) {
703 def device = meters.find { it.id == id }
707 return [Current_watt: device.currentValue("power")]
713 def device = outlets.find { it.id == params.id }
715 device = switches.find { it.id == params.id }
717 httpError(404, "Device not found")
723 return [Device_id: params.id, result_action: "200"]
726 def turnOffOutlet() {
727 def device = outlets.find { it.id == params.id }
729 device = switches.find { it.id == params.id }
731 httpError(404, "Device not found")
737 return [Device_id: params.id, result_action: "200"]
741 def getSwitchStatus() {
742 def device = switches.find { it.id == params.id }
744 httpError(404, "Device not found")
746 return [Device_state: device.currentValue('switch'), Dim: getLevelStatus(params.id)]
751 def device = switches.find { it.id == params.id }
753 httpError(404, "Device not found")
758 return [Device_id: params.id, result_action: "200"]
762 def turnOffSwitch() {
763 def device = switches.find { it.id == params.id }
765 httpError(404, "Device not found")
770 return [Device_id: params.id, result_action: "200"]
776 def getTempSensorsStatus() {
777 def device = temperature_sensors.find { it.id == params.id }
779 httpError(404, "Device not found")
781 def bat = getBatteryStatus(device.id)
782 def scale = [Scale: location.temperatureScale]
783 return [Device_state: device.currentValue('temperature')] + scale + bat
787 def getTempSensorsStatus(id) {
788 def device = temperature_sensors.find { it.id == id }
792 def bat = getBatteryStatus(device.id)
793 return [temperature: device.currentValue('temperature')] + bat