From 96f2c5ed8bbb29a810a0610db968d76b2b9ac2a7 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 23 Nov 2015 11:38:25 -0600 Subject: [PATCH] MSA-699: Vinli Home Connect allows users to control their Smartthings Devices with their Vinli connect vehicles. The Vinli device is an OBD dongle that can report when it leaves or enters geofences. A user can, for instance, set their doors to lock and lights to turn off when they leave proximity to their home. --- .../vinli-home-connect.groovy | 196 ++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 smartapps/com-vinli-smartthings/vinli-home-connect.src/vinli-home-connect.groovy diff --git a/smartapps/com-vinli-smartthings/vinli-home-connect.src/vinli-home-connect.groovy b/smartapps/com-vinli-smartthings/vinli-home-connect.src/vinli-home-connect.groovy new file mode 100644 index 0000000..be213ad --- /dev/null +++ b/smartapps/com-vinli-smartthings/vinli-home-connect.src/vinli-home-connect.groovy @@ -0,0 +1,196 @@ +/** + * Vinli Home Beta + * + * Copyright 2015 Daniel + * + */ +definition( + name: "Vinli Home Connect", + namespace: "com.vinli.smartthings", + author: "Daniel", + description: "Allows Vinli users to connect their car to Smart Things", + category: "SmartThings Labs", + 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 external service to control these things...") { + input "switches", "capability.switch", multiple: true, required: true + input "locks", "capability.lock", multiple: true, required: true + } +} + +mappings { + + path("/devices") { + action: [ + GET: "listAllDevices" + ] + } + + path("/switches") { + action: [ + GET: "listSwitches" + ] + } + path("/switches/:command") { + action: [ + PUT: "updateSwitches" + ] + } + path("/switches/:id/:command") { + action: [ + PUT: "updateSwitch" + ] + } + path("/locks/:command") { + action: [ + PUT: "updateLocks" + ] + } + path("/locks/:id/:command") { + action: [ + PUT: "updateLock" + ] + } + + path("/devices/:id/:command") { + action: [ + PUT: "commandDevice" + ] + } +} + +// returns a list of all devices +def listAllDevices() { + def resp = [] + switches.each { + resp << [name: it.name, label: it.label, value: it.currentValue("switch"), type: "switch", id: it.id, hub: it.hub.name] + } + + locks.each { + resp << [name: it.name, label: it.label, value: it.currentValue("lock"), type: "lock", id: it.id, hub: it.hub.name] + } + return resp +} + +// returns a list like +// [[name: "kitchen lamp", value: "off"], [name: "bathroom", value: "on"]] +def listSwitches() { + def resp = [] + switches.each { + resp << [name: it.displayName, value: it.currentValue("switch"), type: "switch", id: it.id] + } + return resp +} + +void updateLocks() { + // use the built-in request object to get the command parameter + def command = params.command + + if (command) { + + // check that the switch supports the specified command + // If not, return an error using httpError, providing a HTTP status code. + locks.each { + if (!it.hasCommand(command)) { + httpError(501, "$command is not a valid command for all switches specified") + } + } + + // all switches have the comand + // execute the command on all switches + // (note we can do this on the array - the command will be invoked on every element + locks."$command"() + } +} + +void updateLock() { + def command = params.command + + locks.each { + if (!it.hasCommand(command)) { + httpError(400, "$command is not a valid command for all lock specified") + } + + if (it.id == params.id) { + it."$command"() + } + } +} + +void updateSwitch() { + def command = params.command + + switches.each { + if (!it.hasCommand(command)) { + httpError(400, "$command is not a valid command for all switches specified") + } + + if (it.id == params.id) { + it."$command"() + } + } +} + +void commandDevice() { + def command = params.command + def devices = [] + + switches.each { + devices << it + } + + locks.each { + devices << it + } + + devices.each { + if (it.id == params.id) { + if (!it.hasCommand(command)) { + httpError(400, "$command is not a valid command for specified device") + } + it."$command"() + } + } +} + +void updateSwitches() { + // use the built-in request object to get the command parameter + def command = params.command + + if (command) { + + // check that the switch supports the specified command + // If not, return an error using httpError, providing a HTTP status code. + switches.each { + if (!it.hasCommand(command)) { + httpError(400, "$command is not a valid command for all switches specified") + } + } + + // all switches have the comand + // execute the command on all switches + // (note we can do this on the array - the command will be invoked on every element + switches."$command"() + } +} + + 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.s +} \ No newline at end of file