mirror of
https://github.com/mtan93/SmartThingsPublic.git
synced 2026-03-18 21:03:39 +00:00
Compare commits
16 Commits
MSA-1793-3
...
PROD_2017.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2151e2dd3e | ||
|
|
ccb7b6e49d | ||
|
|
34f77a2989 | ||
|
|
318cdedaec | ||
|
|
649ed033d0 | ||
|
|
843d8800ac | ||
|
|
bcc680ee5d | ||
|
|
245e85f850 | ||
|
|
af16720528 | ||
|
|
c6d6ba85f5 | ||
|
|
81550ee25c | ||
|
|
1cc9d8a90b | ||
|
|
bfd2b6c0fa | ||
|
|
9b6e7d3be8 | ||
|
|
fc312286a2 | ||
|
|
0846b6f34c |
@@ -1,256 +0,0 @@
|
|||||||
/**
|
|
||||||
* Besense z-wave Door/window sensor
|
|
||||||
*/
|
|
||||||
|
|
||||||
metadata {
|
|
||||||
definition (name: "BeSense Door/Window Sensor", namespace: "BeSense", author: "BeSense") {
|
|
||||||
capability "Contact Sensor"
|
|
||||||
capability "Sensor"
|
|
||||||
capability "Battery"
|
|
||||||
capability "Configuration"
|
|
||||||
|
|
||||||
fingerprint mfr: "0214", prod: "0002", model: "0001", deviceJoinName: "BeSense Door/window sensor"
|
|
||||||
}
|
|
||||||
|
|
||||||
// simulator metadata
|
|
||||||
simulator {
|
|
||||||
// status messages
|
|
||||||
status "open": "command: 2001, payload: FF"
|
|
||||||
status "closed": "command: 2001, payload: 00"
|
|
||||||
status "wake up": "command: 8407, payload: "
|
|
||||||
}
|
|
||||||
|
|
||||||
// UI tile definitions
|
|
||||||
tiles(scale: 1) {
|
|
||||||
standardTile("contact", "device.contact", width: 3, height: 3, canChangeIcon: true) {
|
|
||||||
state ("open", label: '${name}', icon: "st.contact.contact.open", backgroundColor: "#ea0f46")
|
|
||||||
state ("closed", label: '${name}', icon: "st.contact.contact.closed", backgroundColor: "#27CC73")
|
|
||||||
}
|
|
||||||
valueTile("battery", "device.battery", inactiveLabel: false, decoration: "flat") {
|
|
||||||
state "battery", label:'${currentValue}% battery', unit:""
|
|
||||||
}
|
|
||||||
|
|
||||||
main "contact"
|
|
||||||
details(["contact", "battery"])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def parse(String description) {
|
|
||||||
def result = null
|
|
||||||
if (description.startsWith("Err 106")) {
|
|
||||||
if (state.sec) {
|
|
||||||
log.debug description
|
|
||||||
} else {
|
|
||||||
result = createEvent(
|
|
||||||
descriptionText: "This sensor failed to complete the network security key exchange. If you are unable to control it via SmartThings, you must remove it from your network and add it again.",
|
|
||||||
eventType: "ALERT",
|
|
||||||
name: "secureInclusion",
|
|
||||||
value: "failed",
|
|
||||||
isStateChange: true,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} else if (description != "updated") {
|
|
||||||
def cmd = zwave.parse(description, [0x20: 1, 0x25: 1, 0x30: 1, 0x31: 5, 0x80: 1, 0x84: 1, 0x71: 3, 0x9C: 1])
|
|
||||||
if (cmd) {
|
|
||||||
result = zwaveEvent(cmd)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.debug "parsed '$description' to $result"
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
def updated() {
|
|
||||||
def cmds = []
|
|
||||||
if (!state.MSR) {
|
|
||||||
cmds = [
|
|
||||||
command(zwave.manufacturerSpecificV2.manufacturerSpecificGet()),
|
|
||||||
"delay 1200",
|
|
||||||
zwave.wakeUpV1.wakeUpNoMoreInformation().format()
|
|
||||||
]
|
|
||||||
} else if (!state.lastbat) {
|
|
||||||
cmds = []
|
|
||||||
} else {
|
|
||||||
cmds = [zwave.wakeUpV1.wakeUpNoMoreInformation().format()]
|
|
||||||
}
|
|
||||||
response(cmds)
|
|
||||||
}
|
|
||||||
|
|
||||||
def configure() {
|
|
||||||
commands([
|
|
||||||
zwave.manufacturerSpecificV2.manufacturerSpecificGet(),
|
|
||||||
zwave.batteryV1.batteryGet()
|
|
||||||
], 6000)
|
|
||||||
}
|
|
||||||
|
|
||||||
def sensorValueEvent(value) {
|
|
||||||
if (value) {
|
|
||||||
createEvent(name: "contact", value: "open", descriptionText: "$device.displayName is open")
|
|
||||||
} else {
|
|
||||||
createEvent(name: "contact", value: "closed", descriptionText: "$device.displayName is closed")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd)
|
|
||||||
{
|
|
||||||
sensorValueEvent(cmd.value)
|
|
||||||
}
|
|
||||||
|
|
||||||
def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd)
|
|
||||||
{
|
|
||||||
sensorValueEvent(cmd.value)
|
|
||||||
}
|
|
||||||
|
|
||||||
def zwaveEvent(physicalgraph.zwave.commands.switchbinaryv1.SwitchBinaryReport cmd)
|
|
||||||
{
|
|
||||||
sensorValueEvent(cmd.value)
|
|
||||||
}
|
|
||||||
|
|
||||||
def zwaveEvent(physicalgraph.zwave.commands.sensorbinaryv1.SensorBinaryReport cmd)
|
|
||||||
{
|
|
||||||
sensorValueEvent(cmd.sensorValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
def zwaveEvent(physicalgraph.zwave.commands.sensoralarmv1.SensorAlarmReport cmd)
|
|
||||||
{
|
|
||||||
sensorValueEvent(cmd.sensorState)
|
|
||||||
}
|
|
||||||
|
|
||||||
def zwaveEvent(physicalgraph.zwave.commands.notificationv3.NotificationReport cmd)
|
|
||||||
{
|
|
||||||
def result = []
|
|
||||||
if (cmd.notificationType == 0x06 && cmd.event == 0x16) {
|
|
||||||
result << sensorValueEvent(1)
|
|
||||||
} else if (cmd.notificationType == 0x06 && cmd.event == 0x17) {
|
|
||||||
result << sensorValueEvent(0)
|
|
||||||
} else if (cmd.notificationType == 0x07) {
|
|
||||||
if (cmd.v1AlarmType == 0x07) { // special case for nonstandard messages from Monoprice door/window sensors
|
|
||||||
result << sensorValueEvent(cmd.v1AlarmLevel)
|
|
||||||
} else if (cmd.event == 0x01 || cmd.event == 0x02) {
|
|
||||||
result << sensorValueEvent(1)
|
|
||||||
} else if (cmd.event == 0x03) {
|
|
||||||
result << createEvent(descriptionText: "$device.displayName covering was removed", isStateChange: true)
|
|
||||||
if(!state.MSR) result << response(command(zwave.manufacturerSpecificV2.manufacturerSpecificGet()))
|
|
||||||
} else if (cmd.event == 0x05 || cmd.event == 0x06) {
|
|
||||||
result << createEvent(descriptionText: "$device.displayName detected glass breakage", isStateChange: true)
|
|
||||||
} else if (cmd.event == 0x07) {
|
|
||||||
if(!state.MSR) result << response(command(zwave.manufacturerSpecificV2.manufacturerSpecificGet()))
|
|
||||||
result << createEvent(name: "motion", value: "active", descriptionText:"$device.displayName detected motion")
|
|
||||||
}
|
|
||||||
} else if (cmd.notificationType) {
|
|
||||||
def text = "Notification $cmd.notificationType: event ${([cmd.event] + cmd.eventParameter).join(", ")}"
|
|
||||||
result << createEvent(name: "notification$cmd.notificationType", value: "$cmd.event", descriptionText: text, displayed: false)
|
|
||||||
} else {
|
|
||||||
def value = cmd.v1AlarmLevel == 255 ? "active" : cmd.v1AlarmLevel ?: "inactive"
|
|
||||||
result << createEvent(name: "alarm $cmd.v1AlarmType", value: value, displayed: false)
|
|
||||||
}
|
|
||||||
result
|
|
||||||
}
|
|
||||||
|
|
||||||
def zwaveEvent(physicalgraph.zwave.commands.wakeupv1.WakeUpNotification cmd)
|
|
||||||
{
|
|
||||||
def event = createEvent(descriptionText: "${device.displayName} woke up", isStateChange: false)
|
|
||||||
def cmds = []
|
|
||||||
if (!state.MSR) {
|
|
||||||
cmds << command(zwave.manufacturerSpecificV2.manufacturerSpecificGet())
|
|
||||||
cmds << "delay 1200"
|
|
||||||
}
|
|
||||||
if (!state.lastbat || now() - state.lastbat > 53*60*60*1000) {
|
|
||||||
cmds << command(zwave.batteryV1.batteryGet())
|
|
||||||
} else {
|
|
||||||
cmds << zwave.wakeUpV1.wakeUpNoMoreInformation().format()
|
|
||||||
}
|
|
||||||
[event, response(cmds)]
|
|
||||||
}
|
|
||||||
|
|
||||||
def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd) {
|
|
||||||
def map = [ name: "battery", unit: "%" ]
|
|
||||||
if (cmd.batteryLevel == 0xFF) {
|
|
||||||
map.value = 1
|
|
||||||
map.descriptionText = "${device.displayName} has a low battery"
|
|
||||||
map.isStateChange = true
|
|
||||||
} else {
|
|
||||||
map.value = cmd.batteryLevel
|
|
||||||
}
|
|
||||||
state.lastbat = now()
|
|
||||||
[createEvent(map), response(zwave.wakeUpV1.wakeUpNoMoreInformation())]
|
|
||||||
}
|
|
||||||
|
|
||||||
def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) {
|
|
||||||
def result = []
|
|
||||||
|
|
||||||
def msr = String.format("%04X-%04X-%04X", cmd.manufacturerId, cmd.productTypeId, cmd.productId)
|
|
||||||
log.debug "msr: $msr"
|
|
||||||
updateDataValue("MSR", msr)
|
|
||||||
|
|
||||||
retypeBasedOnMSR()
|
|
||||||
|
|
||||||
result << createEvent(descriptionText: "$device.displayName MSR: $msr", isStateChange: false)
|
|
||||||
|
|
||||||
if (msr == "011A-0601-0901") { // Enerwave motion doesn't always get the associationSet that the hub sends on join
|
|
||||||
result << response(zwave.associationV1.associationSet(groupingIdentifier:1, nodeId:zwaveHubNodeId))
|
|
||||||
} else if (!device.currentState("battery")) {
|
|
||||||
if (msr == "0086-0102-0059") {
|
|
||||||
result << response(zwave.securityV1.securityMessageEncapsulation().encapsulate(zwave.batteryV1.batteryGet()).format())
|
|
||||||
} else {
|
|
||||||
result << response(command(zwave.batteryV1.batteryGet()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result
|
|
||||||
}
|
|
||||||
|
|
||||||
def zwaveEvent(physicalgraph.zwave.commands.securityv1.SecurityMessageEncapsulation cmd) {
|
|
||||||
def encapsulatedCommand = cmd.encapsulatedCommand([0x20: 1, 0x25: 1, 0x30: 1, 0x31: 5, 0x80: 1, 0x84: 1, 0x71: 3, 0x9C: 1])
|
|
||||||
// log.debug "encapsulated: $encapsulatedCommand"
|
|
||||||
if (encapsulatedCommand) {
|
|
||||||
state.sec = 1
|
|
||||||
zwaveEvent(encapsulatedCommand)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def zwaveEvent(physicalgraph.zwave.Command cmd) {
|
|
||||||
createEvent(descriptionText: "$device.displayName: $cmd", displayed: false)
|
|
||||||
}
|
|
||||||
|
|
||||||
private command(physicalgraph.zwave.Command cmd) {
|
|
||||||
if (state.sec == 1) {
|
|
||||||
zwave.securityV1.securityMessageEncapsulation().encapsulate(cmd).format()
|
|
||||||
} else {
|
|
||||||
cmd.format()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private commands(commands, delay=200) {
|
|
||||||
delayBetween(commands.collect{ command(it) }, delay)
|
|
||||||
}
|
|
||||||
|
|
||||||
def retypeBasedOnMSR() {
|
|
||||||
switch (state.MSR) {
|
|
||||||
case "0086-0002-002D":
|
|
||||||
log.debug "Changing device type to Z-Wave Water Sensor"
|
|
||||||
setDeviceType("Z-Wave Water Sensor")
|
|
||||||
break
|
|
||||||
case "011F-0001-0001": // Schlage motion
|
|
||||||
case "014A-0001-0001": // Ecolink motion
|
|
||||||
case "014A-0004-0001": // Ecolink motion +
|
|
||||||
case "0060-0001-0002": // Everspring SP814
|
|
||||||
case "0060-0001-0003": // Everspring HSP02
|
|
||||||
case "011A-0601-0901": // Enerwave ZWN-BPC
|
|
||||||
case "0214-0002-0002": // Besense pir or ceiling sensor
|
|
||||||
log.debug "Changing device type to Z-Wave Motion Sensor"
|
|
||||||
setDeviceType("Z-Wave Motion Sensor")
|
|
||||||
break
|
|
||||||
case "013C-0002-000D": // Philio multi +
|
|
||||||
log.debug "Changing device type to 3-in-1 Multisensor Plus (SG)"
|
|
||||||
setDeviceType("3-in-1 Multisensor Plus (SG)")
|
|
||||||
break
|
|
||||||
case "0109-2001-0106": // Vision door/window
|
|
||||||
log.debug "Changing device type to Z-Wave Plus Door/Window Sensor"
|
|
||||||
setDeviceType("Z-Wave Plus Door/Window Sensor")
|
|
||||||
break
|
|
||||||
case "0109-2002-0205": // Vision Motion
|
|
||||||
log.debug "Changing device type to Z-Wave Plus Motion/Temp Sensor"
|
|
||||||
setDeviceType("Z-Wave Plus Motion/Temp Sensor")
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
metadata {
|
metadata {
|
||||||
// Automatically generated. Make future change here.
|
// Automatically generated. Make future change here.
|
||||||
definition (name: "Hue Bridge", namespace: "smartthings", author: "SmartThings") {
|
definition (name: "Hue Bridge", namespace: "smartthings", author: "SmartThings") {
|
||||||
|
capability "Bridge"
|
||||||
capability "Health Check"
|
capability "Health Check"
|
||||||
|
|
||||||
attribute "networkAddress", "string"
|
attribute "networkAddress", "string"
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ metadata {
|
|||||||
capability "Refresh"
|
capability "Refresh"
|
||||||
capability "Actuator"
|
capability "Actuator"
|
||||||
capability "Sensor"
|
capability "Sensor"
|
||||||
|
capability "Outlet"
|
||||||
|
|
||||||
fingerprint profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0008,0B04,0B05", outClusters: "0019", manufacturer: "CentraLite", model: "4257050-ZHAC"
|
fingerprint profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0008,0B04,0B05", outClusters: "0019", manufacturer: "CentraLite", model: "4257050-ZHAC"
|
||||||
|
|
||||||
@@ -79,7 +80,8 @@ def parse(String description) {
|
|||||||
*/
|
*/
|
||||||
event.value = event.value / 10
|
event.value = event.value / 10
|
||||||
}
|
}
|
||||||
return event
|
|
||||||
|
return event ? createEvent(event) : event
|
||||||
}
|
}
|
||||||
|
|
||||||
def setLevel(value) {
|
def setLevel(value) {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ metadata {
|
|||||||
capability "Actuator"
|
capability "Actuator"
|
||||||
capability "Switch"
|
capability "Switch"
|
||||||
capability "Sensor"
|
capability "Sensor"
|
||||||
|
capability "Outlet"
|
||||||
|
|
||||||
fingerprint profileId: "0104", inClusters: "0006, 0004, 0003, 0000, 0005", outClusters: "0019", manufacturer: "Compacta International, Ltd", model: "ZBMPlug15", deviceJoinName: "SmartPower Outlet V1"
|
fingerprint profileId: "0104", inClusters: "0006, 0004, 0003, 0000, 0005", outClusters: "0019", manufacturer: "Compacta International, Ltd", model: "ZBMPlug15", deviceJoinName: "SmartPower Outlet V1"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,9 +83,8 @@ def parse(String description) {
|
|||||||
|
|
||||||
if (event) {
|
if (event) {
|
||||||
if (event.name == "power") {
|
if (event.name == "power") {
|
||||||
event.value = event.value / 10
|
def value = (event.value as Integer) / 10
|
||||||
event.descriptionText = '{{ device.displayName }} power is {{ value }} Watts'
|
event = createEvent(name: event.name, value: value, descriptionText: '{{ device.displayName }} power is {{ value }} Watts', translatable: true)
|
||||||
event.translatable = true
|
|
||||||
} else if (event.name == "switch") {
|
} else if (event.name == "switch") {
|
||||||
def descriptionText = event.value == "on" ? '{{ device.displayName }} is On' : '{{ device.displayName }} is Off'
|
def descriptionText = event.value == "on" ? '{{ device.displayName }} is On' : '{{ device.displayName }} is Off'
|
||||||
event = createEvent(name: event.name, value: event.value, descriptionText: descriptionText, translatable: true)
|
event = createEvent(name: event.name, value: event.value, descriptionText: descriptionText, translatable: true)
|
||||||
@@ -106,7 +105,7 @@ def parse(String description) {
|
|||||||
log.debug "${cluster}"
|
log.debug "${cluster}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return event
|
return event ? createEvent(event) : event
|
||||||
}
|
}
|
||||||
|
|
||||||
def off() {
|
def off() {
|
||||||
|
|||||||
@@ -17,14 +17,14 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
definition(
|
definition(
|
||||||
name: "Hue (Connect)",
|
name: "Hue (Connect)",
|
||||||
namespace: "smartthings",
|
namespace: "smartthings",
|
||||||
author: "SmartThings",
|
author: "SmartThings",
|
||||||
description: "Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Adjust colors by going to the Thing detail screen for your Hue lights (tap the gear on Hue tiles).\n\nPlease update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.",
|
description: "Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Adjust colors by going to the Thing detail screen for your Hue lights (tap the gear on Hue tiles).\n\nPlease update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.",
|
||||||
category: "SmartThings Labs",
|
category: "SmartThings Labs",
|
||||||
iconUrl: "https://s3.amazonaws.com/smartapp-icons/Partner/hue.png",
|
iconUrl: "https://s3.amazonaws.com/smartapp-icons/Partner/hue.png",
|
||||||
iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Partner/hue@2x.png",
|
iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Partner/hue@2x.png",
|
||||||
singleInstance: true
|
singleInstance: true
|
||||||
)
|
)
|
||||||
|
|
||||||
preferences {
|
preferences {
|
||||||
@@ -85,7 +85,8 @@ def bridgeDiscovery(params=[:])
|
|||||||
}
|
}
|
||||||
|
|
||||||
return dynamicPage(name:"bridgeDiscovery", title:"Discovery Started!", nextPage:"bridgeBtnPush", refreshInterval:refreshInterval, uninstall: true) {
|
return dynamicPage(name:"bridgeDiscovery", title:"Discovery Started!", nextPage:"bridgeBtnPush", refreshInterval:refreshInterval, uninstall: true) {
|
||||||
section("Please wait while we discover your Hue Bridge. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.") {
|
section("Please wait while we discover your Hue Bridge. Kindly note that you must first configure your Hue Bridge and Lights using the Philips Hue application. " +
|
||||||
|
"Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.") {
|
||||||
input "selectedHue", "enum", required:false, title:"Select Hue Bridge (${numFound} found)", multiple:false, options:options, submitOnChange: true
|
input "selectedHue", "enum", required:false, title:"Select Hue Bridge (${numFound} found)", multiple:false, options:options, submitOnChange: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -178,7 +179,7 @@ def bulbDiscovery() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bulbRefreshCount > 200 && numFound == 0) {
|
if (bulbRefreshCount > 200 && numFound == 0) {
|
||||||
// Time out to avoid endless discovery
|
// Time out after 10 minutes
|
||||||
state.inBulbDiscovery = false
|
state.inBulbDiscovery = false
|
||||||
bulbRefreshCount = 0
|
bulbRefreshCount = 0
|
||||||
return dynamicPage(name:"bulbDiscovery", title:"Light Discovery Failed!", nextPage:"", refreshInterval:0, install:true, uninstall: true) {
|
return dynamicPage(name:"bulbDiscovery", title:"Light Discovery Failed!", nextPage:"", refreshInterval:0, install:true, uninstall: true) {
|
||||||
@@ -216,32 +217,32 @@ private sendDeveloperReq() {
|
|||||||
def token = app.id
|
def token = app.id
|
||||||
def host = getBridgeIP()
|
def host = getBridgeIP()
|
||||||
sendHubCommand(new physicalgraph.device.HubAction([
|
sendHubCommand(new physicalgraph.device.HubAction([
|
||||||
method: "POST",
|
method: "POST",
|
||||||
path: "/api",
|
path: "/api",
|
||||||
headers: [
|
headers: [
|
||||||
HOST: host
|
HOST: host
|
||||||
],
|
],
|
||||||
body: [devicetype: "$token-0"]], "${selectedHue}", [callback: "usernameHandler"]))
|
body: [devicetype: "$token-0"]], "${selectedHue}", [callback: "usernameHandler"]))
|
||||||
}
|
}
|
||||||
|
|
||||||
private discoverHueBulbs() {
|
private discoverHueBulbs() {
|
||||||
def host = getBridgeIP()
|
def host = getBridgeIP()
|
||||||
sendHubCommand(new physicalgraph.device.HubAction([
|
sendHubCommand(new physicalgraph.device.HubAction([
|
||||||
method: "GET",
|
method: "GET",
|
||||||
path: "/api/${state.username}/lights",
|
path: "/api/${state.username}/lights",
|
||||||
headers: [
|
headers: [
|
||||||
HOST: host
|
HOST: host
|
||||||
]], "${selectedHue}", [callback: "lightsHandler"]))
|
]], "${selectedHue}", [callback: "lightsHandler"]))
|
||||||
}
|
}
|
||||||
|
|
||||||
private verifyHueBridge(String deviceNetworkId, String host) {
|
private verifyHueBridge(String deviceNetworkId, String host) {
|
||||||
log.trace "Verify Hue Bridge $deviceNetworkId"
|
log.trace "Verify Hue Bridge $deviceNetworkId"
|
||||||
sendHubCommand(new physicalgraph.device.HubAction([
|
sendHubCommand(new physicalgraph.device.HubAction([
|
||||||
method: "GET",
|
method: "GET",
|
||||||
path: "/description.xml",
|
path: "/description.xml",
|
||||||
headers: [
|
headers: [
|
||||||
HOST: host
|
HOST: host
|
||||||
]], deviceNetworkId, [callback: "bridgeDescriptionHandler"]))
|
]], deviceNetworkId, [callback: "bridgeDescriptionHandler"]))
|
||||||
}
|
}
|
||||||
|
|
||||||
private verifyHueBridges() {
|
private verifyHueBridges() {
|
||||||
@@ -399,7 +400,7 @@ def addBulbs() {
|
|||||||
log.debug "$dni in not longer paired to the Hue Bridge or ID changed"
|
log.debug "$dni in not longer paired to the Hue Bridge or ID changed"
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//backwards compatable
|
//backwards compatable
|
||||||
newHueBulb = bulbs.find { (app.id + "/" + it.id) == dni }
|
newHueBulb = bulbs.find { (app.id + "/" + it.id) == dni }
|
||||||
d = addChildBulb(dni, "Extended Color Light", newHueBulb?.value?.name, newHueBulb?.value?.hub)
|
d = addChildBulb(dni, "Extended Color Light", newHueBulb?.value?.name, newHueBulb?.value?.hub)
|
||||||
d?.completedSetup = true
|
d?.completedSetup = true
|
||||||
@@ -1151,7 +1152,7 @@ def setColorTemperature(childDevice, huesettings) {
|
|||||||
def ct = hueSettings == 6500 ? 153 : Math.round(1000000/huesettings)
|
def ct = hueSettings == 6500 ? 153 : Math.round(1000000/huesettings)
|
||||||
createSwitchEvent(childDevice, "on")
|
createSwitchEvent(childDevice, "on")
|
||||||
put("lights/$id/state", [ct: ct, on: true])
|
put("lights/$id/state", [ct: ct, on: true])
|
||||||
return "Setting color temperature to $percent"
|
return "Setting color temperature to $ct"
|
||||||
}
|
}
|
||||||
|
|
||||||
def setColor(childDevice, huesettings) {
|
def setColor(childDevice, huesettings) {
|
||||||
@@ -1226,7 +1227,7 @@ private poll() {
|
|||||||
def uri = "/api/${state.username}/lights/"
|
def uri = "/api/${state.username}/lights/"
|
||||||
log.debug "GET: $host$uri"
|
log.debug "GET: $host$uri"
|
||||||
sendHubCommand(new physicalgraph.device.HubAction("GET ${uri} HTTP/1.1\r\n" +
|
sendHubCommand(new physicalgraph.device.HubAction("GET ${uri} HTTP/1.1\r\n" +
|
||||||
"HOST: ${host}\r\n\r\n", physicalgraph.device.Protocol.LAN, selectedHue))
|
"HOST: ${host}\r\n\r\n", physicalgraph.device.Protocol.LAN, selectedHue))
|
||||||
}
|
}
|
||||||
|
|
||||||
private isOnline(id) {
|
private isOnline(id) {
|
||||||
@@ -1243,10 +1244,10 @@ private put(path, body) {
|
|||||||
log.debug "BODY: ${bodyJSON}"
|
log.debug "BODY: ${bodyJSON}"
|
||||||
|
|
||||||
sendHubCommand(new physicalgraph.device.HubAction("PUT $uri HTTP/1.1\r\n" +
|
sendHubCommand(new physicalgraph.device.HubAction("PUT $uri HTTP/1.1\r\n" +
|
||||||
"HOST: ${host}\r\n" +
|
"HOST: ${host}\r\n" +
|
||||||
"Content-Length: ${length}\r\n" +
|
"Content-Length: ${length}\r\n" +
|
||||||
"\r\n" +
|
"\r\n" +
|
||||||
"${bodyJSON}", physicalgraph.device.Protocol.LAN, "${selectedHue}"))
|
"${bodyJSON}", physicalgraph.device.Protocol.LAN, "${selectedHue}"))
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -346,7 +346,7 @@ def devicesList(selector = '') {
|
|||||||
if (resp.status == 200) {
|
if (resp.status == 200) {
|
||||||
return resp.data
|
return resp.data
|
||||||
} else {
|
} else {
|
||||||
log.error("Non-200 from device list call. ${resp.status} ${resp.data}")
|
log.debug("No response from device list call. ${resp.status} ${resp.data}")
|
||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -418,9 +418,15 @@ def updateDevices() {
|
|||||||
}
|
}
|
||||||
getChildDevices().findAll { !selectors.contains("${it.deviceNetworkId}") }.each {
|
getChildDevices().findAll { !selectors.contains("${it.deviceNetworkId}") }.each {
|
||||||
log.info("Deleting ${it.deviceNetworkId}")
|
log.info("Deleting ${it.deviceNetworkId}")
|
||||||
state.devices[it.deviceNetworkId] = null
|
if (state.devices[it.deviceNetworkId])
|
||||||
deleteChildDevice(it.deviceNetworkId)
|
state.devices[it.deviceNetworkId] = null
|
||||||
|
// The reason the implementation is trying to delete this bulb is because it is not longer connected to the LIFX location.
|
||||||
|
// Adding "try" will prevent this exception from happening.
|
||||||
|
// Ideally device health would show to the user that the device is not longer accessible so that the user can either force delete it or remove it from the SmartApp.
|
||||||
|
try {
|
||||||
|
deleteChildDevice(it.deviceNetworkId)
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.debug("Can't remove this device because it's being used by an SmartApp")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user