mirror of
https://github.com/mtan93/SmartThingsPublic.git
synced 2026-03-09 13:21:53 +00:00
Compare commits
145 Commits
DHF-7
...
MSA-2148-1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
42d1a31d20 | ||
|
|
a99b9f7367 | ||
|
|
95b294dbcb | ||
|
|
0d1f9f21ac | ||
|
|
8b75c7350a | ||
|
|
21028d48f2 | ||
|
|
9421ca622a | ||
|
|
dadefdfda2 | ||
|
|
1977b5c2cc | ||
|
|
8bd02707f4 | ||
|
|
c86d61a862 | ||
|
|
8126203164 | ||
|
|
04f56060c9 | ||
|
|
215253d6d3 | ||
|
|
f6e99745ce | ||
|
|
47eedf5770 | ||
|
|
3d0dbc57a1 | ||
|
|
d2b16ab9c4 | ||
|
|
7297ad2622 | ||
|
|
f1a8d58c40 | ||
|
|
6b4309fa95 | ||
|
|
3d0fb9cdde | ||
|
|
f0f72b2bce | ||
|
|
19de3e0145 | ||
|
|
a06aff2bbb | ||
|
|
dfad749e3c | ||
|
|
f96ae94d12 | ||
|
|
748529b81b | ||
|
|
de5f0683d3 | ||
|
|
fc70b5ce55 | ||
|
|
36e63133fc | ||
|
|
838c466312 | ||
|
|
97bfe61baa | ||
|
|
34df40d5b4 | ||
|
|
545be046f0 | ||
|
|
a5041e0fcb | ||
|
|
6996a07969 | ||
|
|
5beae1d9fc | ||
|
|
e5738978b0 | ||
|
|
07064eb8cc | ||
|
|
f519a2d828 | ||
|
|
4da49283bf | ||
|
|
7389edf795 | ||
|
|
23154372d2 | ||
|
|
1b0437c633 | ||
|
|
b3d9578140 | ||
|
|
7549979be5 | ||
|
|
771926c337 | ||
|
|
f647be3a62 | ||
|
|
728b169a08 | ||
|
|
d2f981fd34 | ||
|
|
2536c69083 | ||
|
|
a58dd2094d | ||
|
|
c549a5bed0 | ||
|
|
ef5fffc4bc | ||
|
|
c370e88a6b | ||
|
|
ce8c50c630 | ||
|
|
b069669c11 | ||
|
|
4d61d28b42 | ||
|
|
4547d0543b | ||
|
|
6b1e41198c | ||
|
|
59e6f1251b | ||
|
|
e8939a77d7 | ||
|
|
5aee3a1861 | ||
|
|
17ae692aa0 | ||
|
|
f02428b99f | ||
|
|
34174b730c | ||
|
|
12f874408a | ||
|
|
513e44912c | ||
|
|
f752a01906 | ||
|
|
505ec4ff0f | ||
|
|
fe0f555f10 | ||
|
|
6e1701f955 | ||
|
|
9f5378c2b6 | ||
|
|
39e828b16d | ||
|
|
42353044e6 | ||
|
|
78f06a0b9d | ||
|
|
7f13dd356d | ||
|
|
4042bbbf98 | ||
|
|
20407441d9 | ||
|
|
52925d6d99 | ||
|
|
e6c17131af | ||
|
|
cc70865fbf | ||
|
|
91a77afb2d | ||
|
|
006ffa8a0b | ||
|
|
5e787dd0e3 | ||
|
|
17465c87c0 | ||
|
|
370b435874 | ||
|
|
be9bdae4cc | ||
|
|
c278e035f6 | ||
|
|
e53d9c910c | ||
|
|
c13014936b | ||
|
|
d6b0f6a8ed | ||
|
|
62c810ba90 | ||
|
|
ea3abb26c0 | ||
|
|
0b81793b0f | ||
|
|
16f41bddae | ||
|
|
117adea586 | ||
|
|
783538e36d | ||
|
|
fb8e4a2416 | ||
|
|
320c8918f8 | ||
|
|
0f3656cd12 | ||
|
|
6110aaa0fa | ||
|
|
c391ce4b43 | ||
|
|
073bac8dac | ||
|
|
c4c2a3ffd7 | ||
|
|
3c83bfb53b | ||
|
|
6325101f52 | ||
|
|
945a972082 | ||
|
|
535fc112de | ||
|
|
a844e85c47 | ||
|
|
b65acdb91f | ||
|
|
4067e6e7e2 | ||
|
|
4c6d1eddb2 | ||
|
|
10d2097ebe | ||
|
|
d3728d95b2 | ||
|
|
60f6e9c02c | ||
|
|
b645872d8f | ||
|
|
d3731b49fe | ||
|
|
da139056e1 | ||
|
|
d864c5e3b3 | ||
|
|
74a35eeddb | ||
|
|
7064ce972a | ||
|
|
936ee59242 | ||
|
|
79a6a6472e | ||
|
|
919111ed22 | ||
|
|
fc1f1508ad | ||
|
|
7f3cd0cdaa | ||
|
|
423c25df53 | ||
|
|
df8e435fcc | ||
|
|
8aceef9be4 | ||
|
|
144314d9ae | ||
|
|
a1f39849ed | ||
|
|
8eed22ca0c | ||
|
|
d626c5f2a1 | ||
|
|
1dae5d3936 | ||
|
|
807ff53c6d | ||
|
|
f95319ce59 | ||
|
|
453dbbdde3 | ||
|
|
52427802a8 | ||
|
|
72bb22a4b8 | ||
|
|
1263a6e2e1 | ||
|
|
a4d9cd51a3 | ||
|
|
92e1586fa6 | ||
|
|
45663ffb86 |
18
build.gradle
18
build.gradle
@@ -9,7 +9,7 @@ apply plugin: 'smartthings-slack'
|
||||
|
||||
buildscript {
|
||||
dependencies {
|
||||
classpath "com.smartthings.deployment:executable-deployment-scripts:1.0.11"
|
||||
classpath "com.smartthings.deployment:executable-deployment-scripts:1.0.12"
|
||||
}
|
||||
repositories {
|
||||
mavenLocal()
|
||||
@@ -19,7 +19,7 @@ buildscript {
|
||||
username smartThingsArtifactoryUserName
|
||||
password smartThingsArtifactoryPassword
|
||||
}
|
||||
url "https://artifactory.smartthings.com/libs-release-local"
|
||||
url "https://smartthings.jfrog.io/smartthings/libs-release-local"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -32,7 +32,7 @@ repositories {
|
||||
username smartThingsArtifactoryUserName
|
||||
password smartThingsArtifactoryPassword
|
||||
}
|
||||
url "https://artifactory.smartthings.com/libs-release-local"
|
||||
url "https://smartthings.jfrog.io/smartthings/libs-release-local"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,10 +51,10 @@ sourceSets {
|
||||
|
||||
dependencies {
|
||||
devicetypesCompile 'org.codehaus.groovy:groovy-all:2.4.7'
|
||||
devicetypesCompile 'smartthings:appengine-z-wave:0.1.2'
|
||||
devicetypesCompile 'smartthings:appengine-zigbee:0.1.11'
|
||||
devicetypesCompile 'smartthings:appengine-z-wave:0.1.3'
|
||||
devicetypesCompile 'smartthings:appengine-zigbee:0.1.12'
|
||||
smartappsCompile 'org.codehaus.groovy:groovy-all:2.4.7'
|
||||
smartappsCompile 'smartthings:appengine-common:0.1.8'
|
||||
smartappsCompile 'smartthings:appengine-common:0.1.9'
|
||||
smartappsCompile 'org.codehaus.groovy.modules.http-builder:http-builder:0.7.1'
|
||||
smartappsCompile 'org.grails:grails-web:2.3.11'
|
||||
smartappsCompile 'org.json:json:20140107'
|
||||
@@ -74,19 +74,19 @@ slackSendMessage {
|
||||
String username
|
||||
switch (branch) {
|
||||
case 'master':
|
||||
username = 'Hickory'
|
||||
username = 'DEV'
|
||||
iconUrl = wolverine
|
||||
color = '#35D0F2'
|
||||
messageText = 'Began deployment of _SmartThingsPublic[master]_ branch to the _Dev_ environments.'
|
||||
break
|
||||
case 'staging':
|
||||
username = 'Dickory'
|
||||
username = 'STG'
|
||||
iconUrl = beach
|
||||
color = '#FFDE20'
|
||||
messageText = 'Began deployment of _SmartThingsPublic[staging]_ branch to the _Staging_ environments.'
|
||||
break
|
||||
case 'production':
|
||||
username = 'Dock'
|
||||
username = 'PRD'
|
||||
iconUrl = drinks
|
||||
color = '#FF1D23'
|
||||
messageText = 'Began deployment of _SmartThingsPublic[production]_ branch to the _Prod_ environments.'
|
||||
|
||||
@@ -0,0 +1,268 @@
|
||||
/**
|
||||
*
|
||||
* Inovelli 2-Channel Smart Plug
|
||||
*
|
||||
* github: Eric Maycock (erocm123)
|
||||
* Date: 2017-04-27
|
||||
* Copyright Eric Maycock
|
||||
*
|
||||
* Includes all configuration parameters and ease of advanced configuration.
|
||||
*
|
||||
* 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: "Inovelli 2-Channel Smart Plug", namespace: "erocm123", author: "Eric Maycock") {
|
||||
capability "Actuator"
|
||||
capability "Sensor"
|
||||
capability "Switch"
|
||||
capability "Polling"
|
||||
capability "Refresh"
|
||||
capability "Health Check"
|
||||
|
||||
fingerprint manufacturer: "015D", prod: "0221", model: "251C", deviceJoinName: "Show Home 2-Channel Smart Plug"
|
||||
fingerprint manufacturer: "0312", prod: "B221", model: "251C", deviceJoinName: "Inovelli 2-Channel Smart Plug"
|
||||
}
|
||||
simulator {}
|
||||
preferences {}
|
||||
tiles {
|
||||
multiAttributeTile(name: "switch", type: "lighting", width: 6, height: 4, canChangeIcon: true) {
|
||||
tileAttribute("device.switch", key: "PRIMARY_CONTROL") {
|
||||
attributeState "off", label: '${name}', action: "switch.on", icon: "st.switches.switch.off", backgroundColor: "#ffffff", nextState: "turningOn"
|
||||
attributeState "on", label: '${name}', action: "switch.off", icon: "st.switches.switch.on", backgroundColor: "#00a0dc", nextState: "turningOff"
|
||||
attributeState "turningOff", label: '${name}', action: "switch.on", icon: "st.switches.switch.off", backgroundColor: "#ffffff", nextState: "turningOn"
|
||||
attributeState "turningOn", label: '${name}', action: "switch.off", icon: "st.switches.switch.on", backgroundColor: "#00a0dc", nextState: "turningOff"
|
||||
}
|
||||
}
|
||||
standardTile("refresh", "device.switch", inactiveLabel: false, decoration: "flat", width: 2, height: 2) {
|
||||
state "default", label: "", action: "refresh.refresh", icon: "st.secondary.refresh"
|
||||
}
|
||||
main(["switch"])
|
||||
details(["switch",
|
||||
childDeviceTiles("all"), "refresh"
|
||||
])
|
||||
}
|
||||
}
|
||||
def parse(String description) {
|
||||
def result = []
|
||||
def cmd = zwave.parse(description)
|
||||
if (cmd) {
|
||||
result += zwaveEvent(cmd)
|
||||
logging("Parsed ${cmd} to ${result.inspect()}", 1)
|
||||
} else {
|
||||
logging("Non-parsed event: ${description}", 2)
|
||||
}
|
||||
return result
|
||||
}
|
||||
def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd, ep = null) {
|
||||
logging("BasicReport ${cmd} - ep ${ep}", 2)
|
||||
if (ep) {
|
||||
def event
|
||||
childDevices.each {
|
||||
childDevice ->
|
||||
if (childDevice.deviceNetworkId == "$device.deviceNetworkId-ep$ep") {
|
||||
childDevice.sendEvent(name: "switch", value: cmd.value ? "on" : "off")
|
||||
}
|
||||
}
|
||||
if (cmd.value) {
|
||||
event = [createEvent([name: "switch", value: "on"])]
|
||||
} else {
|
||||
def allOff = true
|
||||
childDevices.each {
|
||||
n ->
|
||||
if (n.currentState("switch").value != "off") allOff = false
|
||||
}
|
||||
if (allOff) {
|
||||
event = [createEvent([name: "switch", value: "off"])]
|
||||
} else {
|
||||
event = [createEvent([name: "switch", value: "on"])]
|
||||
}
|
||||
}
|
||||
return event
|
||||
}
|
||||
}
|
||||
def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd) {
|
||||
logging("BasicSet ${cmd}", 2)
|
||||
def result = createEvent(name: "switch", value: cmd.value ? "on" : "off", type: "digital")
|
||||
def cmds = []
|
||||
cmds << encap(zwave.switchBinaryV1.switchBinaryGet(), 1)
|
||||
cmds << encap(zwave.switchBinaryV1.switchBinaryGet(), 2)
|
||||
return [result, response(commands(cmds))] // returns the result of reponse()
|
||||
}
|
||||
def zwaveEvent(physicalgraph.zwave.commands.switchbinaryv1.SwitchBinaryReport cmd, ep = null) {
|
||||
logging("SwitchBinaryReport ${cmd} - ep ${ep}", 2)
|
||||
if (ep) {
|
||||
def event
|
||||
def childDevice = childDevices.find {
|
||||
it.deviceNetworkId == "$device.deviceNetworkId-ep$ep"
|
||||
}
|
||||
if (childDevice) childDevice.sendEvent(name: "switch", value: cmd.value ? "on" : "off")
|
||||
if (cmd.value) {
|
||||
event = [createEvent([name: "switch", value: "on"])]
|
||||
} else {
|
||||
def allOff = true
|
||||
childDevices.each {
|
||||
n->
|
||||
if (n.currentState("switch").value != "off") allOff = false
|
||||
}
|
||||
if (allOff) {
|
||||
event = [createEvent([name: "switch", value: "off"])]
|
||||
} else {
|
||||
event = [createEvent([name: "switch", value: "on"])]
|
||||
}
|
||||
}
|
||||
return event
|
||||
} else {
|
||||
def result = createEvent(name: "switch", value: cmd.value ? "on" : "off", type: "digital")
|
||||
def cmds = []
|
||||
cmds << encap(zwave.switchBinaryV1.switchBinaryGet(), 1)
|
||||
cmds << encap(zwave.switchBinaryV1.switchBinaryGet(), 2)
|
||||
return [result, response(commands(cmds))] // returns the result of reponse()
|
||||
}
|
||||
}
|
||||
def zwaveEvent(physicalgraph.zwave.commands.multichannelv3.MultiChannelCmdEncap cmd) {
|
||||
logging("MultiChannelCmdEncap ${cmd}", 2)
|
||||
def encapsulatedCommand = cmd.encapsulatedCommand([0x32: 3, 0x25: 1, 0x20: 1])
|
||||
if (encapsulatedCommand) {
|
||||
zwaveEvent(encapsulatedCommand, cmd.sourceEndPoint as Integer)
|
||||
}
|
||||
}
|
||||
def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) {
|
||||
logging("ManufacturerSpecificReport ${cmd}", 2)
|
||||
def msr = String.format("%04X-%04X-%04X", cmd.manufacturerId, cmd.productTypeId, cmd.productId)
|
||||
logging("msr: $msr", 2)
|
||||
updateDataValue("MSR", msr)
|
||||
}
|
||||
def zwaveEvent(physicalgraph.zwave.Command cmd) {
|
||||
// This will capture any commands not handled by other instances of zwaveEvent
|
||||
// and is recommended for development so you can see every command the device sends
|
||||
logging("Unhandled Event: ${cmd}", 2)
|
||||
}
|
||||
def on() {
|
||||
logging("on()", 1)
|
||||
commands([
|
||||
zwave.switchAllV1.switchAllOn(),
|
||||
encap(zwave.switchBinaryV1.switchBinaryGet(), 1),
|
||||
encap(zwave.switchBinaryV1.switchBinaryGet(), 2)
|
||||
])
|
||||
}
|
||||
def off() {
|
||||
logging("off()", 1)
|
||||
commands([
|
||||
zwave.switchAllV1.switchAllOff(),
|
||||
encap(zwave.switchBinaryV1.switchBinaryGet(), 1),
|
||||
encap(zwave.switchBinaryV1.switchBinaryGet(), 2)
|
||||
])
|
||||
}
|
||||
void childOn(String dni) {
|
||||
logging("childOn($dni)", 1)
|
||||
def cmds = []
|
||||
cmds << new physicalgraph.device.HubAction(command(encap(zwave.basicV1.basicSet(value: 0xFF), channelNumber(dni))))
|
||||
cmds << new physicalgraph.device.HubAction(command(encap(zwave.switchBinaryV1.switchBinaryGet(), channelNumber(dni))))
|
||||
sendHubCommand(cmds, 1000)
|
||||
}
|
||||
void childOff(String dni) {
|
||||
logging("childOff($dni)", 1)
|
||||
def cmds = []
|
||||
cmds << new physicalgraph.device.HubAction(command(encap(zwave.basicV1.basicSet(value: 0x00), channelNumber(dni))))
|
||||
cmds << new physicalgraph.device.HubAction(command(encap(zwave.switchBinaryV1.switchBinaryGet(), channelNumber(dni))))
|
||||
sendHubCommand(cmds, 1000)
|
||||
}
|
||||
void childRefresh(String dni) {
|
||||
logging("childRefresh($dni)", 1)
|
||||
def cmds = []
|
||||
cmds << new physicalgraph.device.HubAction(command(encap(zwave.switchBinaryV1.switchBinaryGet(), channelNumber(dni))))
|
||||
sendHubCommand(cmds, 1000)
|
||||
}
|
||||
def poll() {
|
||||
logging("poll()", 1)
|
||||
commands([
|
||||
encap(zwave.switchBinaryV1.switchBinaryGet(), 1),
|
||||
encap(zwave.switchBinaryV1.switchBinaryGet(), 2),
|
||||
])
|
||||
}
|
||||
def refresh() {
|
||||
logging("refresh()", 1)
|
||||
commands([
|
||||
encap(zwave.switchBinaryV1.switchBinaryGet(), 1),
|
||||
encap(zwave.switchBinaryV1.switchBinaryGet(), 2),
|
||||
])
|
||||
}
|
||||
def ping() {
|
||||
logging("ping()", 1)
|
||||
refresh()
|
||||
}
|
||||
def installed() {
|
||||
logging("installed()", 1)
|
||||
command(zwave.manufacturerSpecificV1.manufacturerSpecificGet())
|
||||
createChildDevices()
|
||||
}
|
||||
def updated() {
|
||||
logging("updated()", 1)
|
||||
if (!childDevices) {
|
||||
createChildDevices()
|
||||
} else if (device.label != state.oldLabel) {
|
||||
childDevices.each {
|
||||
if (it.label == "${state.oldLabel} (CH${channelNumber(it.deviceNetworkId)})") {
|
||||
def newLabel = "${device.displayName} (CH${channelNumber(it.deviceNetworkId)})"
|
||||
it.setLabel(newLabel)
|
||||
}
|
||||
}
|
||||
state.oldLabel = device.label
|
||||
}
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
sendEvent(name: "needUpdate", value: device.currentValue("needUpdate"), displayed: false, isStateChange: true)
|
||||
}
|
||||
def zwaveEvent(physicalgraph.zwave.commands.configurationv2.ConfigurationReport cmd) {
|
||||
logging("${device.displayName} parameter '${cmd.parameterNumber}' with a byte size of '${cmd.size}' is set to '${cmd2Integer(cmd.configurationValue)}'", 2)
|
||||
}
|
||||
private encap(cmd, endpoint) {
|
||||
if (endpoint) {
|
||||
zwave.multiChannelV3.multiChannelCmdEncap(destinationEndPoint: endpoint).encapsulate(cmd)
|
||||
} else {
|
||||
cmd
|
||||
}
|
||||
}
|
||||
private command(physicalgraph.zwave.Command cmd) {
|
||||
if (state.sec) {
|
||||
zwave.securityV1.securityMessageEncapsulation().encapsulate(cmd).format()
|
||||
} else {
|
||||
cmd.format()
|
||||
}
|
||||
}
|
||||
private commands(commands, delay = 1000) {
|
||||
delayBetween(commands.collect {
|
||||
command(it)
|
||||
}, delay)
|
||||
}
|
||||
private channelNumber(String dni) {
|
||||
dni.split("-ep")[-1] as Integer
|
||||
}
|
||||
private void createChildDevices() {
|
||||
state.oldLabel = device.label
|
||||
for (i in 1..2) {
|
||||
addChildDevice("Switch Child Device", "${device.deviceNetworkId}-ep${i}", null, [completedSetup: true, label: "${device.displayName} (CH${i})",
|
||||
isComponent: true, componentName: "ep$i", componentLabel: "Channel $i"
|
||||
])
|
||||
}
|
||||
}
|
||||
|
||||
private def logging(message, level) {
|
||||
if (logLevel != "0") {
|
||||
switch (logLevel) {
|
||||
case "1":
|
||||
if (level > 1) log.debug "$message"
|
||||
break
|
||||
case "99":
|
||||
log.debug "$message"
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
/**
|
||||
* Switch Child Device
|
||||
*
|
||||
* Copyright 2017 Eric Maycock
|
||||
*
|
||||
* 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: "Switch Child Device", namespace: "erocm123", author: "Eric Maycock") {
|
||||
capability "Switch"
|
||||
capability "Actuator"
|
||||
capability "Sensor"
|
||||
capability "Refresh"
|
||||
}
|
||||
|
||||
tiles {
|
||||
multiAttributeTile(name:"switch", type: "lighting", width: 3, height: 4, canChangeIcon: true){
|
||||
tileAttribute ("device.switch", key: "PRIMARY_CONTROL") {
|
||||
attributeState "off", label: '${name}', action: "switch.on", icon: "st.switches.switch.off", backgroundColor: "#ffffff", nextState:"turningOn"
|
||||
attributeState "on", label: '${name}', action: "switch.off", icon: "st.switches.switch.on", backgroundColor: "#00A0DC", nextState:"turningOff"
|
||||
attributeState "turningOn", label:'${name}', action:"switch.off", icon:"st.switches.switch.on", backgroundColor:"#00A0DC", nextState:"turningOff"
|
||||
attributeState "turningOff", label:'${name}', action:"switch.on", icon:"st.switches.switch.off", backgroundColor:"#ffffff", nextState:"turningOn"
|
||||
}
|
||||
}
|
||||
standardTile("refresh", "device.switch", inactiveLabel: false, decoration: "flat", width: 2, height: 2) {
|
||||
state "default", label:"", action:"refresh.refresh", icon:"st.secondary.refresh"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void on() {
|
||||
parent.childOn(device.deviceNetworkId)
|
||||
}
|
||||
|
||||
void off() {
|
||||
parent.childOff(device.deviceNetworkId)
|
||||
}
|
||||
|
||||
void refresh() {
|
||||
parent.childRefresh(device.deviceNetworkId)
|
||||
}
|
||||
@@ -24,10 +24,7 @@ metadata {
|
||||
capability "Temperature Measurement"
|
||||
capability "Health Check"
|
||||
|
||||
fingerprint deviceId: "0x0701", inClusters: "0x5E, 0x20, 0x86, 0x72, 0x5A, 0x59, 0x85, 0x73, 0x84, 0x80, 0x71, 0x56, 0x70, 0x31, 0x8E, 0x22, 0x30, 0x9C, 0x98, 0x7A", outClusters: ""
|
||||
|
||||
fingerprint mfr:"010F", prod:"0801", model:"2001"
|
||||
fingerprint mfr:"010F", prod:"0801", model:"1001"
|
||||
fingerprint deviceId: "0x0701", inClusters: "0x5E, 0x20, 0x86, 0x72, 0x5A, 0x59, 0x85, 0x73, 0x84, 0x80, 0x71, 0x56, 0x70, 0x31, 0x8E, 0x22, 0x30, 0x9C, 0x98, 0x7A", outClusters: ""
|
||||
}
|
||||
|
||||
simulator {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Spruce Sensor -Pre-release V2 10/8/2015
|
||||
* Spruce Sensor -updated with SLP model number 5/2017
|
||||
*
|
||||
* Copyright 2014 Plaid Systems
|
||||
*
|
||||
@@ -14,25 +14,33 @@
|
||||
*
|
||||
-------10/20/2015 Updates--------
|
||||
-Fix/add battery reporting interval to update
|
||||
-remove polling and/or refresh(?)
|
||||
-remove polling and/or refresh
|
||||
|
||||
-------5/2017 Updates--------
|
||||
-Add fingerprints for SLP
|
||||
-add device health, check every 60mins + 2mins
|
||||
*/
|
||||
|
||||
metadata {
|
||||
definition (name: "Spruce Sensor", namespace: "plaidsystems", author: "NCauffman") {
|
||||
definition (name: "Spruce Sensor", namespace: "plaidsystems", author: "Plaid Systems") {
|
||||
|
||||
capability "Configuration"
|
||||
capability "Battery"
|
||||
capability "Relative Humidity Measurement"
|
||||
capability "Temperature Measurement"
|
||||
capability "Sensor"
|
||||
capability "Health Check"
|
||||
//capability "Polling"
|
||||
|
||||
attribute "maxHum", "string"
|
||||
attribute "minHum", "string"
|
||||
|
||||
|
||||
command "resetHumidity"
|
||||
command "refresh"
|
||||
|
||||
fingerprint profileId: "0104", inClusters: "0000,0001,0003,0402,0405", outClusters: "0003, 0019", manufacturer: "PLAID SYSTEMS", model: "PS-SPRZMS-01"
|
||||
fingerprint profileId: "0104", inClusters: "0000,0001,0003,0402,0405", outClusters: "0003, 0019", manufacturer: "PLAID SYSTEMS", model: "PS-SPRZMS-01", deviceJoinName: "Spruce Sensor"
|
||||
fingerprint profileId: "0104", inClusters: "0000,0001,0003,0402,0405", outClusters: "0003, 0019", manufacturer: "PLAID SYSTEMS", model: "PS-SPRZMS-SLP1", deviceJoinName: "Spruce Sensor"
|
||||
}
|
||||
|
||||
preferences {
|
||||
@@ -65,7 +73,7 @@ metadata {
|
||||
[value: 64, color: "#44B621"],
|
||||
[value: 80, color: "#3D79D9"],
|
||||
[value: 96, color: "#0A50C2"]
|
||||
]
|
||||
], icon:"st.Weather.weather12"
|
||||
}
|
||||
|
||||
valueTile("maxHum", "device.maxHum", canChangeIcon: false, canChangeBackground: false) {
|
||||
@@ -293,6 +301,11 @@ def setConfig(){
|
||||
sendEvent(name: 'configuration',value: configInterval, descriptionText: "Configuration initialized")
|
||||
}
|
||||
|
||||
def installed(){
|
||||
//check every 1 hour + 2mins
|
||||
sendEvent(name: "checkInterval", value: 1 * 60 * 60 + 2 * 60, displayed: false, data: [protocol: "zigbee", hubHardwareId: device.hub.hardwareID])
|
||||
}
|
||||
|
||||
//when device preferences are changed
|
||||
def updated(){
|
||||
log.debug "device updated"
|
||||
@@ -303,6 +316,8 @@ def updated(){
|
||||
sendEvent(name: 'configuration',value: 0, descriptionText: "Settings changed and will update at next report. Measure interval set to ${interval} mins")
|
||||
}
|
||||
}
|
||||
//check every 1 hour + 2mins
|
||||
sendEvent(name: "checkInterval", value: 1 * 60 * 60 + 2 * 60, displayed: false, data: [protocol: "zigbee", hubHardwareId: device.hub.hardwareID])
|
||||
}
|
||||
|
||||
//poll
|
||||
@@ -395,4 +410,4 @@ private byte[] reverseArray(byte[] array) {
|
||||
i++;
|
||||
}
|
||||
return array
|
||||
}
|
||||
}
|
||||
|
||||
2
devicetypes/smartthings/aeon-key-fob.src/.st-ignore
Normal file
2
devicetypes/smartthings/aeon-key-fob.src/.st-ignore
Normal file
@@ -0,0 +1,2 @@
|
||||
.st-ignore
|
||||
README.md
|
||||
34
devicetypes/smartthings/aeon-key-fob.src/README.md
Normal file
34
devicetypes/smartthings/aeon-key-fob.src/README.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Aeon Labs Key Fob
|
||||
|
||||
Cloud Execution
|
||||
|
||||
Works with:
|
||||
|
||||
* [Aeon Labs Key Fob](http://aeotec.com/z-wave-key-fob-remote-control)
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Capabilities](#capabilities)
|
||||
* [Health](#device-health)
|
||||
* [Troubleshooting](#troubleshooting)
|
||||
|
||||
## Capabilities
|
||||
|
||||
* **Actuator** - represents device has commands
|
||||
* **Button** - represents a device with one or more buttons
|
||||
* **Holdable Button** - represents a device with one or more holdable buttons
|
||||
* **Configuration** - allows for configuration of devices
|
||||
* **Sensor** - detects sensor events
|
||||
* **Battery** - defines device uses a battery
|
||||
* **Health Check** - indicates ability to get device health notifications
|
||||
|
||||
## Device Health
|
||||
|
||||
Aeon Key Fob is a ZWave totally sleepy device and is marked offline only in the case when Hub is offline.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
If the device doesn't pair when trying from the SmartThings mobile app, it is possible that the sensor is out of range.
|
||||
Pairing needs to be tried again by placing the sensor closer to the hub.
|
||||
Instructions related to pairing, resetting and removing the Aeon Labs Key Fob from SmartThings can be found in the following link:
|
||||
* [Aeotec Key Fob Troubleshooting Tips](https://support.smartthings.com/hc/en-us/articles/202294120-Aeon-Labs-Key-Fob)
|
||||
@@ -1,3 +1,4 @@
|
||||
import groovy.json.JsonOutput
|
||||
/**
|
||||
* Copyright 2015 SmartThings
|
||||
*
|
||||
@@ -19,6 +20,7 @@ metadata {
|
||||
capability "Configuration"
|
||||
capability "Sensor"
|
||||
capability "Battery"
|
||||
capability "Health Check"
|
||||
|
||||
fingerprint deviceId: "0x0101", inClusters: "0x86,0x72,0x70,0x80,0x84,0x85"
|
||||
fingerprint mfr: "0086", prod: "0001", model: "0026", deviceJoinName: "Aeon Panic Button"
|
||||
@@ -131,6 +133,9 @@ def updated() {
|
||||
}
|
||||
|
||||
def initialize() {
|
||||
// Device only goes OFFLINE when Hub is off
|
||||
sendEvent(name: "DeviceWatch-Enroll", value: JsonOutput.toJson([protocol: "zwave", scheme:"untracked"]), displayed: false)
|
||||
|
||||
def zwMap = getZwaveInfo()
|
||||
def buttons = 4 // Default for Key Fob
|
||||
|
||||
|
||||
2
devicetypes/smartthings/aeon-minimote.src/.st-ignore
Normal file
2
devicetypes/smartthings/aeon-minimote.src/.st-ignore
Normal file
@@ -0,0 +1,2 @@
|
||||
.st-ignore
|
||||
README.md
|
||||
33
devicetypes/smartthings/aeon-minimote.src/README.md
Normal file
33
devicetypes/smartthings/aeon-minimote.src/README.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# Aeon Minimote
|
||||
|
||||
Cloud Execution
|
||||
|
||||
Works with:
|
||||
|
||||
* [Aeotec Minimote](http://aeotec.com/small-z-wave-remote-control)
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Capabilities](#capabilities)
|
||||
* [Health](#device-health)
|
||||
* [Troubleshooting](#troubleshooting)
|
||||
|
||||
## Capabilities
|
||||
|
||||
* **Actuator** - represents device has commands
|
||||
* **Button** - represents a device with one or more buttons
|
||||
* **Holdable Button** - represents a device with one or more holdable buttons
|
||||
* **Configuration** - allows for configuration of devices
|
||||
* **Sensor** - detects sensor events
|
||||
* **Health Check** - indicates ability to get device health notifications
|
||||
|
||||
## Device Health
|
||||
|
||||
Aeon Minimote is a ZWave totally sleepy device and is marked offline only in the case when Hub is offline.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
If the device doesn't pair when trying from the SmartThings mobile app, it is possible that the sensor is out of range.
|
||||
Pairing needs to be tried again by placing the sensor closer to the hub.
|
||||
Instructions related to pairing, resetting and removing the Aeotec Minimote from SmartThings can be found in the following link:
|
||||
* [Aeotec Minimote Troubleshooting Tips](https://support.smartthings.com/hc/en-us/articles/202087904-Aeotec-Minimote)
|
||||
@@ -1,3 +1,4 @@
|
||||
import groovy.json.JsonOutput
|
||||
/**
|
||||
* Copyright 2015 SmartThings
|
||||
*
|
||||
@@ -18,6 +19,7 @@ metadata {
|
||||
capability "Holdable Button"
|
||||
capability "Configuration"
|
||||
capability "Sensor"
|
||||
capability "Health Check"
|
||||
|
||||
fingerprint deviceId: "0x0101", inClusters: "0x86,0x72,0x70,0x9B", outClusters: "0x26,0x2B"
|
||||
fingerprint deviceId: "0x0101", inClusters: "0x86,0x72,0x70,0x9B,0x85,0x84", outClusters: "0x26" // old style with numbered buttons
|
||||
@@ -109,7 +111,6 @@ def configure() {
|
||||
return cmds
|
||||
}
|
||||
|
||||
|
||||
def installed() {
|
||||
initialize()
|
||||
}
|
||||
@@ -119,5 +120,7 @@ def updated() {
|
||||
}
|
||||
|
||||
def initialize() {
|
||||
// Device only goes OFFLINE when Hub is off
|
||||
sendEvent(name: "DeviceWatch-Enroll", value: JsonOutput.toJson([protocol: "zwave", scheme:"untracked"]), displayed: false)
|
||||
sendEvent(name: "numberOfButtons", value: 4)
|
||||
}
|
||||
|
||||
@@ -27,13 +27,9 @@ Works with:
|
||||
## Device Health
|
||||
|
||||
Aeon Labs MultiSensor 6 is polled by the hub.
|
||||
As of hubCore version 0.14.38 the hub sends up reports every 15 minutes regardless of whether the state changed.
|
||||
Device-Watch allows 2 check-in misses from device plus some lag time. So Check-in interval = (2*15 + 2)mins = 32 mins.
|
||||
Not to mention after going OFFLINE when the device is plugged back in, it might take a considerable amount of time for
|
||||
the device to appear as ONLINE again. This is because if this listening device does not respond to two poll requests in a row,
|
||||
it is not polled for 5 minutes by the hub. This can delay up the process of being marked ONLINE by quite some time.
|
||||
Aeon MultiSensor reports in once every hour.
|
||||
|
||||
* __32min__ checkInterval
|
||||
* __122min__ checkInterval
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
|
||||
@@ -130,13 +130,13 @@ metadata {
|
||||
}
|
||||
|
||||
def installed(){
|
||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
// Device-Watch simply pings if no device events received for 122min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 60 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
}
|
||||
|
||||
def updated() {
|
||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
// Device-Watch simply pings if no device events received for 122min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 60 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
log.debug "Updated with settings: ${settings}"
|
||||
log.debug "${device.displayName} is now ${device.latestValue("powerSupply")}"
|
||||
|
||||
|
||||
@@ -27,13 +27,9 @@ Works with:
|
||||
## Device Health
|
||||
|
||||
Aeon Labs MultiSensor (Gen 5) is polled by the hub.
|
||||
As of hubCore version 0.14.38 the hub sends up reports every 15 minutes regardless of whether the state changed.
|
||||
Device-Watch allows 2 check-in misses from device plus some lag time. So Check-in interval = (2*15 + 2)mins = 32 mins.
|
||||
Not to mention after going OFFLINE when the device is plugged back in, it might take a considerable amount of time for
|
||||
the device to appear as ONLINE again. This is because if this listening device does not respond to two poll requests in a row,
|
||||
it is not polled for 5 minutes by the hub. This can delay up the process of being marked ONLINE by quite some time.
|
||||
Aeon MultiSensor Gen5 reports in once every hour.
|
||||
|
||||
* __32min__ checkInterval
|
||||
* __122min__ checkInterval
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
|
||||
@@ -22,8 +22,6 @@ metadata {
|
||||
capability "Battery"
|
||||
capability "Health Check"
|
||||
|
||||
command "configureAfterSecure"
|
||||
|
||||
fingerprint deviceId: "0x0701", inClusters: "0x5E,0x86,0x72,0x59,0x85,0x73,0x71,0x84,0x80,0x30,0x31,0x70,0x98,0x7A", outClusters:"0x5A"
|
||||
fingerprint mfr:"0086", prod:"0102", model:"004A", deviceJoinName: "Aeon Labs MultiSensor (Gen 5)"
|
||||
}
|
||||
@@ -91,23 +89,23 @@ metadata {
|
||||
valueTile("battery", "device.battery", inactiveLabel: false, decoration: "flat", width: 2, height: 2) {
|
||||
state "battery", label:'${currentValue}% battery', unit:""
|
||||
}
|
||||
standardTile("configureAfterSecure", "device.configure", inactiveLabel: false, decoration: "flat", width: 2, height: 2) {
|
||||
state "configure", label:'', action:"configureAfterSecure", icon:"st.secondary.configure"
|
||||
standardTile("configure", "device.configure", inactiveLabel: false, decoration: "flat", width: 2, height: 2) {
|
||||
state "configure", label:'', action:"configure", icon:"st.secondary.configure"
|
||||
}
|
||||
|
||||
main(["motion", "temperature", "humidity", "illuminance"])
|
||||
details(["motion", "temperature", "humidity", "illuminance", "battery", "configureAfterSecure"])
|
||||
details(["motion", "temperature", "humidity", "illuminance", "battery", "configure"])
|
||||
}
|
||||
}
|
||||
|
||||
def installed(){
|
||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
sendEvent(name: "checkInterval", value: 2 * 60 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
}
|
||||
|
||||
def updated(){
|
||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
sendEvent(name: "checkInterval", value: 2 * 60 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
}
|
||||
|
||||
def parse(String description)
|
||||
@@ -131,8 +129,8 @@ def zwaveEvent(physicalgraph.zwave.commands.wakeupv1.WakeUpNotification cmd)
|
||||
|
||||
if (!isConfigured()) {
|
||||
// we're still in the process of configuring a newly joined device
|
||||
log.debug("not sending wakeUpNoMoreInformation yet")
|
||||
result += response(configureAfterSecure())
|
||||
log.debug("not sending wakeUpNoMoreInformation yet: late configure")
|
||||
result += response(configure())
|
||||
} else {
|
||||
result += response(zwave.wakeUpV1.wakeUpNoMoreInformation())
|
||||
}
|
||||
@@ -150,11 +148,6 @@ def zwaveEvent(physicalgraph.zwave.commands.securityv1.SecurityMessageEncapsulat
|
||||
}
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.securityv1.SecurityCommandsSupportedReport cmd) {
|
||||
// log.debug "Received SecurityCommandsSupportedReport"
|
||||
response(configureAfterSecure())
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd) {
|
||||
def map = [ name: "battery", unit: "%" ]
|
||||
if (cmd.batteryLevel == 0xFF) {
|
||||
@@ -226,36 +219,6 @@ def zwaveEvent(physicalgraph.zwave.Command cmd) {
|
||||
createEvent(descriptionText: cmd.toString(), isStateChange: false)
|
||||
}
|
||||
|
||||
def configureAfterSecure() {
|
||||
// log.debug "configureAfterSecure()"
|
||||
|
||||
def request = [
|
||||
// send temperature, humidity, and illuminance every 8 minutes
|
||||
zwave.configurationV1.configurationSet(parameterNumber: 101, size: 4, scaledConfigurationValue: 128|64|32),
|
||||
zwave.configurationV1.configurationSet(parameterNumber: 111, size: 4, scaledConfigurationValue: 8*60),
|
||||
|
||||
// send battery every 20 hours
|
||||
zwave.configurationV1.configurationSet(parameterNumber: 102, size: 4, scaledConfigurationValue: 1),
|
||||
zwave.configurationV1.configurationSet(parameterNumber: 112, size: 4, scaledConfigurationValue: 20*60*60),
|
||||
|
||||
// send no-motion report 60 seconds after motion stops
|
||||
zwave.configurationV1.configurationSet(parameterNumber: 3, size: 2, scaledConfigurationValue: 60),
|
||||
|
||||
// send binary sensor report instead of basic set for motion
|
||||
zwave.configurationV1.configurationSet(parameterNumber: 5, size: 1, scaledConfigurationValue: 2),
|
||||
|
||||
// disable notification-style motion events
|
||||
zwave.notificationV3.notificationSet(notificationType: 7, notificationStatus: 0),
|
||||
|
||||
zwave.batteryV1.batteryGet(),
|
||||
zwave.sensorBinaryV2.sensorBinaryGet(sensorType:0x0C)
|
||||
]
|
||||
|
||||
setConfigured()
|
||||
|
||||
secureSequence(request) + ["delay 20000", zwave.wakeUpV1.wakeUpNoMoreInformation().format()]
|
||||
}
|
||||
|
||||
/**
|
||||
* PING is used by Device-Watch in attempt to reach the Device
|
||||
* */
|
||||
@@ -265,7 +228,36 @@ def ping() {
|
||||
|
||||
def configure() {
|
||||
// log.debug "configure()"
|
||||
//["delay 30000"] + secure(zwave.securityV1.securityCommandsSupportedGet())
|
||||
def request = []
|
||||
// send temperature, humidity, and illuminance every 8 minutes
|
||||
request << zwave.configurationV1.configurationSet(parameterNumber: 101, size: 4, scaledConfigurationValue: 128|64|32)
|
||||
request << zwave.configurationV1.configurationSet(parameterNumber: 111, size: 4, scaledConfigurationValue: 8*60)
|
||||
|
||||
// send battery every 20 hours
|
||||
request << zwave.configurationV1.configurationSet(parameterNumber: 102, size: 4, scaledConfigurationValue: 1)
|
||||
request << zwave.configurationV1.configurationSet(parameterNumber: 112, size: 4, scaledConfigurationValue: 20*60*60)
|
||||
|
||||
// send no-motion report 60 seconds after motion stops
|
||||
request << zwave.configurationV1.configurationSet(parameterNumber: 3, size: 2, scaledConfigurationValue: 60)
|
||||
|
||||
// send binary sensor report instead of basic set for motion
|
||||
request << zwave.configurationV1.configurationSet(parameterNumber: 5, size: 1, scaledConfigurationValue: 2)
|
||||
|
||||
// Turn on the Multisensor Gen5 PIR sensor
|
||||
request << zwave.configurationV1.configurationSet(parameterNumber: 4, size: 1, scaledConfigurationValue: 1)
|
||||
|
||||
// disable notification-style motion events
|
||||
request << zwave.notificationV3.notificationSet(notificationType: 7, notificationStatus: 0)
|
||||
|
||||
request << zwave.batteryV1.batteryGet()
|
||||
request << zwave.sensorBinaryV2.sensorBinaryGet(sensorType: 0x0C) //motion
|
||||
request << zwave.sensorMultilevelV5.sensorMultilevelGet(sensorType: 0x01) //temperature
|
||||
request << zwave.sensorMultilevelV5.sensorMultilevelGet(sensorType: 0x03) //illuminance
|
||||
request << zwave.sensorMultilevelV5.sensorMultilevelGet(sensorType: 0x05) //humidity
|
||||
|
||||
setConfigured()
|
||||
|
||||
secureSequence(request) + ["delay 20000", zwave.wakeUpV1.wakeUpNoMoreInformation().format()]
|
||||
}
|
||||
|
||||
private setConfigured() {
|
||||
|
||||
2
devicetypes/smartthings/aeon-multisensor.src/.st-ignore
Normal file
2
devicetypes/smartthings/aeon-multisensor.src/.st-ignore
Normal file
@@ -0,0 +1,2 @@
|
||||
.st-ignore
|
||||
README.md
|
||||
44
devicetypes/smartthings/aeon-multisensor.src/README.md
Normal file
44
devicetypes/smartthings/aeon-multisensor.src/README.md
Normal file
@@ -0,0 +1,44 @@
|
||||
# Aeon Multisensor
|
||||
|
||||
Cloud Execution
|
||||
|
||||
Works with:
|
||||
|
||||
* [Aeotec MultiSensor (DSB05-ZWUS)](https://www.smartthings.com/products/aeotec-multisensor-5)
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Capabilities](#capabilities)
|
||||
* [Health](#device-health)
|
||||
* [Battery](#battery-specification)
|
||||
* [Troubleshooting](#troubleshooting)
|
||||
|
||||
## Capabilities
|
||||
|
||||
* **Motion Sensor** - can detect motion
|
||||
* **Temperature Measurement** - defines device measures current temperature
|
||||
* **Relative Humidity Measurement** - allow reading the relative humidity from devices that support it
|
||||
* **Illuminance Measurement** - gives the illuminance reading from devices that support it
|
||||
* **Configuration** - _configure()_ command called when device is installed or device preferences updated
|
||||
* **Sensor** - detects sensor events
|
||||
* **Battery** - defines device uses a battery
|
||||
* **Health Check** - indicates ability to get device health notifications
|
||||
|
||||
|
||||
## Device Health
|
||||
|
||||
Aeon Labs MultiSensor is polled by the hub.
|
||||
Aeon MultiSensor reports in once every hour.
|
||||
|
||||
* __122min__ checkInterval
|
||||
|
||||
## Battery Specification
|
||||
|
||||
Four AAA batteries are required.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
If the device doesn't pair when trying from the SmartThings mobile app, it is possible that the device is out of range.
|
||||
Pairing needs to be tried again by placing the device closer to the hub.
|
||||
Instructions related to pairing, resetting and removing the device from SmartThings can be found in the following link:
|
||||
* [Aeon MultiSensor Troubleshooting Tips](https://support.smartthings.com/hc/en-us/articles/206157226-How-to-connect-Aeon-Labs-MultiSensors)
|
||||
@@ -20,6 +20,7 @@ metadata {
|
||||
capability "Illuminance Measurement"
|
||||
capability "Sensor"
|
||||
capability "Battery"
|
||||
capability "Health Check"
|
||||
|
||||
fingerprint deviceId: "0x2001", inClusters: "0x30,0x31,0x80,0x84,0x70,0x85,0x72,0x86"
|
||||
}
|
||||
@@ -93,6 +94,16 @@ metadata {
|
||||
}
|
||||
}
|
||||
|
||||
def installed(){
|
||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 60 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
}
|
||||
|
||||
def updated(){
|
||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 60 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
}
|
||||
|
||||
// Parse incoming device messages to generate events
|
||||
def parse(String description)
|
||||
{
|
||||
@@ -179,6 +190,13 @@ def zwaveEvent(physicalgraph.zwave.Command cmd) {
|
||||
[:]
|
||||
}
|
||||
|
||||
/**
|
||||
* PING is used by Device-Watch in attempt to reach the Device
|
||||
* */
|
||||
def ping() {
|
||||
secure(zwave.batteryV1.batteryGet())
|
||||
}
|
||||
|
||||
def configure() {
|
||||
delayBetween([
|
||||
// send binary sensor report instead of basic set for motion
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
* Date: 2014-07-15
|
||||
*/
|
||||
metadata {
|
||||
definition (name: "Aeon Siren", namespace: "smartthings", author: "SmartThings") {
|
||||
definition (name: "Aeon Siren", namespace: "smartthings", author: "SmartThings", ocfDeviceType: "x.com.st.d.sensor.smoke") {
|
||||
capability "Actuator"
|
||||
capability "Alarm"
|
||||
capability "Switch"
|
||||
@@ -61,6 +61,8 @@ metadata {
|
||||
def installed() {
|
||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
|
||||
response(secure(zwave.basicV1.basicGet()))
|
||||
}
|
||||
|
||||
def updated() {
|
||||
@@ -163,4 +165,4 @@ private secure(physicalgraph.zwave.Command cmd) {
|
||||
* */
|
||||
def ping() {
|
||||
secure(zwave.basicV1.basicGet())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//DEPRECATED. INTEGRATION MOVED TO SUPER LAN CONNECT
|
||||
|
||||
/**
|
||||
* Bose SoundTouch
|
||||
*
|
||||
|
||||
@@ -6,7 +6,6 @@ metadata {
|
||||
capability "Relative Humidity Measurement"
|
||||
capability "Thermostat"
|
||||
capability "Battery"
|
||||
capability "Configuration"
|
||||
capability "Refresh"
|
||||
capability "Sensor"
|
||||
capability "Health Check"
|
||||
@@ -15,161 +14,173 @@ metadata {
|
||||
|
||||
command "switchMode"
|
||||
command "switchFanMode"
|
||||
command "quickSetCool"
|
||||
command "quickSetHeat"
|
||||
command "lowerHeatingSetpoint"
|
||||
command "raiseHeatingSetpoint"
|
||||
command "lowerCoolSetpoint"
|
||||
command "raiseCoolSetpoint"
|
||||
|
||||
fingerprint deviceId: "0x08", inClusters: "0x43,0x40,0x44,0x31,0x80,0x85,0x60"
|
||||
fingerprint mfr:"0098", prod:"6401", model:"0107", deviceJoinName: "2Gig CT100 Programmable Thermostat"
|
||||
}
|
||||
|
||||
// simulator metadata
|
||||
simulator {
|
||||
status "off" : "command: 4003, payload: 00"
|
||||
status "heat" : "command: 4003, payload: 01"
|
||||
status "cool" : "command: 4003, payload: 02"
|
||||
status "auto" : "command: 4003, payload: 03"
|
||||
status "emergencyHeat" : "command: 4003, payload: 04"
|
||||
|
||||
status "fanAuto" : "command: 4403, payload: 00"
|
||||
status "fanOn" : "command: 4403, payload: 01"
|
||||
status "fanCirculate" : "command: 4403, payload: 06"
|
||||
|
||||
status "heat 60" : "command: 4303, payload: 01 09 3C"
|
||||
status "heat 72" : "command: 4303, payload: 01 09 48"
|
||||
|
||||
status "cool 76" : "command: 4303, payload: 02 09 4C"
|
||||
status "cool 80" : "command: 4303, payload: 02 09 50"
|
||||
|
||||
status "temp 58" : "command: 3105, payload: 01 2A 02 44"
|
||||
status "temp 62" : "command: 3105, payload: 01 2A 02 6C"
|
||||
status "temp 78" : "command: 3105, payload: 01 2A 03 0C"
|
||||
status "temp 86" : "command: 3105, payload: 01 2A 03 34"
|
||||
|
||||
status "idle" : "command: 4203, payload: 00"
|
||||
status "heating" : "command: 4203, payload: 01"
|
||||
status "cooling" : "command: 4203, payload: 02"
|
||||
|
||||
// reply messages
|
||||
reply "2502": "command: 2503, payload: FF"
|
||||
}
|
||||
|
||||
tiles {
|
||||
valueTile("temperature", "device.temperature", width: 2, height: 2) {
|
||||
state("temperature", label:'${currentValue}°',
|
||||
backgroundColors:[
|
||||
[value: 32, color: "#153591"],
|
||||
[value: 44, color: "#1e9cbb"],
|
||||
[value: 59, color: "#90d2a7"],
|
||||
[value: 74, color: "#44b621"],
|
||||
[value: 84, color: "#f1d801"],
|
||||
[value: 92, color: "#d04e00"],
|
||||
[value: 98, color: "#bc2323"]
|
||||
]
|
||||
)
|
||||
multiAttributeTile(name:"temperature", type:"generic", width:3, height:2, canChangeIcon: true) {
|
||||
tileAttribute("device.temperature", key: "PRIMARY_CONTROL") {
|
||||
attributeState("temperature", label:'${currentValue}°', icon: "st.alarm.temperature.normal",
|
||||
backgroundColors:[
|
||||
// Celsius
|
||||
[value: 0, color: "#153591"],
|
||||
[value: 7, color: "#1e9cbb"],
|
||||
[value: 15, color: "#90d2a7"],
|
||||
[value: 23, color: "#44b621"],
|
||||
[value: 28, color: "#f1d801"],
|
||||
[value: 35, color: "#d04e00"],
|
||||
[value: 37, color: "#bc2323"],
|
||||
// Fahrenheit
|
||||
[value: 40, color: "#153591"],
|
||||
[value: 44, color: "#1e9cbb"],
|
||||
[value: 59, color: "#90d2a7"],
|
||||
[value: 74, color: "#44b621"],
|
||||
[value: 84, color: "#f1d801"],
|
||||
[value: 95, color: "#d04e00"],
|
||||
[value: 96, color: "#bc2323"]
|
||||
]
|
||||
)
|
||||
}
|
||||
tileAttribute("device.batteryIcon", key: "SECONDARY_CONTROL") {
|
||||
attributeState "ok_battery", label:'${currentValue}%', icon:"st.arlo.sensor_battery_4"
|
||||
attributeState "low_battery", label:'Low Battery', icon:"st.arlo.sensor_battery_0"
|
||||
}
|
||||
}
|
||||
standardTile("mode", "device.thermostatMode", inactiveLabel: false, decoration: "flat") {
|
||||
state "off", label:'${name}', action:"switchMode", nextState:"to_heat"
|
||||
state "heat", label:'${name}', action:"switchMode", nextState:"to_cool"
|
||||
state "cool", label:'${name}', action:"switchMode", nextState:"..."
|
||||
state "auto", label:'${name}', action:"switchMode", nextState:"..."
|
||||
state "emergency heat", label:'${name}', action:"switchMode", nextState:"..."
|
||||
state "to_heat", label: "heat", action:"switchMode", nextState:"to_cool"
|
||||
state "to_cool", label: "cool", action:"switchMode", nextState:"..."
|
||||
state "...", label: "...", action:"off", nextState:"off"
|
||||
standardTile("mode", "device.thermostatMode", width:2, height:2, inactiveLabel: false, decoration: "flat") {
|
||||
state "off", action:"switchMode", nextState:"to_heat", icon: "st.thermostat.heating-cooling-off"
|
||||
state "heat", action:"switchMode", nextState:"to_cool", icon: "st.thermostat.heat"
|
||||
state "cool", action:"switchMode", nextState:"...", icon: "st.thermostat.cool"
|
||||
state "auto", action:"switchMode", nextState:"...", icon: "st.thermostat.auto"
|
||||
state "emergency heat", action:"switchMode", nextState:"...", icon: "st.thermostat.emergency-heat"
|
||||
state "to_heat", action:"switchMode", nextState:"to_cool", icon: "st.secondary.secondary"
|
||||
state "to_cool", action:"switchMode", nextState:"...", icon: "st.secondary.secondary"
|
||||
state "...", label: "...", action:"off", nextState:"off", icon: "st.secondary.secondary"
|
||||
}
|
||||
standardTile("fanMode", "device.thermostatFanMode", inactiveLabel: false, decoration: "flat") {
|
||||
state "fanAuto", label:'${name}', action:"switchFanMode"
|
||||
state "fanOn", label:'${name}', action:"switchFanMode"
|
||||
state "fanCirculate", label:'${name}', action:"switchFanMode"
|
||||
standardTile("fanMode", "device.thermostatFanMode", width:2, height:2, inactiveLabel: false, decoration: "flat") {
|
||||
state "auto", action:"switchFanMode", icon: "st.thermostat.fan-auto"
|
||||
state "on", action:"switchFanMode", icon: "st.thermostat.fan-on"
|
||||
state "circulate", action:"switchFanMode", icon: "st.thermostat.fan-circulate"
|
||||
}
|
||||
controlTile("heatSliderControl", "device.heatingSetpoint", "slider", height: 1, width: 2, inactiveLabel: false) {
|
||||
state "setHeatingSetpoint", action:"quickSetHeat", backgroundColor:"#e86d13"
|
||||
valueTile("humidity", "device.humidity", width:2, height:2, inactiveLabel: false, decoration: "flat") {
|
||||
state "humidity", label:'${currentValue}%', icon:"st.Weather.weather12"
|
||||
}
|
||||
valueTile("heatingSetpoint", "device.heatingSetpoint", inactiveLabel: false, decoration: "flat") {
|
||||
state "heat", label:'${currentValue}° heat', backgroundColor:"#ffffff"
|
||||
standardTile("lowerHeatingSetpoint", "device.heatingSetpoint", width:2, height:1, inactiveLabel: false, decoration: "flat") {
|
||||
state "heatingSetpoint", action:"lowerHeatingSetpoint", icon:"st.thermostat.thermostat-left"
|
||||
}
|
||||
controlTile("coolSliderControl", "device.coolingSetpoint", "slider", height: 1, width: 2, inactiveLabel: false) {
|
||||
state "setCoolingSetpoint", action:"quickSetCool", backgroundColor: "#00a0dc"
|
||||
valueTile("heatingSetpoint", "device.heatingSetpoint", width:2, height:1, inactiveLabel: false, decoration: "flat") {
|
||||
state "heatingSetpoint", label:'${currentValue}° heat', backgroundColor:"#ffffff"
|
||||
}
|
||||
valueTile("coolingSetpoint", "device.coolingSetpoint", inactiveLabel: false, decoration: "flat") {
|
||||
state "cool", label:'${currentValue}° cool', backgroundColor:"#ffffff"
|
||||
standardTile("raiseHeatingSetpoint", "device.heatingSetpoint", width:2, height:1, inactiveLabel: false, decoration: "flat") {
|
||||
state "heatingSetpoint", action:"raiseHeatingSetpoint", icon:"st.thermostat.thermostat-right"
|
||||
}
|
||||
valueTile("humidity", "device.humidity", inactiveLabel: false, decoration: "flat") {
|
||||
state "humidity", label:'${currentValue}% humidity', unit:""
|
||||
standardTile("lowerCoolSetpoint", "device.coolingSetpoint", width:2, height:1, inactiveLabel: false, decoration: "flat") {
|
||||
state "coolingSetpoint", action:"lowerCoolSetpoint", icon:"st.thermostat.thermostat-left"
|
||||
}
|
||||
valueTile("battery", "device.battery", inactiveLabel: false, decoration: "flat") {
|
||||
state "battery", label:'${currentValue}% battery', unit:""
|
||||
valueTile("coolingSetpoint", "device.coolingSetpoint", width:2, height:1, inactiveLabel: false, decoration: "flat") {
|
||||
state "coolingSetpoint", label:'${currentValue}° cool', backgroundColor:"#ffffff"
|
||||
}
|
||||
standardTile("refresh", "device.thermostatMode", inactiveLabel: false, decoration: "flat") {
|
||||
standardTile("raiseCoolSetpoint", "device.heatingSetpoint", width:2, height:1, inactiveLabel: false, decoration: "flat") {
|
||||
state "heatingSetpoint", action:"raiseCoolSetpoint", icon:"st.thermostat.thermostat-right"
|
||||
}
|
||||
|
||||
standardTile("refresh", "device.thermostatMode", width:2, height:2, inactiveLabel: false, decoration: "flat") {
|
||||
state "default", action:"refresh.refresh", icon:"st.secondary.refresh"
|
||||
}
|
||||
main "temperature"
|
||||
details(["temperature", "mode", "fanMode", "heatSliderControl", "heatingSetpoint", "coolSliderControl", "coolingSetpoint", "refresh", "humidity", "battery"])
|
||||
details(["temperature", "mode", "fanMode", "humidity", "lowerHeatingSetpoint", "heatingSetpoint", "raiseHeatingSetpoint", "lowerCoolSetpoint", "coolingSetpoint", "raiseCoolSetpoint", "refresh"])
|
||||
}
|
||||
}
|
||||
|
||||
def updated() {
|
||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
// If not set update ManufacturerSpecific data
|
||||
if (!getDataValue("manufacturer")) {
|
||||
sendHubCommand(new physicalgraph.device.HubAction(zwave.manufacturerSpecificV2.manufacturerSpecificGet().format()))
|
||||
}
|
||||
initialize()
|
||||
}
|
||||
|
||||
def installed() {
|
||||
// Configure device
|
||||
def cmds = []
|
||||
cmds << new physicalgraph.device.HubAction(zwave.associationV1.associationSet(groupingIdentifier:1, nodeId:[zwaveHubNodeId]).format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.manufacturerSpecificV2.manufacturerSpecificGet().format())
|
||||
sendHubCommand(cmds)
|
||||
initialize()
|
||||
}
|
||||
|
||||
def initialize() {
|
||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
// Poll device for additional data that will be updated by refresh tile
|
||||
refresh()
|
||||
}
|
||||
|
||||
def parse(String description)
|
||||
{
|
||||
def result = []
|
||||
def result = null
|
||||
if (description == "updated") {
|
||||
} else {
|
||||
def zwcmd = zwave.parse(description, [0x42:2, 0x43:2, 0x31: 2, 0x60: 3])
|
||||
if (zwcmd) {
|
||||
result += zwaveEvent(zwcmd)
|
||||
result = zwaveEvent(zwcmd)
|
||||
// Check battery level at least once every 2 days
|
||||
if (!state.lastbatt || now() - state.lastbatt > 48*60*60*1000) {
|
||||
sendHubCommand(new physicalgraph.device.HubAction(zwave.batteryV1.batteryGet().format()))
|
||||
}
|
||||
} else {
|
||||
log.debug "$device.displayName couldn't parse $description"
|
||||
}
|
||||
}
|
||||
if (!result) {
|
||||
return null
|
||||
return []
|
||||
}
|
||||
if (result.size() == 1 && (!state.lastbatt || now() - state.lastbatt > 48*60*60*1000)) {
|
||||
result << response(zwave.batteryV1.batteryGet().format())
|
||||
}
|
||||
log.debug "$device.displayName parsed '$description' to $result"
|
||||
result
|
||||
return [result]
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.multichannelv3.MultiChannelCmdEncap cmd) {
|
||||
def result = null
|
||||
def encapsulatedCommand = cmd.encapsulatedCommand([0x42:2, 0x43:2, 0x31: 2])
|
||||
log.debug ("Command from endpoint ${cmd.sourceEndPoint}: ${encapsulatedCommand}")
|
||||
def zwaveEvent(physicalgraph.zwave.commands.multichannelv3.MultiInstanceCmdEncap cmd) {
|
||||
def encapsulatedCommand = cmd.encapsulatedCommand([0x31: 3])
|
||||
log.debug ("multiinstancev1.MultiInstanceCmdEncap: command from instance ${cmd.instance}: ${encapsulatedCommand}")
|
||||
if (encapsulatedCommand) {
|
||||
result = zwaveEvent(encapsulatedCommand)
|
||||
if (cmd.sourceEndPoint == 1) { // indicates a response to refresh() vs an unrequested update
|
||||
def event = ([] + result)[0] // in case zwaveEvent returns a list
|
||||
def resp = nextRefreshQuery(event?.name)
|
||||
if (resp) {
|
||||
log.debug("sending next refresh query: $resp")
|
||||
result = [] + result + response(["delay 200", resp])
|
||||
}
|
||||
}
|
||||
zwaveEvent(encapsulatedCommand)
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.thermostatsetpointv2.ThermostatSetpointReport cmd)
|
||||
{
|
||||
def cmdScale = cmd.scale == 1 ? "F" : "C"
|
||||
def temp = convertTemperatureIfNeeded(cmd.scaledValue, cmdScale, cmd.precision)
|
||||
def sendCmd = []
|
||||
def unit = getTemperatureScale()
|
||||
def map1 = [ value: temp, unit: unit, displayed: false ]
|
||||
def cmdScale = cmd.scale == 1 ? "F" : "C"
|
||||
def setpoint = getTempInLocalScale(cmd.scaledValue, cmdScale)
|
||||
switch (cmd.setpointType) {
|
||||
case 1:
|
||||
map1.name = "heatingSetpoint"
|
||||
//map1.name = "heatingSetpoint"
|
||||
sendEvent(name: "heatingSetpoint", value: setpoint, unit: unit, displayed: false)
|
||||
updateThermostatSetpoint("heatingSetpoint", setpoint)
|
||||
// Enforce coolingSetpoint limits, as device doesn't
|
||||
if (setpoint > getTempInLocalScale("coolingSetpoint")) {
|
||||
sendCmd << new physicalgraph.device.HubAction(zwave.thermostatSetpointV1.thermostatSetpointSet(
|
||||
setpointType: 2, scale: cmd.scale, precision: cmd.precision, scaledValue: cmd.scaledValue).format())
|
||||
sendCmd << new physicalgraph.device.HubAction(zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 2).format())
|
||||
sendHubCommand(sendCmd)
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
map1.name = "coolingSetpoint"
|
||||
//map1.name = "coolingSetpoint"
|
||||
sendEvent(name: "coolingSetpoint", value: setpoint, unit: unit, displayed: false)
|
||||
updateThermostatSetpoint("coolingSetpoint", setpoint)
|
||||
// Enforce heatingSetpoint limits, as device doesn't
|
||||
if (setpoint < getTempInLocalScale("heatingSetpoint")) {
|
||||
sendCmd << new physicalgraph.device.HubAction(zwave.thermostatSetpointV1.thermostatSetpointSet(
|
||||
setpointType: 1, scale: cmd.scale, precision: cmd.precision, scaledValue: cmd.scaledValue).format())
|
||||
sendCmd << new physicalgraph.device.HubAction(zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 1).format())
|
||||
sendHubCommand(sendCmd)
|
||||
}
|
||||
break;
|
||||
default:
|
||||
log.debug "unknown setpointType $cmd.setpointType"
|
||||
@@ -180,33 +191,55 @@ def zwaveEvent(physicalgraph.zwave.commands.thermostatsetpointv2.ThermostatSetpo
|
||||
state.size = cmd.size
|
||||
state.scale = cmd.scale
|
||||
state.precision = cmd.precision
|
||||
|
||||
def mode = device.latestValue("thermostatMode")
|
||||
if (mode && map1.name.startsWith(mode) || (mode == "emergency heat" && map1.name == "heatingSetpoint")) {
|
||||
def map2 = [ name: "thermostatSetpoint", value: temp, unit: unit ]
|
||||
[ createEvent(map1), createEvent(map2) ]
|
||||
} else {
|
||||
createEvent(map1)
|
||||
}
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.sensormultilevelv2.SensorMultilevelReport cmd)
|
||||
{
|
||||
// thermostatSetpoint is not displayed by any tile as it can't be predictable calculated due to
|
||||
// the device's quirkiness but it is defined by the capability so it must be set, set it to the most likely value
|
||||
def updateThermostatSetpoint(setpoint, value) {
|
||||
def scale = getTemperatureScale()
|
||||
def heatingSetpoint = (setpoint == "heatingSetpoint") ? value : getTempInLocalScale("heatingSetpoint")
|
||||
def coolingSetpoint = (setpoint == "coolingSetpoint") ? value : getTempInLocalScale("coolingSetpoint")
|
||||
def mode = device.currentValue("thermostatMode")
|
||||
def thermostatSetpoint = heatingSetpoint // corresponds to (mode == "heat" || mode == "emergency heat")
|
||||
if (mode == "cool") {
|
||||
thermostatSetpoint = coolingSetpoint
|
||||
}
|
||||
// Just set to average of heating + cooling for mode off and auto
|
||||
if (mode == "off" || mode == "auto") {
|
||||
thermostatSetpoint = getTempInLocalScale((heatingSetpoint + coolingSetpoint)/2, scale)
|
||||
}
|
||||
sendEvent(name: "thermostatSetpoint", value: thermostatSetpoint, unit: scale)
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.sensormultilevelv2.SensorMultilevelReport cmd) {
|
||||
def map = [:]
|
||||
if (cmd.sensorType == 1) {
|
||||
map.name = "temperature"
|
||||
map.unit = getTemperatureScale()
|
||||
map.value = convertTemperatureIfNeeded(cmd.scaledSensorValue, cmd.scale == 1 ? "F" : "C", cmd.precision)
|
||||
map.value = getTempInLocalScale(cmd.scaledSensorValue, (cmd.scale == 1 ? "F" : "C"))
|
||||
} else if (cmd.sensorType == 5) {
|
||||
map.name = "humidity"
|
||||
map.unit = "%"
|
||||
map.value = cmd.scaledSensorValue
|
||||
}
|
||||
createEvent(map)
|
||||
sendEvent(map)
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.thermostatoperatingstatev2.ThermostatOperatingStateReport cmd)
|
||||
{
|
||||
def zwaveEvent(physicalgraph.zwave.commands.sensormultilevelv3.SensorMultilevelReport cmd) {
|
||||
def map = [:]
|
||||
if (cmd.sensorType == 1) {
|
||||
map.name = "temperature"
|
||||
map.unit = getTemperatureScale()
|
||||
map.value = getTempInLocalScale(cmd.scaledSensorValue, (cmd.scale == 1 ? "F" : "C"))
|
||||
} else if (cmd.sensorType == 5) {
|
||||
map.value = cmd.scaledSensorValue
|
||||
map.unit = "%"
|
||||
map.name = "humidity"
|
||||
}
|
||||
sendEvent(map)
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.thermostatoperatingstatev2.ThermostatOperatingStateReport cmd) {
|
||||
def map = [name: "thermostatOperatingState" ]
|
||||
switch (cmd.operatingState) {
|
||||
case physicalgraph.zwave.commands.thermostatoperatingstatev2.ThermostatOperatingStateReport.OPERATING_STATE_IDLE:
|
||||
@@ -231,12 +264,7 @@ def zwaveEvent(physicalgraph.zwave.commands.thermostatoperatingstatev2.Thermosta
|
||||
map.value = "vent economizer"
|
||||
break
|
||||
}
|
||||
def result = createEvent(map)
|
||||
if (result.isStateChange && device.latestValue("thermostatMode") == "auto" && (result.value == "heating" || result.value == "cooling")) {
|
||||
def thermostatSetpoint = device.latestValue("${result.value}Setpoint")
|
||||
result = [result, createEvent(name: "thermostatSetpoint", value: thermostatSetpoint, unit: getTemperatureScale())]
|
||||
}
|
||||
result
|
||||
sendEvent(map)
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.thermostatfanstatev1.ThermostatFanStateReport cmd) {
|
||||
@@ -252,203 +280,256 @@ def zwaveEvent(physicalgraph.zwave.commands.thermostatfanstatev1.ThermostatFanSt
|
||||
map.value = "running high"
|
||||
break
|
||||
}
|
||||
createEvent(map)
|
||||
sendEvent(map)
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeReport cmd) {
|
||||
def map = [name: "thermostatMode"]
|
||||
def thermostatSetpoint = null
|
||||
def map = [name: "thermostatMode", data:[supportedThermostatModes: state.supportedModes]]
|
||||
switch (cmd.mode) {
|
||||
case physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeReport.MODE_OFF:
|
||||
map.value = "off"
|
||||
break
|
||||
case physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeReport.MODE_HEAT:
|
||||
map.value = "heat"
|
||||
thermostatSetpoint = device.latestValue("heatingSetpoint")
|
||||
break
|
||||
case physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeReport.MODE_AUXILIARY_HEAT:
|
||||
map.value = "emergency heat"
|
||||
thermostatSetpoint = device.latestValue("heatingSetpoint")
|
||||
break
|
||||
case physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeReport.MODE_COOL:
|
||||
map.value = "cool"
|
||||
thermostatSetpoint = device.latestValue("coolingSetpoint")
|
||||
break
|
||||
case physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeReport.MODE_AUTO:
|
||||
map.value = "auto"
|
||||
def temp = device.latestValue("temperature")
|
||||
def heatingSetpoint = device.latestValue("heatingSetpoint")
|
||||
def coolingSetpoint = device.latestValue("coolingSetpoint")
|
||||
if (temp && heatingSetpoint && coolingSetpoint) {
|
||||
if (temp < (heatingSetpoint + coolingSetpoint) / 2.0) {
|
||||
thermostatSetpoint = heatingSetpoint
|
||||
} else {
|
||||
thermostatSetpoint = coolingSetpoint
|
||||
}
|
||||
}
|
||||
break
|
||||
}
|
||||
state.lastTriedMode = map.value
|
||||
if (thermostatSetpoint) {
|
||||
[ createEvent(map), createEvent(name: "thermostatSetpoint", value: thermostatSetpoint, unit: getTemperatureScale()) ]
|
||||
} else {
|
||||
createEvent(map)
|
||||
}
|
||||
sendEvent(map)
|
||||
updateThermostatSetpoint(null, null)
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanModeReport cmd) {
|
||||
def map = [name: "thermostatFanMode", displayed: false]
|
||||
def map = [name: "thermostatFanMode", data:[supportedThermostatFanModes: state.supportedFanModes]]
|
||||
switch (cmd.fanMode) {
|
||||
case physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanModeReport.FAN_MODE_AUTO_LOW:
|
||||
map.value = "fanAuto"
|
||||
case physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanModeReport.FAN_MODE_AUTO_LOW:
|
||||
map.value = "auto"
|
||||
break
|
||||
case physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanModeReport.FAN_MODE_LOW:
|
||||
map.value = "fanOn"
|
||||
map.value = "on"
|
||||
break
|
||||
case physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanModeReport.FAN_MODE_CIRCULATION:
|
||||
map.value = "fanCirculate"
|
||||
map.value = "circulate"
|
||||
break
|
||||
}
|
||||
state.lastTriedFanMode = map.value
|
||||
createEvent(map)
|
||||
sendEvent(map)
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeSupportedReport cmd) {
|
||||
def supportedModes = ""
|
||||
if(cmd.off) { supportedModes += "off " }
|
||||
if(cmd.heat) { supportedModes += "heat " }
|
||||
if(cmd.auxiliaryemergencyHeat) { supportedModes += "emergency heat " }
|
||||
if(cmd.cool) { supportedModes += "cool " }
|
||||
if(cmd.auto) { supportedModes += "auto " }
|
||||
def supportedModes = []
|
||||
if(cmd.heat) { supportedModes << "heat" }
|
||||
if(cmd.cool) { supportedModes << "cool" }
|
||||
// Make sure off is before auto, this ensures the right setpoint is used based on current temperature when auto is set
|
||||
if(cmd.off) { supportedModes << "off" }
|
||||
if(cmd.auto) { supportedModes << "auto" }
|
||||
if(cmd.auxiliaryemergencyHeat) { supportedModes << "emergency heat" }
|
||||
|
||||
state.supportedModes = supportedModes
|
||||
[ createEvent(name:"supportedModes", value: supportedModes, displayed: false),
|
||||
response(zwave.thermostatFanModeV3.thermostatFanModeSupportedGet()) ]
|
||||
sendEvent(name: "supportedThermostatModes", value: supportedModes, isStateChange: true, displayed: false)
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanModeSupportedReport cmd) {
|
||||
def supportedFanModes = ""
|
||||
if(cmd.auto) { supportedFanModes += "fanAuto " }
|
||||
if(cmd.low) { supportedFanModes += "fanOn " }
|
||||
if(cmd.circulation) { supportedFanModes += "fanCirculate " }
|
||||
def supportedFanModes = []
|
||||
if(cmd.auto) { supportedFanModes << "auto" }
|
||||
if(cmd.low) { supportedFanModes << "on" }
|
||||
if(cmd.circulation) { supportedFanModes << "circulate" }
|
||||
|
||||
state.supportedFanModes = supportedFanModes
|
||||
[ createEvent(name:"supportedFanModes", value: supportedModes, displayed: false),
|
||||
response(refresh()) ]
|
||||
sendEvent(name: "supportedThermostatFanModes", value: supportedFanModes, isStateChange: true, displayed: false)
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd) {
|
||||
log.debug "Zwave event received: $cmd"
|
||||
log.debug "Zwave BasicReport: $cmd"
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd) {
|
||||
def map = [ name: "battery", unit: "%" ]
|
||||
if (cmd.batteryLevel == 0xFF) {
|
||||
def batteryState = cmd.batteryLevel
|
||||
def map = [name: "battery", unit: "%", value: cmd.batteryLevel]
|
||||
if ((cmd.batteryLevel == 0xFF) || (cmd.batteryLevel == 0x00)) { // Special value for low battery alert
|
||||
map.value = 1
|
||||
map.descriptionText = "${device.displayName} battery is low"
|
||||
map.isStateChange = true
|
||||
} else {
|
||||
map.value = cmd.batteryLevel
|
||||
batteryState = "low_battery"
|
||||
}
|
||||
state.lastbatt = now()
|
||||
createEvent(map)
|
||||
sendEvent(name: "batteryIcon", value: batteryState, displayed: false)
|
||||
sendEvent(map)
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.Command cmd) {
|
||||
log.warn "Unexpected zwave command $cmd"
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) {
|
||||
log.debug "ManufacturerSpecificReport ${cmd}: value:${cmd}"
|
||||
if (cmd.manufacturerName) {
|
||||
updateDataValue("manufacturer", cmd.manufacturerName)
|
||||
}
|
||||
if (cmd.productTypeId) {
|
||||
updateDataValue("productTypeId", cmd.productTypeId.toString())
|
||||
}
|
||||
if (cmd.productId) {
|
||||
updateDataValue("productId", cmd.productId.toString())
|
||||
}
|
||||
}
|
||||
|
||||
def refresh() {
|
||||
// Use encapsulation to differentiate refresh cmds from what the thermostat sends proactively on change
|
||||
def cmd = zwave.sensorMultilevelV2.sensorMultilevelGet()
|
||||
zwave.multiChannelV3.multiChannelCmdEncap(destinationEndPoint:1).encapsulate(cmd).format()
|
||||
}
|
||||
|
||||
def nextRefreshQuery(name) {
|
||||
def cmd = null
|
||||
switch (name) {
|
||||
case "temperature":
|
||||
cmd = zwave.thermostatModeV2.thermostatModeGet()
|
||||
break
|
||||
case "thermostatMode":
|
||||
cmd = zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 1)
|
||||
break
|
||||
case "heatingSetpoint":
|
||||
cmd = zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 2)
|
||||
break
|
||||
case "coolingSetpoint":
|
||||
cmd = zwave.thermostatFanModeV3.thermostatFanModeGet()
|
||||
break
|
||||
case "thermostatFanMode":
|
||||
cmd = zwave.thermostatOperatingStateV2.thermostatOperatingStateGet()
|
||||
break
|
||||
case "thermostatOperatingState":
|
||||
// get humidity, multilevel sensor get to endpoint 2
|
||||
cmd = zwave.sensorMultilevelV2.sensorMultilevelGet()
|
||||
return zwave.multiChannelV3.multiChannelCmdEncap(destinationEndPoint:2).encapsulate(cmd).format()
|
||||
default: return null
|
||||
// Only allow refresh every 2 minutes to prevent flooding the Zwave network
|
||||
def timeNow = now()
|
||||
if (!state.refreshTriggeredAt || (2 * 60 * 1000 < (timeNow - state.refreshTriggeredAt))) {
|
||||
state.refreshTriggeredAt = timeNow
|
||||
// refresh will request battery, prevent multiple request by setting lastbatt now
|
||||
state.lastbatt = timeNow
|
||||
// use runIn with overwrite to prevent multiple DTH instances run before state.refreshTriggeredAt has been saved
|
||||
runIn(2, "poll", [overwrite: true])
|
||||
}
|
||||
zwave.multiChannelV3.multiChannelCmdEncap(destinationEndPoint:1).encapsulate(cmd).format()
|
||||
}
|
||||
|
||||
def quickSetHeat(degrees) {
|
||||
setHeatingSetpoint(degrees, 1000)
|
||||
def poll() {
|
||||
def cmds = []
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatModeV2.thermostatModeSupportedGet().format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatFanModeV3.thermostatFanModeSupportedGet().format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.multiChannelV3.multiInstanceCmdEncap(instance: 1).encapsulate(zwave.sensorMultilevelV3.sensorMultilevelGet()).format()) // temperature
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatModeV2.thermostatModeGet().format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatFanModeV3.thermostatFanModeGet().format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatOperatingStateV1.thermostatOperatingStateGet().format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 1).format()) // HeatingSetpoint
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 2).format()) // CoolingSetpoint
|
||||
cmds << new physicalgraph.device.HubAction(zwave.batteryV1.batteryGet().format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.multiChannelV3.multiInstanceCmdEncap(instance: 2).encapsulate(zwave.sensorMultilevelV3.sensorMultilevelGet()).format()) // humidity
|
||||
def time = getTimeAndDay()
|
||||
log.debug "time: $time"
|
||||
if (time) {
|
||||
cmds << new physicalgraph.device.HubAction(zwave.clockV1.clockSet(time).format())
|
||||
}
|
||||
// Add 3 seconds delay between each command to avoid flooding the Z-Wave network choking the hub
|
||||
sendHubCommand(cmds, 3000)
|
||||
}
|
||||
|
||||
def setHeatingSetpoint(degrees, delay = 30000) {
|
||||
setHeatingSetpoint(degrees.toDouble(), delay)
|
||||
def raiseHeatingSetpoint() {
|
||||
alterSetpoint(null, true, "heatingSetpoint")
|
||||
}
|
||||
|
||||
def setHeatingSetpoint(Double degrees, Integer delay = 30000) {
|
||||
log.trace "setHeatingSetpoint($degrees, $delay)"
|
||||
def deviceScale = state.scale ?: 1
|
||||
def deviceScaleString = deviceScale == 2 ? "C" : "F"
|
||||
def lowerHeatingSetpoint() {
|
||||
alterSetpoint(null, false, "heatingSetpoint")
|
||||
}
|
||||
|
||||
def raiseCoolSetpoint() {
|
||||
alterSetpoint(null, true, "coolingSetpoint")
|
||||
}
|
||||
|
||||
def lowerCoolSetpoint() {
|
||||
alterSetpoint(null, false, "coolingSetpoint")
|
||||
}
|
||||
|
||||
// Adjusts nextHeatingSetpoint either .5° C/1° F) if raise true/false
|
||||
def alterSetpoint(degrees, raise, setpoint) {
|
||||
def locationScale = getTemperatureScale()
|
||||
def p = (state.precision == null) ? 1 : state.precision
|
||||
|
||||
def convertedDegrees
|
||||
if (locationScale == "C" && deviceScaleString == "F") {
|
||||
convertedDegrees = celsiusToFahrenheit(degrees)
|
||||
} else if (locationScale == "F" && deviceScaleString == "C") {
|
||||
convertedDegrees = fahrenheitToCelsius(degrees)
|
||||
def heatingSetpoint = getTempInLocalScale("heatingSetpoint")
|
||||
def coolingSetpoint = getTempInLocalScale("coolingSetpoint")
|
||||
def targetvalue = (setpoint == "heatingSetpoint") ? heatingSetpoint : coolingSetpoint
|
||||
def delta = (locationScale == "F") ? 1 : 0.5
|
||||
if (raise != null) {
|
||||
targetvalue += raise ? delta : - delta
|
||||
} else if (degrees) {
|
||||
targetvalue = degrees
|
||||
} else {
|
||||
convertedDegrees = degrees
|
||||
log.warn "alterSetpoint called with neither up/down/degree information"
|
||||
return
|
||||
}
|
||||
def data = enforceSetpointLimits(setpoint, [targetvalue: targetvalue, heatingSetpoint: heatingSetpoint, coolingSetpoint: coolingSetpoint])
|
||||
// update UI without waiting for the device to respond, this to give user a smoother UI experience
|
||||
// also, as runIn's have to overwrite and user can change heating/cooling setpoint separately separate runIn's have to be used
|
||||
if (data.targetHeatingSetpoint) {
|
||||
sendEvent("name": "heatingSetpoint", "value": data.targetHeatingSetpoint, unit: locationScale, eventType: "ENTITY_UPDATE")//, displayed: false)
|
||||
runIn(4, "updateHeatingSetpoint", [data: data, overwrite: true])
|
||||
}
|
||||
if (data.targetCoolingSetpoint) {
|
||||
sendEvent("name": "coolingSetpoint", "value": data.targetCoolingSetpoint, unit: locationScale, eventType: "ENTITY_UPDATE")//, displayed: false)
|
||||
runIn(4, "updateCoolingSetpoint", [data: data, overwrite: true])
|
||||
}
|
||||
}
|
||||
|
||||
def updateHeatingSetpoint(data) {
|
||||
updateSetpoints(data)
|
||||
}
|
||||
|
||||
def updateCoolingSetpoint(data) {
|
||||
updateSetpoints(data)
|
||||
}
|
||||
|
||||
def enforceSetpointLimits(setpoint, data) {
|
||||
// Enforce max/min for setpoints
|
||||
def maxSetpoint = getTempInLocalScale(95, "F")
|
||||
def minSetpoint = getTempInLocalScale(35, "F")
|
||||
def targetvalue = data.targetvalue
|
||||
def heatingSetpoint = null
|
||||
def coolingSetpoint = null
|
||||
|
||||
if (targetvalue > maxSetpoint) {
|
||||
targetvalue = maxSetpoint
|
||||
} else if (targetvalue < minSetpoint) {
|
||||
targetvalue = minSetpoint
|
||||
}
|
||||
// Enforce limits, for now make sure heating <= cooling, and cooling >= heating
|
||||
if (setpoint == "heatingSetpoint") {
|
||||
heatingSetpoint = targetvalue
|
||||
coolingSetpoint = (heatingSetpoint > data.coolingSetpoint) ? heatingSetpoint : null
|
||||
}
|
||||
if (setpoint == "coolingSetpoint") {
|
||||
coolingSetpoint = targetvalue
|
||||
heatingSetpoint = (coolingSetpoint < data.heatingSetpoint) ? coolingSetpoint : null
|
||||
}
|
||||
return [targetHeatingSetpoint: heatingSetpoint, targetCoolingSetpoint: coolingSetpoint]
|
||||
}
|
||||
|
||||
def setHeatingSetpoint(degrees) {
|
||||
if (degrees) {
|
||||
def data = enforceSetpointLimits("heatingSetpoint",
|
||||
[targetvalue: degrees.toDouble(), heatingSetpoint: getTempInLocalScale("heatingSetpoint"), coolingSetpoint: getTempInLocalScale("coolingSetpoint")])
|
||||
updateSetpoints(data)
|
||||
}
|
||||
}
|
||||
|
||||
def setCoolingSetpoint(degrees) {
|
||||
if (degrees) {
|
||||
def data = enforceSetpointLimits("coolingSetpoint",
|
||||
[targetvalue: degrees.toDouble(), heatingSetpoint: getTempInLocalScale("heatingSetpoint"), coolingSetpoint: getTempInLocalScale("coolingSetpoint")])
|
||||
updateSetpoints(data)
|
||||
}
|
||||
}
|
||||
|
||||
def updateSetpoints(data) {
|
||||
def cmds = []
|
||||
if (data.targetHeatingSetpoint) {
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatSetpointV1.thermostatSetpointSet(
|
||||
setpointType: 1, scale: state.scale, precision: state.precision, scaledValue: convertToDeviceScale(data.targetHeatingSetpoint)).format())
|
||||
}
|
||||
if (data.targetCoolingSetpoint) {
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatSetpointV1.thermostatSetpointSet(
|
||||
setpointType: 2, scale: state.scale, precision: state.precision, scaledValue: convertToDeviceScale(data.targetCoolingSetpoint)).format())
|
||||
}
|
||||
|
||||
delayBetween([
|
||||
zwave.thermostatSetpointV1.thermostatSetpointSet(setpointType: 1, scale: deviceScale, precision: p, scaledValue: convertedDegrees).format(),
|
||||
zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 1).format()
|
||||
], delay)
|
||||
// Always request both setpoints in case thermostat changed both
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 1).format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 2).format())
|
||||
sendHubCommand(cmds)
|
||||
}
|
||||
|
||||
def quickSetCool(degrees) {
|
||||
setCoolingSetpoint(degrees, 1000)
|
||||
}
|
||||
|
||||
def setCoolingSetpoint(degrees, delay = 30000) {
|
||||
setCoolingSetpoint(degrees.toDouble(), delay)
|
||||
}
|
||||
|
||||
def setCoolingSetpoint(Double degrees, Integer delay = 30000) {
|
||||
log.trace "setCoolingSetpoint($degrees, $delay)"
|
||||
def deviceScale = state.scale ?: 1
|
||||
def deviceScaleString = deviceScale == 2 ? "C" : "F"
|
||||
def convertToDeviceScale(setpoint) {
|
||||
def locationScale = getTemperatureScale()
|
||||
def p = (state.precision == null) ? 1 : state.precision
|
||||
|
||||
def convertedDegrees
|
||||
if (locationScale == "C" && deviceScaleString == "F") {
|
||||
convertedDegrees = celsiusToFahrenheit(degrees)
|
||||
} else if (locationScale == "F" && deviceScaleString == "C") {
|
||||
convertedDegrees = fahrenheitToCelsius(degrees)
|
||||
} else {
|
||||
convertedDegrees = degrees
|
||||
}
|
||||
|
||||
delayBetween([
|
||||
zwave.thermostatSetpointV1.thermostatSetpointSet(setpointType: 2, scale: deviceScale, precision: p, scaledValue: convertedDegrees).format(),
|
||||
zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 2).format()
|
||||
], delay)
|
||||
def deviceScale = (state.scale == 1) ? "F" : "C"
|
||||
return (deviceScale == locationScale) ? setpoint :
|
||||
(deviceScale == "F" ? celsiusToFahrenheit(setpoint.toBigDecimal()) : roundC(fahrenheitToCelsius(setpoint.toBigDecimal())))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -456,78 +537,56 @@ def setCoolingSetpoint(Double degrees, Integer delay = 30000) {
|
||||
* */
|
||||
def ping() {
|
||||
log.debug "ping() called"
|
||||
refresh()
|
||||
}
|
||||
|
||||
def configure() {
|
||||
delayBetween([
|
||||
zwave.thermostatModeV2.thermostatModeSupportedGet().format(),
|
||||
], 2300)
|
||||
}
|
||||
|
||||
def modes() {
|
||||
["off", "heat", "cool", "auto", "emergency heat"]
|
||||
// Just get Operating State as it is not reported when it chnages and there's no need to flood more commands
|
||||
sendHubCommand(new physicalgraph.device.HubAction(zwave.thermostatOperatingStateV1.thermostatOperatingStateGet().format()))
|
||||
}
|
||||
|
||||
def switchMode() {
|
||||
def currentMode = device.currentState("thermostatMode")?.value
|
||||
def currentMode = device.currentValue("thermostatMode")
|
||||
def lastTriedMode = state.lastTriedMode ?: currentMode ?: "off"
|
||||
def supportedModes = getDataByName("supportedModes")
|
||||
def modeOrder = modes()
|
||||
def next = { modeOrder[modeOrder.indexOf(it) + 1] ?: modeOrder[0] }
|
||||
def nextMode = next(lastTriedMode)
|
||||
if (supportedModes?.contains(currentMode)) {
|
||||
while (!supportedModes.contains(nextMode) && nextMode != "off") {
|
||||
nextMode = next(nextMode)
|
||||
}
|
||||
def supportedModes = state.supportedModes
|
||||
if (supportedModes) {
|
||||
def next = { supportedModes[supportedModes.indexOf(it) + 1] ?: supportedModes[0] }
|
||||
def nextMode = next(lastTriedMode)
|
||||
setThermostatMode(nextMode)
|
||||
state.lastTriedMode = nextMode
|
||||
} else {
|
||||
log.warn "supportedModes not defined"
|
||||
}
|
||||
state.lastTriedMode = nextMode
|
||||
delayBetween([
|
||||
zwave.thermostatModeV2.thermostatModeSet(mode: modeMap[nextMode]).format(),
|
||||
zwave.thermostatModeV2.thermostatModeGet().format()
|
||||
], 1000)
|
||||
}
|
||||
|
||||
def switchToMode(nextMode) {
|
||||
def supportedModes = getDataByName("supportedModes")
|
||||
if(supportedModes && !supportedModes.contains(nextMode)) log.warn "thermostat mode '$nextMode' is not supported"
|
||||
if (nextMode in modes()) {
|
||||
def supportedModes = state.supportedModes
|
||||
if (supportedModes && supportedModes.contains(nextMode)) {
|
||||
setThermostatMode(nextMode)
|
||||
state.lastTriedMode = nextMode
|
||||
"$nextMode"()
|
||||
} else {
|
||||
log.debug("no mode method '$nextMode'")
|
||||
log.debug("ThermostatMode $nextMode is not supported by ${device.displayName}")
|
||||
}
|
||||
}
|
||||
|
||||
def switchFanMode() {
|
||||
def currentMode = device.currentState("thermostatFanMode")?.value
|
||||
def lastTriedMode = state.lastTriedFanMode ?: currentMode ?: "off"
|
||||
def supportedModes = getDataByName("supportedFanModes") ?: "fanAuto fanOn"
|
||||
def modeOrder = ["fanAuto", "fanCirculate", "fanOn"]
|
||||
def next = { modeOrder[modeOrder.indexOf(it) + 1] ?: modeOrder[0] }
|
||||
def nextMode = next(lastTriedMode)
|
||||
while (!supportedModes?.contains(nextMode) && nextMode != "fanAuto") {
|
||||
nextMode = next(nextMode)
|
||||
def supportedFanModes = state.supportedFanModes
|
||||
if (supportedFanModes) {
|
||||
def next = { supportedFanModes[supportedFanModes.indexOf(it) + 1] ?: supportedFanModes[0] }
|
||||
def nextMode = next(lastTriedMode)
|
||||
setThermostatFanMode(nextMode)
|
||||
state.lastTriedFanMode = nextMode
|
||||
} else {
|
||||
log.warn "supportedFanModes not defined"
|
||||
}
|
||||
switchToFanMode(nextMode)
|
||||
}
|
||||
|
||||
def switchToFanMode(nextMode) {
|
||||
def supportedFanModes = getDataByName("supportedFanModes")
|
||||
if(supportedFanModes && !supportedFanModes.contains(nextMode)) log.warn "thermostat mode '$nextMode' is not supported"
|
||||
|
||||
def returnCommand
|
||||
if (nextMode == "fanAuto") {
|
||||
returnCommand = fanAuto()
|
||||
} else if (nextMode == "fanOn") {
|
||||
returnCommand = fanOn()
|
||||
} else if (nextMode == "fanCirculate") {
|
||||
returnCommand = fanCirculate()
|
||||
def supportedFanModes = state.supportedFanModes
|
||||
if (supportedFanModes && supportedFanModes.contains(nextMode)) {
|
||||
setThermostatFanMode(nextMode)
|
||||
state.lastTriedFanMode = nextMode
|
||||
} else {
|
||||
log.debug("no fan mode '$nextMode'")
|
||||
log.debug("FanMode $nextMode is not supported by ${device.displayName}")
|
||||
}
|
||||
if(returnCommand) state.lastTriedFanMode = nextMode
|
||||
returnCommand
|
||||
}
|
||||
|
||||
def getDataByName(String name) {
|
||||
@@ -543,10 +602,10 @@ def getModeMap() { [
|
||||
]}
|
||||
|
||||
def setThermostatMode(String value) {
|
||||
delayBetween([
|
||||
zwave.thermostatModeV2.thermostatModeSet(mode: modeMap[value]).format(),
|
||||
zwave.thermostatModeV2.thermostatModeGet().format()
|
||||
], standardDelay)
|
||||
def cmds = []
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatModeV2.thermostatModeSet(mode: modeMap[value]).format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatModeV2.thermostatModeGet().format())
|
||||
sendHubCommand(cmds)
|
||||
}
|
||||
|
||||
def getFanModeMap() { [
|
||||
@@ -556,69 +615,70 @@ def getFanModeMap() { [
|
||||
]}
|
||||
|
||||
def setThermostatFanMode(String value) {
|
||||
delayBetween([
|
||||
zwave.thermostatFanModeV3.thermostatFanModeSet(fanMode: fanModeMap[value]).format(),
|
||||
zwave.thermostatFanModeV3.thermostatFanModeGet().format()
|
||||
], standardDelay)
|
||||
def cmds = []
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatFanModeV3.thermostatFanModeSet(fanMode: fanModeMap[value]).format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatFanModeV3.thermostatFanModeGet().format())
|
||||
sendHubCommand(cmds)
|
||||
}
|
||||
|
||||
def off() {
|
||||
delayBetween([
|
||||
zwave.thermostatModeV2.thermostatModeSet(mode: 0).format(),
|
||||
zwave.thermostatModeV2.thermostatModeGet().format()
|
||||
], standardDelay)
|
||||
switchToMode("off")
|
||||
}
|
||||
|
||||
def heat() {
|
||||
delayBetween([
|
||||
zwave.thermostatModeV2.thermostatModeSet(mode: 1).format(),
|
||||
zwave.thermostatModeV2.thermostatModeGet().format()
|
||||
], standardDelay)
|
||||
switchToMode("heat")
|
||||
}
|
||||
|
||||
def emergencyHeat() {
|
||||
delayBetween([
|
||||
zwave.thermostatModeV2.thermostatModeSet(mode: 4).format(),
|
||||
zwave.thermostatModeV2.thermostatModeGet().format()
|
||||
], standardDelay)
|
||||
switchToMode("emergency heat")
|
||||
}
|
||||
|
||||
def cool() {
|
||||
delayBetween([
|
||||
zwave.thermostatModeV2.thermostatModeSet(mode: 2).format(),
|
||||
zwave.thermostatModeV2.thermostatModeGet().format()
|
||||
], standardDelay)
|
||||
switchToMode("cool")
|
||||
}
|
||||
|
||||
def auto() {
|
||||
delayBetween([
|
||||
zwave.thermostatModeV2.thermostatModeSet(mode: 3).format(),
|
||||
zwave.thermostatModeV2.thermostatModeGet().format()
|
||||
], standardDelay)
|
||||
switchToMode("auto")
|
||||
}
|
||||
|
||||
def fanOn() {
|
||||
delayBetween([
|
||||
zwave.thermostatFanModeV3.thermostatFanModeSet(fanMode: 1).format(),
|
||||
zwave.thermostatFanModeV3.thermostatFanModeGet().format()
|
||||
], standardDelay)
|
||||
switchToFanMode("on")
|
||||
}
|
||||
|
||||
def fanAuto() {
|
||||
delayBetween([
|
||||
zwave.thermostatFanModeV3.thermostatFanModeSet(fanMode: 0).format(),
|
||||
zwave.thermostatFanModeV3.thermostatFanModeGet().format()
|
||||
], standardDelay)
|
||||
switchToFanMode("auto")
|
||||
}
|
||||
|
||||
def fanCirculate() {
|
||||
delayBetween([
|
||||
zwave.thermostatFanModeV3.thermostatFanModeSet(fanMode: 6).format(),
|
||||
zwave.thermostatFanModeV3.thermostatFanModeGet().format()
|
||||
], standardDelay)
|
||||
switchToFanMode("circulate")
|
||||
}
|
||||
|
||||
private getStandardDelay() {
|
||||
1000
|
||||
private getTimeAndDay() {
|
||||
def timeNow = now()
|
||||
// Need to check that location have timeZone as SC may have created the location without setting it
|
||||
// Don't update clock more than once a day
|
||||
if (location.timeZone && (!state.timeClockSet || (24 * 60 * 60 * 1000 < (timeNow - state.timeClockSet)))) {
|
||||
def currentDate = Calendar.getInstance(location.timeZone)
|
||||
state.timeClockSet = timeNow
|
||||
return [hour: currentDate.get(Calendar.HOUR_OF_DAY), minute: currentDate.get(Calendar.MINUTE), weekday: currentDate.get(Calendar.DAY_OF_WEEK)]
|
||||
}
|
||||
}
|
||||
|
||||
// Get stored temperature from currentState in current local scale
|
||||
def getTempInLocalScale(state) {
|
||||
def temp = device.currentState(state)
|
||||
if (temp && temp.value && temp.unit) {
|
||||
return getTempInLocalScale(temp.value.toBigDecimal(), temp.unit)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// get/convert temperature to current local scale
|
||||
def getTempInLocalScale(temp, scale) {
|
||||
def scaledTemp = convertTemperatureIfNeeded(temp.toBigDecimal(), scale).toDouble()
|
||||
return (getTemperatureScale() == "F" ? scaledTemp.round(0).toInteger() : roundC(scaledTemp))
|
||||
}
|
||||
|
||||
def roundC (tempC) {
|
||||
return (Math.round(tempC.toDouble() * 2))/2
|
||||
}
|
||||
|
||||
@@ -108,11 +108,20 @@ def updated(){
|
||||
}
|
||||
}
|
||||
|
||||
def getCommandClassVersions() {
|
||||
[
|
||||
0x20: 1, // Basic
|
||||
0x26: 1, // SwitchMultilevel
|
||||
0x56: 1, // Crc16Encap
|
||||
0x70: 1, // Configuration
|
||||
]
|
||||
}
|
||||
|
||||
def parse(String description) {
|
||||
def result = null
|
||||
if (description != "updated") {
|
||||
log.debug "parse() >> zwave.parse($description)"
|
||||
def cmd = zwave.parse(description, [0x20: 1, 0x26: 1, 0x70: 1])
|
||||
def cmd = zwave.parse(description, commandClassVersions)
|
||||
if (cmd) {
|
||||
result = zwaveEvent(cmd)
|
||||
}
|
||||
@@ -179,6 +188,16 @@ def zwaveEvent(physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelS
|
||||
[createEvent(name:"switch", value:"on"), response(zwave.switchMultilevelV1.switchMultilevelGet().format())]
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.crc16encapv1.Crc16Encap cmd) {
|
||||
def versions = commandClassVersions
|
||||
def version = versions[cmd.commandClass as Integer]
|
||||
def ccObj = version ? zwave.commandClass(cmd.commandClass, version) : zwave.commandClass(cmd.commandClass)
|
||||
def encapsulatedCommand = ccObj?.command(cmd.command)?.parse(cmd.data)
|
||||
if (encapsulatedCommand) {
|
||||
zwaveEvent(encapsulatedCommand)
|
||||
}
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.Command cmd) {
|
||||
// Handles all Z-Wave commands we aren't interested in
|
||||
[:]
|
||||
|
||||
@@ -70,7 +70,7 @@ metadata {
|
||||
state "heat", action:"switchMode", nextState: "updating", icon: "st.thermostat.heat"
|
||||
state "cool", action:"switchMode", nextState: "updating", icon: "st.thermostat.cool"
|
||||
state "auto", action:"switchMode", nextState: "updating", icon: "st.thermostat.auto"
|
||||
state "emergency heat", action:"switchMode", icon: "st.thermostat.emergency-heat" // emergency heat = auxHeatOnly
|
||||
state "auxheatonly", action:"switchMode", icon: "st.thermostat.emergency-heat"
|
||||
state "updating", label:"Working", icon: "st.secondary.secondary"
|
||||
}
|
||||
standardTile("fanMode", "device.thermostatFanMode", inactiveLabel: false, decoration: "flat") {
|
||||
@@ -156,47 +156,49 @@ void poll() {
|
||||
def generateEvent(Map results) {
|
||||
log.debug "parsing data $results"
|
||||
if(results) {
|
||||
results.each { name, value ->
|
||||
|
||||
def linkText = getLinkText(device)
|
||||
def isChange = false
|
||||
def isDisplayed = true
|
||||
def supportedThermostatModes = ["off"]
|
||||
def thermostatMode = null
|
||||
|
||||
results.each { name, value ->
|
||||
def event = [name: name, linkText: linkText, descriptionText: getThermostatDescriptionText(name, value, linkText),
|
||||
handlerName: name]
|
||||
|
||||
if (name=="temperature" || name=="heatingSetpoint" || name=="coolingSetpoint" ) {
|
||||
def sendValue = location.temperatureScale == "C"? roundC(convertFtoC(value.toDouble())) : value.toInteger()
|
||||
isChange = isTemperatureStateChange(device, name, value.toString())
|
||||
isDisplayed = isChange
|
||||
event << [value: sendValue, unit: temperatureScale, isStateChange: isChange, displayed: isDisplayed]
|
||||
event << [value: sendValue, unit: temperatureScale]
|
||||
} else if (name=="maxCoolingSetpoint" || name=="minCoolingSetpoint" || name=="maxHeatingSetpoint" || name=="minHeatingSetpoint") {
|
||||
def sendValue = location.temperatureScale == "C"? roundC(convertFtoC(value.toDouble())) : value.toInteger()
|
||||
event << [value: sendValue, unit: temperatureScale, displayed: false]
|
||||
} else if (name=="heatMode" || name=="coolMode" || name=="autoMode" || name=="auxHeatMode"){
|
||||
isChange = isStateChange(device, name, value.toString())
|
||||
event << [value: value.toString(), isStateChange: isChange, displayed: false]
|
||||
if (value == true) {
|
||||
supportedThermostatModes << ((name == "auxHeatMode") ? "auxheatonly" : name - "Mode")
|
||||
}
|
||||
return // as we don't want to send this event here, proceed to next name/value pair
|
||||
} else if (name=="thermostatFanMode"){
|
||||
isChange = isStateChange(device, name, value.toString())
|
||||
event << [value: value.toString(), isStateChange: isChange, displayed: false]
|
||||
sendEvent(name: "supportedThermostatFanModes", value: fanModes(), displayed: false)
|
||||
event << [value: value.toString(), data:[supportedThermostatFanModes: fanModes()]]
|
||||
} else if (name=="humidity") {
|
||||
isChange = isStateChange(device, name, value.toString())
|
||||
event << [value: value.toString(), isStateChange: isChange, displayed: false, unit: "%"]
|
||||
event << [value: value.toString(), displayed: false, unit: "%"]
|
||||
} else if (name == "deviceAlive") {
|
||||
isChange = isStateChange(device, name, value.toString())
|
||||
event['isStateChange'] = isChange
|
||||
event['displayed'] = false
|
||||
} else if (name == "thermostatMode") {
|
||||
def mode = value.toString()
|
||||
mode = (mode == "auxHeatOnly") ? "emergency heat" : mode
|
||||
isChange = isStateChange(device, name, mode)
|
||||
event << [value: mode, isStateChange: isChange, displayed: isDisplayed]
|
||||
thermostatMode = value.toLowerCase()
|
||||
return // as we don't want to send this event here, proceed to next name/value pair
|
||||
} else {
|
||||
isChange = isStateChange(device, name, value.toString())
|
||||
isDisplayed = isChange
|
||||
event << [value: value.toString(), isStateChange: isChange, displayed: isDisplayed]
|
||||
event << [value: value.toString()]
|
||||
}
|
||||
sendEvent(event)
|
||||
}
|
||||
if (state.supportedThermostatModes != supportedThermostatModes) {
|
||||
state.supportedThermostatModes = supportedThermostatModes
|
||||
sendEvent(name: "supportedThermostatModes", value: supportedThermostatModes, displayed: false)
|
||||
}
|
||||
if (thermostatMode) {
|
||||
sendEvent(name: "thermostatMode", value: thermostatMode, data:[supportedThermostatModes:state.supportedThermostatModes], linkText: linkText,
|
||||
descriptionText: getThermostatDescriptionText("thermostatMode", thermostatMode, linkText), handlerName: "thermostatMode")
|
||||
}
|
||||
generateSetpointEvent ()
|
||||
generateStatusEvent ()
|
||||
}
|
||||
@@ -322,15 +324,7 @@ void resumeProgram() {
|
||||
}
|
||||
|
||||
def modes() {
|
||||
if (state.modes) {
|
||||
log.debug "Modes = ${state.modes}"
|
||||
return state.modes
|
||||
}
|
||||
else {
|
||||
state.modes = parent.availableModes(this)
|
||||
log.debug "Modes = ${state.modes}"
|
||||
return state.modes
|
||||
}
|
||||
return state.supportedThermostatModes
|
||||
}
|
||||
|
||||
def fanModes() {
|
||||
@@ -413,11 +407,13 @@ def setThermostatFanMode(String mode) {
|
||||
}
|
||||
|
||||
def generateModeEvent(mode) {
|
||||
sendEvent(name: "thermostatMode", value: mode, descriptionText: "$device.displayName is in ${mode} mode", displayed: true)
|
||||
sendEvent(name: "thermostatMode", value: mode, data:[supportedThermostatModes: state.supportedThermostatModes],
|
||||
descriptionText: "$device.displayName is in ${mode} mode")
|
||||
}
|
||||
|
||||
def generateFanModeEvent(fanMode) {
|
||||
sendEvent(name: "thermostatFanMode", value: fanMode, descriptionText: "$device.displayName fan is in ${fanMode} mode", displayed: true)
|
||||
sendEvent(name: "thermostatFanMode", value: fanMode, data:[supportedThermostatFanModes: fanModes()],
|
||||
descriptionText: "$device.displayName fan is in ${fanMode} mode")
|
||||
}
|
||||
|
||||
def generateOperatingStateEvent(operatingState) {
|
||||
@@ -453,14 +449,14 @@ def heat() {
|
||||
}
|
||||
|
||||
def emergencyHeat() {
|
||||
auxHeatOnly()
|
||||
auxheatonly()
|
||||
}
|
||||
|
||||
def auxHeatOnly() {
|
||||
log.debug "auxHeatOnly = emergency heat"
|
||||
def auxheatonly() {
|
||||
log.debug "auxheatonly()"
|
||||
def deviceId = device.deviceNetworkId.split(/\./).last()
|
||||
if (parent.setMode ("auxHeatOnly", deviceId))
|
||||
generateModeEvent("emergency heat") // emergency heat = auxHeatOnly
|
||||
generateModeEvent("auxheatonly")
|
||||
else {
|
||||
log.debug "Error setting new mode."
|
||||
def currentMode = device.currentState("thermostatMode")?.value
|
||||
@@ -593,7 +589,7 @@ def generateSetpointEvent() {
|
||||
} else if (mode == "off") {
|
||||
sendEvent("name":"thermostatSetpoint", "value":averageSetpoint, "unit":location.temperatureScale)
|
||||
sendEvent("name":"displayThermostatSetpoint", "value":"Off", displayed: false)
|
||||
} else if (mode == "emergency heat") { // emergency heat = auxHeatOnly
|
||||
} else if (mode == "auxheatonly") {
|
||||
sendEvent("name":"thermostatSetpoint", "value":heatingSetpoint, "unit":location.temperatureScale)
|
||||
sendEvent("name":"displayThermostatSetpoint", "value":heatingSetpoint, "unit":location.temperatureScale, displayed: false)
|
||||
}
|
||||
@@ -632,7 +628,7 @@ void raiseSetpoint() {
|
||||
targetvalue = thermostatSetpoint ? thermostatSetpoint : 0
|
||||
targetvalue = location.temperatureScale == "F"? targetvalue + 1 : targetvalue + 0.5
|
||||
|
||||
if ((mode == "heat" || mode == "emergency heat") && targetvalue > maxHeatingSetpoint) { // emergency heat = auxHeatOnly
|
||||
if ((mode == "heat" || mode == "auxheatonly") && targetvalue > maxHeatingSetpoint) {
|
||||
targetvalue = maxHeatingSetpoint
|
||||
} else if (mode == "cool" && targetvalue > maxCoolingSetpoint) {
|
||||
targetvalue = maxCoolingSetpoint
|
||||
@@ -678,7 +674,7 @@ void lowerSetpoint() {
|
||||
targetvalue = thermostatSetpoint ? thermostatSetpoint : 0
|
||||
targetvalue = location.temperatureScale == "F"? targetvalue - 1 : targetvalue - 0.5
|
||||
|
||||
if ((mode == "heat" || mode == "emergency heat") && targetvalue < minHeatingSetpoint) { // emergency heat = auxHeatOnly
|
||||
if ((mode == "heat" || mode == "auxheatonly") && targetvalue < minHeatingSetpoint) {
|
||||
targetvalue = minHeatingSetpoint
|
||||
} else if (mode == "cool" && targetvalue < minCoolingSetpoint) {
|
||||
targetvalue = minCoolingSetpoint
|
||||
@@ -719,7 +715,7 @@ void alterSetpoint(temp) {
|
||||
}
|
||||
|
||||
//step1: check thermostatMode, enforce limits before sending request to cloud
|
||||
if (mode == "heat" || mode == "emergency heat"){ // emergency heat = auxHeatOnly
|
||||
if (mode == "heat" || mode == "auxheatonly"){
|
||||
if (temp.value > coolingSetpoint){
|
||||
targetHeatingSetpoint = temp.value
|
||||
targetCoolingSetpoint = temp.value
|
||||
@@ -754,7 +750,7 @@ void alterSetpoint(temp) {
|
||||
log.debug "alterSetpoint in mode $mode succeed change setpoint to= ${temp.value}"
|
||||
} else {
|
||||
log.error "Error alterSetpoint()"
|
||||
if (mode == "heat" || mode == "emergency heat"){ // emergency heat = auxHeatOnly
|
||||
if (mode == "heat" || mode == "auxheatonly"){
|
||||
sendEvent("name": "thermostatSetpoint", "value": heatingSetpoint.toString(), displayed: false)
|
||||
sendEvent("name": "displayThermostatSetpoint", "value": heatingSetpoint.toString(), displayed: false)
|
||||
} else if (mode == "cool") {
|
||||
@@ -783,7 +779,7 @@ def generateStatusEvent() {
|
||||
log.debug "Cooling set point = ${coolingSetpoint}"
|
||||
log.debug "HVAC Mode = ${mode}"
|
||||
|
||||
if (mode == "heat") {
|
||||
if (mode == "heat" || mode == "auxheatonly") {
|
||||
if (temperature >= heatingSetpoint) {
|
||||
statusText = "Right Now: Idle"
|
||||
} else {
|
||||
@@ -806,8 +802,6 @@ def generateStatusEvent() {
|
||||
}
|
||||
} else if (mode == "off") {
|
||||
statusText = "Right Now: Off"
|
||||
} else if (mode == "emergency heat") { // emergency heat = auxHeatOnly
|
||||
statusText = "Emergency Heat"
|
||||
} else {
|
||||
statusText = "?"
|
||||
}
|
||||
|
||||
@@ -47,14 +47,14 @@
|
||||
capability "Sensor"
|
||||
capability "Battery"
|
||||
capability "Health Check"
|
||||
command "resetParams2StDefaults"
|
||||
command "listCurrentParams"
|
||||
command "updateZwaveParam"
|
||||
command "test"
|
||||
command "configure"
|
||||
|
||||
fingerprint mfr:"010F", prod:"0800", model:"2001"
|
||||
fingerprint mfr:"010F", prod:"0800", model:"1001"
|
||||
command "resetParams2StDefaults"
|
||||
command "listCurrentParams"
|
||||
command "updateZwaveParam"
|
||||
command "test"
|
||||
command "configure"
|
||||
|
||||
fingerprint deviceId: "0x2001", inClusters: "0x30,0x84,0x85,0x80,0x8F,0x56,0x72,0x86,0x70,0x8E,0x31,0x9C,0xEF,0x30,0x31,0x9C"
|
||||
}
|
||||
|
||||
simulator {
|
||||
|
||||
@@ -300,15 +300,21 @@ def setColor(value) {
|
||||
value.hex = "#${hex(value.red)}${hex(value.green)}${hex(value.blue)}"
|
||||
}
|
||||
|
||||
sendEvent(name: "hue", value: value.hue, displayed: false)
|
||||
sendEvent(name: "saturation", value: value.saturation, displayed: false)
|
||||
sendEvent(name: "color", value: value.hex, displayed: false)
|
||||
if (value.level) {
|
||||
sendEvent(name: "level", value: value.level)
|
||||
}
|
||||
if (value.switch) {
|
||||
sendEvent(name: "switch", value: value.switch)
|
||||
}
|
||||
if(value.hue) {
|
||||
sendEvent(name: "hue", value: value.hue, displayed: false)
|
||||
}
|
||||
if(value.saturation) {
|
||||
sendEvent(name: "saturation", value: value.saturation, displayed: false)
|
||||
}
|
||||
if(value.hex?.trim()) {
|
||||
sendEvent(name: "color", value: value.hex, displayed: false)
|
||||
}
|
||||
if (value.level) {
|
||||
sendEvent(name: "level", value: value.level)
|
||||
}
|
||||
if (value.switch?.trim()) {
|
||||
sendEvent(name: "switch", value: value.switch)
|
||||
}
|
||||
|
||||
sendRGB(value.rh, value.gh, value.bh)
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ metadata {
|
||||
capability "Sensor"
|
||||
capability "Smoke Detector" //attributes: smoke ("detected","clear","tested")
|
||||
capability "Temperature Measurement" //attributes: temperature
|
||||
capability "Health Check"
|
||||
attribute "tamper", "enum", ["detected", "clear"]
|
||||
attribute "heatAlarm", "enum", ["overheat detected", "clear", "rapid temperature rise", "underheat detected"]
|
||||
fingerprint deviceId: "0x0701", inClusters: "0x5E, 0x86, 0x72, 0x5A, 0x59, 0x85, 0x73, 0x84, 0x80, 0x71, 0x56, 0x70, 0x31, 0x8E, 0x22, 0x9C, 0x98, 0x7A", outClusters: "0x20, 0x8B"
|
||||
@@ -339,6 +340,8 @@ def zwaveEvent(physicalgraph.zwave.Command cmd) {
|
||||
}
|
||||
|
||||
def configure() {
|
||||
// Device wakes up every 4 hours, this interval allows us to miss one wakeup notification before marking offline
|
||||
sendEvent(name: "checkInterval", value: 8 * 60 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
// This sensor joins as a secure device if you tripple-click the button to include it
|
||||
log.debug "configure() >> isSecured() : ${isSecured()}"
|
||||
if (!isSecured()) {
|
||||
|
||||
@@ -35,8 +35,8 @@ metadata {
|
||||
|
||||
// tile definitions
|
||||
tiles(scale: 2) {
|
||||
multiAttributeTile(name:"valve", type: "generic", width: 6, height: 4, canChangeIcon: true){
|
||||
tileAttribute ("device.valve", key: "PRIMARY_CONTROL") {
|
||||
multiAttributeTile(name:"contact", type: "generic", width: 6, height: 4, canChangeIcon: true){
|
||||
tileAttribute ("device.contact", key: "PRIMARY_CONTROL") {
|
||||
attributeState "open", label: '${name}', action: "valve.close", icon: "st.valves.water.open", backgroundColor: "#00A0DC", nextState:"closing"
|
||||
attributeState "closed", label: '${name}', action: "valve.open", icon: "st.valves.water.closed", backgroundColor: "#ffffff", nextState:"opening"
|
||||
attributeState "opening", label: '${name}', action: "valve.close", icon: "st.valves.water.open", backgroundColor: "#00A0DC"
|
||||
@@ -48,14 +48,16 @@ metadata {
|
||||
state "default", label:'', action:"refresh.refresh", icon:"st.secondary.refresh"
|
||||
}
|
||||
|
||||
main "valve"
|
||||
details(["valve","refresh"])
|
||||
main "contact"
|
||||
details(["contact","refresh"])
|
||||
}
|
||||
}
|
||||
|
||||
def installed(){
|
||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
|
||||
response(refresh())
|
||||
}
|
||||
|
||||
def updated(){
|
||||
@@ -85,11 +87,17 @@ def zwaveEvent(physicalgraph.zwave.Command cmd) {
|
||||
}
|
||||
|
||||
def open() {
|
||||
zwave.switchBinaryV1.switchBinarySet(switchValue: 0x00).format()
|
||||
delayBetween([
|
||||
zwave.switchBinaryV1.switchBinarySet(switchValue: 0x00).format(),
|
||||
zwave.switchBinaryV1.switchBinaryGet().format()
|
||||
], 500)
|
||||
}
|
||||
|
||||
def close() {
|
||||
zwave.switchBinaryV1.switchBinarySet(switchValue: 0xFF).format()
|
||||
delayBetween([
|
||||
zwave.switchBinaryV1.switchBinarySet(switchValue: 0xFF).format(),
|
||||
zwave.switchBinaryV1.switchBinaryGet().format()
|
||||
], 500)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -105,6 +113,6 @@ def refresh() {
|
||||
|
||||
def createEventWithDebug(eventMap) {
|
||||
def event = createEvent(eventMap)
|
||||
log.debug "Event created with ${event?.descriptionText}"
|
||||
log.debug "Event created with ${event?.name}:${event?.value} - ${event?.descriptionText}"
|
||||
return event
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//DEPRECATED. INTEGRATION MOVED TO SUPER LAN CONNECT
|
||||
|
||||
/**
|
||||
* Hue Bloom
|
||||
*
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//DEPRECATED. INTEGRATION MOVED TO SUPER LAN CONNECT
|
||||
|
||||
/**
|
||||
* Hue Bridge
|
||||
*
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//DEPRECATED. INTEGRATION MOVED TO SUPER LAN CONNECT
|
||||
|
||||
/**
|
||||
* Hue Bulb
|
||||
*
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//DEPRECATED. INTEGRATION MOVED TO SUPER LAN CONNECT
|
||||
|
||||
/**
|
||||
* Hue Lux Bulb
|
||||
*
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//DEPRECATED. INTEGRATION MOVED TO SUPER LAN CONNECT
|
||||
|
||||
/**
|
||||
* Hue White Ambiance Bulb
|
||||
*
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
* Date: 2013-03-05
|
||||
*/
|
||||
metadata {
|
||||
definition (name: "SmartAlert Siren", namespace: "smartthings", author: "SmartThings", ocfDeviceType: "x.com.st.smokedetector") {
|
||||
definition (name: "SmartAlert Siren", namespace: "smartthings", author: "SmartThings", ocfDeviceType: "x.com.st.d.sensor.smoke") {
|
||||
capability "Actuator"
|
||||
capability "Switch"
|
||||
capability "Sensor"
|
||||
|
||||
@@ -23,12 +23,12 @@ metadata {
|
||||
capability "Refresh"
|
||||
capability "Sensor"
|
||||
capability "Health Check"
|
||||
capability "Light"
|
||||
capability "Outlet"
|
||||
|
||||
fingerprint profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0B04,0B05", outClusters: "0019", manufacturer: "CentraLite", model: "3200", deviceJoinName: "Outlet"
|
||||
fingerprint profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0B04,0B05", outClusters: "0019", manufacturer: "CentraLite", model: "3200-Sgb", deviceJoinName: "Outlet"
|
||||
fingerprint profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0B04,0B05", outClusters: "0019", manufacturer: "CentraLite", model: "4257050-RZHAC", deviceJoinName: "Outlet"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 000F, 0B04", outClusters: "0019", manufacturer: "SmartThings", model: "outletv4", deviceJoinName: "Outlet"
|
||||
fingerprint profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0B04,0B05", outClusters: "0019"
|
||||
}
|
||||
|
||||
|
||||
@@ -105,6 +105,8 @@ def parse(String description) {
|
||||
} else {
|
||||
log.warn "TEMP REPORTING CONFIG FAILED- error code: ${descMap.data[0]}"
|
||||
}
|
||||
} else if (descMap?.clusterInt == zigbee.IAS_ZONE_CLUSTER && descMap.attrInt == zigbee.ATTRIBUTE_IAS_ZONE_STATUS && descMap?.value) {
|
||||
map = translateZoneStatus(new ZoneStatus(zigbee.convertToInt(descMap?.value)))
|
||||
}
|
||||
}
|
||||
} else if (map.name == "temperature") {
|
||||
@@ -129,6 +131,10 @@ def parse(String description) {
|
||||
private Map parseIasMessage(String description) {
|
||||
ZoneStatus zs = zigbee.parseZoneStatus(description)
|
||||
|
||||
translateZoneStatus(zs)
|
||||
}
|
||||
|
||||
private Map translateZoneStatus(ZoneStatus zs) {
|
||||
return zs.isAlarm1Set() ? getMoistureResult('wet') : getMoistureResult('dry')
|
||||
}
|
||||
|
||||
@@ -197,7 +203,8 @@ def ping() {
|
||||
def refresh() {
|
||||
log.debug "Refreshing Temperature and Battery"
|
||||
def refreshCmds = zigbee.readAttribute(zigbee.TEMPERATURE_MEASUREMENT_CLUSTER, 0x0000) +
|
||||
zigbee.readAttribute(zigbee.POWER_CONFIGURATION_CLUSTER, 0x0020)
|
||||
zigbee.readAttribute(zigbee.POWER_CONFIGURATION_CLUSTER, 0x0020) +
|
||||
zigbee.readAttribute(zigbee.IAS_ZONE_CLUSTER, zigbee.ATTRIBUTE_IAS_ZONE_STATUS)
|
||||
|
||||
return refreshCmds + zigbee.enrollResponse()
|
||||
}
|
||||
|
||||
@@ -111,6 +111,8 @@ def parse(String description) {
|
||||
def value = descMap.value.endsWith("01") ? "active" : "inactive"
|
||||
log.debug "Doing a read attr motion event"
|
||||
map = getMotionResult(value)
|
||||
} else if (descMap?.clusterInt == zigbee.IAS_ZONE_CLUSTER && descMap.attrInt == zigbee.ATTRIBUTE_IAS_ZONE_STATUS && descMap?.value) {
|
||||
map = translateZoneStatus(new ZoneStatus(zigbee.convertToInt(descMap?.value)))
|
||||
}
|
||||
}
|
||||
} else if (map.name == "temperature") {
|
||||
@@ -135,6 +137,10 @@ def parse(String description) {
|
||||
private Map parseIasMessage(String description) {
|
||||
ZoneStatus zs = zigbee.parseZoneStatus(description)
|
||||
|
||||
translateZoneStatus(zs)
|
||||
}
|
||||
|
||||
private Map translateZoneStatus(ZoneStatus zs) {
|
||||
// Some sensor models that use this DTH use alarm1 and some use alarm2 to signify motion
|
||||
return (zs.isAlarm1Set() || zs.isAlarm2Set()) ? getMotionResult('active') : getMotionResult('inactive')
|
||||
}
|
||||
@@ -165,13 +171,29 @@ private Map getBatteryResult(rawValue) {
|
||||
def pct = batteryMap[volts]
|
||||
result.value = pct
|
||||
} else {
|
||||
def minVolts = 2.1
|
||||
def maxVolts = 3.0
|
||||
def pct = (volts - minVolts) / (maxVolts - minVolts)
|
||||
def roundedPct = Math.round(pct * 100)
|
||||
if (roundedPct <= 0)
|
||||
roundedPct = 1
|
||||
result.value = Math.min(100, roundedPct)
|
||||
def minVolts = 2.4
|
||||
def maxVolts = 2.7
|
||||
// Get the current battery percentage as a multiplier 0 - 1
|
||||
def curValVolts = Integer.parseInt(device.currentState("battery")?.value ?: "100") / 100.0
|
||||
// Find the corresponding voltage from our range
|
||||
curValVolts = curValVolts * (maxVolts - minVolts) + minVolts
|
||||
// Round to the nearest 10th of a volt
|
||||
curValVolts = Math.round(10 * curValVolts) / 10.0
|
||||
// Only update the battery reading if we don't have a last reading,
|
||||
// OR we have received the same reading twice in a row
|
||||
// OR we don't currently have a battery reading
|
||||
// OR the value we just received is at least 2 steps off from the last reported value
|
||||
if(state?.lastVolts == null || state?.lastVolts == volts || device.currentState("battery")?.value == null || Math.abs(curValVolts - volts) > 0.1) {
|
||||
def pct = (volts - minVolts) / (maxVolts - minVolts)
|
||||
def roundedPct = Math.round(pct * 100)
|
||||
if (roundedPct <= 0)
|
||||
roundedPct = 1
|
||||
result.value = Math.min(100, roundedPct)
|
||||
} else {
|
||||
// Don't update as we want to smooth the battery values
|
||||
result = null
|
||||
}
|
||||
state.lastVolts = volts
|
||||
}
|
||||
}
|
||||
|
||||
@@ -200,7 +222,8 @@ def refresh() {
|
||||
log.debug "refresh called"
|
||||
|
||||
def refreshCmds = zigbee.readAttribute(zigbee.POWER_CONFIGURATION_CLUSTER, 0x0020) +
|
||||
zigbee.readAttribute(zigbee.TEMPERATURE_MEASUREMENT_CLUSTER, 0x0000)
|
||||
zigbee.readAttribute(zigbee.TEMPERATURE_MEASUREMENT_CLUSTER, 0x0000) +
|
||||
zigbee.readAttribute(zigbee.IAS_ZONE_CLUSTER, zigbee.ATTRIBUTE_IAS_ZONE_STATUS)
|
||||
|
||||
return refreshCmds + zigbee.enrollResponse()
|
||||
}
|
||||
|
||||
@@ -134,8 +134,9 @@ def parse(String description) {
|
||||
} else {
|
||||
log.warn "TEMP REPORTING CONFIG FAILED- error code: ${descMap.data[0]}"
|
||||
}
|
||||
} else if (descMap?.clusterInt == zigbee.IAS_ZONE_CLUSTER && descMap.attrInt == zigbee.ATTRIBUTE_IAS_ZONE_STATUS && descMap?.value) {
|
||||
maps += translateZoneStatus(new ZoneStatus(zigbee.convertToInt(descMap?.value)))
|
||||
} else {
|
||||
|
||||
maps += handleAcceleration(descMap)
|
||||
}
|
||||
}
|
||||
@@ -229,6 +230,11 @@ private List<Map> parseAxis(List<Map> attrData) {
|
||||
|
||||
private List<Map> parseIasMessage(String description) {
|
||||
ZoneStatus zs = zigbee.parseZoneStatus(description)
|
||||
|
||||
translateZoneStatus(zs)
|
||||
}
|
||||
|
||||
private List<Map> translateZoneStatus(ZoneStatus zs) {
|
||||
List<Map> results = []
|
||||
|
||||
if (garageSensor != "Yes") {
|
||||
@@ -268,12 +274,28 @@ private Map getBatteryResult(rawValue) {
|
||||
result.value = pct
|
||||
} else {
|
||||
def minVolts = 2.1
|
||||
def maxVolts = 3.0
|
||||
def pct = (volts - minVolts) / (maxVolts - minVolts)
|
||||
def roundedPct = Math.round(pct * 100)
|
||||
if (roundedPct <= 0)
|
||||
roundedPct = 1
|
||||
result.value = Math.min(100, roundedPct)
|
||||
def maxVolts = 2.7
|
||||
// Get the current battery percentage as a multiplier 0 - 1
|
||||
def curValVolts = Integer.parseInt(device.currentState("battery")?.value ?: "100") / 100.0
|
||||
// Find the corresponding voltage from our range
|
||||
curValVolts = curValVolts * (maxVolts - minVolts) + minVolts
|
||||
// Round to the nearest 10th of a volt
|
||||
curValVolts = Math.round(10 * curValVolts) / 10.0
|
||||
// Only update the battery reading if we don't have a last reading,
|
||||
// OR we have received the same reading twice in a row
|
||||
// OR we don't currently have a battery reading
|
||||
// OR the value we just received is at least 2 steps off from the last reported value
|
||||
if(state?.lastVolts == null || state?.lastVolts == volts || device.currentState("battery")?.value == null || Math.abs(curValVolts - volts) > 0.1) {
|
||||
def pct = (volts - minVolts) / (maxVolts - minVolts)
|
||||
def roundedPct = Math.round(pct * 100)
|
||||
if (roundedPct <= 0)
|
||||
roundedPct = 1
|
||||
result.value = Math.min(100, roundedPct)
|
||||
} else {
|
||||
// Don't update as we want to smooth the battery values
|
||||
result = null
|
||||
}
|
||||
state.lastVolts = volts
|
||||
}
|
||||
}
|
||||
|
||||
@@ -313,7 +335,7 @@ def refresh() {
|
||||
def refreshCmds = zigbee.readAttribute(zigbee.TEMPERATURE_MEASUREMENT_CLUSTER, 0x0000) +
|
||||
zigbee.readAttribute(zigbee.POWER_CONFIGURATION_CLUSTER, 0x0020) +
|
||||
zigbee.readAttribute(0xFC02, 0x0010, [mfgCode: manufacturerCode]) +
|
||||
zigbee.enrollResponse()
|
||||
zigbee.readAttribute(zigbee.IAS_ZONE_CLUSTER, zigbee.ATTRIBUTE_IAS_ZONE_STATUS) + zigbee.enrollResponse()
|
||||
|
||||
return refreshCmds
|
||||
}
|
||||
|
||||
@@ -49,6 +49,6 @@ def arrived() {
|
||||
|
||||
|
||||
def departed() {
|
||||
log.trace "Executing 'arrived'"
|
||||
log.trace "Executing 'departed'"
|
||||
sendEvent(name: "presence", value: "not present")
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//DEPRECATED. INTEGRATION MOVED TO SUPER LAN CONNECT
|
||||
|
||||
/**
|
||||
* Copyright 2015 SmartThings
|
||||
*
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//DEPRECATED. INTEGRATION MOVED TO SUPER LAN CONNECT
|
||||
|
||||
/**
|
||||
* Copyright 2015 SmartThings
|
||||
*
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//DEPRECATED. INTEGRATION MOVED TO SUPER LAN CONNECT
|
||||
|
||||
/**
|
||||
* Copyright 2015 SmartThings
|
||||
*
|
||||
|
||||
2
devicetypes/smartthings/zigbee-button.src/.st-ignore
Normal file
2
devicetypes/smartthings/zigbee-button.src/.st-ignore
Normal file
@@ -0,0 +1,2 @@
|
||||
.st-ignore
|
||||
README.md
|
||||
42
devicetypes/smartthings/zigbee-button.src/README.md
Normal file
42
devicetypes/smartthings/zigbee-button.src/README.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# ZigBee Button
|
||||
|
||||
Cloud Execution
|
||||
|
||||
Works with:
|
||||
|
||||
* [OSRAM LIGHTIFY Dimming Switch](https://support.smartthings.com/hc/en-us/articles/115000236823-SYLVANIA-Dimming-Switch)
|
||||
* [Iris Smart Button](https://support.smartthings.com/hc/en-us/articles/115000190186-Iris-Smart-Button)
|
||||
* [Iris KeyFob](https://support.smartthings.com/hc/en-us/articles/217409686-Iris-Smart-Fob)
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Capabilities](#capabilities)
|
||||
* [Health](#device-health)
|
||||
* [Troubleshooting](#troubleshooting)
|
||||
|
||||
## Capabilities
|
||||
|
||||
* **Actuator** - It represents that a device has commands.
|
||||
* **Battery** - It defines that the device has a battery
|
||||
* **Button** - It defines that a device has one or more buttons
|
||||
* **Holdable Button** - It defines that a device has one or more holdable buttons
|
||||
* **Configuration** - _configure()_ command called when device is installed or device preferences updated
|
||||
* **Refresh** - _refresh()_ command for status updates
|
||||
* **Sensor** - it represents that a Device has attributes.
|
||||
* **Health Check** - indicates ability to get device health notifications
|
||||
|
||||
|
||||
## Device Health
|
||||
|
||||
ZigBee Button is marked offline only in the case when Hub is offline.
|
||||
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
If the device doesn't pair when trying from the SmartThings mobile app, it is possible that the device is out of range.
|
||||
Pairing needs to be tried again by placing the device closer to the hub.
|
||||
It may also happen that you need to reset the device.
|
||||
Instructions related to pairing, resetting and removing the device from SmartThings can be found in the following link:
|
||||
* [OSRAM LIGHTIFY Dimming Switch Troubleshooting Tips](https://support.smartthings.com/hc/en-us/articles/115000236823-SYLVANIA-Dimming-Switch)
|
||||
* [Iris Smart Button Troubleshooting Tips](https://support.smartthings.com/hc/en-us/articles/115000190186-Iris-Smart-Button)
|
||||
* [Iris KeyFob Troubleshooting Tips](https://support.smartthings.com/hc/en-us/articles/217409686-Iris-Smart-Fob)
|
||||
@@ -13,6 +13,8 @@
|
||||
* for the specific language governing permissions and limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
import groovy.json.JsonOutput
|
||||
import physicalgraph.zigbee.zcl.DataType
|
||||
|
||||
metadata {
|
||||
@@ -24,6 +26,7 @@ metadata {
|
||||
capability "Configuration"
|
||||
capability "Refresh"
|
||||
capability "Sensor"
|
||||
capability "Health Check"
|
||||
|
||||
command "enrollResponse"
|
||||
|
||||
@@ -249,6 +252,8 @@ def updated() {
|
||||
}
|
||||
|
||||
def initialize() {
|
||||
// Arrival sensors only goes OFFLINE when Hub is off
|
||||
sendEvent(name: "DeviceWatch-Enroll", value: JsonOutput.toJson([protocol: "zigbee", scheme:"untracked"]), displayed: false)
|
||||
if ((device.getDataValue("manufacturer") == "OSRAM") && (device.getDataValue("model") == "LIGHTIFY Dimming Switch")) {
|
||||
sendEvent(name: "numberOfButtons", value: 2)
|
||||
}
|
||||
|
||||
@@ -34,6 +34,9 @@ metadata {
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008", outClusters: "0003, 0006, 0008, 0019, 0406", manufacturer: "Leviton", model: "DL6HD", deviceJoinName: "Leviton Dimmer Switch"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008", outClusters: "0003, 0006, 0008, 0019, 0406", manufacturer: "Leviton", model: "DL3HL", deviceJoinName: "Leviton Lumina RF Plug-In Dimmer"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008", outClusters: "0003, 0006, 0008, 0019, 0406", manufacturer: "Leviton", model: "DL1KD", deviceJoinName: "Leviton Lumina RF Dimmer Switch"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04, 0B05, FC01, FC08", outClusters: "0003, 0019", manufacturer: "LEDVANCE", model: "A19 W 10 year", deviceJoinName: "SYLVANIA Smart 10Y A19 Soft White"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B05, FC01", outClusters: "0003, 0019", manufacturer: "LEDVANCE", model: "BR30 W 10 year", deviceJoinName: "SYLVANIA Smart 10Y BR30 Soft White"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B05, FC01", outClusters: "0003, 0019", manufacturer: "LEDVANCE", model: "PAR38 W 10 year", deviceJoinName: "SYLVANIA Smart 10Y PAR38 Soft White"
|
||||
}
|
||||
|
||||
tiles(scale: 2) {
|
||||
@@ -66,22 +69,29 @@ def parse(String description) {
|
||||
else {
|
||||
sendEvent(event)
|
||||
}
|
||||
}
|
||||
else {
|
||||
def cluster = zigbee.parse(description)
|
||||
|
||||
if (cluster && cluster.clusterId == 0x0006 && cluster.command == 0x07) {
|
||||
if (cluster.data[0] == 0x00) {
|
||||
} else {
|
||||
def descMap = zigbee.parseDescriptionAsMap(description)
|
||||
if (descMap && descMap.clusterInt == 0x0006 && descMap.commandInt == 0x07) {
|
||||
if (descMap.data[0] == "00") {
|
||||
log.debug "ON/OFF REPORTING CONFIG RESPONSE: " + cluster
|
||||
sendEvent(name: "checkInterval", value: 60 * 12, displayed: false, data: [protocol: "zigbee", hubHardwareId: device.hub.hardwareID])
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
log.warn "ON/OFF REPORTING CONFIG FAILED- error code:${cluster.data[0]}"
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else if (device.getDataValue("manufacturer") == "sengled" && descMap && descMap.clusterInt == 0x0008 && descMap.attrInt == 0x0000) {
|
||||
// This is being done because the sengled element touch/classic incorrectly uses the value 0xFF for the max level.
|
||||
// Per the ZCL spec for the UINT8 data type 0xFF is an invalid value, and 0xFE should be the max. Here we
|
||||
// manually handle the invalid attribute value since it will be ignored by getEvent as an invalid value.
|
||||
// We also set the level of the bulb to 0xFE so future level reports will be 0xFE until it is changed by
|
||||
// something else.
|
||||
if (descMap.value.toUpperCase() == "FF") {
|
||||
descMap.value = "FE"
|
||||
}
|
||||
sendHubCommand(zigbee.command(zigbee.LEVEL_CONTROL_CLUSTER, 0x00, "FE0000").collect { new physicalgraph.device.HubAction(it) }, 0)
|
||||
sendEvent(zigbee.getEventFromAttrData(descMap.clusterInt, descMap.attrInt, descMap.encoding, descMap.value))
|
||||
} else {
|
||||
log.warn "DID NOT PARSE MESSAGE for description : $description"
|
||||
log.debug "${cluster}"
|
||||
log.debug "${descMap}"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -130,4 +140,4 @@ def configure() {
|
||||
|
||||
// OnOff minReportTime 0 seconds, maxReportTime 5 min. Reporting interval if no activity
|
||||
refresh() + zigbee.onOffConfig(0, 300) + zigbee.levelConfig()
|
||||
}
|
||||
}
|
||||
@@ -40,6 +40,9 @@ metadata {
|
||||
fingerprint profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0008,0300,0B04,FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY BR RGBW", deviceJoinName: "SYLVANIA Smart BR30 RGBW"
|
||||
fingerprint profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0008,0300,0B04,FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY RT RGBW", deviceJoinName: "SYLVANIA Smart RT5/6 RGBW"
|
||||
fingerprint profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0008,0300,0B04,FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY FLEX OUTDOOR RGBW", deviceJoinName: "SYLVANIA Smart Outdoor RGBW Flex"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B05, FC01, FC08", outClusters: "0003, 0019", manufacturer: "LEDVANCE", model: "RT HO RGBW", deviceJoinName: "SYLVANIA Smart RT HO RGBW"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B05, FC01", outClusters: "0019", manufacturer: "LEDVANCE", model: "A19 RGBW", deviceJoinName: "SYLVANIA Smart A19 RGBW"
|
||||
|
||||
}
|
||||
|
||||
// UI tile definitions
|
||||
@@ -103,12 +106,12 @@ def parse(String description) {
|
||||
|
||||
if (zigbeeMap?.clusterInt == COLOR_CONTROL_CLUSTER) {
|
||||
if(zigbeeMap.attrInt == ATTRIBUTE_HUE){ //Hue Attribute
|
||||
def hueValue = Math.round(zigbee.convertHexToInt(zigbeeMap.value) / 0xfe * 100)
|
||||
sendEvent(name: "hue", value: hueValue, descriptionText: "Color has changed")
|
||||
state.hueValue = Math.round(zigbee.convertHexToInt(zigbeeMap.value) / 0xfe * 100)
|
||||
runIn(5, updateColor, [overwrite: true])
|
||||
}
|
||||
else if(zigbeeMap.attrInt == ATTRIBUTE_SATURATION){ //Saturation Attribute
|
||||
def saturationValue = Math.round(zigbee.convertHexToInt(zigbeeMap.value) / 0xfe * 100)
|
||||
sendEvent(name: "saturation", value: saturationValue, descriptionText: "Color has changed", displayed: false)
|
||||
state.saturationValue = Math.round(zigbee.convertHexToInt(zigbeeMap.value) / 0xfe * 100)
|
||||
runIn(5, updateColor, [overwrite: true])
|
||||
}
|
||||
}
|
||||
else if (cluster && cluster.clusterId == 0x0006 && cluster.command == 0x07) {
|
||||
@@ -127,6 +130,11 @@ def parse(String description) {
|
||||
}
|
||||
}
|
||||
|
||||
def updateColor() {
|
||||
sendEvent(name: "hue", value: state.hueValue, descriptionText: "Color has changed")
|
||||
sendEvent(name: "saturation", value: state.saturationValue, descriptionText: "Color has changed", displayed: false)
|
||||
}
|
||||
|
||||
def on() {
|
||||
zigbee.on()
|
||||
}
|
||||
@@ -204,9 +212,9 @@ def setColor(value){
|
||||
log.trace "setColor($value)"
|
||||
zigbee.on() +
|
||||
zigbee.command(COLOR_CONTROL_CLUSTER, MOVE_TO_HUE_AND_SATURATION_COMMAND,
|
||||
getScaledHue(value.hue), getScaledSaturation(value.saturation), "0000") +
|
||||
zigbee.readAttribute(COLOR_CONTROL_CLUSTER, ATTRIBUTE_HUE) +
|
||||
zigbee.readAttribute(COLOR_CONTROL_CLUSTER, ATTRIBUTE_SATURATION)
|
||||
getScaledHue(value.hue), getScaledSaturation(value.saturation), "0000") +
|
||||
zigbee.readAttribute(COLOR_CONTROL_CLUSTER, ATTRIBUTE_SATURATION) +
|
||||
zigbee.readAttribute(COLOR_CONTROL_CLUSTER, ATTRIBUTE_HUE)
|
||||
}
|
||||
|
||||
def setHue(value) {
|
||||
@@ -225,4 +233,4 @@ def installed() {
|
||||
sendEvent(name: "level", value: 100)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -27,7 +27,6 @@ metadata {
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0702"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0702, 0B05", outClusters: "0003, 000A, 0019", manufacturer: "Jasco Products", model: "45853", deviceJoinName: "GE ZigBee Plug-In Switch"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0702, 0B05", outClusters: "000A, 0019", manufacturer: "Jasco Products", model: "45856", deviceJoinName: "GE ZigBee In-Wall Switch"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 000F, 0B04", outClusters: "0019", manufacturer: "SmartThings", model: "outletv4", deviceJoinName: "Outlet"
|
||||
}
|
||||
|
||||
tiles(scale: 2) {
|
||||
|
||||
@@ -38,8 +38,8 @@ metadata {
|
||||
}
|
||||
|
||||
tiles(scale: 2) {
|
||||
multiAttributeTile(name:"valve", type: "generic", width: 6, height: 4, canChangeIcon: true){
|
||||
tileAttribute ("device.valve", key: "PRIMARY_CONTROL") {
|
||||
multiAttributeTile(name:"contact", type: "generic", width: 6, height: 4, canChangeIcon: true){
|
||||
tileAttribute ("device.contact", key: "PRIMARY_CONTROL") {
|
||||
attributeState "open", label: '${name}', action: "valve.close", icon: "st.valves.water.open", backgroundColor: "#00A0DC", nextState:"closing"
|
||||
attributeState "closed", label: '${name}', action: "valve.open", icon: "st.valves.water.closed", backgroundColor: "#ffffff", nextState:"opening"
|
||||
attributeState "opening", label: '${name}', action: "valve.close", icon: "st.valves.water.open", backgroundColor: "#00A0DC", nextState:"closing"
|
||||
@@ -58,8 +58,8 @@ metadata {
|
||||
state "default", label:"", action:"refresh.refresh", icon:"st.secondary.refresh"
|
||||
}
|
||||
|
||||
main(["valve"])
|
||||
details(["valve", "battery", "refresh"])
|
||||
main(["contact"])
|
||||
details(["contact", "battery", "refresh"])
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -39,6 +39,13 @@ metadata {
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY A19 Tunable White", deviceJoinName: "SYLVANIA Smart A19 Tunable White"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "Classic B40 TW - LIGHTIFY", deviceJoinName: "OSRAM LIGHTIFY Classic B40 Tunable White"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0702, 0B05", outClusters: "0019", manufacturer: "sengled", model: "Z01-A19NAE26", deviceJoinName: "Sengled Element plus"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04, 0B05, FC01, FC08", outClusters: "0003, 0019", manufacturer: "LEDVANCE", model: "A19 TW 10 year", deviceJoinName: "SYLVANIA Smart 10Y A19 TW"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY Conv Under Cabinet TW", deviceJoinName: "SYLVANIA Smart Convertible Under Cabinet"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "ColorstripRGBW", deviceJoinName: "SYLVANIA Smart Convertible Under Cabinet"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY Edge-lit Flushmount TW", deviceJoinName: "SYLVANIA Smart Edge-lit Flushmount TW"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B05, FC01", outClusters: "0003, 0019", manufacturer: "LEDVANCE", model: "MR16 TW", deviceJoinName: "SYLVANIA Smart MR16 Tunable White"
|
||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY Surface TW", deviceJoinName: "SYLVANIA Smart Surface Tunable White"
|
||||
|
||||
}
|
||||
|
||||
// UI tile definitions
|
||||
@@ -178,4 +185,4 @@ def installed() {
|
||||
sendEvent(name: "level", value: 100)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
.st-ignore
|
||||
README.md
|
||||
@@ -0,0 +1,39 @@
|
||||
# Z-wave Basic Smoke Alarm
|
||||
|
||||
Cloud Execution
|
||||
|
||||
Works with:
|
||||
|
||||
* [First Alert Smoke Detector (ZSMOKE)](https://www.smartthings.com/products/first-alert-smoke-detector)
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Capabilities](#capabilities)
|
||||
* [Health](#device-health)
|
||||
* [Battery](#battery-specification)
|
||||
* [Troubleshooting](#troubleshooting)
|
||||
|
||||
## Capabilities
|
||||
|
||||
* **Smoke Detector** - measure smoke and optionally carbon monoxide levels
|
||||
* **Sensor** - detects sensor events
|
||||
* **Battery** - defines device uses a battery
|
||||
* **Health Check** - indicates ability to get device health notifications
|
||||
|
||||
## Device Health
|
||||
|
||||
First Alert Smoke Detector (ZSMOKE) is a Z-wave sleepy device and checks in every 1 hour.
|
||||
Device-Watch allows 2 check-in misses from device plus some lag time. So Check-in interval = (2*60 + 2)mins = 122 mins.
|
||||
|
||||
* __122min__ checkInterval
|
||||
|
||||
## Battery Specification
|
||||
|
||||
Two AA 1.5V batteries are required.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
If the device doesn't pair when trying from the SmartThings mobile app, it is possible that the device is out of range.
|
||||
Pairing needs to be tried again by placing the device closer to the hub.
|
||||
Instructions related to pairing, resetting and removing the device from SmartThings can be found in the following link:
|
||||
* [First Alert Smoke Detector (ZSMOKE) Troubleshooting Tips](https://support.smartthings.com/hc/en-us/articles/207150556-First-Alert-Smoke-Detector-ZSMOKE-)
|
||||
@@ -0,0 +1,181 @@
|
||||
/**
|
||||
* Copyright 2015 SmartThings
|
||||
*
|
||||
* 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: "Z-Wave Basic Smoke Alarm", namespace: "smartthings", author: "SmartThings") {
|
||||
capability "Smoke Detector"
|
||||
capability "Sensor"
|
||||
capability "Battery"
|
||||
capability "Health Check"
|
||||
|
||||
fingerprint deviceId: "0xA100", inClusters: "0x20,0x80,0x70,0x85,0x71,0x72,0x86"
|
||||
fingerprint mfr:"0138", prod:"0001", model:"0001", deviceJoinName: "First Alert Smoke Detector"
|
||||
}
|
||||
|
||||
simulator {
|
||||
status "smoke": "command: 7105, payload: 01 FF"
|
||||
status "clear": "command: 7105, payload: 01 00"
|
||||
status "test": "command: 7105, payload: 0C FF"
|
||||
status "battery 100%": "command: 8003, payload: 64"
|
||||
status "battery 5%": "command: 8003, payload: 05"
|
||||
}
|
||||
|
||||
tiles (scale: 2){
|
||||
multiAttributeTile(name:"smoke", type: "lighting", width: 6, height: 4){
|
||||
tileAttribute ("device.smoke", key: "PRIMARY_CONTROL") {
|
||||
attributeState("clear", label:"clear", icon:"st.alarm.smoke.clear", backgroundColor:"#ffffff")
|
||||
attributeState("detected", label:"SMOKE", icon:"st.alarm.smoke.smoke", backgroundColor:"#e86d13")
|
||||
attributeState("tested", label:"TEST", icon:"st.alarm.smoke.test", backgroundColor:"#e86d13")
|
||||
}
|
||||
}
|
||||
valueTile("battery", "device.battery", inactiveLabel: false, decoration: "flat", width: 2, height: 2) {
|
||||
state "battery", label:'${currentValue}% battery', unit:""
|
||||
}
|
||||
|
||||
main "smoke"
|
||||
details(["smoke", "battery"])
|
||||
}
|
||||
}
|
||||
|
||||
def installed() {
|
||||
// Device checks in every hour, this interval allows us to miss one check-in notification before marking offline
|
||||
sendEvent(name: "checkInterval", value: 2 * 60 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
|
||||
def cmds = []
|
||||
createSmokeEvents("smokeClear", cmds)
|
||||
cmds.each { cmd -> sendEvent(cmd) }
|
||||
}
|
||||
|
||||
def updated() {
|
||||
// Device checks in every hour, this interval allows us to miss one check-in notification before marking offline
|
||||
sendEvent(name: "checkInterval", value: 2 * 60 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
}
|
||||
|
||||
def parse(String description) {
|
||||
def results = []
|
||||
if (description.startsWith("Err")) {
|
||||
results << createEvent(descriptionText:description, displayed:true)
|
||||
} else {
|
||||
def cmd = zwave.parse(description, [ 0x80: 1, 0x84: 1, 0x71: 2, 0x72: 1 ])
|
||||
if (cmd) {
|
||||
zwaveEvent(cmd, results)
|
||||
}
|
||||
}
|
||||
log.debug "'$description' parsed to ${results.inspect()}"
|
||||
return results
|
||||
}
|
||||
|
||||
def createSmokeEvents(name, results) {
|
||||
def text = null
|
||||
switch (name) {
|
||||
case "smoke":
|
||||
text = "$device.displayName smoke was detected!"
|
||||
// these are displayed:false because the composite event is the one we want to see in the app
|
||||
results << createEvent(name: "smoke", value: "detected", descriptionText: text)
|
||||
break
|
||||
case "tested":
|
||||
text = "$device.displayName was tested"
|
||||
results << createEvent(name: "smoke", value: "tested", descriptionText: text)
|
||||
break
|
||||
case "smokeClear":
|
||||
text = "$device.displayName smoke is clear"
|
||||
results << createEvent(name: "smoke", value: "clear", descriptionText: text)
|
||||
name = "clear"
|
||||
break
|
||||
case "testClear":
|
||||
text = "$device.displayName test cleared"
|
||||
results << createEvent(name: "smoke", value: "clear", descriptionText: text)
|
||||
name = "clear"
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.alarmv2.AlarmReport cmd, results) {
|
||||
if (cmd.zwaveAlarmType == physicalgraph.zwave.commands.alarmv2.AlarmReport.ZWAVE_ALARM_TYPE_SMOKE) {
|
||||
if (cmd.zwaveAlarmEvent == 3) {
|
||||
createSmokeEvents("tested", results)
|
||||
} else {
|
||||
createSmokeEvents((cmd.zwaveAlarmEvent == 1 || cmd.zwaveAlarmEvent == 2) ? "smoke" : "smokeClear", results)
|
||||
}
|
||||
} else switch(cmd.alarmType) {
|
||||
case 1:
|
||||
createSmokeEvents(cmd.alarmLevel ? "smoke" : "smokeClear", results)
|
||||
break
|
||||
case 12: // test button pressed
|
||||
createSmokeEvents(cmd.alarmLevel ? "tested" : "testClear", results)
|
||||
break
|
||||
case 13: // sent every hour -- not sure what this means, just a wake up notification?
|
||||
if (cmd.alarmLevel == 255) {
|
||||
results << createEvent(descriptionText: "$device.displayName checked in", isStateChange: false)
|
||||
} else {
|
||||
results << createEvent(descriptionText: "$device.displayName code 13 is $cmd.alarmLevel", isStateChange:true, displayed:false)
|
||||
}
|
||||
|
||||
// Clear smoke in case they pulled batteries and we missed the clear msg
|
||||
if(device.currentValue("smoke") != "clear") {
|
||||
createSmokeEvents("smokeClear", results)
|
||||
}
|
||||
|
||||
// Check battery if we don't have a recent battery event
|
||||
if (!state.lastbatt || (now() - state.lastbatt) >= 48*60*60*1000) {
|
||||
results << response(zwave.batteryV1.batteryGet())
|
||||
}
|
||||
break
|
||||
default:
|
||||
results << createEvent(displayed: true, descriptionText: "Alarm $cmd.alarmType ${cmd.alarmLevel == 255 ? 'activated' : cmd.alarmLevel ?: 'deactivated'}".toString())
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// SensorBinary and SensorAlarm aren't tested, but included to preemptively support future smoke alarms
|
||||
//
|
||||
def zwaveEvent(physicalgraph.zwave.commands.sensorbinaryv2.SensorBinaryReport cmd, results) {
|
||||
if (cmd.sensorType == physicalgraph.zwave.commandclasses.SensorBinaryV2.SENSOR_TYPE_SMOKE) {
|
||||
createSmokeEvents(cmd.sensorValue ? "smoke" : "smokeClear", results)
|
||||
}
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.sensoralarmv1.SensorAlarmReport cmd, results) {
|
||||
if (cmd.sensorType == 1) {
|
||||
createSmokeEvents(cmd.sensorState ? "smoke" : "smokeClear", results)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.wakeupv1.WakeUpNotification cmd, results) {
|
||||
results << createEvent(descriptionText: "$device.displayName woke up", isStateChange: false)
|
||||
if (!state.lastbatt || (now() - state.lastbatt) >= 56*60*60*1000) {
|
||||
results << response(zwave.batteryV1.batteryGet(), "delay 2000", zwave.wakeUpV1.wakeUpNoMoreInformation())
|
||||
} else {
|
||||
results << response(zwave.wakeUpV1.wakeUpNoMoreInformation())
|
||||
}
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd, results) {
|
||||
def map = [ name: "battery", unit: "%", isStateChange: true ]
|
||||
state.lastbatt = now()
|
||||
if (cmd.batteryLevel == 0xFF) {
|
||||
map.value = 1
|
||||
map.descriptionText = "$device.displayName battery is low!"
|
||||
} else {
|
||||
map.value = cmd.batteryLevel
|
||||
}
|
||||
results << createEvent(map)
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.Command cmd, results) {
|
||||
def event = [ displayed: false ]
|
||||
event.linkText = device.label ?: device.name
|
||||
event.descriptionText = "$event.linkText: $cmd"
|
||||
results << createEvent(event)
|
||||
}
|
||||
@@ -88,11 +88,20 @@ def updated(){
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
}
|
||||
|
||||
def getCommandClassVersions() {
|
||||
[
|
||||
0x20: 1, // Basic
|
||||
0x26: 1, // SwitchMultilevel
|
||||
0x56: 1, // Crc16Encap
|
||||
0x70: 1, // Configuration
|
||||
]
|
||||
}
|
||||
|
||||
def parse(String description) {
|
||||
def result = null
|
||||
if (description != "updated") {
|
||||
log.debug "parse() >> zwave.parse($description)"
|
||||
def cmd = zwave.parse(description, [0x20: 1, 0x26: 1, 0x70: 1])
|
||||
def cmd = zwave.parse(description, commandClassVersions)
|
||||
if (cmd) {
|
||||
result = zwaveEvent(cmd)
|
||||
}
|
||||
@@ -159,6 +168,16 @@ def zwaveEvent(physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelS
|
||||
[createEvent(name:"switch", value:"on"), response(zwave.switchMultilevelV1.switchMultilevelGet().format())]
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.crc16encapv1.Crc16Encap cmd) {
|
||||
def versions = commandClassVersions
|
||||
def version = versions[cmd.commandClass as Integer]
|
||||
def ccObj = version ? zwave.commandClass(cmd.commandClass, version) : zwave.commandClass(cmd.commandClass)
|
||||
def encapsulatedCommand = ccObj?.command(cmd.command)?.parse(cmd.data)
|
||||
if (encapsulatedCommand) {
|
||||
zwaveEvent(encapsulatedCommand)
|
||||
}
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.Command cmd) {
|
||||
// Handles all Z-Wave commands we aren't interested in
|
||||
[:]
|
||||
|
||||
@@ -113,9 +113,9 @@ def updated() {
|
||||
|
||||
def configure() {
|
||||
commands([
|
||||
zwave.manufacturerSpecificV2.manufacturerSpecificGet(),
|
||||
zwave.batteryV1.batteryGet()
|
||||
], 6000)
|
||||
zwave.sensorBinaryV2.sensorBinaryGet(sensorType: zwave.sensorBinaryV2.SENSOR_TYPE_DOOR_WINDOW),
|
||||
zwave.manufacturerSpecificV2.manufacturerSpecificGet()
|
||||
], 1000)
|
||||
}
|
||||
|
||||
def sensorValueEvent(value) {
|
||||
@@ -190,11 +190,17 @@ def zwaveEvent(physicalgraph.zwave.commands.wakeupv1.WakeUpNotification cmd)
|
||||
cmds << command(zwave.manufacturerSpecificV2.manufacturerSpecificGet())
|
||||
cmds << "delay 1200"
|
||||
}
|
||||
|
||||
if (device.currentValue("contact") == null) { // Incase our initial request didn't make it
|
||||
cmds << command(zwave.sensorBinaryV2.sensorBinaryGet(sensorType: zwave.sensorBinaryV2.SENSOR_TYPE_DOOR_WINDOW))
|
||||
}
|
||||
|
||||
if (!state.lastbat || now() - state.lastbat > 53*60*60*1000) {
|
||||
cmds << command(zwave.batteryV1.batteryGet())
|
||||
} else {
|
||||
} else { // If we check the battery state we will send NoMoreInfo in the handler for BatteryReport so that we definitely get the report
|
||||
cmds << zwave.wakeUpV1.wakeUpNoMoreInformation().format()
|
||||
}
|
||||
|
||||
[event, response(cmds)]
|
||||
}
|
||||
|
||||
|
||||
@@ -86,23 +86,25 @@ import physicalgraph.zwave.commands.doorlockv1.*
|
||||
import physicalgraph.zwave.commands.usercodev1.*
|
||||
|
||||
def installed() {
|
||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
}
|
||||
// Device-Watch pings if no device events received for 1 hour (checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 1 * 60 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
|
||||
def updated() {
|
||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
try {
|
||||
if (!state.init) {
|
||||
state.init = true
|
||||
response(secureSequence([zwave.doorLockV1.doorLockOperationGet(), zwave.batteryV1.batteryGet()]))
|
||||
// Wait long enough for behind-the-scenes z-wave magic to finish, but be quick enough before hub goes back into inclusion and blocks us
|
||||
response(["delay 2000"] + secureSequence([zwave.doorLockV1.doorLockOperationGet(), zwave.batteryV1.batteryGet()], 2200))
|
||||
}
|
||||
} catch (e) {
|
||||
log.warn "updated() threw $e"
|
||||
log.warn "installed() threw $e"
|
||||
}
|
||||
}
|
||||
|
||||
def updated() {
|
||||
// Device-Watch pings if no device events received for 1 hour (checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 1 * 60 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
}
|
||||
|
||||
def parse(String description) {
|
||||
def result = null
|
||||
if (description.startsWith("Err 106")) {
|
||||
@@ -153,8 +155,8 @@ def zwaveEvent(physicalgraph.zwave.commands.securityv1.SecurityCommandsSupported
|
||||
def zwaveEvent(DoorLockOperationReport cmd) {
|
||||
def result = []
|
||||
|
||||
unschedule(followupStateCheck)
|
||||
unschedule(stateCheck)
|
||||
unschedule("followupStateCheck")
|
||||
unschedule("stateCheck")
|
||||
|
||||
def map = [ name: "lock" ]
|
||||
if (cmd.doorLockMode == 0xFF) {
|
||||
@@ -464,7 +466,7 @@ def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd) {
|
||||
zwave.associationV1.associationRemove(groupingIdentifier:1, nodeId:zwaveHubNodeId).format(),
|
||||
"delay 1200",
|
||||
zwave.associationV1.associationGet(groupingIdentifier:2).format()
|
||||
]
|
||||
]
|
||||
[result, response(cmds)]
|
||||
}
|
||||
|
||||
|
||||
@@ -85,11 +85,21 @@ metadata {
|
||||
details(["switch", "power", "energy", "levelSliderControl", "refresh", "reset"])
|
||||
}
|
||||
|
||||
def getCommandClassVersions() {
|
||||
[
|
||||
0x20: 1, // Basic
|
||||
0x26: 3, // SwitchMultilevel
|
||||
0x56: 1, // Crc16Encap
|
||||
0x70: 1, // Configuration
|
||||
0x32: 3, // Meter
|
||||
]
|
||||
}
|
||||
|
||||
// parse events into attributes
|
||||
def parse(String description) {
|
||||
def result = null
|
||||
if (description != "updated") {
|
||||
def cmd = zwave.parse(description, [0x20: 1, 0x26: 3, 0x70: 1, 0x32:3])
|
||||
def cmd = zwave.parse(description, commandClassVersions)
|
||||
if (cmd) {
|
||||
result = zwaveEvent(cmd)
|
||||
log.debug("'$description' parsed to $result")
|
||||
@@ -124,6 +134,21 @@ def zwaveEvent(physicalgraph.zwave.commands.switchmultilevelv3.SwitchMultilevelR
|
||||
dimmerEvents(cmd)
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.crc16encapv1.Crc16Encap cmd) {
|
||||
def versions = commandClassVersions
|
||||
def version = versions[cmd.commandClass as Integer]
|
||||
def ccObj = version ? zwave.commandClass(cmd.commandClass, version) : zwave.commandClass(cmd.commandClass)
|
||||
def encapsulatedCommand = ccObj?.command(cmd.command)?.parse(cmd.data)
|
||||
if (encapsulatedCommand) {
|
||||
zwaveEvent(encapsulatedCommand)
|
||||
}
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.Command cmd) {
|
||||
// Handles all Z-Wave commands we aren't interested in
|
||||
[:]
|
||||
}
|
||||
|
||||
def dimmerEvents(physicalgraph.zwave.Command cmd) {
|
||||
def result = []
|
||||
def value = (cmd.value ? "on" : "off")
|
||||
|
||||
@@ -89,10 +89,19 @@ def updated() {
|
||||
} catch (e) { log.debug e }
|
||||
}
|
||||
|
||||
def getCommandClassVersions() {
|
||||
[
|
||||
0x20: 1, // Basic
|
||||
0x32: 1, // SwitchMultilevel
|
||||
0x56: 1, // Crc16Encap
|
||||
0x72: 2, // ManufacturerSpecific
|
||||
]
|
||||
}
|
||||
|
||||
def parse(String description) {
|
||||
def result = null
|
||||
if(description == "updated") return
|
||||
def cmd = zwave.parse(description, [0x20: 1, 0x32: 1, 0x72: 2])
|
||||
def cmd = zwave.parse(description, commandClassVersions)
|
||||
if (cmd) {
|
||||
result = zwaveEvent(cmd)
|
||||
}
|
||||
@@ -157,6 +166,16 @@ def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerS
|
||||
result
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.crc16encapv1.Crc16Encap cmd) {
|
||||
def versions = commandClassVersions
|
||||
def version = versions[cmd.commandClass as Integer]
|
||||
def ccObj = version ? zwave.commandClass(cmd.commandClass, version) : zwave.commandClass(cmd.commandClass)
|
||||
def encapsulatedCommand = ccObj?.command(cmd.command)?.parse(cmd.data)
|
||||
if (encapsulatedCommand) {
|
||||
zwaveEvent(encapsulatedCommand)
|
||||
}
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.Command cmd) {
|
||||
log.debug "$device.displayName: Unhandled: $cmd"
|
||||
[:]
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
* Date: 2014-07-15
|
||||
*/
|
||||
metadata {
|
||||
definition (name: "Z-Wave Siren", namespace: "smartthings", author: "SmartThings") {
|
||||
definition (name: "Z-Wave Siren", namespace: "smartthings", author: "SmartThings", ocfDeviceType: "x.com.st.d.sensor.smoke") {
|
||||
capability "Actuator"
|
||||
capability "Alarm"
|
||||
capability "Battery"
|
||||
@@ -72,7 +72,7 @@ def createEvents(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd) {
|
||||
|
||||
def poll() {
|
||||
if (secondsPast(state.lastbatt, 36*60*60)) {
|
||||
return zwave.batteryV1.batteryGet().format
|
||||
return zwave.batteryV1.batteryGet().format()
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
|
||||
@@ -21,8 +21,6 @@ metadata {
|
||||
|
||||
attribute "alarmState", "string"
|
||||
|
||||
fingerprint deviceId: "0xA100", inClusters: "0x20,0x80,0x70,0x85,0x71,0x72,0x86"
|
||||
fingerprint mfr:"0138", prod:"0001", model:"0001", deviceJoinName: "First Alert Smoke Detector"
|
||||
fingerprint mfr:"0138", prod:"0001", model:"0002", deviceJoinName: "First Alert Smoke Detector and Carbon Monoxide Alarm (ZCOMBO)"
|
||||
}
|
||||
|
||||
@@ -57,6 +55,10 @@ metadata {
|
||||
def installed() {
|
||||
// Device checks in every hour, this interval allows us to miss one check-in notification before marking offline
|
||||
sendEvent(name: "checkInterval", value: 2 * 60 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
|
||||
def cmds = []
|
||||
createSmokeOrCOEvents("allClear", cmds) // allClear to set inital states for smoke and CO
|
||||
cmds.each { cmd -> sendEvent(cmd) }
|
||||
}
|
||||
|
||||
def updated() {
|
||||
@@ -105,6 +107,12 @@ def createSmokeOrCOEvents(name, results) {
|
||||
results << createEvent(name: "carbonMonoxide", value: "clear", descriptionText: text, displayed: false)
|
||||
name = "clear"
|
||||
break
|
||||
case "allClear":
|
||||
text = "$device.displayName all clear"
|
||||
results << createEvent(name: "smoke", value: "clear", descriptionText: text, displayed: false)
|
||||
results << createEvent(name: "carbonMonoxide", value: "clear", displayed: false)
|
||||
name = "clear"
|
||||
break
|
||||
case "testClear":
|
||||
text = "$device.displayName test cleared"
|
||||
results << createEvent(name: "smoke", value: "clear", descriptionText: text, displayed: false)
|
||||
|
||||
@@ -71,9 +71,17 @@ def updated(){
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
}
|
||||
|
||||
def getCommandClassVersions() {
|
||||
[
|
||||
0x20: 1, // Basic
|
||||
0x56: 1, // Crc16Encap
|
||||
0x70: 1, // Configuration
|
||||
]
|
||||
}
|
||||
|
||||
def parse(String description) {
|
||||
def result = null
|
||||
def cmd = zwave.parse(description, [0x20: 1, 0x70: 1])
|
||||
def cmd = zwave.parse(description, commandClassVersions)
|
||||
if (cmd) {
|
||||
result = createEvent(zwaveEvent(cmd))
|
||||
}
|
||||
@@ -120,6 +128,15 @@ def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerS
|
||||
createEvent([descriptionText: "$device.displayName MSR: $msr", isStateChange: false])
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.crc16encapv1.Crc16Encap cmd) {
|
||||
def versions = commandClassVersions
|
||||
def version = versions[cmd.commandClass as Integer]
|
||||
def ccObj = version ? zwave.commandClass(cmd.commandClass, version) : zwave.commandClass(cmd.commandClass)
|
||||
def encapsulatedCommand = ccObj?.command(cmd.command)?.parse(cmd.data)
|
||||
if (encapsulatedCommand) {
|
||||
zwaveEvent(encapsulatedCommand)
|
||||
}
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.Command cmd) {
|
||||
// Handles all Z-Wave commands we aren't interested in
|
||||
|
||||
@@ -89,9 +89,17 @@ def updated(){
|
||||
}
|
||||
}
|
||||
|
||||
def getCommandClassVersions() {
|
||||
[
|
||||
0x20: 1, // Basic
|
||||
0x56: 1, // Crc16Encap
|
||||
0x70: 1, // Configuration
|
||||
]
|
||||
}
|
||||
|
||||
def parse(String description) {
|
||||
def result = null
|
||||
def cmd = zwave.parse(description, [0x20: 1, 0x70: 1])
|
||||
def cmd = zwave.parse(description, commandClassVersions)
|
||||
if (cmd) {
|
||||
result = createEvent(zwaveEvent(cmd))
|
||||
}
|
||||
@@ -138,6 +146,16 @@ def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerS
|
||||
createEvent([descriptionText: "$device.displayName MSR: $msr", isStateChange: false])
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.crc16encapv1.Crc16Encap cmd) {
|
||||
def versions = commandClassVersions
|
||||
def version = versions[cmd.commandClass as Integer]
|
||||
def ccObj = version ? zwave.commandClass(cmd.commandClass, version) : zwave.commandClass(cmd.commandClass)
|
||||
def encapsulatedCommand = ccObj?.command(cmd.command)?.parse(cmd.data)
|
||||
if (encapsulatedCommand) {
|
||||
zwaveEvent(encapsulatedCommand)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.Command cmd) {
|
||||
// Handles all Z-Wave commands we aren't interested in
|
||||
|
||||
@@ -15,10 +15,9 @@ metadata {
|
||||
definition (name: "Z-Wave Thermostat", namespace: "smartthings", author: "SmartThings") {
|
||||
capability "Actuator"
|
||||
capability "Temperature Measurement"
|
||||
capability "Relative Humidity Measurement"
|
||||
capability "Thermostat"
|
||||
capability "Configuration"
|
||||
capability "Polling"
|
||||
capability "Refresh"
|
||||
capability "Sensor"
|
||||
capability "Health Check"
|
||||
|
||||
@@ -117,7 +116,7 @@ metadata {
|
||||
state "cool", label:'${currentValue}° cool', backgroundColor:"#ffffff"
|
||||
}
|
||||
standardTile("refresh", "device.thermostatMode", inactiveLabel: false, decoration: "flat") {
|
||||
state "default", action:"polling.poll", icon:"st.secondary.refresh"
|
||||
state "default", action:"refresh.refresh", icon:"st.secondary.refresh"
|
||||
}
|
||||
main "temperature"
|
||||
details(["temperature", "mode", "fanMode", "heatSliderControl", "heatingSetpoint", "coolSliderControl", "coolingSetpoint", "refresh"])
|
||||
@@ -125,13 +124,20 @@ metadata {
|
||||
}
|
||||
|
||||
def installed(){
|
||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
sendHubCommand(new physicalgraph.device.HubAction(zwave.thermostatModeV2.thermostatModeSupportedGet().format()))
|
||||
initialize()
|
||||
}
|
||||
|
||||
def updated(){
|
||||
initialize()
|
||||
}
|
||||
|
||||
def initialize() {
|
||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
unschedule()
|
||||
runEvery5Minutes("refresh")
|
||||
refresh()
|
||||
}
|
||||
|
||||
def parse(String description)
|
||||
@@ -149,6 +155,7 @@ def parse(String description)
|
||||
]
|
||||
if (map.name == "thermostatMode") {
|
||||
state.lastTriedMode = map.value
|
||||
map.data = [supportedThermostatModes:state.supportedThermostatModes]
|
||||
if (map.value == "cool") {
|
||||
map2.value = device.latestValue("coolingSetpoint")
|
||||
log.info "THERMOSTAT, latest cooling setpoint = ${map2.value}"
|
||||
@@ -172,6 +179,7 @@ def parse(String description)
|
||||
}
|
||||
} else if (map.name == "thermostatFanMode" && map.isStateChange) {
|
||||
state.lastTriedFanMode = map.value
|
||||
map.data = [supportedThermostatFanModes: state.supportedThermostatFanModes]
|
||||
}
|
||||
log.debug "Parse returned $result"
|
||||
result
|
||||
@@ -305,26 +313,26 @@ def zwaveEvent(physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanMod
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeSupportedReport cmd) {
|
||||
def supportedModes = ""
|
||||
if(cmd.off) { supportedModes += "off " }
|
||||
if(cmd.heat) { supportedModes += "heat " }
|
||||
if(cmd.auxiliaryemergencyHeat) { supportedModes += "emergency heat " }
|
||||
if(cmd.cool) { supportedModes += "cool " }
|
||||
if(cmd.auto) { supportedModes += "auto " }
|
||||
def supportedModes = []
|
||||
if(cmd.off) { supportedModes << "off" }
|
||||
if(cmd.heat) { supportedModes << "heat" }
|
||||
if(cmd.cool) { supportedModes << "cool" }
|
||||
if(cmd.auto) { supportedModes << "auto" }
|
||||
if(cmd.auxiliaryemergencyHeat) { supportedModes << "emergency heat" }
|
||||
|
||||
state.supportedModes = supportedModes
|
||||
// No events to be generated, return empty map
|
||||
state.supportedThermostatModes = supportedModes
|
||||
sendEvent(name: "supportedThermostatModes", value: supportedModes, displayed: false)
|
||||
return [:]
|
||||
}
|
||||
|
||||
def zwaveEvent(physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanModeSupportedReport cmd) {
|
||||
def supportedFanModes = ""
|
||||
if(cmd.auto) { supportedFanModes += "auto " } // "fanAuto "
|
||||
if(cmd.low) { supportedFanModes += "on " } // "fanOn"
|
||||
if(cmd.circulation) { supportedFanModes += "circulate " } // "fanCirculate"
|
||||
def supportedFanModes = []
|
||||
if(cmd.auto) { supportedFanModes << "auto" } // "fanAuto "
|
||||
if(cmd.circulation) { supportedFanModes << "circulate" } // "fanCirculate"
|
||||
if(cmd.low) { supportedFanModes << "on" } // "fanOn"
|
||||
|
||||
state.supportedFanModes = supportedFanModes
|
||||
// No events to be generated, return empty map
|
||||
state.supportedThermostatFanModes = supportedFanModes
|
||||
sendEvent(name: "supportedThermostatFanModes", value: supportedFanModes, displayed: false)
|
||||
return [:]
|
||||
}
|
||||
|
||||
@@ -337,15 +345,17 @@ def zwaveEvent(physicalgraph.zwave.Command cmd) {
|
||||
}
|
||||
|
||||
// Command Implementations
|
||||
def poll() {
|
||||
delayBetween([
|
||||
zwave.sensorMultilevelV3.sensorMultilevelGet().format(), // current temperature
|
||||
zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 1).format(),
|
||||
zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 2).format(),
|
||||
zwave.thermostatModeV2.thermostatModeGet().format(),
|
||||
zwave.thermostatFanModeV3.thermostatFanModeGet().format(),
|
||||
zwave.thermostatOperatingStateV1.thermostatOperatingStateGet().format()
|
||||
], 2300)
|
||||
def refresh() {
|
||||
def cmds = []
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatModeV2.thermostatModeSupportedGet().format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatFanModeV3.thermostatFanModeSupportedGet().format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatModeV2.thermostatModeGet().format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatFanModeV3.thermostatFanModeGet().format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.sensorMultilevelV2.sensorMultilevelGet().format()) // current temperature
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatOperatingStateV1.thermostatOperatingStateGet().format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 1).format())
|
||||
cmds << new physicalgraph.device.HubAction(zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 2).format())
|
||||
sendHubCommand(cmds)
|
||||
}
|
||||
|
||||
def quickSetHeat(degrees) {
|
||||
@@ -416,28 +426,14 @@ def ping() {
|
||||
poll()
|
||||
}
|
||||
|
||||
def configure() {
|
||||
delayBetween([
|
||||
zwave.thermostatModeV2.thermostatModeSupportedGet().format(),
|
||||
zwave.thermostatFanModeV3.thermostatFanModeSupportedGet().format(),
|
||||
zwave.associationV1.associationSet(groupingIdentifier:1, nodeId:[zwaveHubNodeId]).format(),
|
||||
zwave.sensorMultilevelV3.sensorMultilevelGet().format(), // current temperature
|
||||
zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 1).format(),
|
||||
zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 2).format(),
|
||||
zwave.thermostatModeV2.thermostatModeGet().format(),
|
||||
zwave.thermostatFanModeV3.thermostatFanModeGet().format(),
|
||||
zwave.thermostatOperatingStateV1.thermostatOperatingStateGet().format()
|
||||
], 2300)
|
||||
}
|
||||
|
||||
def modes() {
|
||||
["off", "heat", "cool", "auto", "emergency heat"]
|
||||
return state.supportedThermostatModes
|
||||
}
|
||||
|
||||
def switchMode() {
|
||||
def currentMode = device.currentState("thermostatMode")?.value
|
||||
def lastTriedMode = state.lastTriedMode ?: currentMode ?: "off"
|
||||
def supportedModes = getDataByName("supportedModes")
|
||||
def lastTriedMode = state.lastTriedMode ?: currentMode ?: ["off"]
|
||||
def supportedModes = getDataByName("supportedThermostatModes")
|
||||
def modeOrder = modes()
|
||||
def next = { modeOrder[modeOrder.indexOf(it) + 1] ?: modeOrder[0] }
|
||||
def nextMode = next(lastTriedMode)
|
||||
@@ -454,7 +450,7 @@ def switchMode() {
|
||||
}
|
||||
|
||||
def switchToMode(nextMode) {
|
||||
def supportedModes = getDataByName("supportedModes")
|
||||
def supportedModes = getDataByName("supportedThermostatModes")
|
||||
if(supportedModes && !supportedModes.contains(nextMode)) log.warn "thermostat mode '$nextMode' is not supported"
|
||||
if (nextMode in modes()) {
|
||||
state.lastTriedMode = nextMode
|
||||
@@ -466,9 +462,9 @@ def switchToMode(nextMode) {
|
||||
|
||||
def switchFanMode() {
|
||||
def currentMode = device.currentState("thermostatFanMode")?.value
|
||||
def lastTriedMode = state.lastTriedFanMode ?: currentMode ?: "off"
|
||||
def supportedModes = getDataByName("supportedFanModes") ?: "auto on" // "fanAuto fanOn"
|
||||
def modeOrder = ["auto", "circulate", "on"] // "fanAuto", "fanCirculate", "fanOn"
|
||||
def lastTriedMode = state.lastTriedFanMode ?: currentMode ?: ["off"]
|
||||
def supportedModes = getDataByName("supportedThermostatFanModes") ?: ["auto", "on"]
|
||||
def modeOrder = state.supportedThermostatFanModes
|
||||
def next = { modeOrder[modeOrder.indexOf(it) + 1] ?: modeOrder[0] }
|
||||
def nextMode = next(lastTriedMode)
|
||||
while (!supportedModes?.contains(nextMode) && nextMode != "auto") { // "fanAuto"
|
||||
@@ -478,7 +474,7 @@ def switchFanMode() {
|
||||
}
|
||||
|
||||
def switchToFanMode(nextMode) {
|
||||
def supportedFanModes = getDataByName("supportedFanModes")
|
||||
def supportedFanModes = getDataByName("supportedThermostatFanModes")
|
||||
if(supportedFanModes && !supportedFanModes.contains(nextMode)) log.warn "thermostat mode '$nextMode' is not supported"
|
||||
|
||||
def returnCommand
|
||||
|
||||
@@ -58,6 +58,7 @@ metadata {
|
||||
def installed() {
|
||||
// Device-Watch simply pings if no device events received for 32min(checkInterval)
|
||||
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
|
||||
response(refresh())
|
||||
}
|
||||
|
||||
def updated() {
|
||||
|
||||
@@ -2,26 +2,11 @@ import javax.crypto.Mac;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.security.InvalidKeyException;
|
||||
|
||||
/**
|
||||
* OpenT2T SmartApp Test
|
||||
*
|
||||
* Copyright 2016 OpenT2T
|
||||
*
|
||||
* 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: "OpenT2T SmartApp Test",
|
||||
namespace: "opent2t",
|
||||
author: "OpenT2T",
|
||||
description: "Test app to test end to end SmartThings scenarios via OpenT2T",
|
||||
author: "Microsoft",
|
||||
description: "SmartApp for end to end SmartThings scenarios via OpenT2T",
|
||||
category: "SmartThings Labs",
|
||||
iconUrl: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png",
|
||||
iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png",
|
||||
@@ -55,16 +40,16 @@ definition(
|
||||
|
||||
//Device Inputs
|
||||
preferences {
|
||||
section("Allow OpenT2T to control these things...") {
|
||||
input "contactSensors", "capability.contactSensor", title: "Which Contact Sensors", multiple: true, required: false, hideWhenEmpty: true
|
||||
input "garageDoors", "capability.garageDoorControl", title: "Which Garage Doors?", multiple: true, required: false, hideWhenEmpty: true
|
||||
input "locks", "capability.lock", title: "Which Locks?", multiple: true, required: false, hideWhenEmpty: true
|
||||
input "cameras", "capability.videoCapture", title: "Which Cameras?", multiple: true, required: false, hideWhenEmpty: true
|
||||
input "motionSensors", "capability.motionSensor", title: "Which Motion Sensors?", multiple: true, required: false, hideWhenEmpty: true
|
||||
input "presenceSensors", "capability.presenceSensor", title: "Which Presence Sensors", multiple: true, required: false, hideWhenEmpty: true
|
||||
section("Allow Microsoft to control these things...") {
|
||||
// input "contactSensors", "capability.contactSensor", title: "Which Contact Sensors", multiple: true, required: false, hideWhenEmpty: true
|
||||
// input "garageDoors", "capability.garageDoorControl", title: "Which Garage Doors?", multiple: true, required: false, hideWhenEmpty: true
|
||||
// input "locks", "capability.lock", title: "Which Locks?", multiple: true, required: false, hideWhenEmpty: true
|
||||
// input "cameras", "capability.videoCapture", title: "Which Cameras?", multiple: true, required: false, hideWhenEmpty: true
|
||||
// input "motionSensors", "capability.motionSensor", title: "Which Motion Sensors?", multiple: true, required: false, hideWhenEmpty: true
|
||||
// input "presenceSensors", "capability.presenceSensor", title: "Which Presence Sensors", multiple: true, required: false, hideWhenEmpty: true
|
||||
input "switches", "capability.switch", title: "Which Switches and Lights?", multiple: true, required: false, hideWhenEmpty: true
|
||||
input "thermostats", "capability.thermostat", title: "Which Thermostat?", multiple: true, required: false, hideWhenEmpty: true
|
||||
input "waterSensors", "capability.waterSensor", title: "Which Water Leak Sensors?", multiple: true, required: false, hideWhenEmpty: true
|
||||
// input "waterSensors", "capability.waterSensor", title: "Which Water Leak Sensors?", multiple: true, required: false, hideWhenEmpty: true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,36 +67,32 @@ def getInputs() {
|
||||
return inputList
|
||||
}
|
||||
|
||||
|
||||
//API external Endpoints
|
||||
mappings {
|
||||
path("/devices") {
|
||||
action:
|
||||
[
|
||||
action: [
|
||||
GET: "getDevices"
|
||||
]
|
||||
}
|
||||
path("/devices/:id") {
|
||||
action:
|
||||
[
|
||||
action: [
|
||||
GET: "getDevice"
|
||||
]
|
||||
}
|
||||
path("/update/:id") {
|
||||
action:
|
||||
[
|
||||
action: [
|
||||
PUT: "updateDevice"
|
||||
]
|
||||
}
|
||||
path("/deviceSubscription") {
|
||||
action:
|
||||
[
|
||||
action: [
|
||||
POST : "registerDeviceChange",
|
||||
DELETE: "unregisterDeviceChange"
|
||||
]
|
||||
}
|
||||
path("/locationSubscription") {
|
||||
action:
|
||||
[
|
||||
action: [
|
||||
POST : "registerDeviceGraph",
|
||||
DELETE: "unregisterDeviceGraph"
|
||||
]
|
||||
@@ -195,7 +176,10 @@ def registerDeviceChange() {
|
||||
state.deviceSubscriptionMap.put(deviceId, [subscriptionEndpt])
|
||||
log.info "Added subscription URL: ${subscriptionEndpt} for ${myDevice.displayName}"
|
||||
} else if (!state.deviceSubscriptionMap[deviceId].contains(subscriptionEndpt)) {
|
||||
state.deviceSubscriptionMap[deviceId] << subscriptionEndpt
|
||||
// state.deviceSubscriptionMap[deviceId] << subscriptionEndpt
|
||||
// For now, we will only have one subscription endpoint per device
|
||||
state.deviceSubscriptionMap.remove(deviceId)
|
||||
state.deviceSubscriptionMap.put(deviceId, [subscriptionEndpt])
|
||||
log.info "Added subscription URL: ${subscriptionEndpt} for ${myDevice.displayName}"
|
||||
}
|
||||
|
||||
@@ -308,16 +292,16 @@ def deviceEventHandler(evt) {
|
||||
def evtDeviceType = getDeviceType(evtDevice)
|
||||
def deviceData = [];
|
||||
|
||||
if (evt.data != null) {
|
||||
def evtData = parseJson(evt.data)
|
||||
log.info "Received event for ${evtDevice.displayName}, data: ${evtData}, description: ${evt.descriptionText}"
|
||||
}
|
||||
|
||||
if (evtDeviceType == "thermostat") {
|
||||
deviceData = [name: evtDevice.displayName, id: evtDevice.id, status: evtDevice.status, deviceType: evtDeviceType, manufacturer: evtDevice.manufacturerName, model: evtDevice.modelName, attributes: deviceAttributeList(evtDevice, evtDeviceType), locationMode: getLocationModeInfo(), locationId: location.id]
|
||||
} else {
|
||||
deviceData = [name: evtDevice.displayName, id: evtDevice.id, status: evtDevice.status, deviceType: evtDeviceType, manufacturer: evtDevice.manufacturerName, model: evtDevice.modelName, attributes: deviceAttributeList(evtDevice, evtDeviceType), locationId: location.id]
|
||||
}
|
||||
|
||||
if(evt.data != null){
|
||||
def evtData = parseJson(evt.data)
|
||||
log.info "Received event for ${evtDevice.displayName}, data: ${evtData}, description: ${evt.descriptionText}"
|
||||
}
|
||||
|
||||
def params = [body: deviceData]
|
||||
|
||||
@@ -327,10 +311,10 @@ def deviceEventHandler(evt) {
|
||||
params.uri = "${it}"
|
||||
if (state.verificationKeyMap[it] != null) {
|
||||
def key = state.verificationKeyMap[it]
|
||||
params.header = [Signature: ComputHMACValue(key, groovy.json.JsonOutput.toJson(params.body))]
|
||||
params.headers = [Signature: ComputHMACValue(key, groovy.json.JsonOutput.toJson(params.body))]
|
||||
}
|
||||
log.trace "POST URI: ${params.uri}"
|
||||
log.trace "Header: ${params.header}"
|
||||
log.trace "Headers: ${params.headers}"
|
||||
log.trace "Payload: ${params.body}"
|
||||
try {
|
||||
httpPostJson(params) { resp ->
|
||||
@@ -360,10 +344,10 @@ def locationEventHandler(evt) {
|
||||
params.uri = "${it}"
|
||||
if (state.verificationKeyMap[it] != null) {
|
||||
def key = state.verificationKeyMap[it]
|
||||
params.header = [Signature: ComputHMACValue(key, groovy.json.JsonOutput.toJson(params.body))]
|
||||
params.headers = [Signature: ComputHMACValue(key, groovy.json.JsonOutput.toJson(params.body))]
|
||||
}
|
||||
log.trace "POST URI: ${params.uri}"
|
||||
log.trace "Header: ${params.header}"
|
||||
log.trace "Headers: ${params.headers}"
|
||||
log.trace "Payload: ${params.body}"
|
||||
try {
|
||||
httpPostJson(params) { resp ->
|
||||
@@ -382,6 +366,7 @@ def locationEventHandler(evt) {
|
||||
|
||||
private ComputHMACValue(key, data) {
|
||||
try {
|
||||
log.debug "data hased: ${data}"
|
||||
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA1")
|
||||
Mac mac = Mac.getInstance("HmacSHA1")
|
||||
mac.init(secretKeySpec)
|
||||
@@ -504,7 +489,8 @@ private getDeviceType(device) {
|
||||
|
||||
//Loop through the device capability list to determine the device type.
|
||||
capabilities.each { capability ->
|
||||
switch (capability.name.toLowerCase()) {
|
||||
switch(capability.name.toLowerCase())
|
||||
{
|
||||
case "switch":
|
||||
deviceType = "switch"
|
||||
|
||||
@@ -649,7 +635,8 @@ private mapDeviceCommands(command, value) {
|
||||
if (value == 1 || value == "1" || value == "lock") {
|
||||
resultCommand = "lock"
|
||||
resultValue = ""
|
||||
} else if (value == 0 || value == "0" || value == "unlock") {
|
||||
}
|
||||
else if (value == 0 || value == "0" || value == "unlock") {
|
||||
resultCommand = "unlock"
|
||||
resultValue = ""
|
||||
}
|
||||
|
||||
@@ -1,609 +0,0 @@
|
||||
/**
|
||||
* Bose SoundTouch (Connect)
|
||||
*
|
||||
* Copyright 2015 SmartThings
|
||||
*
|
||||
* 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: "Bose SoundTouch (Connect)",
|
||||
namespace: "smartthings",
|
||||
author: "SmartThings",
|
||||
description: "Control your Bose SoundTouch speakers",
|
||||
category: "SmartThings Labs",
|
||||
iconUrl: "https://d3azp77rte0gip.cloudfront.net/smartapps/fcf1d93a-ba0b-4324-b96f-e5b5487dfaf5/images/BoseST_icon.png",
|
||||
iconX2Url: "https://d3azp77rte0gip.cloudfront.net/smartapps/fcf1d93a-ba0b-4324-b96f-e5b5487dfaf5/images/BoseST_icon@2x.png",
|
||||
iconX3Url: "https://d3azp77rte0gip.cloudfront.net/smartapps/fcf1d93a-ba0b-4324-b96f-e5b5487dfaf5/images/BoseST_icon@2x-1.png",
|
||||
singleInstance: true
|
||||
)
|
||||
|
||||
preferences {
|
||||
page(name:"deviceDiscovery", title:"Device Setup", content:"deviceDiscovery", refreshTimeout:5)
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the urn that we're looking for
|
||||
*
|
||||
* @return URN which we are looking for
|
||||
*
|
||||
* @todo This + getUSNQualifier should be one and should use regular expressions
|
||||
*/
|
||||
def getDeviceType() {
|
||||
return "urn:schemas-upnp-org:device:MediaRenderer:1" // Bose
|
||||
}
|
||||
|
||||
/**
|
||||
* If not null, returns an additional qualifier for ssdUSN
|
||||
* to avoid spamming the network
|
||||
*
|
||||
* @return Additional qualifier OR null if not needed
|
||||
*/
|
||||
def getUSNQualifier() {
|
||||
return "uuid:BO5EBO5E-F00D-F00D-FEED-"
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the name of the new device to instantiate in the user's smartapps
|
||||
* This must be an app owned by the namespace (see #getNameSpace).
|
||||
*
|
||||
* @return name
|
||||
*/
|
||||
def getDeviceName() {
|
||||
return "Bose SoundTouch"
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the namespace this app and siblings use
|
||||
*
|
||||
* @return namespace
|
||||
*/
|
||||
def getNameSpace() {
|
||||
return "smartthings"
|
||||
}
|
||||
|
||||
/**
|
||||
* The deviceDiscovery page used by preferences. Will automatically
|
||||
* make calls to the underlying discovery mechanisms as well as update
|
||||
* whenever new devices are discovered AND verified.
|
||||
*
|
||||
* @return a dynamicPage() object
|
||||
*/
|
||||
def deviceDiscovery()
|
||||
{
|
||||
if(canInstallLabs())
|
||||
{
|
||||
def refreshInterval = 3 // Number of seconds between refresh
|
||||
int deviceRefreshCount = !state.deviceRefreshCount ? 0 : state.deviceRefreshCount as int
|
||||
state.deviceRefreshCount = deviceRefreshCount + refreshInterval
|
||||
|
||||
def devices = getSelectableDevice()
|
||||
def numFound = devices.size() ?: 0
|
||||
|
||||
// Make sure we get location updates (contains LAN data such as SSDP results, etc)
|
||||
subscribeNetworkEvents()
|
||||
|
||||
//device discovery request every 15s
|
||||
if((deviceRefreshCount % 15) == 0) {
|
||||
discoverDevices()
|
||||
}
|
||||
|
||||
// Verify request every 3 seconds except on discoveries
|
||||
if(((deviceRefreshCount % 3) == 0) && ((deviceRefreshCount % 15) != 0)) {
|
||||
verifyDevices()
|
||||
}
|
||||
|
||||
log.trace "Discovered devices: ${devices}"
|
||||
|
||||
return dynamicPage(name:"deviceDiscovery", title:"Discovery Started!", nextPage:"", refreshInterval:refreshInterval, install:true, uninstall: true) {
|
||||
section("Please wait while we discover your ${getDeviceName()}. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.") {
|
||||
input "selecteddevice", "enum", required:false, title:"Select ${getDeviceName()} (${numFound} found)", multiple:true, options:devices, submitOnChange: true
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
def upgradeNeeded = """To use SmartThings Labs, your Hub should be completely up to date.
|
||||
|
||||
To update your Hub, access Location Settings in the Main Menu (tap the gear next to your location name), select your Hub, and choose "Update Hub"."""
|
||||
|
||||
return dynamicPage(name:"deviceDiscovery", title:"Upgrade needed!", nextPage:"", install:true, uninstall: true) {
|
||||
section("Upgrade") {
|
||||
paragraph "$upgradeNeeded"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by SmartThings Cloud when user has selected device(s) and
|
||||
* pressed "Install".
|
||||
*/
|
||||
def installed() {
|
||||
log.trace "Installed with settings: ${settings}"
|
||||
initialize()
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by SmartThings Cloud when app has been updated
|
||||
*/
|
||||
def updated() {
|
||||
log.trace "Updated with settings: ${settings}"
|
||||
unsubscribe()
|
||||
initialize()
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by SmartThings Cloud when user uninstalls the app
|
||||
*
|
||||
* We don't need to manually do anything here because any children
|
||||
* are automatically removed upon the removal of the parent.
|
||||
*
|
||||
* Only time to do anything here is when you need to notify
|
||||
* the remote end. And even then you're discouraged from removing
|
||||
* the children manually.
|
||||
*/
|
||||
def uninstalled() {
|
||||
}
|
||||
|
||||
/**
|
||||
* If user has selected devices, will start monitoring devices
|
||||
* for changes (new address, port, etc...)
|
||||
*/
|
||||
def initialize() {
|
||||
log.trace "initialize()"
|
||||
state.subscribe = false
|
||||
if (selecteddevice) {
|
||||
addDevice()
|
||||
refreshDevices()
|
||||
subscribeNetworkEvents(true)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the child devices based on the user's selection
|
||||
*
|
||||
* Uses selecteddevice defined in the deviceDiscovery() page
|
||||
*/
|
||||
def addDevice(){
|
||||
def devices = getVerifiedDevices()
|
||||
def devlist
|
||||
log.trace "Adding childs"
|
||||
|
||||
// If only one device is selected, we don't get a list (when using simulator)
|
||||
if (!(selecteddevice instanceof List)) {
|
||||
devlist = [selecteddevice]
|
||||
} else {
|
||||
devlist = selecteddevice
|
||||
}
|
||||
|
||||
log.trace "These are being installed: ${devlist}"
|
||||
|
||||
devlist.each { dni ->
|
||||
def d = getChildDevice(dni)
|
||||
if(!d) {
|
||||
def newDevice = devices.find { (it.value.mac) == dni }
|
||||
def deviceName = newDevice?.value.name
|
||||
if (!deviceName)
|
||||
deviceName = getDeviceName() + "[${newDevice?.value.name}]"
|
||||
d = addChildDevice(getNameSpace(), getDeviceName(), dni, newDevice?.value.hub, [label:"${deviceName}"])
|
||||
d.boseSetDeviceID(newDevice.value.deviceID)
|
||||
log.trace "Created ${d.displayName} with id $dni"
|
||||
// sync DTH with device, done here as it currently don't work from the DTH's installed() method
|
||||
d.refresh()
|
||||
} else {
|
||||
log.trace "${d.displayName} with id $dni already exists"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves a DeviceNetworkId to an address. Primarily used by children
|
||||
*
|
||||
* @param dni Device Network id
|
||||
* @return address or null
|
||||
*/
|
||||
def resolveDNI2Address(dni) {
|
||||
def device = getVerifiedDevices().find { (it.value.mac) == dni }
|
||||
if (device) {
|
||||
return convertHexToIP(device.value.networkAddress)
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Joins a child to the "Play Everywhere" zone
|
||||
*
|
||||
* @param child The speaker joining the zone
|
||||
* @return A list of maps with POST data
|
||||
*/
|
||||
def boseZoneJoin(child) {
|
||||
log = child.log // So we can debug this function
|
||||
|
||||
def results = []
|
||||
def result = [:]
|
||||
|
||||
// Find the master (if any)
|
||||
def server = getChildDevices().find{ it.boseGetZone() == "server" }
|
||||
|
||||
if (server) {
|
||||
log.debug "boseJoinZone() We have a server already, so lets add the new speaker"
|
||||
child.boseSetZone("client")
|
||||
|
||||
result['endpoint'] = "/setZone"
|
||||
result['host'] = server.getDeviceIP() + ":8090"
|
||||
result['body'] = "<zone master=\"${server.boseGetDeviceID()}\" senderIPAddress=\"${server.getDeviceIP()}\">"
|
||||
getChildDevices().each{ it ->
|
||||
log.trace "child: " + child
|
||||
log.trace "zone : " + it.boseGetZone()
|
||||
if (it.boseGetZone() || it.boseGetDeviceID() == child.boseGetDeviceID())
|
||||
result['body'] = result['body'] + "<member ipaddress=\"${it.getDeviceIP()}\">${it.boseGetDeviceID()}</member>"
|
||||
}
|
||||
result['body'] = result['body'] + '</zone>'
|
||||
} else {
|
||||
log.debug "boseJoinZone() No server, add it!"
|
||||
result['endpoint'] = "/setZone"
|
||||
result['host'] = child.getDeviceIP() + ":8090"
|
||||
result['body'] = "<zone master=\"${child.boseGetDeviceID()}\" senderIPAddress=\"${child.getDeviceIP()}\">"
|
||||
result['body'] = result['body'] + "<member ipaddress=\"${child.getDeviceIP()}\">${child.boseGetDeviceID()}</member>"
|
||||
result['body'] = result['body'] + '</zone>'
|
||||
child.boseSetZone("server")
|
||||
}
|
||||
results << result
|
||||
return results
|
||||
}
|
||||
|
||||
def boseZoneReset() {
|
||||
getChildDevices().each{ it.boseSetZone(null) }
|
||||
}
|
||||
|
||||
def boseZoneHasMaster() {
|
||||
return getChildDevices().find{ it.boseGetZone() == "server" } != null
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a speaker from the play everywhere zone.
|
||||
*
|
||||
* @param child Which speaker is leaving
|
||||
* @return a list of maps with POST data
|
||||
*/
|
||||
def boseZoneLeave(child) {
|
||||
log = child.log // So we can debug this function
|
||||
|
||||
def results = []
|
||||
def result = [:]
|
||||
|
||||
// First, tag us as a non-member
|
||||
child.boseSetZone(null)
|
||||
|
||||
// Find the master (if any)
|
||||
def server = getChildDevices().find{ it.boseGetZone() == "server" }
|
||||
|
||||
if (server && server.boseGetDeviceID() != child.boseGetDeviceID()) {
|
||||
log.debug "boseLeaveZone() We have a server, so tell him we're leaving"
|
||||
result['endpoint'] = "/removeZoneSlave"
|
||||
result['host'] = server.getDeviceIP() + ":8090"
|
||||
result['body'] = "<zone master=\"${server.boseGetDeviceID()}\" senderIPAddress=\"${server.getDeviceIP()}\">"
|
||||
result['body'] = result['body'] + "<member ipaddress=\"${child.getDeviceIP()}\">${child.boseGetDeviceID()}</member>"
|
||||
result['body'] = result['body'] + '</zone>'
|
||||
results << result
|
||||
} else {
|
||||
log.debug "boseLeaveZone() No server, then...uhm, we probably were it!"
|
||||
// Dismantle the entire thing, first send this to master
|
||||
result['endpoint'] = "/removeZoneSlave"
|
||||
result['host'] = child.getDeviceIP() + ":8090"
|
||||
result['body'] = "<zone master=\"${child.boseGetDeviceID()}\" senderIPAddress=\"${child.getDeviceIP()}\">"
|
||||
getChildDevices().each{ dev ->
|
||||
if (dev.boseGetZone() || dev.boseGetDeviceID() == child.boseGetDeviceID())
|
||||
result['body'] = result['body'] + "<member ipaddress=\"${dev.getDeviceIP()}\">${dev.boseGetDeviceID()}</member>"
|
||||
}
|
||||
result['body'] = result['body'] + '</zone>'
|
||||
results << result
|
||||
|
||||
// Also issue this to each individual client
|
||||
getChildDevices().each{ dev ->
|
||||
if (dev.boseGetZone() && dev.boseGetDeviceID() != child.boseGetDeviceID()) {
|
||||
log.trace "Additional device: " + dev
|
||||
result['host'] = dev.getDeviceIP() + ":8090"
|
||||
results << result
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return results
|
||||
}
|
||||
|
||||
/**
|
||||
* Define our XML parsers
|
||||
*
|
||||
* @return mapping of root-node <-> parser function
|
||||
*/
|
||||
def getParsers() {
|
||||
[
|
||||
"root" : "parseDESC",
|
||||
"info" : "parseINFO"
|
||||
]
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when location has changed, contains information from
|
||||
* network transactions. See deviceDiscovery() for where it is
|
||||
* registered.
|
||||
*
|
||||
* @param evt Holds event information
|
||||
*/
|
||||
def onLocation(evt) {
|
||||
// Convert the event into something we can use
|
||||
def lanEvent = parseLanMessage(evt.description, true)
|
||||
lanEvent << ["hub":evt?.hubId]
|
||||
|
||||
// Determine what we need to do...
|
||||
if (lanEvent?.ssdpTerm?.contains(getDeviceType()) &&
|
||||
(getUSNQualifier() == null ||
|
||||
lanEvent?.ssdpUSN?.contains(getUSNQualifier())
|
||||
)
|
||||
)
|
||||
{
|
||||
parseSSDP(lanEvent)
|
||||
}
|
||||
else if (
|
||||
lanEvent.headers && lanEvent.body &&
|
||||
lanEvent.headers."content-type"?.contains("xml")
|
||||
)
|
||||
{
|
||||
def parsers = getParsers()
|
||||
def xmlData = new XmlSlurper().parseText(lanEvent.body)
|
||||
|
||||
// Let each parser take a stab at it
|
||||
parsers.each { node,func ->
|
||||
if (xmlData.name() == node)
|
||||
"$func"(xmlData)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles SSDP description file.
|
||||
*
|
||||
* @param xmlData
|
||||
*/
|
||||
private def parseDESC(xmlData) {
|
||||
log.info "parseDESC()"
|
||||
|
||||
def devicetype = getDeviceType().toLowerCase()
|
||||
def devicetxml = body.device.deviceType.text().toLowerCase()
|
||||
|
||||
// Make sure it's the type we want
|
||||
if (devicetxml == devicetype) {
|
||||
def devices = getDevices()
|
||||
def device = devices.find {it?.key?.contains(xmlData?.device?.UDN?.text())}
|
||||
if (device && !device.value?.verified) {
|
||||
// Unlike regular DESC, we cannot trust this just yet, parseINFO() decides all
|
||||
device.value << [name:xmlData?.device?.friendlyName?.text(),model:xmlData?.device?.modelName?.text(), serialNumber:xmlData?.device?.serialNum?.text()]
|
||||
} else {
|
||||
log.error "parseDESC(): The xml file returned a device that didn't exist"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle BOSE <info></info> result. This is an alternative to
|
||||
* using the SSDP description standard. Some of the speakers do
|
||||
* not support SSDP description, so we need this as well.
|
||||
*
|
||||
* @param xmlData
|
||||
*/
|
||||
private def parseINFO(xmlData) {
|
||||
log.info "parseINFO()"
|
||||
def devicetype = getDeviceType().toLowerCase()
|
||||
|
||||
def deviceID = xmlData.attributes()['deviceID']
|
||||
def device = getDevices().find {it?.key?.contains(deviceID)}
|
||||
if (device && !device.value?.verified) {
|
||||
device.value << [name:xmlData?.name?.text(),model:xmlData?.type?.text(), serialNumber:xmlData?.serialNumber?.text(), "deviceID":deviceID, verified: true]
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles SSDP discovery messages and adds them to the list
|
||||
* of discovered devices. If it already exists, it will update
|
||||
* the port and location (in case it was moved).
|
||||
*
|
||||
* @param lanEvent
|
||||
*/
|
||||
def parseSSDP(lanEvent) {
|
||||
//SSDP DISCOVERY EVENTS
|
||||
def USN = lanEvent.ssdpUSN.toString()
|
||||
def devices = getDevices()
|
||||
|
||||
if (!(devices."${USN}")) {
|
||||
//device does not exist
|
||||
log.trace "parseSDDP() Adding Device \"${USN}\" to known list"
|
||||
devices << ["${USN}":lanEvent]
|
||||
} else {
|
||||
// update the values
|
||||
def d = devices."${USN}"
|
||||
if (d.networkAddress != lanEvent.networkAddress || d.deviceAddress != lanEvent.deviceAddress) {
|
||||
log.trace "parseSSDP() Updating device location (ip & port)"
|
||||
d.networkAddress = lanEvent.networkAddress
|
||||
d.deviceAddress = lanEvent.deviceAddress
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a Map object which can be used with a preference page
|
||||
* to represent a list of devices detected and verified.
|
||||
*
|
||||
* @return Map with zero or more devices
|
||||
*/
|
||||
Map getSelectableDevice() {
|
||||
def devices = getVerifiedDevices()
|
||||
def map = [:]
|
||||
devices.each {
|
||||
def value = "${it.value.name}"
|
||||
def key = it.value.mac
|
||||
map["${key}"] = value
|
||||
}
|
||||
map
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the refresh loop, making sure to keep us up-to-date with changes
|
||||
*
|
||||
*/
|
||||
private refreshDevices() {
|
||||
discoverDevices()
|
||||
verifyDevices()
|
||||
runIn(300, "refreshDevices")
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a subscription for network events
|
||||
*
|
||||
* @param force If true, will unsubscribe and subscribe if necessary (Optional, default false)
|
||||
*/
|
||||
private subscribeNetworkEvents(force=false) {
|
||||
if (force) {
|
||||
unsubscribe()
|
||||
state.subscribe = false
|
||||
}
|
||||
|
||||
if(!state.subscribe) {
|
||||
subscribe(location, null, onLocation, [filterEvents:false])
|
||||
state.subscribe = true
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Issues a SSDP M-SEARCH over the LAN for a specific type (see getDeviceType())
|
||||
*/
|
||||
private discoverDevices() {
|
||||
log.trace "discoverDevice() Issuing SSDP request"
|
||||
sendHubCommand(new physicalgraph.device.HubAction("lan discovery ${getDeviceType()}", physicalgraph.device.Protocol.LAN))
|
||||
}
|
||||
|
||||
/**
|
||||
* Walks through the list of unverified devices and issues a verification
|
||||
* request for each of them (basically calling verifyDevice() per unverified)
|
||||
*/
|
||||
private verifyDevices() {
|
||||
def devices = getDevices().findAll { it?.value?.verified != true }
|
||||
|
||||
devices.each {
|
||||
verifyDevice(
|
||||
it?.value?.mac,
|
||||
convertHexToIP(it?.value?.networkAddress),
|
||||
convertHexToInt(it?.value?.deviceAddress),
|
||||
it?.value?.ssdpPath
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the device, in this case, we need to obtain the info block which
|
||||
* holds information such as the actual mac to use in certain scenarios.
|
||||
*
|
||||
* Without this mac (henceforth referred to as deviceID), we can't do multi-speaker
|
||||
* functions.
|
||||
*
|
||||
* @param deviceNetworkId The DNI of the device
|
||||
* @param ip The address of the device on the network (not the same as DNI)
|
||||
* @param port The port to use (0 will be treated as invalid and will use 80)
|
||||
* @param devicessdpPath The URL path (for example, /desc)
|
||||
*
|
||||
* @note Result is captured in locationHandler()
|
||||
*/
|
||||
private verifyDevice(String deviceNetworkId, String ip, int port, String devicessdpPath) {
|
||||
if(ip) {
|
||||
def address = ip + ":8090"
|
||||
sendHubCommand(new physicalgraph.device.HubAction([
|
||||
method: "GET",
|
||||
path: "/info",
|
||||
headers: [
|
||||
HOST: address,
|
||||
]]))
|
||||
} else {
|
||||
log.warn("verifyDevice() IP address was empty")
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of devices which have been verified
|
||||
*
|
||||
* @return array of verified devices
|
||||
*/
|
||||
def getVerifiedDevices() {
|
||||
getDevices().findAll{ it?.value?.verified == true }
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all discovered devices or an empty array if none
|
||||
*
|
||||
* @return array of devices
|
||||
*/
|
||||
def getDevices() {
|
||||
state.devices = state.devices ?: [:]
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a hexadecimal string to an integer
|
||||
*
|
||||
* @param hex The string with a hexadecimal value
|
||||
* @return An integer
|
||||
*/
|
||||
private Integer convertHexToInt(hex) {
|
||||
Integer.parseInt(hex,16)
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts an IP address represented as 0xAABBCCDD to AAA.BBB.CCC.DDD
|
||||
*
|
||||
* @param hex Address represented in hex
|
||||
* @return String containing normal IPv4 dot notation
|
||||
*/
|
||||
private String convertHexToIP(hex) {
|
||||
if (hex)
|
||||
[convertHexToInt(hex[0..1]),convertHexToInt(hex[2..3]),convertHexToInt(hex[4..5]),convertHexToInt(hex[6..7])].join(".")
|
||||
else
|
||||
hex
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if this setup can support SmarthThing Labs items
|
||||
*
|
||||
* @return true if it supports it.
|
||||
*/
|
||||
private Boolean canInstallLabs()
|
||||
{
|
||||
return hasAllHubsOver("000.011.00603")
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if the firmwares on all hubs owned by user match or exceed the
|
||||
* provided version number.
|
||||
*
|
||||
* @param desiredFirmware The version that must match or exceed
|
||||
* @return true if hub has same or newer
|
||||
*/
|
||||
private Boolean hasAllHubsOver(String desiredFirmware)
|
||||
{
|
||||
return realHubFirmwareVersions.every { fw -> fw >= desiredFirmware }
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a list of firmware version for every hub the user has
|
||||
*
|
||||
* @return List of firmwares
|
||||
*/
|
||||
private List getRealHubFirmwareVersions()
|
||||
{
|
||||
return location.hubs*.firmwareVersionString.findAll { it }
|
||||
}
|
||||
@@ -27,10 +27,9 @@ definition(
|
||||
|
||||
preferences {
|
||||
page(name: "selectButton")
|
||||
page(name: "configureButton1")
|
||||
page(name: "configureButton2")
|
||||
page(name: "configureButton3")
|
||||
page(name: "configureButton4")
|
||||
for (def i=1; i<=8; i++) {
|
||||
page(name: "configureButton$i")
|
||||
}
|
||||
|
||||
page(name: "timeIntervalInput", title: "Only during a certain time") {
|
||||
section {
|
||||
@@ -60,22 +59,45 @@ def selectButton() {
|
||||
}
|
||||
}
|
||||
|
||||
def createPage(pageNum) {
|
||||
if ((state.numButton == pageNum) || (pageNum == 8))
|
||||
state.installCondition = true
|
||||
dynamicPage(name: "configureButton$pageNum", title: "Set up button $pageNum here",
|
||||
nextPage: "configureButton${pageNum+1}", install: state.installCondition, uninstall: configured(), getButtonSections(pageNum))
|
||||
}
|
||||
|
||||
def configureButton1() {
|
||||
dynamicPage(name: "configureButton1", title: "Now let's decide how to use the first button",
|
||||
nextPage: "configureButton2", uninstall: configured(), getButtonSections(1))
|
||||
state.numButton = buttonDevice.currentState("numberOfButtons")?.longValue ?: 4
|
||||
log.debug "state variable numButton: ${state.numButton}"
|
||||
state.installCondition = false
|
||||
createPage(1)
|
||||
}
|
||||
def configureButton2() {
|
||||
dynamicPage(name: "configureButton2", title: "If you have a second button, set it up here",
|
||||
nextPage: "configureButton3", uninstall: configured(), getButtonSections(2))
|
||||
createPage(2)
|
||||
}
|
||||
|
||||
def configureButton3() {
|
||||
dynamicPage(name: "configureButton3", title: "If you have a third button, you can do even more here",
|
||||
nextPage: "configureButton4", uninstall: configured(), getButtonSections(3))
|
||||
createPage(3)
|
||||
}
|
||||
|
||||
def configureButton4() {
|
||||
dynamicPage(name: "configureButton4", title: "If you have a fourth button, you rule, and can set it up here",
|
||||
install: true, uninstall: true, getButtonSections(4))
|
||||
createPage(4)
|
||||
}
|
||||
|
||||
def configureButton5() {
|
||||
createPage(5)
|
||||
}
|
||||
|
||||
def configureButton6() {
|
||||
createPage(6)
|
||||
}
|
||||
|
||||
def configureButton7() {
|
||||
createPage(7)
|
||||
}
|
||||
|
||||
def configureButton8() {
|
||||
createPage(8)
|
||||
}
|
||||
|
||||
def getButtonSections(buttonNumber) {
|
||||
|
||||
@@ -202,7 +202,8 @@ def inputSelectionPage() {
|
||||
|
||||
section("options variations") {
|
||||
paragraph "tap these elements and look at the differences when selecting an option"
|
||||
input(type: "enum", name: "selectionSimple", title: "Simple options", description: "no separators in the selectable options", groupedOptions: addGroup(englishOptions + spanishOptions))
|
||||
input(type: "enum", name: "selectionSimple", title: "Simple options", description: "no separators in the selectable options", options: ["Thing 1", "Thing 2", "(Complicated) Thing 3"])
|
||||
input(type: "enum", name: "selectionSimpleGrouped", title: "Simple (Grouped) options", description: "no separators in the selectable options", groupedOptions: addGroup(englishOptions + spanishOptions))
|
||||
input(type: "enum", name: "selectionGrouped", title: "Grouped options", description: "separate groups of options with headers", groupedOptions: groupedOptions)
|
||||
}
|
||||
|
||||
@@ -214,15 +215,15 @@ def inputSelectionPage() {
|
||||
|
||||
section("segmented") {
|
||||
paragraph "segmented should only work if there are either 2 or 3 options to choose from"
|
||||
input(type: "enum", name: "selectionSegmented1", style: "segmented", title: "1 option", groupedOptions: addGroup(["One"]))
|
||||
input(type: "enum", name: "selectionSegmented4", style: "segmented", title: "4 options", groupedOptions: addGroup(["One", "Two", "Three", "Four"]))
|
||||
input(type: "enum", name: "selectionSegmented1", style: "segmented", title: "1 option", options: ["One"])
|
||||
input(type: "enum", name: "selectionSegmented4", style: "segmented", title: "4 options", options: ["One", "Two", "Three", "Four"])
|
||||
|
||||
paragraph "multiple and required will have no effect on segmented selection elements. There will always be exactly 1 option selected"
|
||||
input(type: "enum", name: "selectionSegmented2", style: "segmented", title: "2 options", options: ["One", "Two"])
|
||||
input(type: "enum", name: "selectionSegmented3", style: "segmented", title: "3 options", options: ["One", "Two", "Three"])
|
||||
|
||||
paragraph "specifying defaultValue still works with segmented selection elements"
|
||||
input(type: "enum", name: "selectionSegmentedWithDefault", title: "defaulted to 'two'", groupedOptions: addGroup(["One", "Two", "Three"]), defaultValue: "Two")
|
||||
input(type: "enum", name: "selectionSegmentedWithDefault", style: "segmented", title: "defaulted to 'two'", options: ["One", "Two", "Three"], defaultValue: "Two")
|
||||
}
|
||||
|
||||
section("required: true") {
|
||||
@@ -231,6 +232,8 @@ def inputSelectionPage() {
|
||||
|
||||
section("multiple: true") {
|
||||
input(type: "enum", name: "selectionMultiple", title: "This allows multiple selections", description: "It should look different when nothing is selected", groupedOptions: addGroup(["an option", "another option", "no way, one more?"]), multiple: true)
|
||||
input(type: "enum", name: "selectionMultipleDefault1", title: "This allows multiple selections with a single default", description: "It should look different when nothing is selected", groupedOptions: addGroup(["an option", "another option", "no way, one more?"]), multiple: true, defaultValue: "an option")
|
||||
input(type: "enum", name: "selectionMultipleDefault2", title: "This allows multiple selections with multiple defaults", description: "It should look different when nothing is selected", groupedOptions: addGroup(["an option", "another option", "no way, one more?"]), multiple: true, defaultValue: ["an option", "another option"])
|
||||
}
|
||||
|
||||
section("with image") {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=يوفر لك إمكانية توصيل مصابيح Philips Hue بـ SmartThings والتحكم بها من منطقة Things أو لوحة المعلومات في تطبيق SmartThings للهواتف المحمولة. يُرجى تحديث Hue Bridge أولاً، خارج تطبيق SmartThings، باستخدام تطبيق Philips Hue.
|
||||
'''Discovery Started!'''=بدأ الاكتشاف!
|
||||
'''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.'''=يُرجى الانتظار ريثما نكتشف Hue Bridge الخاص بك. تجدر الإشارة إلى أنه عليك أوّلاً تكوين Hue Bridge والمصابيح باستخدام تطبيق Philips Hue. قد يستغرق الاكتشاف خمس دقائق أو أكثر، لذا اجلس واسترخِ! اختر جهازك أدناه بمجرد اكتشافه.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=تحديد Hue Bridge (تم العثور على {{numFound}})
|
||||
'''Bridge Discovery Failed!'''=فشل اكتشاف Bridge
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=فشل اكتشاف أي Hue Bridges. يُرجى التأكد من اتصال Hue Bridge بالشبكة نفسها التي يتصل بها موزع SmartThings الخاص بك، ومن أنه متصل بمصدر طاقة أيضاً.
|
||||
'''Linking with your Hue'''=الارتباط بجهاز Hue الخاص بك
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to relink.'''=اسم مستخدم Hue الحالي غير صالح. يُرجى الضغط على الزر الموجود على Hue Bridge الخاص بك لإعادة الارتباط.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=اضغط على الزر الموجود على Hue Bridge الخاص بك لإعداد رابط.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=لم تحدد Hue Bridge، يُرجى الضغط على 'تم' وتحديد واحد قبل النقر فوق التالي.
|
||||
'''Success!'''=نجحت العملية!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=نجح الارتباط بالموزع الخاص بك! يُرجى النقر فوق ”التالي“!
|
||||
'''Find bridges'''=بحث عن أجهزة bridges
|
||||
'''Light Discovery Failed!'''=فشل اكتشاف المصباح!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=فشل اكتشاف أي مصابيح، يُرجى المحاولة مرة أخرى لاحقاً. انقر فوق تم للخروج.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=حدد مصابيح Hue التي تريد إضافتها (تم العثور على {{numFound}})
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=مصابيح Hue المضافة مُسبقاً (تمت إضافة {{existingLightsSize}})
|
||||
'''Light Discovery Started!'''=بدأ اكتشاف المصباح!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=يُرجى الانتظار ريثما نكتشف مصابيح Hue الخاصة بك. قد يستغرق الاكتشاف خمس دقائق أو أكثر، لذا اجلس واسترخِ! اختر جهازك أدناه بمجرد اكتشافه.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Позволява да свържете Philips Hue lights (лампи) със SmartThings и да ги управлявате от областта Things (Уреди) или Dashboard (Табло) в приложението SmartThings Mobile. Първо актуализирайте своя Hue Bridge (Мост) извън приложението SmartThings, като използвате приложението Philips Hue.
|
||||
'''Discovery Started!'''=Откриването е стартирано!
|
||||
'''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.'''=Изчакайте, докато намерим вашия Hue Bridge (Мост). Обърнете внимание, че първо трябва да конфигурирате своя Hue Bridge (Мост) и Lights (Лампи) с помощта на приложението Philips Hue. Намирането може да отнеме пет минути или повече, така че седнете и се отпуснете! Изберете устройството си по-долу, след като бъде открито.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Избор на Hue Bridge (Мост) ({{numFound}} са открити)
|
||||
'''Bridge Discovery Failed!'''=Откриването на Bridge (Мост) е неуспешно!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Неуспешно откриване на Hue Bridges (Мост). Уверете се, че Hue Bridge (Мост) е свързан към същата мрежа като концентратора на SmartThings, както и че има захранване.
|
||||
'''Linking with your Hue'''=Свързване с Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Текущото потребителско име за Hue е невалидно. Натиснете бутона на вашия Hue Bridge (Мост) за повторно свързване.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Натиснете бутона на вашия Hue Bridge (Мост), за да установите връзка.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Не сте избрали Hue Bridge (Мост), натиснете „Done“ (Готово) и изберете един, преди да щракнете върху Next (Напред).
|
||||
'''Success!'''=Успех!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Свързването с вашия концентратор е успешно. Щракнете върху „Next“ (Напред)!
|
||||
'''Find bridges'''=Откриване на мостове
|
||||
'''Light Discovery Failed!'''=Откриването на лампата е неуспешно!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Неуспешно откриване на лампи, опитайте отново по-късно. Щракнете върху Done (Готово) за изход.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Изберете Hue Lights (Лампи) за добавяне ({{numFound}} са открити)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=По-рано добавени Hue Lights (Лампи) ({{existingLightsSize}} са добавени)
|
||||
'''Light Discovery Started!'''=Откриването на лампи е стартирано!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Изчакайте, докато намерим вашите Hue Lights (Лампи). Намирането може да отнеме пет минути или повече, така че седнете и се отпуснете! Изберете устройството си по-долу, след като бъде открито.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Umožňuje připojit světla Philips Hue lights (světla) pomocí SmartThings a ovládat je z oblasti Things (Věci) nebo z Dashboard (Řídicí panel) v mobilní aplikaci SmartThings. Nejprve aktualizujte Hue Bridge (můstek) mimo aplikaci SmartThings, pomocí aplikace Philips Hue.
|
||||
'''Discovery Started!'''=Zjišťování byla zahájeno!
|
||||
'''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.'''=Počkejte na rozpoznání Hue Bridge (můstek). Uvědomte si, že musíte nejprve nakonfigurovat Hue Bridge (můstek) a Lights (světla) pomocí aplikace Philips Hue. Rozpoznání může trvat pět minut i déle, proto se klidně posaďte a počkejte! Po rozpoznání vyberte níže dané zařízení.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Vyberte Hue Bridge (můstek) (nalezeno {{numFound}})
|
||||
'''Bridge Discovery Failed!'''=Zjišťování Bridge (můstek) se nezdařilo!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Nepodařilo se najít žádný Hue Bridge (můstek). Zkontrolujte, zda je Hue Bridge (můstek) připojený ke stejné síti jako SmartThings Hub a zda je napájený.
|
||||
'''Linking with your Hue'''=Propojení s Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Aktuální uživatelské jméno Hue je neplatné. Stiskněte tlačítko na Hue Bridge (můstek) a obnovte propojení.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Stiskněte tlačítko na Hue Bridge (můstek) a nastavte propojení.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Nevybrali jste Hue Bridge (můstek); stiskněte tlačítko „Done“ (Hotovo) a jeden vyberte, než klepnete na tlačítko Next (Další).
|
||||
'''Success!'''=Úspěch!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Propojení s hub bylo úspěšně navázáno! Klepněte na tlačítko „Next“ (Další)!
|
||||
'''Find bridges'''=Najít bridge
|
||||
'''Light Discovery Failed!'''=Zjišťování světel se nezdařilo!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Nepodařilo najít žádná světla, opakujte akci později. Ukončete akci klepnutím na tlačítko Done (Hotovo).
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Vyberte Hue lights (světla), která chcete přidat (nalezeno {{numFound}})
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Dříve přidaná Hue Lights (světla) (přidáno {{existingLightsSize}})
|
||||
'''Light Discovery Started!'''=Zjišťování světel bylo zahájeno!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Počkejte na rozpoznání Hue Lights (světla). Rozpoznání může trvat pět minut i déle, proto se klidně posaďte a počkejte! Po rozpoznání vyberte níže dané zařízení.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Giver dig mulighed for at forbinde dine Philips Hue Lights (Philips Hue-lamper) med SmartThings og styre dem fra dit Things-område eller dit Dashboard i SmartThings-mobilappen. Opdater din Hue Bridge (Hue-bro) først (uden for SmartThings-appen) ved hjælp af Philips Hue-appen.
|
||||
'''Discovery Started!'''=Opdagelse er startet!
|
||||
'''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.'''=Vent, mens vi finder din Hue Bridge (Hue-bro). Bemærk, at du først skal konfigurere din Hue Bridge og Lights (Lamper) med Philips Hue-applikationen. Det kan tage fem minutter eller mere at finde enheden, så bare læn dig tilbage, og slap af! Vælg din enhed herunder, når den er fundet.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Vælg Hue Bridge (Hue-bro) ({{numFound}} fundet)
|
||||
'''Bridge Discovery Failed!'''=Opdagelse af Bridge (bro) mislykkedes!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Kunne ikke finde nogen Hue Bridges (Hue-broer). Bekræft, at Hue Bridge (Hue-broen) er tilsluttet det samme netværk som din SmartThings-hub, og at der er strøm på den.
|
||||
'''Linking with your Hue'''=Sammenkædning med din Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Det aktuelle Hue-brugernavn er ugyldigt. Tryk på knappen på din Hue Bridge (Hue-bro) for at tilknytte igen.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Tryk på knappen på din Hue Bridge (Hue-bro) for at oprette et link.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Du har ikke valgt en Hue Bridge (Hue-bro). Tryk på “Done” (Udført), og vælg én, inden du klikker på Next (Næste).
|
||||
'''Success!'''=Succes!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Sammenkædningen med din hub blev gennemført! Klik på “Next” (Næste)!
|
||||
'''Find bridges'''=Find bridges (broer)
|
||||
'''Light Discovery Failed!'''=Opdagelse af lights (lamper) mislykkedes!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Kunne ikke finde nogen lights (lamper). Prøv igen senere. Klik på Done (Udført) for at afslutte.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Vælg Hue Lights (Hue-lamper), der skal tilføjes ({{numFound}} fundet)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Tidligere tilføjede Hue Lights (Hue-lamper) ({{existingLightsSize}} tilføjet)
|
||||
'''Light Discovery Started!'''=Opdagelse af lights (lamper) er startet!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Vent, mens vi finder dine Hue Lights (Hue-lamper). Det kan tage fem minutter eller mere at finde enheden, så bare læn dig tilbage, og slap af! Vælg din enhed herunder, når den er fundet.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Sie können Ihre Phillips Hue Lights (Lichter) mit SmartThings verbinden und aus Ihrem Things-Bereich oder dem Dashboard in der SmartThings-Mobile-App aus steuern. Bitte aktualisieren Sie zunächst Ihre Hue Bridge (Brücke) außerhalb der SmartThings-App mit der Phillips-Hue-App.
|
||||
'''Discovery Started!'''=Erkennung gestartet!
|
||||
'''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.'''=Bitte warten Sie, bis Ihre Hue Bridge (Brücke) erkannt wurde. Beachten Sie bitte, dass Sie Ihre Hue Bridge (Brücke) und Lights (Lichter) zunächst mit der Philips Hue-Anwendung konfigurieren müssen. Die Erkennung kann fünf Minuten oder länger dauern. Lehnen Sie sich zurück und entspannen Sie sich! Wählen Sie nach der Erkennung unten ein Gerät aus.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Hue Bridge (Brücke) auswählen ({{numFound}} gefunden)
|
||||
'''Bridge Discovery Failed!'''=Bridge (Brücke)-Erkennung fehlgeschlagen!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Es konnten keine Hue Bridges (Brücken) gefunden werden. Bitte bestätigen Sie, dass die Hue Bridge (Brücke) am gleichen Netzwerk wie Ihr SmartThings Hub angeschlossen ist und Strom erhält.
|
||||
'''Linking with your Hue'''=Kopplung mit Ihrem Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Der aktuelle Hue-Benutzername ist ungültig. Bitte drücken Sie für eine erneute Kopplung die Taste auf Ihrer Hue Bridge (Brücke).
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Drücken Sie die Taste auf Ihrer Hue-Bridge (Brücke), um eine Kopplung einzurichten.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Sie haben keine Hue Bridge (Brücke) ausgewählt. Bitte drücken Sie ‚Done‘ (OK) und wählen Sie eine aus, bevor Sie auf Next (Weiter) drücken.
|
||||
'''Success!'''=Erfolgreich verbunden!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Die Kopplung mit Ihrem Hub war erfolgreich! Bitte klicken Sie auf ‚Next‘ (Weiter)!
|
||||
'''Find bridges'''=Bridges (Brücken) suchen
|
||||
'''Light Discovery Failed!'''=Lichterkennung fehlgeschlagen!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Es wurden keine Lichter erkannt. Bitte versuchen Sie es später erneut. Klicken Sie zum Beenden auf „Done“ (OK).
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Wählen Sie die hinzuzufügenden Hue Lights (Lichter) aus ({{numFound}} gefunden)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Zuvor hinzugefügte Hue Lights (Lichter) ({{existingLightsSize}} hinzugefügt)
|
||||
'''Light Discovery Started!'''=Lichterkennung gestartet!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Bitte warten Sie, bis Ihre Hue Lights (Lichter) erkannt wurden. Die Erkennung kann fünf Minuten oder länger dauern. Lehnen Sie sich zurück und entspannen Sie sich! Wählen Sie nach der Erkennung unten ein Gerät aus.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Sie können Ihre Phillips Hue Lights (Lichter) mit SmartThings verbinden und aus Ihrem Things-Bereich oder dem Dashboard in der SmartThings-Mobile-App aus steuern. Bitte aktualisieren Sie zunächst Ihre Hue Bridge (Brücke) außerhalb der SmartThings-App mit der Phillips-Hue-App.
|
||||
'''Discovery Started!'''=Erkennung gestartet!
|
||||
'''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.'''=Bitte warten Sie, bis Ihre Hue Bridge (Brücke) erkannt wurde. Beachten Sie bitte, dass Sie Ihre Hue Bridge (Brücke) und Lights (Lichter) zunächst mit der Philips Hue-Anwendung konfigurieren müssen. Die Erkennung kann fünf Minuten oder länger dauern. Lehnen Sie sich zurück und entspannen Sie sich! Wählen Sie nach der Erkennung unten ein Gerät aus.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Hue Bridge (Brücke) auswählen ({{numFound}} gefunden)
|
||||
'''Bridge Discovery Failed!'''=Bridge (Brücke)-Erkennung fehlgeschlagen!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Es konnten keine Hue Bridges (Brücken) gefunden werden. Bitte bestätigen Sie, dass die Hue Bridge (Brücke) am gleichen Netzwerk wie Ihr SmartThings Hub angeschlossen ist und Strom erhält.
|
||||
'''Linking with your Hue'''=Kopplung mit Ihrem Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Der aktuelle Hue-Benutzername ist ungültig. Bitte drücken Sie für eine erneute Kopplung die Taste auf Ihrer Hue Bridge (Brücke).
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Drücken Sie die Taste auf Ihrer Hue-Bridge (Brücke), um eine Kopplung einzurichten.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Sie haben keine Hue Bridge (Brücke) ausgewählt. Bitte drücken Sie ‚Done‘ (OK) und wählen Sie eine aus, bevor Sie auf Next (Weiter) drücken.
|
||||
'''Success!'''=Erfolgreich verbunden!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Die Kopplung mit Ihrem Hub war erfolgreich! Bitte klicken Sie auf ‚Next‘ (Weiter)!
|
||||
'''Find bridges'''=Bridges (Brücken) suchen
|
||||
'''Light Discovery Failed!'''=Lichterkennung fehlgeschlagen!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Es wurden keine Lichter erkannt. Bitte versuchen Sie es später erneut. Klicken Sie zum Beenden auf „Done“ (OK).
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Wählen Sie die hinzuzufügenden Hue Lights (Lichter) aus ({{numFound}} gefunden)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Zuvor hinzugefügte Hue Lights (Lichter) ({{existingLightsSize}} hinzugefügt)
|
||||
'''Light Discovery Started!'''=Lichterkennung gestartet!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Bitte warten Sie, bis Ihre Hue Lights (Lichter) erkannt wurden. Die Erkennung kann fünf Minuten oder länger dauern. Lehnen Sie sich zurück und entspannen Sie sich! Wählen Sie nach der Erkennung unten ein Gerät aus.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Sie können Ihre Phillips Hue Lights (Lichter) mit SmartThings verbinden und aus Ihrem Things-Bereich oder dem Dashboard in der SmartThings-Mobile-App aus steuern. Bitte aktualisieren Sie zunächst Ihre Hue Bridge (Brücke) außerhalb der SmartThings-App mit der Phillips-Hue-App.
|
||||
'''Discovery Started!'''=Erkennung gestartet!
|
||||
'''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.'''=Bitte warten Sie, bis Ihre Hue Bridge (Brücke) erkannt wurde. Beachten Sie bitte, dass Sie Ihre Hue Bridge (Brücke) und Lights (Lichter) zunächst mit der Philips Hue-Anwendung konfigurieren müssen. Die Erkennung kann fünf Minuten oder länger dauern. Lehnen Sie sich zurück und entspannen Sie sich! Wählen Sie nach der Erkennung unten ein Gerät aus.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Hue Bridge (Brücke) auswählen ({{numFound}} gefunden)
|
||||
'''Bridge Discovery Failed!'''=Bridge (Brücke)-Erkennung fehlgeschlagen!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Es konnten keine Hue Bridges (Brücken) gefunden werden. Bitte bestätigen Sie, dass die Hue Bridge (Brücke) am gleichen Netzwerk wie Ihr SmartThings Hub angeschlossen ist und Strom erhält.
|
||||
'''Linking with your Hue'''=Kopplung mit Ihrem Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Der aktuelle Hue-Benutzername ist ungültig. Bitte drücken Sie für eine erneute Kopplung die Taste auf Ihrer Hue Bridge (Brücke).
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Drücken Sie die Taste auf Ihrer Hue-Bridge (Brücke), um eine Kopplung einzurichten.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Sie haben keine Hue Bridge (Brücke) ausgewählt. Bitte drücken Sie ‚Done‘ (OK) und wählen Sie eine aus, bevor Sie auf Next (Weiter) drücken.
|
||||
'''Success!'''=Erfolgreich verbunden!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Die Kopplung mit Ihrem Hub war erfolgreich! Bitte klicken Sie auf ‚Next‘ (Weiter)!
|
||||
'''Find bridges'''=Bridges (Brücken) suchen
|
||||
'''Light Discovery Failed!'''=Lichterkennung fehlgeschlagen!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Es wurden keine Lichter erkannt. Bitte versuchen Sie es später erneut. Klicken Sie zum Beenden auf „Done“ (OK).
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Wählen Sie die hinzuzufügenden Hue Lights (Lichter) aus ({{numFound}} gefunden)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Zuvor hinzugefügte Hue Lights (Lichter) ({{existingLightsSize}} hinzugefügt)
|
||||
'''Light Discovery Started!'''=Lichterkennung gestartet!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Bitte warten Sie, bis Ihre Hue Lights (Lichter) erkannt wurden. Die Erkennung kann fünf Minuten oder länger dauern. Lehnen Sie sich zurück und entspannen Sie sich! Wählen Sie nach der Erkennung unten ein Gerät aus.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Σας επιτρέπει να συνδέσετε τους λαμπτήρες Philips Hue με το SmartThings και να τους ελέγχετε από την περιοχή Things στο Dashboard της εφαρμογής SmartThings για κινητές συσκευές. Ενημερώστε πρώτα το Hue Bridge εκτός της εφαρμογής SmartThings, χρησιμοποιώντας την εφαρμογή Philips Hue.
|
||||
'''Discovery Started!'''=Η ανακάλυψη ξεκίνησε!
|
||||
'''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.'''=Περιμένετε μέχρι να ολοκληρωθεί η ανακάλυψη του Hue Bridge σας. Έχετε υπόψη ότι θα πρέπει πρώτα να διαμορφώσετε το Hue Bridge και τους λαμπτήρες, χρησιμοποιώντας την εφαρμογή Philips Hue. Η ανακάλυψη μπορεί να διαρκέσει πέντε λεπτά ή περισσότερο, επομένως, χαλαρώστε και περιμένετε! Επιλέξτε τη συσκευή σας παρακάτω μόλις ανακαλυφθεί.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Επιλογή Hue Bridge (βρέθηκαν {{numFound}})
|
||||
'''Bridge Discovery Failed!'''=Η ανακάλυψη Bridge απέτυχε!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Δεν ανακαλύφθηκε κανένα Hue Bridge. Βεβαιωθείτε ότι το Hue Bridge είναι συνδεδεμένο στο ίδιο δίκτυο με το SmartThings Hub και ότι τροφοδοτείται με ρεύμα.
|
||||
'''Linking with your Hue'''=Γίνεται σύνδεση με το Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Το τρέχον όνομα χρήστη Hue δεν είναι έγκυρο. Πατήστε το κουμπί στο Hue Bridge για επανασύνδεση.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Πατήστε το κουμπί στο Hue Bridge σας για να ρυθμίσετε μια σύνδεση.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Δεν έχετε επιλέξτε ένα Hue Bridge. Πατήστε «Done» (Τέλος) και επιλέξτε ένα πριν κάνετε κλικ στην επιλογή Next (Επόμενο).
|
||||
'''Success!'''=Επιτυχία!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Η σύνδεση με το διανομέα σας ολοκληρώθηκε με επιτυχία. Κάντε κλικ στην επιλογή 'Next' (Επόμενο)!
|
||||
'''Find bridges'''=Εύρεση bridge
|
||||
'''Light Discovery Failed!'''=Η ανακάλυψη λαμπτήρων απέτυχε!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Η ανακάλυψη λαμπτήρων απέτυχε, δοκιμάστε ξανά αργότερα. Κάντε κλικ στην επιλογή "Done" (Τέλος) για έξοδο.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Επιλογή λαμπτήρων Hue για προσθήκη (βρέθηκαν {{numFound}})
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Λαμπτήρες Hue που προστέθηκαν παλαιότερα (προστέθηκαν {{existingLightsSize}})
|
||||
'''Light Discovery Started!'''=Η ανακάλυψη λαμπτήρων ξεκίνησε!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Περιμένετε μέχρι να ολοκληρωθεί η ανακάλυψη των λαμπτήρων Hue σας. Η ανακάλυψη μπορεί να διαρκέσει πέντε λεπτά ή περισσότερο, επομένως, χαλαρώστε και περιμένετε! Επιλέξτε τη συσκευή σας παρακάτω μόλις ανακαλυφθεί.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Enables you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, from outside the SmartThings app, using the Philips Hue app.
|
||||
'''Discovery Started!'''=Discovery Started!
|
||||
'''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.'''=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 longer, so sit back and relax! Select your device below once it's been discovered.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Select Hue Bridge ({{numFound}} found)
|
||||
'''Bridge Discovery Failed!'''=Bridge Discovery Failed
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=No Hue Bridges discovered. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.
|
||||
'''Linking with your Hue'''=Linking with your Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Press the button on your Hue Bridge to set up a link.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=You haven't selected a Hue Bridge. Please press 'Done' and select one before clicking 'Next'.
|
||||
'''Success!'''=Success!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Linking to your hub was successful! Please click 'Next'!
|
||||
'''Find bridges'''=Find Bridges
|
||||
'''Light Discovery Failed!'''=Light Discovery Failed!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=No lights discovered. Please try again later. Click Done to exit.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Select Hue Lights to add ({{numFound}} found)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Previously added Hue Lights ({{existingLightsSize}} added)
|
||||
'''Light Discovery Started!'''=Light Discovery Started!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Please wait while we discover your Hue Lights. Discovery can take five minutes or longer, so sit back and relax! Select your light below once it's been discovered.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Enables you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, from outside the SmartThings app, using the Philips Hue app.
|
||||
'''Discovery Started!'''=Discovery Started!
|
||||
'''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.'''=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 longer, so sit back and relax! Select your device below once it's been discovered.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Select Hue Bridge ({{numFound}} found)
|
||||
'''Bridge Discovery Failed!'''=Bridge Discovery Failed
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=No Hue Bridges discovered. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.
|
||||
'''Linking with your Hue'''=Linking with your Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Press the button on your Hue Bridge to set up a link.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=You haven't selected a Hue Bridge. Please press 'Done' and select one before clicking 'Next'.
|
||||
'''Success!'''=Success!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Linking to your hub was successful! Please click 'Next'!
|
||||
'''Find bridges'''=Find Bridges
|
||||
'''Light Discovery Failed!'''=Light Discovery Failed!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=No lights discovered. Please try again later. Click Done to exit.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Select Hue Lights to add ({{numFound}} found)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Previously added Hue Lights ({{existingLightsSize}} added)
|
||||
'''Light Discovery Started!'''=Light Discovery Started!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Please wait while we discover your Hue Lights. Discovery can take five minutes or longer, so sit back and relax! Select your light below once it's been discovered.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Enables you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, from outside the SmartThings app, using the Philips Hue app.
|
||||
'''Discovery Started!'''=Discovery Started!
|
||||
'''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.'''=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 longer, so sit back and relax! Select your device below once it's been discovered.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Select Hue Bridge ({{numFound}} found)
|
||||
'''Bridge Discovery Failed!'''=Bridge Discovery Failed
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=No Hue Bridges discovered. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.
|
||||
'''Linking with your Hue'''=Linking with your Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Press the button on your Hue Bridge to set up a link.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=You haven't selected a Hue Bridge. Please press 'Done' and select one before clicking 'Next'.
|
||||
'''Success!'''=Success!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Linking to your hub was successful! Please click 'Next'!
|
||||
'''Find bridges'''=Find Bridges
|
||||
'''Light Discovery Failed!'''=Light Discovery Failed!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=No lights discovered. Please try again later. Click Done to exit.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Select Hue Lights to add ({{numFound}} found)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Previously added Hue Lights ({{existingLightsSize}} added)
|
||||
'''Light Discovery Started!'''=Light Discovery Started!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Please wait while we discover your Hue Lights. Discovery can take five minutes or longer, so sit back and relax! Select your light below once it's been discovered.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Enables you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, from outside the SmartThings app, using the Philips Hue app.
|
||||
'''Discovery Started!'''=Discovery Started!
|
||||
'''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.'''=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 longer, so sit back and relax! Select your device below once it's been discovered.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Select Hue Bridge ({{numFound}} found)
|
||||
'''Bridge Discovery Failed!'''=Bridge Discovery Failed
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=No Hue Bridges discovered. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.
|
||||
'''Linking with your Hue'''=Linking with your Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Press the button on your Hue Bridge to set up a link.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=You haven't selected a Hue Bridge. Please press 'Done' and select one before clicking 'Next'.
|
||||
'''Success!'''=Success!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Linking to your hub was successful! Please click 'Next'!
|
||||
'''Find bridges'''=Find Bridges
|
||||
'''Light Discovery Failed!'''=Light Discovery Failed!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=No lights discovered. Please try again later. Click Done to exit.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Select Hue Lights to add ({{numFound}} found)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Previously added Hue Lights ({{existingLightsSize}} added)
|
||||
'''Light Discovery Started!'''=Light Discovery Started!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Please wait while we discover your Hue Lights. Discovery can take five minutes or longer, so sit back and relax! Select your light below once it's been discovered.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Enables you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, from outside the SmartThings app, using the Philips Hue app.
|
||||
'''Discovery Started!'''=Discovery Started!
|
||||
'''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.'''=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 longer, so sit back and relax! Select your device below once it's been discovered.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Select Hue Bridge ({{numFound}} found)
|
||||
'''Bridge Discovery Failed!'''=Bridge Discovery Failed
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=No Hue Bridges discovered. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.
|
||||
'''Linking with your Hue'''=Linking with your Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Press the button on your Hue Bridge to set up a link.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=You haven't selected a Hue Bridge. Please press 'Done' and select one before clicking 'Next'.
|
||||
'''Success!'''=Success!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Linking to your hub was successful! Please click 'Next'!
|
||||
'''Find bridges'''=Find Bridges
|
||||
'''Light Discovery Failed!'''=Light Discovery Failed!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=No lights discovered. Please try again later. Click Done to exit.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Select Hue Lights to add ({{numFound}} found)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Previously added Hue Lights ({{existingLightsSize}} added)
|
||||
'''Light Discovery Started!'''=Light Discovery Started!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Please wait while we discover your Hue Lights. Discovery can take five minutes or longer, so sit back and relax! Select your light below once it's been discovered.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Enables you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, from outside the SmartThings app, using the Philips Hue app.
|
||||
'''Discovery Started!'''=Discovery Started!
|
||||
'''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.'''=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 longer, so sit back and relax! Select your device below once it's been discovered.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Select Hue Bridge ({{numFound}} found)
|
||||
'''Bridge Discovery Failed!'''=Bridge Discovery Failed
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=No Hue Bridges discovered. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.
|
||||
'''Linking with your Hue'''=Linking with your Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Press the button on your Hue Bridge to set up a link.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=You haven't selected a Hue Bridge. Please press 'Done' and select one before clicking 'Next'.
|
||||
'''Success!'''=Success!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Linking to your hub was successful! Please click 'Next'!
|
||||
'''Find bridges'''=Find Bridges
|
||||
'''Light Discovery Failed!'''=Light Discovery Failed!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=No lights discovered. Please try again later. Click Done to exit.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Select Hue Lights to add ({{numFound}} found)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Previously added Hue Lights ({{existingLightsSize}} added)
|
||||
'''Light Discovery Started!'''=Light Discovery Started!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Please wait while we discover your Hue Lights. Discovery can take five minutes or longer, so sit back and relax! Select your light below once it's been discovered.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Enables you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, from outside the SmartThings app, using the Philips Hue app.
|
||||
'''Discovery Started!'''=Discovery Started!
|
||||
'''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.'''=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 longer, so sit back and relax! Select your device below once it's been discovered.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Select Hue Bridge ({{numFound}} found)
|
||||
'''Bridge Discovery Failed!'''=Bridge Discovery Failed
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=No Hue Bridges discovered. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.
|
||||
'''Linking with your Hue'''=Linking with your Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Press the button on your Hue Bridge to set up a link.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=You haven't selected a Hue Bridge. Please press 'Done' and select one before clicking 'Next'.
|
||||
'''Success!'''=Success!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Linking to your hub was successful! Please click 'Next'!
|
||||
'''Find bridges'''=Find Bridges
|
||||
'''Light Discovery Failed!'''=Light Discovery Failed!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=No lights discovered. Please try again later. Click Done to exit.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Select Hue Lights to add ({{numFound}} found)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Previously added Hue Lights ({{existingLightsSize}} added)
|
||||
'''Light Discovery Started!'''=Light Discovery Started!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Please wait while we discover your Hue Lights. Discovery can take five minutes or longer, so sit back and relax! Select your light below once it's been discovered.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Permite conectar sus Philips Hue Lights (Luces) con SmartThings y controlarlas desde Things area (Área de cosas) o Dashboard (Panel) en la aplicación móvil SmartThings. Actualice primero el Hue Bridge (Puente), fuera de la aplicación SmartThings, usando la aplicación Philips Hue.
|
||||
'''Discovery Started!'''=¡Se ha iniciado la detección!
|
||||
'''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.'''=Espere mientras detectamos su Hue Bridge (Puente). Tenga en cuenta que primero tiene que configurar su Hue Bridge (Puente) y Hue Lights (Luces) mediante la aplicación Philips Hue. La detección puede tardar cinco minutos o más. Así que tómeselo con tranquilidad. Seleccione su dispositivo cuando se haya detectado.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Seleccionar Hue Bridge (Puente) ({{numFound}} encontrados)
|
||||
'''Bridge Discovery Failed!'''=¡Error al detectar Bridge (Puente)!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Error al detectar Hue Bridges (Puentes). Confirme que el Hue Bridge (Puente) está conectado a la misma red que su Hub SmartThings y que está enchufado a una toma eléctrica.
|
||||
'''Linking with your Hue'''=Vincular con su Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=El nombre de usuario del Hue actual no es válido. Pulse el botón en su Hue Bridge (Puente) para volver a vincular.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Pulse el botón en su Hue Bridge (Puente) para configurar el vínculo.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=No ha seleccionado ningún Hue Bridge (Puente). Pulse “Done” (Hecho) y seleccione uno antes de hacer clic en Next (Siguiente).
|
||||
'''Success!'''=Operación realizada correctamente.
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Se ha vinculado su Hub correctamente. Haga clic en Next (Siguiente).
|
||||
'''Find bridges'''=Encontrar Bridges (Puentes)
|
||||
'''Light Discovery Failed!'''=Error al detectar luces.
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Error al detectar luces. Inténtelo de nuevo más tarde. Haga clic en Done (Hecho) para salir.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Seleccione Hue Lights (Luces) para añadir ({{numFound}} encontradas)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Hue Lights (Luces) añadidas anteriormente ({{existingLightsSize}} añadidas)
|
||||
'''Light Discovery Started!'''=Se ha iniciado la detección de luces.
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Espere mientras detectamos sus Hue Lights (Luces). La detección puede tardar cinco minutos o más. Así que tómeselo con tranquilidad. Seleccione su dispositivo cuando se haya detectado.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Le permite conectar sus Philips Hue lights (luces Philips Hue) con SmartThings y controlarlas desde el área de Objetos o el Panel de la aplicación SmartThings Mobile. Primero actualice su Hue Bridge (puente Hue) desde fuera de la aplicación de SmartThings, mediante la aplicación de Philips Hue.
|
||||
'''Discovery Started!'''=Descubrimiento iniciado
|
||||
'''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.'''=Espere mientras descubrimos su Hue Bridge (puente Hue). Tenga en cuenta que primero debe configurar Hue Bridge y Hue Lights (luces Hue) mediante la aplicación de Hue. El descubrimiento puede tomar cinco minutos o más, por lo que le sugerimos que se ponga cómodo y se relaje. Una vez descubierto, seleccione su dispositivo.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Seleccione Hue Bridge (Puente Hue) (se encontraron {{numFound}})
|
||||
'''Bridge Discovery Failed!'''=Error al descubrir Bridges (puentes).
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=No se descubrieron Hue Bridges (Puentes Hue). Confirme que el Hue Bridge (Puente Hue) está conectado a la misma red que su unidad central de SmartThings, y que está conectado a la red eléctrica.
|
||||
'''Linking with your Hue'''=Vinculando con su Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=El nombre de usuario Hue actual no es válido. Presione el botón de su Hue Bridge (Puente Hue) para volver a vincular.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Presione el botón de su Hue Bridge (Puente Hue) para configurar un vínculo.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=No seleccionó un Hue Bridge (puente Hue). Presione “Done” (Realizado) y seleccione uno antes de hacer clic en Next (Siguiente).
|
||||
'''Success!'''=¡Logrado!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=El vínculo con su unidad central se realizó correctamente. Haga clic en 'Next' (Siguiente).
|
||||
'''Find bridges'''=Encontrar puentes
|
||||
'''Light Discovery Failed!'''=Error al descubrir luces
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=No se descubrió ninguna luz. Vuelva a intentarlo de nuevo más tarde. Haga clic en Done (Realizado) para salir.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Seleccione Hue Lights (Luces Hue) que desea agregar (se encontraron {{numFound}})
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Hue Lights (Luces Hue) agregadas anteriormente (se agregaron {{existingLightsSize}})
|
||||
'''Light Discovery Started!'''=Descubrimiento de luces iniciado
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Espere mientras descubrimos sus Hue Lights (Luces Hue). El descubrimiento puede tomar cinco minutos o más, por lo que le sugerimos que se ponga cómodo y se relaje. Una vez descubierto, seleccione su dispositivo.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Võimaldab teil ühendada teie Philips Hue tuled SmartThingsiga ja juhtida neid oma Thingsi piirkonnast või SmartThingsi mobiilirakenduse esipaneelilt. Värskendage esmalt oma Hue Bridge’i väljaspool SmartThingsi rakendust, kasutades Philips Hue rakendust.
|
||||
'''Discovery Started!'''=Tuvastamine algas!
|
||||
'''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.'''=Oodake, kuni me tuvastame teie Hue Bridge’i. Pange tähele, et peate esmalt oma Hue Bridge and Lights’i süsteemi rakenduse Philips Hue abil konfigureerima. Tuvastamisele võib kuluda üle viie minuti, seega oodake rahulikult! Pärast tuvastamist valige all oma seade.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Valige Hue Bridge ({{numFound}} leitud)
|
||||
'''Bridge Discovery Failed!'''=Bridge’i tuvastamine nurjus!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Ei leitud ühtki Hue Bridge’i. Kontrollige, kas Hue Bridge on ühendatud teie SmartThingsi jaoturiga samasse võrku ja et sellel on toide olemas.
|
||||
'''Linking with your Hue'''=Huega ühendamine
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Praegune Hue kasutajanimi on vale. Vajutage nuppu oma Hue Bridge’il, et uuesti ühendada.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Vajutage nuppu oma Hue Bridge’il, et ühendust seadistada.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Te pole valinud Hue Bridge’i, vajutage nuppu „Valmis” ja valige mõni, enne kui klõpsate jätkamiseks.
|
||||
'''Success!'''=Edukas!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Teie jaoturiga ühendamine õnnestus! Klõpsake nuppu Järgmine!
|
||||
'''Find bridges'''=Bridge’ide leidmine
|
||||
'''Light Discovery Failed!'''=Tulede tuvastamine nurjus!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Tulede tuvastamine nurjus, proovige hiljem uuesti. Klõpsake väljumiseks nuppu Valmis.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Valige lisamiseks Hue tuled ({{numFound}} leitud)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Varem lisatud Hue tuled ({{existingLightsSize}} lisatud)
|
||||
'''Light Discovery Started!'''=Tulede tuvastamine algas!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Oodake, kuni me tuvastame teie Hue tuled. Tuvastamisele võib kuluda üle viie minuti, seega oodake rahulikult! Pärast tuvastamist valige all oma seade.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Antaa sinun yhdistää Philips Hue Lights -valot SmartThingsiin ja hallita niitä SmartThings-mobiilisovelluksen Things (Laitteet) -alueelta tai koontinäytöstä. Päivitä ensin Hue Bridge -silta SmartThings-sovelluksen ulkopuolella Philips Hue -sovelluksen avulla.
|
||||
'''Discovery Started!'''=Etsintä aloitettu!
|
||||
'''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.'''=Odota, kunnes Hue Bridge -silta löytyy. Huomaa, että sinun on ensin päivitettävä Hue Bridge -silta ja Hue Lights -valot Philips Hue -sovelluksen avulla. Etsintä voi kestää jopa yli viisi minuuttia, joten odota kärsivällisesti! Valitse laite alta, kun se on löytynyt.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Valitse Hue Bridge -silta ({{numFound}} löydetty)
|
||||
'''Bridge Discovery Failed!'''=Sillan etsintä epäonnistui!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Hue Bridge -siltoja ei löytynyt. Varmista, että Hue Bridge -silta on yhdistetty SmartThings-keskittimen kanssa samaan verkkoon ja että se saa virtaa.
|
||||
'''Linking with your Hue'''=Hue-linkin muodostaminen
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Huen nykyinen käyttäjänimi ei kelpaa. Muodosta linkki uudelleen painamalla Hue Bridge -sillassa olevaa painiketta.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Määritä linkki painamalla Hue Bridge -sillassa olevaa painiketta.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Et ole valinnut Hue Bridge -siltaa. Paina Done (Valmis) -painiketta ja valitse silta, ennen kuin napsautat Next (Seuraava) -painiketta.
|
||||
'''Success!'''=Onnistui!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Keskittimen linkittäminen onnistui! Valitse Next (Seuraava)!
|
||||
'''Find bridges'''=Etsi siltoja
|
||||
'''Light Discovery Failed!'''=Valojen etsintä epäonnistui!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Valoja ei löytynyt. Yritä myöhemmin uudelleen. Lopeta valitsemalla Done (Valmis).
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Valitse lisättävät Hue Lights -valot ({{numFound}} löydetty)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Aikaisemmin lisätyt Hue Lights -valot ({{existingLightsSize}} lisätty)
|
||||
'''Light Discovery Started!'''=Valojen etsintä aloitettu!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Odota, kunnes Hue Lights -valot löytyvät. Etsintä voi kestää jopa yli viisi minuuttia, joten odota kärsivällisesti! Valitse laite alta, kun se on löytynyt.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Vous permet de connecter vos lampes Philips Hue à SmartThings et de les contrôler depuis votre zone Things (Objets) ou du tableau de bord dans l'application mobile SmartThings. Veuillez d'abord mettre à jour votre pont Hue, en dehors de l'application SmartThings, à l'aide de l'application Philips Hue.
|
||||
'''Discovery Started!'''=La détection a commencé !
|
||||
'''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.'''=Veuillez patienter pendant la détection de votre pont Hue. Vous devez d'abord configurer votre pont et vos lampes Hue à l'aide de l'application Philips Hue. La détection peut prendre cinq minutes voire plus. Alors, détendez-vous en attendant ! Une fois qu'il a été détecté, sélectionnez votre appareil ci-dessous.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Sélectionnez le pont Hue ({{numFound}} trouvé(s))
|
||||
'''Bridge Discovery Failed!'''=Échec de la détection du pont !
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=La détection des ponts Hue a échoué. Veuillez confirmer que le pont Hue est connecté au même réseau que votre concentrateur SmartThings, et qu'il est sous tension.
|
||||
'''Linking with your Hue'''=Association avec votre Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Le nom d'utilisateur Hue actuel n'est pas valide. Veuillez appuyer sur la touche de votre pont Hue pour l'associer de nouveau.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Appuyez sur la touche de votre pont Hue pour configurer une association.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Vous n'avez pas sélectionné de pont Hue. Appuyez sur “Done” (Terminé), puis sélectionnez-en un avant de cliquer sur Next (Suivant).
|
||||
'''Success!'''=Opération réussie !
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Vous avez réussi à associer votre concentrateur. Veuillez cliquer sur « Suivant » !
|
||||
'''Find bridges'''=Trouver des ponts
|
||||
'''Light Discovery Failed!'''=La détection du pont a échoué !
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Échec de la détection des lampes, veuillez réessayer ultérieurement. Cliquez sur Done (Terminé) pour quitter.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Sélectionnez les lampes Hue à ajouter ({{numFound}} trouvée(s))
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Lampes Hue précédemment ajoutées ({{existingLightsSize}} ajoutée(s))
|
||||
'''Light Discovery Started!'''=La détection des lampes a commencé !
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Veuillez patienter pendant la détection de vos lampes Hue La détection peut prendre cinq minutes voire plus. Alors, détendez-vous en attendant ! Une fois qu'il a été détecté, sélectionnez votre appareil ci-dessous.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Vous permet de connecter vos Philips Hue Lights (lumières Philips Hue) avec SmartThings et de les contrôler depuis Things (choses) ou Dashboard (tableau de bord) dans l’application mobile SmartThings. Veuillez d’abord mettre à jour votre Hue Bridge (pont Hue) à l’extérieur de l’application SmartThings, à l’aide de l’application Philips Hue.
|
||||
'''Discovery Started!'''=Début de la détection.
|
||||
'''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.'''=Veuillez patienter pendant que nous détectons votre Hue Bridge (pont Hue). Veuillez noter que vous devez d’abord configurer votre Hue Bridge (pont Hue) et vos Hue Lights (lumières Hue) à l’aide de l’application Philips Hue. La détection peut prendre cinq minutes ou plus, donc détendez-vous. Sélectionnez votre appareil ci-dessous une fois qu’il est détecté.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Sélectionnez le Hue Bridge (pont Hue; {{numFound}} trouvé(s))
|
||||
'''Bridge Discovery Failed!'''=Échec de détection du pont!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Échec de détection d’un Hue Bridge (pont Hue). Veuillez vous assurer que le Hue Bridge (pont Hue) est connecté au même réseau que votre borne SmartThings et qu’il est alimenté.
|
||||
'''Linking with your Hue'''=Jumelage avec votre Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Le nom d’utilisateur Hue que vous utilisez n’est pas valide. Appuyez sur le bouton qui se trouve sur votre Hue Bridge (pont Hue) pour effectuer le jumelage de nouveau.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Appuyez sur le bouton qui se trouve sur le Hue Bridge (pont Hue) afin de configurer un lien.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Vous n’avez pas sélectionné de Hue Bridge (pont Hue). Veuillez appuyez sur « Done » (terminé) et sélectionnez-en un avant de cliquer sur Next (suivant).
|
||||
'''Success!'''=Réussite!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Le jumelage avec votre portail est un succès! Veuillez cliquer sur Next (suivant)!
|
||||
'''Find bridges'''=Trouver des ponts
|
||||
'''Light Discovery Failed!'''=Échec de détection de lumière!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Impossible de détecter de la lumière. Veuillez réessayer plus tard. Cliquez sur Done (terminé) pour quitter.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Sélectionnez les Hue Lights (lumières Hue) que vous souhaitez ajouter ({{numFound}} trouvée(s))
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Hue Lights (lumières Hue) ajoutées précédemment ({{existingLightsSize}} ajoutée(s))
|
||||
'''Light Discovery Started!'''=Début de la détection de lumières!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Veuillez patienter pendant que nous détectons vos Hue Lights (lumières Hue). La détection peut prendre cinq minutes ou plus, donc détendez-vous. Sélectionnez votre appareil ci-dessous une fois qu’il est détecté.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Vous permet de connecter vos lampes Philips Hue à SmartThings et de les contrôler depuis votre zone Things (Objets) ou du tableau de bord dans l'application mobile SmartThings. Veuillez d'abord mettre à jour votre pont Hue, en dehors de l'application SmartThings, à l'aide de l'application Philips Hue.
|
||||
'''Discovery Started!'''=La détection a commencé !
|
||||
'''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.'''=Veuillez patienter pendant la détection de votre pont Hue. Vous devez d'abord configurer votre pont et vos lampes Hue à l'aide de l'application Philips Hue. La détection peut prendre cinq minutes voire plus. Alors, détendez-vous en attendant ! Une fois qu'il a été détecté, sélectionnez votre appareil ci-dessous.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Sélectionnez le pont Hue ({{numFound}} trouvé(s))
|
||||
'''Bridge Discovery Failed!'''=Échec de la détection du pont !
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=La détection des ponts Hue a échoué. Veuillez confirmer que le pont Hue est connecté au même réseau que votre concentrateur SmartThings, et qu'il est sous tension.
|
||||
'''Linking with your Hue'''=Association avec votre Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Le nom d'utilisateur Hue actuel n'est pas valide. Veuillez appuyer sur la touche de votre pont Hue pour l'associer de nouveau.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Appuyez sur la touche de votre pont Hue pour configurer une association.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Vous n'avez pas sélectionné de pont Hue. Appuyez sur “Done” (Terminé), puis sélectionnez-en un avant de cliquer sur Next (Suivant).
|
||||
'''Success!'''=Opération réussie !
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Vous avez réussi à associer votre concentrateur. Veuillez cliquer sur « Suivant » !
|
||||
'''Find bridges'''=Trouver des ponts
|
||||
'''Light Discovery Failed!'''=La détection du pont a échoué !
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Échec de la détection des lampes, veuillez réessayer ultérieurement. Cliquez sur Done (Terminé) pour quitter.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Sélectionnez les lampes Hue à ajouter ({{numFound}} trouvée(s))
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Lampes Hue précédemment ajoutées ({{existingLightsSize}} ajoutée(s))
|
||||
'''Light Discovery Started!'''=La détection des lampes a commencé !
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Veuillez patienter pendant la détection de vos lampes Hue La détection peut prendre cinq minutes voire plus. Alors, détendez-vous en attendant ! Une fois qu'il a été détecté, sélectionnez votre appareil ci-dessous.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Vous permet de connecter vos lampes Philips Hue à SmartThings et de les contrôler depuis votre zone Things (Objets) ou du tableau de bord dans l'application mobile SmartThings. Veuillez d'abord mettre à jour votre pont Hue, en dehors de l'application SmartThings, à l'aide de l'application Philips Hue.
|
||||
'''Discovery Started!'''=La détection a commencé !
|
||||
'''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.'''=Veuillez patienter pendant la détection de votre pont Hue. Vous devez d'abord configurer votre pont et vos lampes Hue à l'aide de l'application Philips Hue. La détection peut prendre cinq minutes voire plus. Alors, détendez-vous en attendant ! Une fois qu'il a été détecté, sélectionnez votre appareil ci-dessous.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Sélectionnez le pont Hue ({{numFound}} trouvé(s))
|
||||
'''Bridge Discovery Failed!'''=Échec de la détection du pont !
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=La détection des ponts Hue a échoué. Veuillez confirmer que le pont Hue est connecté au même réseau que votre concentrateur SmartThings, et qu'il est sous tension.
|
||||
'''Linking with your Hue'''=Association avec votre Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Le nom d'utilisateur Hue actuel n'est pas valide. Veuillez appuyer sur la touche de votre pont Hue pour l'associer de nouveau.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Appuyez sur la touche de votre pont Hue pour configurer une association.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Vous n'avez pas sélectionné de pont Hue. Appuyez sur “Done” (Terminé), puis sélectionnez-en un avant de cliquer sur Next (Suivant).
|
||||
'''Success!'''=Opération réussie !
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Vous avez réussi à associer votre concentrateur. Veuillez cliquer sur « Suivant » !
|
||||
'''Find bridges'''=Trouver des ponts
|
||||
'''Light Discovery Failed!'''=La détection du pont a échoué !
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Échec de la détection des lampes, veuillez réessayer ultérieurement. Cliquez sur Done (Terminé) pour quitter.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Sélectionnez les lampes Hue à ajouter ({{numFound}} trouvée(s))
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Lampes Hue précédemment ajoutées ({{existingLightsSize}} ajoutée(s))
|
||||
'''Light Discovery Started!'''=La détection des lampes a commencé !
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Veuillez patienter pendant la détection de vos lampes Hue La détection peut prendre cinq minutes voire plus. Alors, détendez-vous en attendant ! Une fois qu'il a été détecté, sélectionnez votre appareil ci-dessous.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Omogućava vam da povežete Philips Hue lights (svjetla Philips Hue) i SmartThings te da upravljate njima iz dijela Things area (Područje za stvari) ili Dashboard (Nadzorna ploča) u mobilnoj aplikaciji SmartThings. Najprije aktualizirajte Hue Bridge (Hue most) izvan aplikacije SmartThings s pomoću aplikacije Philips Hue.
|
||||
'''Discovery Started!'''=Otkrivanje je započelo!
|
||||
'''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.'''=Pričekajte dok otkrivamo vaš Hue Bridge (Hue most). Imajte na umu da najprije morate konfigurirati vaš Hue Bridge (Hue most) i Lights (svjetla) s pomoću aplikacije Philips Hue. Otkrivanje može trajati pet minuta ili dulje, stoga sjednite i opustite se! Kada bude otkriven, odaberite svoj uređaj u nastavku.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Odaberite Hue Bridge (Hue most) (pronađeno: {{numFound}})
|
||||
'''Bridge Discovery Failed!'''=Neuspješno otkrivanje Bridgea (mosta)!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Nije otkriven nijedan Hue Bridge (Hue most). Potvrdite da je Hue Bridge (Hue most) povezan na istu mrežu kao i SmartThings Hub i da je uključen.
|
||||
'''Linking with your Hue'''=Povezivanje s uređajem Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Neispravno je trenutačno korisničko ime za Hue. Pritisnite gumb za ponovno povezivanje na Hue Bridgeu (Hue most).
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Pritisnite gumb na uređaju Hue Bridge (Hue most) da biste postavili vezu.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Niste odabrali nijedan Hue Bridge (Hue most), pritisnite „Done” (Gotovo) i odaberite jedan prije nego što kliknete next (dalje).
|
||||
'''Success!'''=Uspjeh!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Povezivanje na koncentrator bilo je uspješno! Kliknite „Next” (Dalje)!
|
||||
'''Find bridges'''=Pronađi mostove
|
||||
'''Light Discovery Failed!'''=Otkrivanje svjetla nije uspjelo!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Nije otkriveno nijedno svjetlo, pokušajte ponovno kasnije. Kliknite Done (Gotovo) za izlaz.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Odaberite Hue Lights (svjetla Hue) za dodavanje (pronađeno: {{numFound}})
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Hue Lights (svjetla Hue) koja su prethodno dodana (dodano: {{existingLightsSize}})
|
||||
'''Light Discovery Started!'''=Započelo je otkrivanje svjetla!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Pričekajte dok otkrivamo Hue Lights (svjetla Hue). Otkrivanje može trajati pet minuta ili dulje, stoga sjednite i opustite se! Kada bude otkriven, odaberite svoj uređaj u nastavku.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Lehetővé teszi a Philips Hue Lights (lámpák) összekapcsolását a SmartThings rendszerrel és vezérlésüket a SmartThings Mobile alkalmazás Things (Tárgyak) területéről vagy a Dashboard (Vezérlőpult) segítségével. Előbb frissítse a Hue Bridge (híd) eszközt a SmartThings alkalmazáson kívülről, a Philips Hue alkalmazás segítségével.
|
||||
'''Discovery Started!'''=Megkezdődött a keresés!
|
||||
'''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.'''=Kis türelmet kérünk, amíg megtaláljuk a Hue Bridge (híd) eszközt. Felhívjuk figyelmét, hogy előbb el kell végeznie a Hue Bridge (híd) és Lights (lámpák) konfigurálását a Philips Hue alkalmazással. Ez akár öt percnél is tovább tarthat, így némi türelemre lesz szükség! Az eszköz megtalálása után alább kiválaszthatja azt.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Válassza ki a Hue Bridge (híd) eszközt ({{numFound}} találat)
|
||||
'''Bridge Discovery Failed!'''=A Bridge (híd) keresése sikertelen volt!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Nem sikerült Hue Bridge (híd) eszközt találni. Győződjön meg róla, hogy a Hue Bridge (híd) ugyanahhoz a hálózathoz kapcsolódik, mint a SmartThings Hub, és be van kapcsolva.
|
||||
'''Linking with your Hue'''=Összekapcsolás a Hue-val
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=A jelenleg Hue-felhasználónév érvénytelen. Nyomja meg a Hue Bridge (híd) gombját az újbóli összekapcsoláshoz.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Az összekapcsolás beállításához nyomja meg a Hue Bridge (híd) gombját.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Nem választott ki Hue Bridge (híd) eszközt. Nyomja meg a „Done” (Kész) gombot, és válasszon, mielőtt a Next (Tovább) gombra kattintana.
|
||||
'''Success!'''=Sikerült!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Sikeresen összekapcsolódott a hubbal! Kattintson a „Next” (Tovább) gombra!
|
||||
'''Find bridges'''=Bridge (híd) eszközök keresése
|
||||
'''Light Discovery Failed!'''=A Light (lámpa) keresése sikertelen volt!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Nem sikerült Light (lámpa) eszközt találni, próbálja meg később. Kattintson a Done (Kész) gombra a kilépéshez.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Válassza ki a hozzáadni kívánt Hue Light (lámpa) eszközöket ({{numFound}} találat)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Előzőleg hozzáadott Hue Lights (lámpák) ({{existingLightsSize}} hozzáadva)
|
||||
'''Light Discovery Started!'''=Megkezdődött a Light (lámpa) eszközök keresése!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Kis türelmet kérünk, amíg megtaláljuk a Hue Light (lámpa) eszközöket. Ez akár öt percnél is tovább tarthat, így némi türelemre lesz szükség! Az eszköz megtalálása után alább kiválaszthatja azt.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Consente di collegare le Philips Hue Light (lampadine Philips Hue) con SmartThings e di controllarle dall'area Things o dalla dashboard nell'applicazione mobile SmartThings. Aggiornate innanzitutto il bridge Hue, fuori dall'applicazione SmartThings, tramite l'applicazione Philips Hue.
|
||||
'''Discovery Started!'''=Rilevamento avviato.
|
||||
'''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.'''=Attendete mentre è in corso il rilevamento del bridge Hue. Tenete presente che occorre innanzitutto configurare il bridge e le lampadine Hue tramite l'applicazione Philips Hue. La procedura di rilevamento può richiede almeno cinque minuti, quindi sedetevi e rilassatevi! Selezionate il dispositivo in uso tra quelli riportati di seguito dopo il rilevamento.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Selezionate il bridge Hue ({{numFound}} trovati)
|
||||
'''Bridge Discovery Failed!'''=Rilevamento bridge non riuscito.
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Impossibile rilevare i bridge Hue. Verificate che il bridge Hue sia connesso alla stessa rete dell'hub SmartThings e che sia collegato all'alimentazione.
|
||||
'''Linking with your Hue'''=Collegamento con Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Il nome utente Hue corrente non è valido. Premete il pulsante sul bridge Hue per ripetere il collegamento.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Premete il pulsante sul bridge Hue per configurare un collegamento.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Non avete selezionato nessun bridge Hue. Premete “Done” (Fatto) e selezionatene uno prima di fare clic su Next (Avanti).
|
||||
'''Success!'''=Operazione riuscita.
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Il collegamento all'hub è stato effettuato correttamente. Fate clic su “Next” (Avanti).
|
||||
'''Find bridges'''=Cerca bridge
|
||||
'''Light Discovery Failed!'''=Rilevamento lampadina non riuscito.
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Impossibile rilevare le lampadine. Riprovate più tardi. Fate clic su Done (Fatto) per uscire.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Selezionate le Hue Light (lampadine Hue) da aggiungere ({{numFound}} trovate)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Hue Light (lampadine Hue) aggiunte in precedenza ({{existingLightsSize}} aggiunte)
|
||||
'''Light Discovery Started!'''=Rilevamento lampadine avviato.
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Attendete mentre è in corso il rilevamento delle Hue Light (lampadine Hue). La procedura di rilevamento può richiede almeno cinque minuti, quindi sedetevi e rilassatevi! Selezionate il dispositivo in uso tra quelli riportati di seguito dopo il rilevamento.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Philips Hue 조명을 SmartThings와 연결하여 SmartThings 모바일 앱의 개별 기기 정보 영역이나 대시보드에서 조명을 조절할 수 있도록 지원합니다. SmartThings 앱을 빠져나와 Philips Hue 앱을 이용하여 먼저 Hue 브릿지를 업데이트하세요.
|
||||
'''Discovery Started!'''=찾기 시작!
|
||||
'''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.'''=Hue 브릿지 검색이 완료될 때까지 잠시 기다리세요. Philips Hue 앱을 이용하여 Hue 브릿지와 조명을 먼저 설정해야 합니다. 검색에는 5분 이상 걸릴 수 있으므로 편히 쉬면서 기다리세요! 검색이 완료되면 아래에서 기기를 선택하세요.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Hue 브릿지 선택 ({{numFound}}개 찾음)
|
||||
'''Bridge Discovery Failed!'''=브릿지 찾기 실패!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Hue 브릿지를 찾지 못했습니다. Hue 브릿지가 SmartThings 허브와 같은 네트워크에 연결되어 있고 전원이 켜져 있는지 확인하세요.
|
||||
'''Linking with your Hue'''=Hue와 연결 중
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=현재 Hue 사용자 이름이 바르지 않습니다. Hue 브릿지의 버튼을 눌러 다시 연결하세요.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Hue 브릿지의 버튼을 눌러 다시 연결하세요.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=선택된 Hue 브릿지가 없습니다. [완료]를 누르고 Hue 브릿지를 선택한 후 [다음]을 클릭하세요.
|
||||
'''Success!'''=성공!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=허브와 성공적으로 연결했습니다! [다음]을 클릭하세요.
|
||||
'''Find bridges'''=브릿지 검색
|
||||
'''Light Discovery Failed!'''=조명 찾기 실패!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=조명을 찾지 못했습니다. 나중에 다시 시도하세요. 종료하려면 [완료]를 클릭하세요.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=추가할 Hue 조명 선택 ({{numFound}}개 찾음)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=이전에 추가한 Hue 조명 ({{existingLightsSize}} 추가됨)
|
||||
'''Light Discovery Started!'''=조명 찾기 시작!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Hue 조명 검색이 완료될 때까지 잠시 기다리세요. 검색에는 5분 이상 걸릴 수 있으므로 편히 쉬면서 기다리세요! 검색이 완료되면 아래에서 기기를 선택하세요.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Hiermee kunt u uw Philips Hue lights (lampen) verbinden met SmartThings en ze bedienen via uw Things-gebied of het Dashboard in de SmartThings Mobiele app. Werk eerst met de Philips Hue-app uw Hue Bridge (brug) bij buiten de SmartThings-app.
|
||||
'''Discovery Started!'''=Detectie gestart!
|
||||
'''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.'''=Even geduld terwijl wij uw Hue Bridge (brug) detecteren. Houd er rekening mee dat u eerst uw Hue Bridge en Lights (lampen) moet configureren met de applicatie Philips Hue. Het detecteren kan wel vijf minuten of langer duren, dus even geduld! Selecteer uw apparaat hieronder na het detecteren.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Selecteer Hue Bridge (brug) ({{numFound}} gevonden)
|
||||
'''Bridge Discovery Failed!'''=Detectie brug mislukt!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Kan geen Hue Bridges (bruggen) detecteren. Bevestig dat de Hue Bridge (brug) is verbonden met hetzelfde netwerk als uw SmartThings-hub en wordt voorzien van voeding.
|
||||
'''Linking with your Hue'''=Koppelen met uw Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=De huidige Hue-gebruikersnaam is ongeldig. Druk op de knop op uw Hue Bridge (brug) om opnieuw te koppelen.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Druk op de knop op uw Hue Bridge (brug) om een koppeling in te stellen.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=U hebt geen Hue Bridge (brug) geselecteerd. Druk op “Done” (Gereed) en selecteer één brug voordat u op Next (Volgende) klikt.
|
||||
'''Success!'''=Succes!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=De koppeling met uw hub is geslaagd! Klik op Next (Volgende)!
|
||||
'''Find bridges'''=Bruggen zoeken
|
||||
'''Light Discovery Failed!'''=Lampdetectie mislukt
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Kan geen lampen detecteren, probeer het later opnieuw. Klik op Done (Gereed) om af te sluiten.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Selecteer Hue Lights (lampen) om toe te voegen ({{numFound}} gevonden)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Eerder toegevoegde Hue Lights (lampen) ({{existingLightsSize}} toegevoegd)
|
||||
'''Light Discovery Started!'''=Lampdetectie gestart.
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Even geduld terwijl wij uw Hue Lights (lampen) detecteren. Het detecteren kan wel vijf minuten of langer duren, dus even geduld! Selecteer uw apparaat hieronder na het detecteren.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Hiermee kunt u uw Philips Hue lights (lampen) verbinden met SmartThings en ze bedienen via uw Things-gebied of het Dashboard in de SmartThings Mobiele app. Werk eerst met de Philips Hue-app uw Hue Bridge (brug) bij buiten de SmartThings-app.
|
||||
'''Discovery Started!'''=Detectie gestart!
|
||||
'''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.'''=Even geduld terwijl wij uw Hue Bridge (brug) detecteren. Houd er rekening mee dat u eerst uw Hue Bridge en Lights (lampen) moet configureren met de applicatie Philips Hue. Het detecteren kan wel vijf minuten of langer duren, dus even geduld! Selecteer uw apparaat hieronder na het detecteren.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Selecteer Hue Bridge (brug) ({{numFound}} gevonden)
|
||||
'''Bridge Discovery Failed!'''=Detectie brug mislukt!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Kan geen Hue Bridges (bruggen) detecteren. Bevestig dat de Hue Bridge (brug) is verbonden met hetzelfde netwerk als uw SmartThings-hub en wordt voorzien van voeding.
|
||||
'''Linking with your Hue'''=Koppelen met uw Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=De huidige Hue-gebruikersnaam is ongeldig. Druk op de knop op uw Hue Bridge (brug) om opnieuw te koppelen.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Druk op de knop op uw Hue Bridge (brug) om een koppeling in te stellen.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=U hebt geen Hue Bridge (brug) geselecteerd. Druk op “Done” (Gereed) en selecteer één brug voordat u op Next (Volgende) klikt.
|
||||
'''Success!'''=Succes!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=De koppeling met uw hub is geslaagd! Klik op Next (Volgende)!
|
||||
'''Find bridges'''=Bruggen zoeken
|
||||
'''Light Discovery Failed!'''=Lampdetectie mislukt
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Kan geen lampen detecteren, probeer het later opnieuw. Klik op Done (Gereed) om af te sluiten.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Selecteer Hue Lights (lampen) om toe te voegen ({{numFound}} gevonden)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Eerder toegevoegde Hue Lights (lampen) ({{existingLightsSize}} toegevoegd)
|
||||
'''Light Discovery Started!'''=Lampdetectie gestart.
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Even geduld terwijl wij uw Hue Lights (lampen) detecteren. Het detecteren kan wel vijf minuten of langer duren, dus even geduld! Selecteer uw apparaat hieronder na het detecteren.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Lar deg koble Philips Hue Lights (lys) med SmartThings og kontrollere dem fra Things (Ting)-området eller dashbordet i SmartThings-mobilappen. Oppdater Hue Bridge (bro) først, utenfor SmartThings-appen, ved å bruke Philips Hue-appen.
|
||||
'''Discovery Started!'''=Oppdagelse startet!
|
||||
'''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.'''=Vent litt mens vi oppdager Hue Bridge (bro). Vær oppmerksom på at du må først sette opp Hue Bridge (bro) og Lights (lysene) ved å bruke Philips Hue-appen. Det kan ta fem minutter eller mer å oppdage den, så len deg tilbake og slapp av! Velg enheten nedenfor når den er oppdaget.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Velg Hue Bridge (bro) ({{numFound}} funnet)
|
||||
'''Bridge Discovery Failed!'''=Oppdagelse av Bridge (bro) mislyktes!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Kunne ikke oppdage noen Hue Bridge (bro). Bekreft at Hue Bridge (bro) er koblet til det samme nettverket som SmartThings-huben, og at den har strøm.
|
||||
'''Linking with your Hue'''=Kobler sammen med Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Det gjeldende Hue-brukernavnet er ugyldig. Trykk på knappen på Hue Bridge (bro) for å koble til igjen.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Trykk på knappen på Hue Bridge (bro) for å sette opp en kobling.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Du har ikke valgt en Hue Bridge (bro), trykk på “Done” (Utført), og velg en før du klikker på Next (Neste).
|
||||
'''Success!'''=Suksess!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Tilkobling til huben var vellykket! Klikk på 'Next' (Neste)!
|
||||
'''Find bridges'''=Finn broer
|
||||
'''Light Discovery Failed!'''=Lysoppdagelse mislyktes!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Kunne ikke oppdage noen lys, prøv igjen senere. Klikk på Done (Utført) for å avslutte.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Velg Hue Ligths (lys) du vil legge til ({{numFound}} funnet)
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Hue Lights (lys) tidligere lagt til ({{existingLightsSize}} lagt til)
|
||||
'''Light Discovery Started!'''=Lysoppdagelse startet!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Vent litt mens vi oppdager Hue Lights (lys). Det kan ta fem minutter eller mer å oppdage den, så len deg tilbake og slapp av! Velg enheten nedenfor når den er oppdaget.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Umożliwia łączenie Philips Hue Lights (lamp Philips Hue) z rozwiązaniem SmartThings oraz sterowanie nimi w obszarze Things (Rzeczy) lub na pulpicie nawigacyjnym w aplikacji mobilnej SmartThings. Najpierw zaktualizuj Hue Bridge (mostek Hue) poza aplikacją SmartThings, korzystając z aplikacji Philips Hue.
|
||||
'''Discovery Started!'''=Rozpoczęto wykrywanie.
|
||||
'''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.'''=Poczekaj na wykrycie Hue Bridge (mostka Hue). Pamiętaj, że najpierw musisz skonfigurować Hue Bridge (mostek Hue) i Hue Lights (lampy Hue) za pomocą aplikacji Philips Hue. Wykrywanie może potrwać co najmniej pięć minut, więc usiądź i zrelaksuj się. Po wykryciu Twojego urządzenia wybierz je poniżej.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Wybierz Hue Bridge (mostek Hue) (znaleziono {{numFound}})
|
||||
'''Bridge Discovery Failed!'''=Wykrywanie mostka nie powiodło się!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Wykrywanie Hue Bridges (mostków Hue) nie powiodło się. Potwierdź, że Hue Bridge (mostek Hue) został podłączony do tej samej sieci, co koncentrator SmartThings Hub, oraz że jego zasilanie działa.
|
||||
'''Linking with your Hue'''=Łączenie z urządzeniem Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=Bieżąca nazwa użytkownika urządzenia Hue jest nieprawidłowa. Naciśnij przycisk na Hue Bridge (mostku Hue), aby ponownie go podłączyć.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Naciśnij przycisk na Hue Bridge (mostku Hue), aby skonfigurować połączenie.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Nie wybrano Hue Bridge (mostka Hue), naciśnij opcję „Done” (Gotowe) i wybierz go przed kliknięciem opcji Next (Dalej).
|
||||
'''Success!'''=Sukces!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=Łączenie z koncentratorem zakończyło się pomyślnie. Kliknij opcję „Next” (Dalej).
|
||||
'''Find bridges'''=Wyszukaj mostki
|
||||
'''Light Discovery Failed!'''=Wykrywanie lampy nie powiodło się.
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Nie można wykryć lamp, spróbuj ponownie później. Kliknij opcję Done (Gotowe), aby zakończyć.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Wybierz Hue Lights (lampy Hue) do dodania (znaleziono {{numFound}})
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Poprzednio dodane Hue Lights (lampy Hue) (dodano {{existingLightsSize}})
|
||||
'''Light Discovery Started!'''=Rozpoczęto wykrywanie lamp.
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Poczekaj na wykrycie Hue Lights (lamp Hue). Wykrywanie może potrwać co najmniej pięć minut, więc usiądź i zrelaksuj się. Po wykryciu Twojego urządzenia wybierz je poniżej.
|
||||
@@ -1,19 +0,0 @@
|
||||
'''Allows you to connect your Philips Hue lights with SmartThings and control them from your Things area or Dashboard in the SmartThings Mobile app. Please update your Hue Bridge first, outside of the SmartThings app, using the Philips Hue app.'''=Permite conectar as luzes da Philips Hue com o SmartThings e controlá-las a partir da área "Things" (Coisas) ou do "Dashboard" (Painel) do aplicativo SmartThings Mobile. Primeiro atualize a ponte da Hue fora do aplicativo SmartThings, usando o aplicativo Philips Hue.
|
||||
'''Discovery Started!'''=Detecção iniciada!
|
||||
'''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.'''=Aguarde enquanto detectamos a ponte da Hue. Note que você deve primeiro configurar a ponte da Hue e as luzes usando o aplicativo Philips Hue. A detecção pode levar cinco minutos ou mais, portanto, sente-se e relaxe! Selecione abaixo o seu aparelho após a detecção.
|
||||
'''Select Hue Bridge ({{numFound}} found)'''=Selecionar ponte da Hue ({{numFound}} encontrado(s))
|
||||
'''Bridge Discovery Failed!'''=Falha ao detectar a ponte!
|
||||
'''Failed to discover any Hue Bridges. Please confirm that the Hue Bridge is connected to the same network as your SmartThings Hub, and that it has power.'''=Falha ao detectar pontes da Hue. Verifique se a ponte da Hue está conectada à mesma rede do seu SmartThings Hub e ligada na tomada.
|
||||
'''Linking with your Hue'''=Vinculando com a Hue
|
||||
'''The current Hue username is invalid. Please press the button on your Hue Bridge to re-link.'''=O nome de usuário da Hue atual é inválido. Pressione o botão na ponte da Hue para vincular novamente.
|
||||
'''Press the button on your Hue Bridge to setup a link.'''=Pressione o botão na ponte da Hue para configurar a vinculação.
|
||||
'''You haven't selected a Hue Bridge, please Press 'Done' and select one before clicking next.'''=Você não selecionou uma ponte da Hue. Pressione 'Done' (Concluir) e selecione a ponte antes de clicar em Next (Avançar).
|
||||
'''Success!'''=Sucesso!
|
||||
'''Linking to your hub was a success! Please click 'Next'!'''=A vinculação com o hub foi concluída com êxito. Clique em "Next" (Avançar).
|
||||
'''Find bridges'''=Encontrar pontes
|
||||
'''Light Discovery Failed!'''=Falha ao detectar luz!
|
||||
'''Failed to discover any lights, please try again later. Click 'Done' to exit.'''=Falha ao detectar as luzes. Tente novamente mais tarde. Clique em \"Done\" (Concluir) para sair.
|
||||
'''Select Hue Lights to add ({{numFound}} found)'''=Selecione as luzes da Hue a serem adicionadas ({{numFound}} encontrada(s))
|
||||
'''Previously added Hue Lights ({{existingLightsSize}} added)'''=Luzes da Hue adicionadas anteriormente ({{existingLightsSize}} adicionada(s))
|
||||
'''Light Discovery Started!'''=Detecção de luz iniciada!
|
||||
'''Please wait while we discover your Hue Lights. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.'''=Aguarde enquanto detectamos as luzes da Hue. A detecção pode levar cinco minutos ou mais, portanto, sente-se e relaxe! Selecione abaixo o seu aparelho após a detecção.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user