mirror of
https://github.com/mtan93/SmartThingsPublic.git
synced 2026-03-08 05:31:56 +00:00
This submission contains the SmartApp to which the iOS app connects with OAuth, and the device type which is created by the SmartApp for each beacon registered in the app.
148 lines
3.8 KiB
Groovy
148 lines
3.8 KiB
Groovy
/**
|
|
* BeaconThing Manager
|
|
*
|
|
* Copyright 2015 obycode
|
|
*
|
|
* 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: "BeaconThings Manager",
|
|
namespace: "com.obycode",
|
|
author: "obycode",
|
|
description: "SmartApp to interact with the BeaconThings iOS app. Use this app to integrate iBeacons into your smart home.",
|
|
category: "Convenience",
|
|
iconUrl: "http://beaconthingsapp.com/images/Icon-60.png",
|
|
iconX2Url: "http://beaconthingsapp.com/images/Icon-60@2x.png",
|
|
iconX3Url: "http://beaconthingsapp.com/images/Icon-60@3x.png",
|
|
oauth: true)
|
|
|
|
|
|
preferences {
|
|
section("Allow BeaconThings to talk to your home") {
|
|
|
|
}
|
|
}
|
|
|
|
def installed() {
|
|
log.debug "Installed with settings: ${settings}"
|
|
|
|
initialize()
|
|
}
|
|
|
|
def initialize() {
|
|
}
|
|
|
|
def uninstalled() {
|
|
removeChildDevices(getChildDevices())
|
|
}
|
|
|
|
mappings {
|
|
path("/beacons") {
|
|
action: [
|
|
DELETE: "clearBeacons",
|
|
POST: "addBeacon"
|
|
]
|
|
}
|
|
|
|
path("/beacons/:id") {
|
|
action: [
|
|
PUT: "updateBeacon",
|
|
DELETE: "deleteBeacon"
|
|
]
|
|
}
|
|
}
|
|
|
|
void clearBeacons() {
|
|
removeChildDevices(getChildDevices())
|
|
}
|
|
|
|
void addBeacon() {
|
|
def beacon = request.JSON?.beacon
|
|
if (beacon) {
|
|
def beaconId = "BeaconThings"
|
|
if (beacon.major) {
|
|
beaconId = "$beaconId-${beacon.major}"
|
|
if (beacon.minor) {
|
|
beaconId = "$beaconId-${beacon.minor}"
|
|
}
|
|
}
|
|
log.debug "adding beacon $beaconId"
|
|
def d = addChildDevice("com.obycode", "BeaconThing", beaconId, null, [label:beacon.name, name:"BeaconThing", completedSetup: true])
|
|
log.debug "addChildDevice returned $d"
|
|
|
|
if (beacon.present) {
|
|
d.arrive(beacon.present)
|
|
}
|
|
else if (beacon.presence) {
|
|
d.setPresence(beacon.presence)
|
|
}
|
|
}
|
|
}
|
|
|
|
void updateBeacon() {
|
|
log.debug "updating beacon ${params.id}"
|
|
def beaconDevice = getChildDevice(params.id)
|
|
// def children = getChildDevices()
|
|
// def beaconDevice = children.find{ d -> d.deviceNetworkId == "${params.id}" }
|
|
if (!beaconDevice) {
|
|
log.debug "Beacon not found directly"
|
|
def children = getChildDevices()
|
|
beaconDevice = children.find{ d -> d.deviceNetworkId == "${params.id}" }
|
|
if (!beaconDevice) {
|
|
log.debug "Beacon not found in list either"
|
|
return
|
|
}
|
|
}
|
|
|
|
// This could be just updating the presence
|
|
def presence = request.JSON?.presence
|
|
if (presence) {
|
|
log.debug "Setting ${beaconDevice.label} to $presence"
|
|
beaconDevice.setPresence(presence)
|
|
}
|
|
|
|
// It could be someone arriving
|
|
def arrived = request.JSON?.arrived
|
|
if (arrived) {
|
|
log.debug "$arrived arrived at ${beaconDevice.label}"
|
|
beaconDevice.arrived(arrived)
|
|
}
|
|
|
|
// It could be someone left
|
|
def left = request.JSON?.left
|
|
if (left) {
|
|
log.debug "$left left ${beaconDevice.label}"
|
|
beaconDevice.left(left)
|
|
}
|
|
|
|
// or it could be updating the name
|
|
def beacon = request.JSON?.beacon
|
|
if (beacon) {
|
|
beaconDevice.label = beacon.name
|
|
}
|
|
}
|
|
|
|
void deleteBeacon() {
|
|
log.debug "deleting beacon ${params.id}"
|
|
deleteChildDevice(params.id)
|
|
// def children = getChildDevices()
|
|
// def beaconDevice = children.find{ d -> d.deviceNetworkId == "${params.id}" }
|
|
// if (beaconDevice) {
|
|
// deleteChildDevice(beaconDevice.deviceNetworkId)
|
|
// }
|
|
}
|
|
|
|
private removeChildDevices(delete) {
|
|
delete.each {
|
|
deleteChildDevice(it.deviceNetworkId)
|
|
}
|
|
}
|