Compare commits

..

10 Commits

Author SHA1 Message Date
Vinay Rao
fc312286a2 Merge pull request #1653 from SmartThingsCommunity/staging
Rolling up staging to production for deploy
2017-02-07 14:21:49 -08:00
Vinay Rao
871d75aea6 Merge pull request #1650 from larsfinander/DVCSMP-2395_Update_OPenT2T_staging
DVCSMP-2395 Update OpenT2T with bugfixes
2017-02-06 11:44:13 -08:00
Lars Finander
3905d48235 DVCSMP-2395 Update OpenT2T with bugfixes 2017-02-06 12:34:00 -07:00
Vinay Rao
d91c02b970 Merge pull request #1644 from varzac/fix-zigbee-dimmer-set-level
DPROT-238 Fix typo on toInteger zigbee dimmer power
2017-02-03 16:35:48 -08:00
Zach Varberg
e019d22aff Fix typo on toInteger zigbee dimmer power
This relates to: https://smartthings.atlassian.net/browse/DPROT-238
2017-02-03 16:22:20 -06:00
Vinay Rao
900ab9f70e Merge pull request #1638 from dkirker/DEVC-488
DEVC-488 Add fingerprint for DL15S In-wall Switch
2017-02-03 13:53:48 -08:00
Vinay Rao
e8d205c775 Merge pull request #1643 from varzac/fix-zigbee-dimmer-set-level
[DPROT-238] Manually call on with setLevel
2017-02-03 13:14:14 -08:00
Zach Varberg
1800ea2bad Manually call on with setLevel
This is to work around misbehaving devices that don't properly honor the
move to level with on off command.

This resolves: https://smartthings.atlassian.net/browse/DPROT-238
2017-02-03 13:01:05 -06:00
Donald Kirker
54a4620c9b DEVC-488 Add fingerprint for DL15S In-wall Switch 2017-02-02 22:00:49 -08:00
Vinay Rao
0846b6f34c Merge pull request #1629 from SmartThingsCommunity/staging
Rolling up staging to production
2017-01-31 13:25:26 -08:00
11 changed files with 50 additions and 201 deletions

View File

@@ -1,145 +0,0 @@
/**
* Aeon Motor Controller
*
* Copyright 2015 Bruce Ravenel
*
* 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: "Aeon Motor Controller", namespace: "bravenel", author: "Bruce Ravenel") {
capability "Refresh"
capability "Actuator"
capability "doorControl"
capability "Switch"
command "up"
command "down"
command "stop"
// fingerprint inClusters: "0x26,0x32"
}
simulator {
status "up": "command: 2604, payload: FF"
status "down": "command: 2604, payload: 00"
status "stop": "command: 2605, payload: FE"
["FF", "FE", "00"].each { val ->
reply "2001$val,delay 100,2602": "command: 2603, payload: $val"
}
}
tiles {
standardTile("motor", "device.motor", width: 2, height: 2) {
state("stopUp", label:'stop', icon:"st.doors.garage.garage-open", action: 'down', backgroundColor:"#79b821")
state("stopDn", label:'stop', icon:"st.doors.garage.garage-closed", action: 'up', backgroundColor:"#79b821")
state("up", label:'up', icon:"st.doors.garage.garage-opening", action:'stop', backgroundColor:"#ffe71e")
state("down", label:'down', icon:"st.doors.garage.garage-closing", action:'stop', backgroundColor:"#ffe71e")
}
valueTile("energy", "device.energy", decoration: "flat") {
state "default", label:' '
}
standardTile("refresh", "device.switch", inactiveLabel: false, decoration: "flat") {
state "default", label:"", action:"refresh.refresh", icon:"st.secondary.refresh"
}
standardTile("stop", "device.switch") {
state "default", label:"", action: "stop", icon:"http://cdn.device-icons.smartthings.com/sonos/stop-btn@2x.png"
}
standardTile("up", "device.switch") {
state "default", label: "Up", action: "up", icon:"http://cdn.device-icons.smartthings.com/thermostat/thermostat-up@2x.png"
}
standardTile("down", "device.switch") {
state "default", label: "Down", action: "down", icon:"http://cdn.device-icons.smartthings.com/thermostat/thermostat-down@2x.png"
}
}
main(["motor"])
details(["motor", "refresh", "energy", "up", "down", "stop",])
}
// parse events into attributes
def parse(String description) {
def result = []
def cmd = zwave.parse(description, [0x20: 1, 0x26: 3])
if (cmd) {
result = zwaveEvent(cmd)
log.debug("'$description' parsed to $result")
} else {
log.debug("Couldn't zwave.parse '$description'")
}
result
}
def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd) {
motorEvents(cmd)
}
def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd) {
motorEvents(cmd)
}
def zwaveEvent(physicalgraph.zwave.commands.switchmultilevelv3.SwitchMultilevelReport cmd) {
motorEvents(cmd)
}
def motorEvents(physicalgraph.zwave.Command cmd) {
def result = []
def switchEvent = []
if(cmd.value == 0) {switchEvent = createEvent(name: "motor", value: "down", descriptionText: text)}
else if(cmd.value == 254) {
def stopVal = state.up ? "stopUp" : "stopDn"
switchEvent = createEvent(name: "motor", value: stopVal, descriptionText: text)
}
else if(cmd.value == 255) {switchEvent = createEvent(name: "motor", value: "up", descriptionText: text)}
result << switchEvent
}
def refresh() {
zwave.switchMultilevelV1.switchMultilevelGet().format()
}
def up() {
state.up = true
delayBetween([
zwave.basicV1.basicSet(value: 0xFF).format(),
zwave.switchMultilevelV1.switchMultilevelGet().format()
], 1000)
}
def down() {
state.up = false
delayBetween([
zwave.basicV1.basicSet(value: 0x00).format(),
zwave.switchMultilevelV1.switchMultilevelGet().format()
], 1000)
}
def stop() {
delayBetween([
zwave.switchMultilevelV1.switchMultilevelStopLevelChange().format(),
zwave.switchMultilevelV1.switchMultilevelGet().format()
], 1000)
}
def on() {
state.up = true
delayBetween([
zwave.basicV1.basicSet(value: 0xFF).format(),
zwave.switchMultilevelV1.switchMultilevelGet().format()
], 1000)
}
def off() {
state.up = false
delayBetween([
zwave.basicV1.basicSet(value: 0x00).format(),
zwave.switchMultilevelV1.switchMultilevelGet().format()
], 1000)
}

View File

@@ -40,11 +40,14 @@ metadata {
// Parse incoming device messages to generate events
def parse(String description) {
def resMap
if (description.startsWith("zone")) {
resMap = createEvent(name: "contact", value: zigbee.parseZoneStatus(description).isAlarm1Set() ? "open" : "closed")
def name = null
def value = description
if (zigbee.isZoneType19(description)) {
name = "contact"
value = zigbee.translateStatusZoneType19(description) ? "open" : "closed"
}
log.debug "Parse returned $resMap"
return resMap
def result = createEvent(name: name, value: value)
log.debug "Parse returned ${result?.descriptionText}"
return result
}

View File

@@ -88,7 +88,7 @@ def parse(String description) {
log.debug "parse($description)"
def results = [:]
if (!isSupportedDescription(description) || description.startsWith("zone")) {
if (!isSupportedDescription(description) || zigbee.isZoneType19(description)) {
// Ignore this in favor of orientation-based state
// results = parseSingleMessage(description)
}

View File

@@ -117,7 +117,7 @@ def parse(String description) {
log.debug "parse($description)"
def results = null
if (!isSupportedDescription(description) || description.startsWith("zone")) {
if (!isSupportedDescription(description) || zigbee.isZoneType19(description)) {
// Ignore this in favor of orientation-based state
// results = parseSingleMessage(description)
}

View File

@@ -45,7 +45,7 @@ metadata {
def parse(String description) {
def results = [:]
if (description.startsWith("zone") || !isSupportedDescription(description)) {
if (isZoneType19(description) || !isSupportedDescription(description)) {
results = parseBasicMessage(description)
}
else if (isMotionStatusMessage(description)){
@@ -87,12 +87,16 @@ private String parseName(String description) {
}
private String parseValue(String description) {
def zs = zigbee.parseZoneStatus(description)
if (zs) {
zs.isAlarm1Set() ? "active" : "inactive"
} else {
description
if (isZoneType19(description)) {
if (translateStatusZoneType19(description)) {
return "active"
}
else {
return "inactive"
}
}
description
}
private parseDescriptionText(String linkText, String value, String description) {

View File

@@ -86,7 +86,7 @@ metadata {
def parse(String description) {
def results
if (!isSupportedDescription(description) || description.startsWith("zone")) {
if (!isSupportedDescription(description) || zigbee.isZoneType19(description)) {
results = parseSingleMessage(description)
}
else if (description == 'updated') {
@@ -488,7 +488,12 @@ private String parseValue(String description) {
if (!isSupportedDescription(description)) {
return description
}
return zigbee.parseZoneStatus(description)?.isAlarm1Set() ? "open" : "closed"
else if (zigbee.translateStatusZoneType19(description)) {
return "open"
}
else {
return "closed"
}
}
private parseDescriptionText(String linkText, String value, String description) {

View File

@@ -96,7 +96,7 @@ metadata {
def parse(String description) {
def results
if (!isSupportedDescription(description) || description.startsWith("zone")) {
if (!isSupportedDescription(description) || zigbee.isZoneType19(description)) {
// Ignore this in favor of orientation-based state
// results = parseSingleMessage(description)
}

View File

@@ -118,38 +118,15 @@ private Map getBatteryResult(rawValue) {
private Map parseNonIasButtonMessage(Map descMap){
def buttonState = ""
def buttonNumber = 0
if ((device.getDataValue("model") == "3460-L") &&(descMap.clusterInt == 0x0006)) {
if (descMap.commandInt == 1) {
if (((device.getDataValue("model") == "3460-L") || (device.getDataValue("model") == "3450-L"))
&&(descMap.clusterInt == 0x0006)) {
if (descMap.command == "01") {
getButtonResult("press")
}
else if (descMap.commandInt == 0) {
else if (descMap.command == "00") {
getButtonResult("release")
}
}
else if ((device.getDataValue("model") == "3450-L") && (descMap.clusterInt == 0x0006)) {
if (descMap.commandInt == 1) {
getButtonResult("press")
}
else if (descMap.commandInt == 0) {
def button = 1
switch(descMap.sourceEndpoint) {
case "01":
button = 4
break
case "02":
button = 3
break
case "03":
button = 1
break
case "04":
button = 2
break
}
getButtonResult("release", button)
}
}
else if (descMap.clusterInt == 0x0006) {
buttonState = "pushed"
if (descMap.command == "01") {

View File

@@ -97,7 +97,7 @@ def on() {
}
def setLevel(value) {
zigbee.setLevel(value)
zigbee.setLevel(value) + (value?.toInteger() > 0 ? zigbee.on() : [])
}
/**

View File

@@ -23,6 +23,7 @@ metadata {
fingerprint profileId: "0104", inClusters: "0000, 0003, 0006", outClusters: "0003, 0006, 0019, 0406", manufacturer: "Leviton", model: "ZSS-10", deviceJoinName: "Leviton Switch"
fingerprint profileId: "0104", inClusters: "0000, 0003, 0006", outClusters: "000A", manufacturer: "HAI", model: "65A21-1", deviceJoinName: "Leviton Wireless Load Control Module-30amp"
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006", outClusters: "0003, 0006, 0008, 0019, 0406", manufacturer: "Leviton", model: "DL15A", deviceJoinName: "Leviton Lumina RF Plug-In Appliance Module"
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006", outClusters: "0003, 0006, 0008, 0019, 0406", manufacturer: "Leviton", model: "DL15S", deviceJoinName: "Leviton Lumina RF Switch"
}
// simulator metadata

View File

@@ -51,7 +51,7 @@ definition(
//Device Inputs
preferences {
section("Allow <PLACEHOLDER: Your App Name> to control these things...") {
section("Allow OpenT2T to control these things...") {
input "contactSensors", "capability.contactSensor", title: "Which Contact Sensors", multiple: true, required: false
input "garageDoors", "capability.garageDoorControl", title: "Which Garage Doors?", multiple: true, required: false
input "locks", "capability.lock", title: "Which Locks?", multiple: true, required: false
@@ -329,34 +329,38 @@ private getDeviceType(device) {
switch (it.name.toLowerCase()) {
case "switch":
deviceType = "switch"
break
case "switch level":
deviceType = "light"
if (caps.any { it.name.toLowerCase() == "power meter" }) {
return deviceType
}
if (caps.any { it.name.toLowerCase() == "switch level" }) {
deviceType = "light"
return deviceType
}
break
case "contact sensor":
deviceType = "contactSensor"
break
return deviceType
case "garageDoorControl":
deviceType = "garageDoor"
break
return deviceType
case "lock":
deviceType = "lock"
break
return deviceType
case "video camera":
deviceType = "camera"
break
return deviceType
case "motion sensor":
deviceType = "motionSensor"
break
return deviceType
case "presence sensor":
deviceType = "presenceSensor"
break
return deviceType
case "thermostat":
deviceType = "thermostat"
break
return deviceType
case "water sensor":
deviceType = "waterSensor"
break
return deviceType
default:
break
}