mirror of
https://github.com/mtan93/SmartThingsPublic.git
synced 2026-03-25 05:04:09 +00:00
Compare commits
1 Commits
MSA-1372-2
...
MSA-1361-1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
33b5564dd1 |
@@ -24,24 +24,17 @@ definition(
|
|||||||
iconX3Url: "http://www.gidjit.com/appicon@3x.png",
|
iconX3Url: "http://www.gidjit.com/appicon@3x.png",
|
||||||
oauth: [displayName: "Gidjit", displayLink: "www.gidjit.com"])
|
oauth: [displayName: "Gidjit", displayLink: "www.gidjit.com"])
|
||||||
|
|
||||||
preferences(oauthPage: "deviceAuthorization") {
|
|
||||||
// deviceAuthorization page is simply the devices to authorize
|
|
||||||
page(name: "deviceAuthorization", title: "Device Authorization", nextPage: "instructionPage",
|
|
||||||
install: false, uninstall: true) {
|
|
||||||
section ("Allow Gidjit to have access, thereby allowing you to quickly control and monitor your following devices. Privacy Policy can be found at http://priv.gidjit.com/privacy.html") {
|
|
||||||
input "switches", "capability.switch", title: "Control/Monitor your switches", multiple: true, required: false
|
|
||||||
input "thermostats", "capability.thermostat", title: "Control/Monitor your thermostats", multiple: true, required: false
|
|
||||||
input "windowShades", "capability.windowShade", title: "Control/Monitor your window shades", multiple: true, required: false //windowShade
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
page(name: "instructionPage", title: "Device Discovery", install: true) {
|
preferences {
|
||||||
section() {
|
section ("Allow Gidjit to have access, there by allowing you to quickly control and monitor the following devices") {
|
||||||
paragraph "Now the process is complete return to the Devices section of the Detected Screen. From there and you can add actions to each of your device panels, including launching SmartThings routines."
|
input "switches", "capability.switch", title: "Control/Monitor your switches", multiple: true, required: false
|
||||||
}
|
input "thermostats", "capability.thermostat", title: "Control/Monitor your thermostats", multiple: true, required: false
|
||||||
}
|
input "windowShades", "capability.windowShade", title: "Control/Monitor your window shades", multiple: true, required: false //windowShade
|
||||||
|
//input "bulbs", "capability.colorControl", title: "Control your lights", multiple: true, required: false //windowShade
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mappings {
|
mappings {
|
||||||
path("/structureinfo") {
|
path("/structureinfo") {
|
||||||
action: [
|
action: [
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
definition(
|
||||||
|
name: "Beep, When Closed",
|
||||||
|
namespace: "smartthings",
|
||||||
|
author: "SmartThings",
|
||||||
|
description: "Beep presence sensor when open/close sensor closes.",
|
||||||
|
category: "Convenience",
|
||||||
|
iconUrl: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png",
|
||||||
|
iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience%402x.png",
|
||||||
|
)
|
||||||
|
|
||||||
|
preferences {
|
||||||
|
section ("When closes...") {
|
||||||
|
input "contact1", "capability.contactSensor", title: "Which open/contact sensor?"
|
||||||
|
}
|
||||||
|
section("Beep the presence sensor..") {
|
||||||
|
input "presence", "capability.presenceSensor", title: "Which sensor beep?"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def installed()
|
||||||
|
{
|
||||||
|
subscribe(contact1, "contact.closed", contactClosedHandler)
|
||||||
|
}
|
||||||
|
|
||||||
|
def updated()
|
||||||
|
{
|
||||||
|
unsubscribe()
|
||||||
|
subscribe(contact1, "contact.closed", contactClosedHandler)
|
||||||
|
}
|
||||||
|
|
||||||
|
def contactClosedHandler(evt) {
|
||||||
|
|
||||||
|
presence.beep()
|
||||||
|
}
|
||||||
@@ -39,7 +39,6 @@ preferences {
|
|||||||
page(name: "completionPage")
|
page(name: "completionPage")
|
||||||
page(name: "numbersPage")
|
page(name: "numbersPage")
|
||||||
page(name: "controllerExplanationPage")
|
page(name: "controllerExplanationPage")
|
||||||
page(name: "unsupportedDevicesPage")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def rootPage() {
|
def rootPage() {
|
||||||
@@ -48,9 +47,6 @@ def rootPage() {
|
|||||||
section("What to dim") {
|
section("What to dim") {
|
||||||
input(name: "dimmers", type: "capability.switchLevel", title: "Dimmers", description: null, multiple: true, required: true, submitOnChange: true)
|
input(name: "dimmers", type: "capability.switchLevel", title: "Dimmers", description: null, multiple: true, required: true, submitOnChange: true)
|
||||||
if (dimmers) {
|
if (dimmers) {
|
||||||
if (dimmersContainUnsupportedDevices()) {
|
|
||||||
href(name: "toUnsupportedDevicesPage", page: "unsupportedDevicesPage", title: "Some of your selected dimmers don't seem to be supported", description: "Tap here to fix it", required: true)
|
|
||||||
}
|
|
||||||
href(name: "toNumbersPage", page: "numbersPage", title: "Duration & Direction", description: numbersPageHrefDescription(), state: "complete")
|
href(name: "toNumbersPage", page: "numbersPage", title: "Duration & Direction", description: numbersPageHrefDescription(), state: "complete")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,31 +71,6 @@ def rootPage() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def unsupportedDevicesPage() {
|
|
||||||
|
|
||||||
def unsupportedDimmers = dimmers.findAll { !hasSetLevelCommand(it) }
|
|
||||||
|
|
||||||
dynamicPage(name: "unsupportedDevicesPage") {
|
|
||||||
if (unsupportedDimmers) {
|
|
||||||
section("These devices do not support the setLevel command") {
|
|
||||||
unsupportedDimmers.each {
|
|
||||||
paragraph deviceLabel(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
section {
|
|
||||||
input(name: "dimmers", type: "capability.sensor", title: "Please remove the above devices from this list.", submitOnChange: true, multiple: true)
|
|
||||||
}
|
|
||||||
section {
|
|
||||||
paragraph "If you think there is a mistake here, please contact support."
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
section {
|
|
||||||
paragraph "You're all set. You can hit the back button, now. Thanks for cleaning up your settings :)"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def controllerExplanationPage() {
|
def controllerExplanationPage() {
|
||||||
dynamicPage(name: "controllerExplanationPage", title: "How To Control Gentle Wake Up") {
|
dynamicPage(name: "controllerExplanationPage", title: "How To Control Gentle Wake Up") {
|
||||||
|
|
||||||
@@ -557,16 +528,14 @@ def updateDimmers(percentComplete) {
|
|||||||
} else {
|
} else {
|
||||||
|
|
||||||
def shouldChangeColors = (colorize && colorize != "false")
|
def shouldChangeColors = (colorize && colorize != "false")
|
||||||
|
def canChangeColors = hasSetColorCommand(dimmer)
|
||||||
|
|
||||||
if (shouldChangeColors && hasSetColorCommand(dimmer)) {
|
log.debug "Setting ${deviceLabel(dimmer)} to ${nextLevel}"
|
||||||
def hue = getHue(dimmer, nextLevel)
|
|
||||||
log.debug "Setting ${deviceLabel(dimmer)} level to ${nextLevel} and hue to ${hue}"
|
if (shouldChangeColors && canChangeColors) {
|
||||||
dimmer.setColor([hue: hue, saturation: 100, level: nextLevel])
|
dimmer.setColor([hue: getHue(dimmer, nextLevel), saturation: 100, level: nextLevel])
|
||||||
} else if (hasSetLevelCommand(dimmer)) {
|
|
||||||
log.debug "Setting ${deviceLabel(dimmer)} level to ${nextLevel}"
|
|
||||||
dimmer.setLevel(nextLevel)
|
|
||||||
} else {
|
} else {
|
||||||
log.warn "${deviceLabel(dimmer)} does not have setColor or setLevel commands."
|
dimmer.setLevel(nextLevel)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -848,21 +817,24 @@ private getRedHue(level) {
|
|||||||
if (level >= 96) return 17
|
if (level >= 96) return 17
|
||||||
}
|
}
|
||||||
|
|
||||||
private dimmersContainUnsupportedDevices() {
|
|
||||||
def found = dimmers.find { hasSetLevelCommand(it) == false }
|
|
||||||
return found != null
|
|
||||||
}
|
|
||||||
|
|
||||||
private hasSetLevelCommand(device) {
|
private hasSetLevelCommand(device) {
|
||||||
return hasCommand(device, "setLevel")
|
def isDimmer = false
|
||||||
|
device.supportedCommands.each {
|
||||||
|
if (it.name.contains("setLevel")) {
|
||||||
|
isDimmer = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return isDimmer
|
||||||
}
|
}
|
||||||
|
|
||||||
private hasSetColorCommand(device) {
|
private hasSetColorCommand(device) {
|
||||||
return hasCommand(device, "setColor")
|
def hasColor = false
|
||||||
}
|
device.supportedCommands.each {
|
||||||
|
if (it.name.contains("setColor")) {
|
||||||
private hasCommand(device, String command) {
|
hasColor = true
|
||||||
return (device.supportedCommands.find { it.name == command } != null)
|
}
|
||||||
|
}
|
||||||
|
return hasColor
|
||||||
}
|
}
|
||||||
|
|
||||||
private dimmersWithSetColorCommand() {
|
private dimmersWithSetColorCommand() {
|
||||||
@@ -1101,4 +1073,4 @@ def hasStartLevel() {
|
|||||||
|
|
||||||
def hasEndLevel() {
|
def hasEndLevel() {
|
||||||
return (endLevel != null && endLevel != "")
|
return (endLevel != null && endLevel != "")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -824,51 +824,17 @@ def deviceHandler(evt) {
|
|||||||
|
|
||||||
def sendToHarmony(evt, String callbackUrl) {
|
def sendToHarmony(evt, String callbackUrl) {
|
||||||
def callback = new URI(callbackUrl)
|
def callback = new URI(callbackUrl)
|
||||||
if(isIP(callback.host)){
|
def host = callback.port != -1 ? "${callback.host}:${callback.port}" : callback.host
|
||||||
def host = callback.port != -1 ? "${callback.host}:${callback.port}" : callback.host
|
def path = callback.query ? "${callback.path}?${callback.query}".toString() : callback.path
|
||||||
def path = callback.query ? "${callback.path}?${callback.query}".toString() : callback.path
|
sendHubCommand(new physicalgraph.device.HubAction(
|
||||||
sendHubCommand(new physicalgraph.device.HubAction(
|
method: "POST",
|
||||||
method: "POST",
|
path: path,
|
||||||
path: path,
|
headers: [
|
||||||
headers: [
|
"Host": host,
|
||||||
"Host": host,
|
"Content-Type": "application/json"
|
||||||
"Content-Type": "application/json"
|
],
|
||||||
],
|
body: [evt: [deviceId: evt.deviceId, name: evt.name, value: evt.value]]
|
||||||
body: [evt: [deviceId: evt.deviceId, name: evt.name, value: evt.value]]
|
))
|
||||||
))
|
|
||||||
} else {
|
|
||||||
def params = [
|
|
||||||
uri: callbackUrl,
|
|
||||||
body: [evt: [deviceId: evt.deviceId, name: evt.name, value: evt.value]]
|
|
||||||
]
|
|
||||||
try {
|
|
||||||
log.debug "Sending data to Harmony Cloud: $params"
|
|
||||||
httpPostJson(params) { resp ->
|
|
||||||
log.debug "Harmony Cloud - Response: ${resp.status}"
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
log.error "Harmony Cloud - Something went wrong: $e"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isIP(String str) {
|
|
||||||
try {
|
|
||||||
String[] parts = str.split("\\.");
|
|
||||||
if (parts.length != 4) return false;
|
|
||||||
for (int i = 0; i < 4; ++i) {
|
|
||||||
int p
|
|
||||||
try {
|
|
||||||
p = Integer.parseInt(parts[i]);
|
|
||||||
} catch (Exception e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (p > 255 || p < 0) return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def listHubs() {
|
def listHubs() {
|
||||||
|
|||||||
Reference in New Issue
Block a user