forked from c99koder/SmartThings
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathroku-virtual-buttons.groovy
98 lines (87 loc) · 3.29 KB
/
roku-virtual-buttons.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/**
* Roku Virtual Buttons
*
* Copyright 2017 Sam Steele
*
* 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: "Roku Virtual Buttons",
namespace: "c99koder",
author: "Sam Steele",
description: "Creates virtual buttons to switch between apps / inputs on a Roku TV",
category: "Convenience",
iconUrl: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png",
iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/[email protected]",
iconX3Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/[email protected]")
preferences {
section("Title") {
input "roku","capability.mediaController", title: "Roku Device", multiple: false, required: true
}
}
def installed() {
initialize()
}
def updated() {
unsubscribe()
initialize()
}
def initialize() {
subscribe(roku, "activityList", createButtons)
createButtons(null)
roku.getAllActivities()
}
def createButtons(evt) {
def activityList = roku.currentValue("activityList")
if (activityList != null) {
def appsNode = new XmlSlurper().parseText(activityList)
appsNode.children().each{
def appId = [email protected]()
def deviceLabel = it.text()
if (getChildDevice(appId) == null) {
def device = addChildDevice("smartthings", "Momentary Button Tile", appId, null, [label: "Roku: $deviceLabel"])
state["$device.id"] = appId
log.debug "Created button tile $device.id for channel $deviceLabel ($appId)"
} else {
log.debug "Skipped $appId"
}
}
}
if (getChildDevice("powerOn") == null) {
def device = addChildDevice("smartthings", "Momentary Button Tile", "powerOn", null, [label: "Roku: Power On"])
state["$device.id"] = "powerOn"
log.debug "Created Power On tile $device.id"
} else {
log.debug "Skipped Power On tile"
}
if (getChildDevice("powerOff") == null) {
def device = addChildDevice("smartthings", "Momentary Button Tile", "powerOff", null, [label: "Roku: Power Off"])
state["$device.id"] = "powerOff"
log.debug "Created Power Off tile $device.id"
} else {
log.debug "Skipped Power Off tile"
}
getAllChildDevices().each {
subscribe(it, "switch", switchHandler)
}
}
def switchHandler(evt) {
if (evt.value == "on") {
if(state["$evt.device.id"] == "powerOn") {
sendHubCommand(new physicalgraph.device.HubAction ("wake on lan ${roku.deviceNetworkId}", physicalgraph.device.Protocol.LAN, null, [:]))
roku.pressKey("Power")
} else if(state["$evt.device.id"] == "powerOff") {
roku.pressKey("PowerOff")
} else {
roku.launchAppId(state["$evt.device.id"])
}
}
}