Compare commits

...

23 Commits

Author SHA1 Message Date
Dan Welch 7ce6b55edb MSA-1807: null 2017-02-25 10:08:37 -08:00
SmartThings, Inc a192b75e4c Merge pull request #1071 from SmartThingsCommunity/MSA-1408-1
Merged publication request 'initial submission for Curb'
2017-02-23 14:39:32 -08:00
Vinay Rao f97a0a4072 Merge pull request #1710 from SmartThingsCommunity/staging
Rolling down staging to master
2017-02-23 11:51:47 -08:00
Vinay Rao dd0aba3dc9 Merge pull request #1708 from workingmonk/bug/wemo_dimmer
ICP-375 CON-90 fix for wemo dimming issue
2017-02-23 11:43:45 -08:00
Vinay Rao e787afd165 updated with more devices 2017-02-23 11:31:49 -08:00
Vinay Rao 12be259779 CON-90 fix for wemo dimming issue 2017-02-23 02:41:20 -08:00
Vinay Rao 9cb0ce716b Merge pull request #1707 from SmartThingsCommunity/master
Rolling up master to staging
2017-02-22 13:53:53 -08:00
Vinay Rao 023b9aad2d Merge pull request #1704 from SmartThingsCommunity/staging
Rolling down staging hotfix to master
2017-02-21 12:44:13 -08:00
Vinay Rao ccb7b6e49d Merge pull request #1703 from scottvlaminck/hue_bridge_use_bridge_cap
CON-79 Update Hue Bridge to use new Bridge marker capability
2017-02-21 12:29:28 -08:00
Scott Vlaminck 34f77a2989 update Hue Bridge to use new Bridge marker capability 2017-02-21 13:42:19 -06:00
Vinay Rao 318cdedaec Merge pull request #1702 from scottvlaminck/add_outlet_capability
add Outlet capability
2017-02-21 10:28:12 -08:00
Jack Chi 011a5ddc74 Merge pull request #1607 from jackchi/hue-enrollment-fix
[CHF-508] Hue bulbs hides enrollment events
2017-02-21 10:13:45 -08:00
Scott Vlaminck 649ed033d0 add Outlet capability 2017-02-21 11:07:51 -06:00
Vinay Rao 843d8800ac Merge pull request #1662 from juano2310/LIFX_exceptions
DVCSMP-2425 - LIFX Exceptions
2017-02-15 15:24:24 -08:00
juano2310 bcc680ee5d DVCSMP-2425 - LIFX Exceptions
Adding comment
2017-02-15 18:21:26 -05:00
Vinay Rao 245e85f850 Merge pull request #1680 from varzac/fix-smartpower-outlet-power-usage
[PROB-1518] Properly create event for outlet power
2017-02-15 14:11:05 -08:00
Vinay Rao af16720528 Merge pull request #1681 from SmartThingsCommunity/master
Rolling up master to staging
2017-02-15 13:58:58 -08:00
Zach Varberg c6d6ba85f5 Properly create event for outlet power
We were not properly creating the event before returning it, causing us
to not actually generate the power event.

This resolves: https://smartthings.atlassian.net/browse/PROB-1518
2017-02-15 13:49:47 -06:00
Vinay Rao 81550ee25c Merge pull request #1673 from larsfinander/ICP-280_Instruction_for_Phlips_Hue_staging
ICP-280 Instruction for Phlips Hue
2017-02-14 13:58:38 -08:00
Vinay Rao 1cc9d8a90b Merge pull request #1675 from SmartThingsCommunity/master
Rolling up master to staging
2017-02-14 12:11:03 -08:00
Lars Finander 9b6e7d3be8 ICP-280 Instruction for Phlips Hue
-Added instructions to tell user to setup in Hue app first
-Fix a null printout and some whitespace
2017-02-14 11:23:27 -07:00
jackchi a5d0c1d80a [CHF-508] Hue bulbs hides enrollment events 2017-01-20 11:33:14 -08:00
Curb Operations 1674dc7339 MSA-1408: it exposes a customer's smart thing switches, and allows the user to toggle them from the Curb app. 2016-07-22 10:39:53 -05:00
13 changed files with 237 additions and 48 deletions
@@ -0,0 +1,68 @@
/**
* Zooz 4-in-1
*
* Copyright 2017 Dan Welch
*
* 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.
*
*/
metadata {
definition (name: "Zooz 4-in-1", namespace: "Danlwelch", author: "Dan Welch") {
capability "Illuminance Measurement"
capability "Light"
capability "Light"
capability "Motion Sensor"
capability "Temperature Measurement"
attribute "Humidity", "string"
}
simulator {
// TODO: define status and reply messages here
}
tiles {
// TODO: define your main and details tiles here
}
}
// parse events into attributes
def parse(String description) {
log.debug "Parsing '${description}'"
// TODO: handle 'illuminance' attribute
// TODO: handle 'switch' attribute
// TODO: handle 'switch' attribute
// TODO: handle 'motion' attribute
// TODO: handle 'temperature' attribute
// TODO: handle 'Humidity' attribute
}
// handle commands
def off() {
log.debug "Executing 'off'"
// TODO: handle 'off' command
}
def on() {
log.debug "Executing 'on'"
// TODO: handle 'on' command
}
def off() {
log.debug "Executing 'off'"
// TODO: handle 'off' command
}
def on() {
log.debug "Executing 'on'"
// TODO: handle 'on' command
}
@@ -58,7 +58,7 @@ metadata {
}
void installed() {
sendEvent(name: "DeviceWatch-Enroll", value: "{\"protocol\": \"LAN\", \"scheme\":\"untracked\", \"hubHardwareId\": \"${device.hub.hardwareID}\"}")
sendEvent(name: "DeviceWatch-Enroll", value: "{\"protocol\": \"LAN\", \"scheme\":\"untracked\", \"hubHardwareId\": \"${device.hub.hardwareID}\"}", displayed: false)
}
// parse events into attributes
@@ -7,6 +7,7 @@
metadata {
// Automatically generated. Make future change here.
definition (name: "Hue Bridge", namespace: "smartthings", author: "SmartThings") {
capability "Bridge"
capability "Health Check"
attribute "networkAddress", "string"
@@ -45,7 +46,7 @@ metadata {
}
void installed() {
sendEvent(name: "DeviceWatch-Enroll", value: "{\"protocol\": \"LAN\", \"scheme\":\"untracked\", \"hubHardwareId\": \"${device.hub.hardwareID}\"}")
sendEvent(name: "DeviceWatch-Enroll", value: "{\"protocol\": \"LAN\", \"scheme\":\"untracked\", \"hubHardwareId\": \"${device.hub.hardwareID}\"}", displayed: false)
}
// parse events into attributes
@@ -67,7 +67,7 @@ metadata {
}
void installed() {
sendEvent(name: "DeviceWatch-Enroll", value: "{\"protocol\": \"LAN\", \"scheme\":\"untracked\", \"hubHardwareId\": \"${device.hub.hardwareID}\"}")
sendEvent(name: "DeviceWatch-Enroll", value: "{\"protocol\": \"LAN\", \"scheme\":\"untracked\", \"hubHardwareId\": \"${device.hub.hardwareID}\"}", displayed: false)
}
// parse events into attributes
@@ -51,7 +51,7 @@ metadata {
}
void installed() {
sendEvent(name: "DeviceWatch-Enroll", value: "{\"protocol\": \"LAN\", \"scheme\":\"untracked\", \"hubHardwareId\": \"${device.hub.hardwareID}\"}")
sendEvent(name: "DeviceWatch-Enroll", value: "{\"protocol\": \"LAN\", \"scheme\":\"untracked\", \"hubHardwareId\": \"${device.hub.hardwareID}\"}", displayed: false)
}
// parse events into attributes
@@ -56,7 +56,7 @@ metadata {
}
void installed() {
sendEvent(name: "DeviceWatch-Enroll", value: "{\"protocol\": \"LAN\", \"scheme\":\"untracked\", \"hubHardwareId\": \"${device.hub.hardwareID}\"}")
sendEvent(name: "DeviceWatch-Enroll", value: "{\"protocol\": \"LAN\", \"scheme\":\"untracked\", \"hubHardwareId\": \"${device.hub.hardwareID}\"}", displayed: false)
}
// parse events into attributes
@@ -24,6 +24,7 @@ metadata {
capability "Refresh"
capability "Actuator"
capability "Sensor"
capability "Outlet"
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
}
return event
return event ? createEvent(event) : event
}
def setLevel(value) {
@@ -4,6 +4,7 @@ metadata {
capability "Actuator"
capability "Switch"
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"
}
@@ -83,9 +83,8 @@ def parse(String description) {
if (event) {
if (event.name == "power") {
event.value = event.value / 10
event.descriptionText = '{{ device.displayName }} power is {{ value }} Watts'
event.translatable = true
def value = (event.value as Integer) / 10
event = createEvent(name: event.name, value: value, descriptionText: '{{ device.displayName }} power is {{ value }} Watts', translatable: true)
} else if (event.name == "switch") {
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)
@@ -106,7 +105,7 @@ def parse(String description) {
log.debug "${cluster}"
}
}
return event
return event ? createEvent(event) : event
}
def off() {
@@ -113,6 +113,14 @@ def refresh() {
zigbee.onOffRefresh() + zigbee.levelRefresh()
}
def installed() {
if (((device.getDataValue("manufacturer") == "MRVL") && (device.getDataValue("model") == "MZ100")) || (device.getDataValue("manufacturer") == "OSRAM SYLVANIA") || (device.getDataValue("manufacturer") == "OSRAM")) {
if ((device.currentState("level")?.value == null) || (device.currentState("level")?.value == 0)) {
sendEvent(name: "level", value: 100)
}
}
}
def configure() {
log.debug "Configuring Reporting and Bindings."
// Device-Watch allows 2 check-in misses from device + ping (plus 1 min lag time)
@@ -0,0 +1,103 @@
/**
* Curb Control
*
* Copyright 2016 Savanni D'Gerinel
*
*/
definition(
name: "Curb Control",
namespace: "curb-v2",
author: "Savanni D'Gerinel",
description: "Control point for Curb/SmartThings integration",
category: "Green Living",
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 Endpoint to Control These Things...") {
input "switches", "capability.switch", title: "Which Switches?", multiple: true, required: false
}
}
mappings {
path("/switches") {
action: [
GET: "listSwitches"
]
}
path("/switches/:id") {
action: [
GET: "showSwitch"
]
}
path("/switches/:id/:command") {
action: [
PUT: "updateSwitch"
]
}
}
def installed() {}
def updated() {}
//switches
def listSwitches() {
switches.collect{device(it,"switch")}
}
def showSwitch() {
show(switches, "switch")
}
void updateSwitch() {
update(switches)
}
def deviceHandler(evt) {}
private void update(devices) {
log.debug "update, request: params: ${params}, devices: $devices.id"
//def command = request.JSON?.command
def command = params.command
//let's create a toggle option here
if (command)
{
def device = devices.find { it.id == params.id }
if (!device) {
httpError(404, "Device not found")
} else {
if(command == "toggle")
{
if(device.currentValue('switch') == "on")
device.off();
else
device.on();;
}
}
}
}
private show(devices, type) {
def device = devices.find { it.id == params.id }
if (!device) {
httpError(404, "Device not found")
}
else {
def attributeName = type == "motionSensor" ? "motion" : type
def s = device.currentState(attributeName)
[id: device.id, label: device.displayName, value: s?.value, unitTime: s?.date?.time, type: type]
}
}
private device(it, type) {
it ? [id: it.id, label: it.label, type: type] : null
}
@@ -85,7 +85,8 @@ def bridgeDiscovery(params=[:])
}
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
}
}
@@ -178,7 +179,7 @@ def bulbDiscovery() {
}
if (bulbRefreshCount > 200 && numFound == 0) {
// Time out to avoid endless discovery
// Time out after 10 minutes
state.inBulbDiscovery = false
bulbRefreshCount = 0
return dynamicPage(name:"bulbDiscovery", title:"Light Discovery Failed!", nextPage:"", refreshInterval:0, install:true, uninstall: true) {
@@ -1151,7 +1152,7 @@ def setColorTemperature(childDevice, huesettings) {
def ct = hueSettings == 6500 ? 153 : Math.round(1000000/huesettings)
createSwitchEvent(childDevice, "on")
put("lights/$id/state", [ct: ct, on: true])
return "Setting color temperature to $percent"
return "Setting color temperature to $ct"
}
def setColor(childDevice, huesettings) {
@@ -346,7 +346,7 @@ def devicesList(selector = '') {
if (resp.status == 200) {
return resp.data
} 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 []
}
}
@@ -418,9 +418,15 @@ def updateDevices() {
}
getChildDevices().findAll { !selectors.contains("${it.deviceNetworkId}") }.each {
log.info("Deleting ${it.deviceNetworkId}")
if (state.devices[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")
}
}
}