/* ===== HUBITAT INTEGRATION VERSION =====================================================
Hubitat - Samsung TV Remote Driver
Copyright 2022 Dave Gutheinz
License: https://github.com/DaveGut/HubitatActive/blob/master/KasaDevices/License.md
===== 2024 Version 2.3.9 ====================================================================
a. Created preset functions (create, execute, trigger). Function work with and without
SmartThings. SEE DOCUMENTATION.
b. Added buttons to support preset functions in dashboards.
c. Added app codes to built-in app search list.
d. Created methods to support adding running app automatically to state.appData
if the SmartThings interface is enabled.
===========================================================================================*/
def driverVer() { return version() }
import groovy.json.JsonOutput
import groovy.json.JsonSlurper
metadata {
definition (name: "Samsung TV Remote",
namespace: "davegut",
author: "David Gutheinz",
singleThreaded: true,
importUrl: "https://raw.githubusercontent.com/DaveGut/HubitatActive/master/SamsungTvRemote/SamsungTVRemote.groovy"
){
capability "Refresh"
capability "Configuration"
capability "SamsungTV"
command "showMessage", [[name: "Not Implemented"]]
capability "Switch"
capability "PushableButton"
capability "Variable"
}
preferences {
input ("deviceIp", "text", title: "Samsung TV Ip", defaultValue: "")
if (deviceIp) {
List modeOptions = ["ART_MODE", "Ambient", "none"]
if (getDataValue("frameTv") == "false") {
modeOptions = ["Ambient", "none"]
}
input ("tvPwrOnMode", "enum", title: "TV Startup Display",
options: modeOptions, defaultValue: "none")
input ("logEnable", "bool",
title: "Enable debug logging for 30 minutes", defaultValue: false)
input ("infoLog", "bool",
title: "Enable information logging " + helpLogo(),
defaultValue: true)
stPreferences()
}
input ("pollInterval","enum", title: "Power Polling Interval (seconds)",
options: ["off", "10", "20", "30", "60"], defaultValue: "60")
tvAppsPreferences()
}
}
String helpLogo() { // library marker davegut.kasaCommon, line 11
return """""" +
"""Samsung TV Remote Help
"""
}
// ===== Installation, setup and update =====
def installed() {
state.token = "12345678"
def tokenSupport = "false"
sendEvent(name: "wsStatus", value: "closed")
// sendEvent(name: "numberOfButtons", value: "60")
runIn(1, updated)
}
def updated() {
sendEvent(name: "numberOfButtons", value: "60")
unschedule()
close()
state.wsData = ""
def updStatus = [:]
if (!deviceIp) {
logWarn("\n\n\t\tEnter the deviceIp and Save Preferences\n\n")
updStatus << [status: "ERROR", data: "Device IP not set."]
} else {
if (!getDataValue("driverVersion") || getDataValue("driverVersion") != driverVer()) {
updateDataValue("driverVersion", driverVer())
updStatus << [driverVer: driverVer()]
}
if (logEnable) { runIn(1800, debugLogOff) }
updStatus << [logEnable: logEnable, infoLog: infoLog]
updStatus << [setOnPollInterval: setOnPollInterval()]
sendEvent(name: "numberOfButtons", value: 60)
sendEvent(name: "wsStatus", value: "closed")
def action = configure()
if (!state.appData) { state.appData == [:] }
updStatus << [updApps: updateAppCodes()]
}
logInfo("updated: ${updStatus}")
}
def setOnPollInterval() {
if (pollInterval == null) {
pollInterval = "60"
device.updateSetting("pollInterval", [type:"enum", value: "60"])
}
if (pollInterval == "60") {
runEvery1Minute(onPoll)
} else if (pollInterval != "off") {
schedule("0/${pollInterval} * * * * ?", onPoll)
}
return pollInterval
}
def configure() {
def respData = [:]
def tvData = [:]
try{
httpGet([uri: "http://${deviceIp}:8001/api/v2/", timeout: 5]) { resp ->
tvData = resp.data
runIn(1, getArtModeStatus)
}
} catch (error) {
tvData << [status: "error", data: error]
logError("configure: TV Off during setup or Invalid IP address.\n\t\tTurn TV On and Run CONFIGURE or Save Preferences!")
}
if (!tvData.status) {
def wifiMac = tvData.device.wifiMac
updateDataValue("deviceMac", wifiMac)
def alternateWolMac = wifiMac.replaceAll(":", "").toUpperCase()
updateDataValue("alternateWolMac", alternateWolMac)
device.setDeviceNetworkId(alternateWolMac)
def modelYear = "20" + tvData.device.model[0..1]
updateDataValue("modelYear", modelYear)
def frameTv = "false"
if (tvData.device.FrameTVSupport) {
frameTv = tvData.device.FrameTVSupport
}
updateDataValue("frameTv", frameTv)
if (tvData.device.TokenAuthSupport) {
tokenSupport = tvData.device.TokenAuthSupport
updateDataValue("tokenSupport", tokenSupport)
}
def uuid = tvData.device.duid.substring(5)
updateDataValue("uuid", uuid)
respData << [status: "OK", dni: alternateWolMac, modelYear: modelYear,
frameTv: frameTv, tokenSupport: tokenSupport]
sendEvent(name: "artModeStatus", value: "none")
def data = [request:"get_artmode_status",
id: "${getDataValue("uuid")}"]
data = JsonOutput.toJson(data)
artModeCmd(data)
} else {
respData << tvData
}
runIn(1, stUpdate)
logInfo("configure: ${respData}")
return respData
}
// ===== Polling/Refresh Capability =====
def onPoll() {
def sendCmdParams = [
uri: "http://${deviceIp}:8001/api/v2/",
timeout: 6
]
asynchttpGet("onPollParse", sendCmdParams)
if (getDataValue("driverVersion") != driverVer()) {
logInfo("Auto Configuring changes to this TV.")
updateDriver()
pauseExecution(3000)
}
}
def updateDriver() {
}
def onPollParse(resp, data) {
def powerState
if (resp.status == 200) {
powerState = new JsonSlurper().parseText(resp.data).device.PowerState
} else {
powerState = "NC"
}
def onOff = "off"
if (powerState == "on") { onOff = "on" }
Map logData = [method: "onPollParse", httpStatus: resp.status,
powerState: powerState, onOff: onOff]
if (device.currentValue("switch") != onOff) {
sendEvent(name: "switch", value: onOff)
logData << [switch: onOff]
if (onOff == "on") {
runIn(5, setPowerOnMode)
} else {
setPowerOffMode()
}
}
logDebug(logData)
}
// ===== Capability Switch =====
def on() {
logInfo("on: [frameTv: ${getDataValue("frameTv")}]")
if (device.currentValue("wsStatus") == "open") {
sendKey("POWER", "Press")
pauseExecution(3000)
sendKey("POWER", "Release")
}
def wolMac = getDataValue("alternateWolMac")
def cmd = "FFFFFFFFFFFF$wolMac$wolMac$wolMac$wolMac$wolMac$wolMac$wolMac$wolMac$wolMac$wolMac$wolMac$wolMac$wolMac$wolMac$wolMac$wolMac"
wol = new hubitat.device.HubAction(
cmd,
hubitat.device.Protocol.LAN,
[type: hubitat.device.HubAction.Type.LAN_TYPE_UDPCLIENT,
destinationAddress: "255.255.255.255:7",
encoding: hubitat.device.HubAction.Encoding.HEX_STRING])
sendHubCommand(wol)
runIn(1, onPoll)
}
def setPowerOnMode() {
logInfo("setPowerOnMode: [tvPwrOnMode: ${tvPwrOnMode}]")
if(tvPwrOnMode == "ART_MODE") {
getArtModeStatus()
pauseExecution(1000)
artMode()
} else if (tvPwrOnMode == "Ambient") {
ambientMode()
}
runIn(5, refresh)
}
def off() {
logInfo("off: [frameTv: ${getDataValue("frameTv")}]")
sendKey("POWER", "Press")
pauseExecution(3000)
sendKey("POWER", "Release")
runIn(1, onPoll)
}
def setPowerOffMode() {
logInfo("setPowerOfMode")
sendEvent(name: "appId", value: " ")
sendEvent(name: "appName", value: " ")
sendEvent(name: "tvChannel", value: " ")
sendEvent(name: "tvChannelName", value: " ")
runIn(5, refresh)
}
def setVariable(valueString) {
sendEvent(name: "variable", value: valueString)
}
def refresh() {
if (connectST) {
deviceRefresh()
}
runIn(4, updateTitle)
}
// ===== BUTTON INTERFACE =====
def push(pushed) {
logDebug("push: button = ${pushed}, trigger = ${state.triggered}")
if (pushed == null) {
logWarn("push: pushed is null. Input ignored")
return
}
pushed = pushed.toInteger()
switch(pushed) {
// ===== Physical Remote Commands =====
case 2 : mute(); break // toggles mute/unmute
case 3 : numericKeyPad(); break
case 4 : Return(); break // Goes back one level on apps. I.e., if playing, goes to
// app main screen
case 6 : artMode(); break
case 7 : ambientMode(); break
case 8 : arrowLeft(); break
case 9 : arrowRight(); break
case 10: arrowUp(); break
case 11: arrowDown(); break
case 12: enter(); break // Executes selected OSD item (both apps and tv menus.
case 13: exit(); break // Exits last selected item (if playing in app, will exit
// and return to app main screen. If on main screen, exits app.
case 14: home(); break // toggles on/off the TV's smart control page.
case 18: channelUp(); break
case 19: channelDown(); break
case 20: guide(); break
case 21: volumeUp(); break
case 22: volumeDown(); break
// ===== Direct Access Functions
case 23: menu(); break // Calls upd OSD setting menu for TV.
case 26: channelList(); break
case 27: play(); break // Player control (playing app media that is not streaming
case 28: pause(); break // (i.e., a recording in app).
case 29: stop(); break // Exits the playing recording, returns to menu
// ===== Other Commands =====
case 34: previousChannel(); break // aka back
case 35: sourceToggle(); break // Changed from hdmi(). Goes to next active source.
case 36: fastBack(); break // player control
case 37: fastForward(); break // player control
// ===== Application Interface =====
case 42: toggleSoundMode(); break // ST function
case 43: togglePictureMode(); break // ST function
case 44:
// Allows opening an app by name. Enter using dashboard tile variable
// which creates the attribute variable.
def variable = device.currentValue("variable")
if (variable == null || variable == " ") {
logWarn("{button44: error: null variable, action: use setVariable to enter the variable]")
} else {
appOpenByName(variable)
}
sendEvent(name: "variable", value: " ")
break
case 45:
// TV Channel Preset Function. Allows adding TV channels without the
// SmartThing interface.
def variable = device.currentValue("variable")
if (variable == null || variable == " ") {
logWarn("{button45: error: null variable, action: use setVariable to enter the variable]")
logWarn("{button45: variable must be in format PresetNo, TVCHANNEL, TVCHANNELTITLE]]")
} else {
def arr = variable.split(",")
if (arr.size() == 3) {
try {
arr[0].trim().toInteger()
arr[1].trim().toInteger()
presetCreateTV(arr[0].trim(), arr[1].trim(), arr[2].trim())
} catch (err) {
logWarn("{button45: [variable: ${variable}, error: must be in format PresetNo, TVCHANNEL, TVCHANNELTITLE]]")
}
} else {
logWarn("{button45: [variable: ${variable}, error: must be in format PresetNo, TVCHANNEL, TVCHANNELTITLE]]")
}
}
sendEvent(name: "variable", value: " ")
break
case 46:
// TV Channel set. Must first enter variable.
def variable = device.currentValue("variable")
if (variable == null || variable == " ") {
logWarn("{button46: error: null variable, action: use setVariable to enter the variable]")
} else {
channelSet(variable)
}
sendEvent(name: "variable", value: " ")
break
// Trigger function. Once pressed, the preset buttons become ADD for 5 seconds.
case 50: presetUpdateNext(); break
case 51: presetExecute("1"); break
case 52: presetExecute("2"); break
case 53: presetExecute("3"); break
case 54: presetExecute("4"); break
case 55: presetExecute("5"); break
case 56: presetExecute("6"); break
case 57: presetExecute("7"); break
case 58: presetExecute("8"); break
case 59: presetExecute("9"); break
case 60: presetExecute("10"); break
default:
logDebug("push: Invalid Button Number!")
break
}
}
// ===== Libraries =====
//#include davegut.samsungTvTEST
// ~~~~~ start include (89) davegut.samsungTvWebsocket ~~~~~
library ( // library marker davegut.samsungTvWebsocket, line 1
name: "samsungTvWebsocket", // library marker davegut.samsungTvWebsocket, line 2
namespace: "davegut", // library marker davegut.samsungTvWebsocket, line 3
author: "Dave Gutheinz", // library marker davegut.samsungTvWebsocket, line 4
description: "Common Samsung TV Websocket Commands", // library marker davegut.samsungTvWebsocket, line 5
category: "utilities", // library marker davegut.samsungTvWebsocket, line 6
documentationLink: "" // library marker davegut.samsungTvWebsocket, line 7
) // library marker davegut.samsungTvWebsocket, line 8
import groovy.json.JsonOutput // library marker davegut.samsungTvWebsocket, line 10
command "webSocketClose" // library marker davegut.samsungTvWebsocket, line 12
command "webSocketOpen" // library marker davegut.samsungTvWebsocket, line 13
command "close" // library marker davegut.samsungTvWebsocket, line 14
attribute "wsStatus", "string" // library marker davegut.samsungTvWebsocket, line 15
if (getDataValue("frameTv") == "true") { // library marker davegut.samsungTvWebsocket, line 16
command "artMode" // library marker davegut.samsungTvWebsocket, line 17
attribute "artModeStatus", "string" // library marker davegut.samsungTvWebsocket, line 18
} // library marker davegut.samsungTvWebsocket, line 19
command "ambientMode" // library marker davegut.samsungTvWebsocket, line 20
// Remote Control Keys (samsungTV-Keys) // library marker davegut.samsungTvWebsocket, line 21
command "pause" // library marker davegut.samsungTvWebsocket, line 22
command "play" // library marker davegut.samsungTvWebsocket, line 23
command "stop" // library marker davegut.samsungTvWebsocket, line 24
command "sendKey", ["string"] // library marker davegut.samsungTvWebsocket, line 25
// Cursor and Entry Control // library marker davegut.samsungTvWebsocket, line 26
command "arrowLeft" // library marker davegut.samsungTvWebsocket, line 27
command "arrowRight" // library marker davegut.samsungTvWebsocket, line 28
command "arrowUp" // library marker davegut.samsungTvWebsocket, line 29
command "arrowDown" // library marker davegut.samsungTvWebsocket, line 30
command "enter" // library marker davegut.samsungTvWebsocket, line 31
command "numericKeyPad" // library marker davegut.samsungTvWebsocket, line 32
// Menu Access // library marker davegut.samsungTvWebsocket, line 33
command "home" // library marker davegut.samsungTvWebsocket, line 34
command "menu" // library marker davegut.samsungTvWebsocket, line 35
command "guide" // library marker davegut.samsungTvWebsocket, line 36
//command "info" // enter // library marker davegut.samsungTvWebsocket, line 37
// Source Commands // library marker davegut.samsungTvWebsocket, line 38
command "sourceSetOSD" // library marker davegut.samsungTvWebsocket, line 39
command "sourceToggle" // library marker davegut.samsungTvWebsocket, line 40
//command "hdmi" // library marker davegut.samsungTvWebsocket, line 41
// TV Channel // library marker davegut.samsungTvWebsocket, line 42
command "channelList" // library marker davegut.samsungTvWebsocket, line 43
command "channelUp" // library marker davegut.samsungTvWebsocket, line 44
command "channelDown" // library marker davegut.samsungTvWebsocket, line 45
command "channelSet", ["string"] // library marker davegut.samsungTvWebsocket, line 46
command "previousChannel" // library marker davegut.samsungTvWebsocket, line 47
// Playing Navigation Commands // library marker davegut.samsungTvWebsocket, line 48
command "exit" // library marker davegut.samsungTvWebsocket, line 49
command "Return" // library marker davegut.samsungTvWebsocket, line 50
command "fastBack" // library marker davegut.samsungTvWebsocket, line 51
command "fastForward" // library marker davegut.samsungTvWebsocket, line 52
// == ART/Ambient Mode // library marker davegut.samsungTvWebsocket, line 54
def artMode() { // library marker davegut.samsungTvWebsocket, line 55
def artModeStatus = device.currentValue("artModeStatus") // library marker davegut.samsungTvWebsocket, line 56
def logData = [artModeStatus: artModeStatus, artModeWs: state.artModeWs] // library marker davegut.samsungTvWebsocket, line 57
if (getDataValue("frameTv") != "true") { // library marker davegut.samsungTvWebsocket, line 58
logData << [status: "Not a Frame TV"] // library marker davegut.samsungTvWebsocket, line 59
} else if (artModeStatus == "on") { // library marker davegut.samsungTvWebsocket, line 60
logData << [status: "artMode already set"] // library marker davegut.samsungTvWebsocket, line 61
} else { // library marker davegut.samsungTvWebsocket, line 62
if (state.artModeWs) { // library marker davegut.samsungTvWebsocket, line 63
def data = [value:"on", // library marker davegut.samsungTvWebsocket, line 64
request:"set_artmode_status", // library marker davegut.samsungTvWebsocket, line 65
id: "${getDataValue("uuid")}"] // library marker davegut.samsungTvWebsocket, line 66
data = JsonOutput.toJson(data) // library marker davegut.samsungTvWebsocket, line 67
artModeCmd(data) // library marker davegut.samsungTvWebsocket, line 68
logData << [status: "Sending artMode WS Command"] // library marker davegut.samsungTvWebsocket, line 69
} else { // library marker davegut.samsungTvWebsocket, line 70
sendKey("POWER") // library marker davegut.samsungTvWebsocket, line 71
logData << [status: "Sending Power WS Command"] // library marker davegut.samsungTvWebsocket, line 72
if (artModeStatus == "none") { // library marker davegut.samsungTvWebsocket, line 73
logData << [NOTE: "SENT BLIND. Enable SmartThings interface!"] // library marker davegut.samsungTvWebsocket, line 74
} // library marker davegut.samsungTvWebsocket, line 75
} // library marker davegut.samsungTvWebsocket, line 76
runIn(10, getArtModeStatus) // library marker davegut.samsungTvWebsocket, line 77
} // library marker davegut.samsungTvWebsocket, line 78
logInfo("artMode: ${logData}") // library marker davegut.samsungTvWebsocket, line 79
} // library marker davegut.samsungTvWebsocket, line 80
def getArtModeStatus() { // library marker davegut.samsungTvWebsocket, line 82
if (getDataValue("frameTv") == "true") { // library marker davegut.samsungTvWebsocket, line 83
if (state.artModeWs) { // library marker davegut.samsungTvWebsocket, line 84
def data = [request:"get_artmode_status", // library marker davegut.samsungTvWebsocket, line 85
id: "${getDataValue("uuid")}"] // library marker davegut.samsungTvWebsocket, line 86
data = JsonOutput.toJson(data) // library marker davegut.samsungTvWebsocket, line 87
artModeCmd(data) // library marker davegut.samsungTvWebsocket, line 88
} else { // library marker davegut.samsungTvWebsocket, line 89
refresh() // library marker davegut.samsungTvWebsocket, line 90
} // library marker davegut.samsungTvWebsocket, line 91
} // library marker davegut.samsungTvWebsocket, line 92
} // library marker davegut.samsungTvWebsocket, line 93
def artModeCmd(data) { // library marker davegut.samsungTvWebsocket, line 95
def cmdData = [method:"ms.channel.emit", // library marker davegut.samsungTvWebsocket, line 96
params:[data:"${data}", // library marker davegut.samsungTvWebsocket, line 97
to:"host", // library marker davegut.samsungTvWebsocket, line 98
event:"art_app_request"]] // library marker davegut.samsungTvWebsocket, line 99
cmdData = JsonOutput.toJson(cmdData) // library marker davegut.samsungTvWebsocket, line 100
sendMessage("frameArt", cmdData) // library marker davegut.samsungTvWebsocket, line 101
} // library marker davegut.samsungTvWebsocket, line 102
def ambientMode() { // library marker davegut.samsungTvWebsocket, line 104
sendKey("AMBIENT") // library marker davegut.samsungTvWebsocket, line 105
runIn(10, refresh) // library marker davegut.samsungTvWebsocket, line 106
} // library marker davegut.samsungTvWebsocket, line 107
// == Remote Commands // library marker davegut.samsungTvWebsocket, line 109
def mute() { sendKeyThenRefresh("MUTE") } // library marker davegut.samsungTvWebsocket, line 110
def unmute() { mute() } // library marker davegut.samsungTvWebsocket, line 112
def volumeUp() { sendKeyThenRefresh("VOLUP") } // library marker davegut.samsungTvWebsocket, line 114
def volumeDown() { sendKeyThenRefresh("VOLDOWN") } // library marker davegut.samsungTvWebsocket, line 116
def play() { sendKeyThenRefresh("PLAY") } // library marker davegut.samsungTvWebsocket, line 118
def pause() { sendKeyThenRefresh("PAUSE") } // library marker davegut.samsungTvWebsocket, line 120
def stop() { sendKeyThenRefresh("STOP") } // library marker davegut.samsungTvWebsocket, line 122
def exit() { sendKeyThenRefresh("EXIT") } // library marker davegut.samsungTvWebsocket, line 124
def Return() { sendKeyThenRefresh("RETURN") } // library marker davegut.samsungTvWebsocket, line 126
def fastBack() { // library marker davegut.samsungTvWebsocket, line 128
sendKey("LEFT", "Press") // library marker davegut.samsungTvWebsocket, line 129
pauseExecution(1000) // library marker davegut.samsungTvWebsocket, line 130
sendKey("LEFT", "Release") // library marker davegut.samsungTvWebsocket, line 131
} // library marker davegut.samsungTvWebsocket, line 132
def fastForward() { // library marker davegut.samsungTvWebsocket, line 134
sendKey("RIGHT", "Press") // library marker davegut.samsungTvWebsocket, line 135
pauseExecution(1000) // library marker davegut.samsungTvWebsocket, line 136
sendKey("RIGHT", "Release") // library marker davegut.samsungTvWebsocket, line 137
} // library marker davegut.samsungTvWebsocket, line 138
def arrowLeft() { sendKey("LEFT") } // library marker davegut.samsungTvWebsocket, line 140
def arrowRight() { sendKey("RIGHT") } // library marker davegut.samsungTvWebsocket, line 142
def arrowUp() { sendKey("UP") } // library marker davegut.samsungTvWebsocket, line 144
def arrowDown() { sendKey("DOWN") } // library marker davegut.samsungTvWebsocket, line 146
def enter() { sendKeyThenRefresh("ENTER") } // library marker davegut.samsungTvWebsocket, line 148
def numericKeyPad() { sendKey("MORE") } // library marker davegut.samsungTvWebsocket, line 150
def home() { sendKey("HOME") } // library marker davegut.samsungTvWebsocket, line 152
def menu() { sendKey("MENU") } // library marker davegut.samsungTvWebsocket, line 154
def guide() { sendKey("GUIDE") } // library marker davegut.samsungTvWebsocket, line 156
def info() { enter() } // library marker davegut.samsungTvWebsocket, line 158
def source() { sourceSetOSD() } // library marker davegut.samsungTvWebsocket, line 160
def sourceSetOSD() { sendKey("SOURCE") } // library marker davegut.samsungTvWebsocket, line 161
def hdmi() { sourceToggle() } // library marker davegut.samsungTvWebsocket, line 163
def sourceToggle() { sendKeyThenRefresh("HDMI") } // library marker davegut.samsungTvWebsocket, line 164
def channelList() { sendKey("CH_LIST") } // library marker davegut.samsungTvWebsocket, line 166
def channelUp() { sendKeyThenRefresh("CHUP") } // library marker davegut.samsungTvWebsocket, line 168
def nextTrack() { channelUp() } // library marker davegut.samsungTvWebsocket, line 169
def channelDown() { sendKeyThenRefresh("CHDOWN") } // library marker davegut.samsungTvWebsocket, line 171
def previousTrack() { channelDown() } // library marker davegut.samsungTvWebsocket, line 172
// Uses ST interface if available. // library marker davegut.samsungTvWebsocket, line 174
def channelSet(channel) { // library marker davegut.samsungTvWebsocket, line 175
if (connectST) { // library marker davegut.samsungTvWebsocket, line 176
setTvChannel(channel) // library marker davegut.samsungTvWebsocket, line 177
} else { // library marker davegut.samsungTvWebsocket, line 178
for (int i = 0; i < channel.length(); i++) { // library marker davegut.samsungTvWebsocket, line 179
sendKey(channel[i]) // library marker davegut.samsungTvWebsocket, line 180
} // library marker davegut.samsungTvWebsocket, line 181
enter() // library marker davegut.samsungTvWebsocket, line 182
sendEvent(name: "tvChannel", value: channel) // library marker davegut.samsungTvWebsocket, line 183
} // library marker davegut.samsungTvWebsocket, line 184
} // library marker davegut.samsungTvWebsocket, line 185
def previousChannel() { sendKeyThenRefresh("PRECH") } // library marker davegut.samsungTvWebsocket, line 187
def showMessage() { logWarn("showMessage: not implemented") } // library marker davegut.samsungTvWebsocket, line 189
// == WebSocket Communications / Parse // library marker davegut.samsungTvWebsocket, line 191
def sendKeyThenRefresh(key) { // library marker davegut.samsungTvWebsocket, line 192
sendKey(key) // library marker davegut.samsungTvWebsocket, line 193
if (connectST) { runIn(3, deviceRefresh) } // library marker davegut.samsungTvWebsocket, line 194
} // library marker davegut.samsungTvWebsocket, line 195
def sendKey(key, cmd = "Click") { // library marker davegut.samsungTvWebsocket, line 197
key = "KEY_${key.toUpperCase()}" // library marker davegut.samsungTvWebsocket, line 198
def data = [method:"ms.remote.control", // library marker davegut.samsungTvWebsocket, line 199
params:[Cmd:"${cmd}", // library marker davegut.samsungTvWebsocket, line 200
DataOfCmd:"${key}", // library marker davegut.samsungTvWebsocket, line 201
TypeOfRemote:"SendRemoteKey"]] // library marker davegut.samsungTvWebsocket, line 202
sendMessage("remote", JsonOutput.toJson(data).toString() ) // library marker davegut.samsungTvWebsocket, line 203
} // library marker davegut.samsungTvWebsocket, line 204
def xxxsendMessage(funct, data) { // library marker davegut.samsungTvWebsocket, line 206
def wsStat = device.currentValue("wsStatus") // library marker davegut.samsungTvWebsocket, line 207
logDebug("sendMessage: [wsStatus: ${wsStat}, function: ${funct}, data: ${data}, connectType: ${state.currentFunction}") // library marker davegut.samsungTvWebsocket, line 208
if (wsStat != "open" || state.currentFunction != funct) { // library marker davegut.samsungTvWebsocket, line 209
connect(funct) // library marker davegut.samsungTvWebsocket, line 210
pauseExecution(500) // library marker davegut.samsungTvWebsocket, line 211
} // library marker davegut.samsungTvWebsocket, line 212
interfaces.webSocket.sendMessage(data) // library marker davegut.samsungTvWebsocket, line 213
runIn(600, close) // library marker davegut.samsungTvWebsocket, line 214
} // library marker davegut.samsungTvWebsocket, line 215
def sendMessage(funct, data) { // library marker davegut.samsungTvWebsocket, line 217
def wsStat = device.currentValue("wsStatus") // library marker davegut.samsungTvWebsocket, line 218
Map logData = [method: "sendMessage", wsStat: wsStat, funct: funct, data: data] // library marker davegut.samsungTvWebsocket, line 219
logDebug("sendMessage: [wsStatus: ${wsStat}, function: ${funct}, data: ${data}, connectType: ${state.currentFunction}") // library marker davegut.samsungTvWebsocket, line 220
if (wsStat == "open" && state.currentFunction == funct) { // library marker davegut.samsungTvWebsocket, line 221
execMessage(data) // library marker davegut.samsungTvWebsocket, line 222
logData << [action: "execMessage"] // library marker davegut.samsungTvWebsocket, line 223
} else { // library marker davegut.samsungTvWebsocket, line 224
if (wsStat == "open") { close() } // library marker davegut.samsungTvWebsocket, line 225
state.wsData = data // library marker davegut.samsungTvWebsocket, line 226
def await = connect(funct) // library marker davegut.samsungTvWebsocket, line 227
runIn(600, close) // close ws after 5 minutes. // library marker davegut.samsungTvWebsocket, line 228
logData << [action: "connect"] // library marker davegut.samsungTvWebsocket, line 229
} // library marker davegut.samsungTvWebsocket, line 230
logDebug(logData) // library marker davegut.samsungTvWebsocket, line 231
} // library marker davegut.samsungTvWebsocket, line 232
def execMessage(data) { // library marker davegut.samsungTvWebsocket, line 233
interfaces.webSocket.sendMessage(data) // library marker davegut.samsungTvWebsocket, line 234
} // library marker davegut.samsungTvWebsocket, line 235
def webSocketOpen() { connect("remote") } // library marker davegut.samsungTvWebsocket, line 237
def webSocketClose() { close() } // library marker davegut.samsungTvWebsocket, line 238
def connect(funct) { // library marker davegut.samsungTvWebsocket, line 240
logDebug("connect: function = ${funct}") // library marker davegut.samsungTvWebsocket, line 241
def url // library marker davegut.samsungTvWebsocket, line 242
def name = "SHViaXRhdCBTYW1zdW5nIFJlbW90ZQ==" // library marker davegut.samsungTvWebsocket, line 243
if (getDataValue("tokenSupport") == "true") { // library marker davegut.samsungTvWebsocket, line 244
if (funct == "remote") { // library marker davegut.samsungTvWebsocket, line 245
url = "wss://${deviceIp}:8002/api/v2/channels/samsung.remote.control?name=${name}&token=${state.token}" // library marker davegut.samsungTvWebsocket, line 246
} else if (funct == "frameArt") { // library marker davegut.samsungTvWebsocket, line 247
url = "wss://${deviceIp}:8002/api/v2/channels/com.samsung.art-app?name=${name}&token=${state.token}" // library marker davegut.samsungTvWebsocket, line 248
} else { // library marker davegut.samsungTvWebsocket, line 249
logWarn("sendMessage: Invalid Function = ${funct}, tokenSupport = true") // library marker davegut.samsungTvWebsocket, line 250
} // library marker davegut.samsungTvWebsocket, line 251
} else { // library marker davegut.samsungTvWebsocket, line 252
if (funct == "remote") { // library marker davegut.samsungTvWebsocket, line 253
url = "ws://${deviceIp}:8001/api/v2/channels/samsung.remote.control?name=${name}" // library marker davegut.samsungTvWebsocket, line 254
} else if (funct == "frameArt") { // library marker davegut.samsungTvWebsocket, line 255
url = "ws://${deviceIp}:8001/api/v2/channels/com.samsung.art-app?name=${name}" // library marker davegut.samsungTvWebsocket, line 256
} else { // library marker davegut.samsungTvWebsocket, line 257
logWarn("sendMessage: Invalid Function = ${funct}, tokenSupport = false") // library marker davegut.samsungTvWebsocket, line 258
} // library marker davegut.samsungTvWebsocket, line 259
} // library marker davegut.samsungTvWebsocket, line 260
state.currentFunction = funct // library marker davegut.samsungTvWebsocket, line 261
interfaces.webSocket.connect(url, ignoreSSLIssues: true) // library marker davegut.samsungTvWebsocket, line 262
return // library marker davegut.samsungTvWebsocket, line 263
} // library marker davegut.samsungTvWebsocket, line 264
def close() { // library marker davegut.samsungTvWebsocket, line 266
logDebug("close") // library marker davegut.samsungTvWebsocket, line 267
interfaces.webSocket.close() // library marker davegut.samsungTvWebsocket, line 268
sendEvent(name: "wsStatus", value: "closed") // library marker davegut.samsungTvWebsocket, line 269
} // library marker davegut.samsungTvWebsocket, line 270
def webSocketStatus(message) { // library marker davegut.samsungTvWebsocket, line 272
def status // library marker davegut.samsungTvWebsocket, line 273
Map logData = [metnod: "webSocketStatus"] // library marker davegut.samsungTvWebsocket, line 274
if (message == "status: open") { // library marker davegut.samsungTvWebsocket, line 275
status = "open" // library marker davegut.samsungTvWebsocket, line 276
if (state.wsData != "") { // library marker davegut.samsungTvWebsocket, line 277
execMessage(state.wsData) // library marker davegut.samsungTvWebsocket, line 278
state.wsData = "" // library marker davegut.samsungTvWebsocket, line 279
logData << [action: "execMessage"] // library marker davegut.samsungTvWebsocket, line 280
} // library marker davegut.samsungTvWebsocket, line 281
} else if (message == "status: closing") { // library marker davegut.samsungTvWebsocket, line 282
status = "closed" // library marker davegut.samsungTvWebsocket, line 283
state.currentFunction = "close" // library marker davegut.samsungTvWebsocket, line 284
} else if (message.substring(0,7) == "failure") { // library marker davegut.samsungTvWebsocket, line 285
status = "closed-failure" // library marker davegut.samsungTvWebsocket, line 286
state.currentFunction = "close" // library marker davegut.samsungTvWebsocket, line 287
close() // library marker davegut.samsungTvWebsocket, line 288
} // library marker davegut.samsungTvWebsocket, line 289
sendEvent(name: "wsStatus", value: status) // library marker davegut.samsungTvWebsocket, line 290
logData << [wsStatus: status] // library marker davegut.samsungTvWebsocket, line 291
logDebug(logData) // library marker davegut.samsungTvWebsocket, line 292
} // library marker davegut.samsungTvWebsocket, line 293
def parse(resp) { // library marker davegut.samsungTvWebsocket, line 295
def logData = [method: "parse"] // library marker davegut.samsungTvWebsocket, line 296
try { // library marker davegut.samsungTvWebsocket, line 297
resp = parseJson(resp) // library marker davegut.samsungTvWebsocket, line 298
def event = resp.event // library marker davegut.samsungTvWebsocket, line 299
logData << [EVENT: event] // library marker davegut.samsungTvWebsocket, line 300
switch(event) { // library marker davegut.samsungTvWebsocket, line 301
case "ms.channel.connect": // library marker davegut.samsungTvWebsocket, line 302
def newToken = resp.data.token // library marker davegut.samsungTvWebsocket, line 303
if (newToken != null && newToken != state.token) { // library marker davegut.samsungTvWebsocket, line 304
state.token = newToken // library marker davegut.samsungTvWebsocket, line 305
logData << [TOKEN: "updated"] // library marker davegut.samsungTvWebsocket, line 306
} else { // library marker davegut.samsungTvWebsocket, line 307
logData << [TOKEN: "noChange"] // library marker davegut.samsungTvWebsocket, line 308
} // library marker davegut.samsungTvWebsocket, line 309
break // library marker davegut.samsungTvWebsocket, line 310
case "d2d_service_message": // library marker davegut.samsungTvWebsocket, line 311
def data = parseJson(resp.data) // library marker davegut.samsungTvWebsocket, line 312
if (data.event == "artmode_status" || // library marker davegut.samsungTvWebsocket, line 313
data.event == "art_mode_changed") { // library marker davegut.samsungTvWebsocket, line 314
def status = data.value // library marker davegut.samsungTvWebsocket, line 315
if (status == null) { status = data.status } // library marker davegut.samsungTvWebsocket, line 316
sendEvent(name: "artModeStatus", value: status) // library marker davegut.samsungTvWebsocket, line 317
logData << [artModeStatus: status] // library marker davegut.samsungTvWebsocket, line 318
state.artModeWs = true // library marker davegut.samsungTvWebsocket, line 319
} // library marker davegut.samsungTvWebsocket, line 320
break // library marker davegut.samsungTvWebsocket, line 321
case "ms.error": // library marker davegut.samsungTvWebsocket, line 322
case "ms.channel.ready": // library marker davegut.samsungTvWebsocket, line 323
case "ms.channel.clientConnect": // library marker davegut.samsungTvWebsocket, line 324
case "ms.channel.clientDisconnect": // library marker davegut.samsungTvWebsocket, line 325
case "ms.remote.touchEnable": // library marker davegut.samsungTvWebsocket, line 326
case "ms.remote.touchDisable": // library marker davegut.samsungTvWebsocket, line 327
break // library marker davegut.samsungTvWebsocket, line 328
default: // library marker davegut.samsungTvWebsocket, line 329
logData << [STATUS: "Not Parsed", DATA: resp.data] // library marker davegut.samsungTvWebsocket, line 330
break // library marker davegut.samsungTvWebsocket, line 331
} // library marker davegut.samsungTvWebsocket, line 332
logDebug(logData) // library marker davegut.samsungTvWebsocket, line 333
} catch (e) { // library marker davegut.samsungTvWebsocket, line 334
logData << [STATUS: "unhandled", ERROR: e] // library marker davegut.samsungTvWebsocket, line 335
logWarn(logData) // library marker davegut.samsungTvWebsocket, line 336
} // library marker davegut.samsungTvWebsocket, line 337
} // library marker davegut.samsungTvWebsocket, line 338
// ~~~~~ end include (89) davegut.samsungTvWebsocket ~~~~~
// ~~~~~ start include (88) davegut.samsungTvApps ~~~~~
library ( // library marker davegut.samsungTvApps, line 1
name: "samsungTvApps", // library marker davegut.samsungTvApps, line 2
namespace: "davegut", // library marker davegut.samsungTvApps, line 3
author: "Dave Gutheinz", // library marker davegut.samsungTvApps, line 4
description: "Samsung TV Applications", // library marker davegut.samsungTvApps, line 5
category: "utilities", // library marker davegut.samsungTvApps, line 6
documentationLink: "" // library marker davegut.samsungTvApps, line 7
) // library marker davegut.samsungTvApps, line 8
import groovy.json.JsonSlurper // library marker davegut.samsungTvApps, line 10
command "appOpenByName", ["string"] // library marker davegut.samsungTvApps, line 12
command "appClose" // library marker davegut.samsungTvApps, line 13
attribute "nowPlaying", "string" // library marker davegut.samsungTvApps, line 14
attribute "appName", "string" // library marker davegut.samsungTvApps, line 15
attribute "appId", "string" // library marker davegut.samsungTvApps, line 16
attribute "tvChannel", "string" // library marker davegut.samsungTvApps, line 17
attribute "tvChannelName", "string" // library marker davegut.samsungTvApps, line 18
def tvAppsPreferences() { // library marker davegut.samsungTvApps, line 20
input ("findAppCodes", "enum", title: "Scan for App Codes (takes 10 minutes)", // library marker davegut.samsungTvApps, line 21
options: ["off", "startOver", "find"], defaultValue: "off") // library marker davegut.samsungTvApps, line 22
} // library marker davegut.samsungTvApps, line 23
def appOpenByName(appName) { // library marker davegut.samsungTvApps, line 25
def logData = [method: "appOpenByName"] // library marker davegut.samsungTvApps, line 26
def thisApp = state.appData.find { it.key.toLowerCase().contains(appName.toLowerCase()) } // library marker davegut.samsungTvApps, line 27
if (thisApp != null) { // library marker davegut.samsungTvApps, line 28
def appId = thisApp.value // library marker davegut.samsungTvApps, line 29
appName = thisApp.key // library marker davegut.samsungTvApps, line 30
logData << [appName: appName, appId: appId] // library marker davegut.samsungTvApps, line 31
def uri = "http://${deviceIp}:8001/api/v2/applications/${appId}" // library marker davegut.samsungTvApps, line 32
try { // library marker davegut.samsungTvApps, line 33
httpPost(uri, body) { resp -> // library marker davegut.samsungTvApps, line 34
logData << [status: resp.statusLine, data: resp.data, success: resp.success] // library marker davegut.samsungTvApps, line 35
if (resp.status == 200) { // library marker davegut.samsungTvApps, line 36
if (connectST) { runIn(10, deviceRefresh) } // library marker davegut.samsungTvApps, line 37
sendEvent(name: "appName", value: appName) // library marker davegut.samsungTvApps, line 38
sendEvent(name: "appId", value: appId) // library marker davegut.samsungTvApps, line 39
logDebug(logData) // library marker davegut.samsungTvApps, line 40
} else { // library marker davegut.samsungTvApps, line 41
logWarn(logData) // library marker davegut.samsungTvApps, line 42
} // library marker davegut.samsungTvApps, line 43
} // library marker davegut.samsungTvApps, line 44
logDebug(logData) // library marker davegut.samsungTvApps, line 45
} catch (err) { // library marker davegut.samsungTvApps, line 46
logData << [status: "httpPost error", data: err] // library marker davegut.samsungTvApps, line 47
logWarn(logData) // library marker davegut.samsungTvApps, line 48
} // library marker davegut.samsungTvApps, line 49
} else { // library marker davegut.samsungTvApps, line 50
logData << [error: "appId is null"] // library marker davegut.samsungTvApps, line 51
logWarn(logData) // library marker davegut.samsungTvApps, line 52
} // library marker davegut.samsungTvApps, line 53
} // library marker davegut.samsungTvApps, line 54
def appClose(appId = device.currentValue("appId")) { // library marker davegut.samsungTvApps, line 56
def logData = [method: "appClose", appId: appId] // library marker davegut.samsungTvApps, line 57
if (appId == null || appId == " ") { // library marker davegut.samsungTvApps, line 58
logData << [status: "appId is null", action: "try exit()"] // library marker davegut.samsungTvApps, line 59
sendEvent(name: "appName", value: " ") // library marker davegut.samsungTvApps, line 60
sendEvent(name: "appId", value: " ") // library marker davegut.samsungTvApps, line 61
if (connectST) { runIn(5, deviceRefresh) } // library marker davegut.samsungTvApps, line 62
} else { // library marker davegut.samsungTvApps, line 63
logData << [status: "sending appClose"] // library marker davegut.samsungTvApps, line 64
Map params = [uri: "http://${deviceIp}:8001/api/v2/applications/${appId}", // library marker davegut.samsungTvApps, line 65
timeout: 3] // library marker davegut.samsungTvApps, line 66
asynchttpDelete("appCloseParse", params, [appId: appId]) // library marker davegut.samsungTvApps, line 67
} // library marker davegut.samsungTvApps, line 68
logDebug(logData) // library marker davegut.samsungTvApps, line 69
} // library marker davegut.samsungTvApps, line 70
def appCloseParse(resp, data) { // library marker davegut.samsungTvApps, line 72
Map logData = [method: "appCloseParse", data: data] // library marker davegut.samsungTvApps, line 73
if (resp.status == 200 && resp.json == true) { // library marker davegut.samsungTvApps, line 74
logData << [status: resp.status, success: resp.json] // library marker davegut.samsungTvApps, line 75
logDebug(logData) // library marker davegut.samsungTvApps, line 76
} else { // library marker davegut.samsungTvApps, line 77
logData << [status: resp.status, success: "false", action: "exit()"] // library marker davegut.samsungTvApps, line 78
exit() // library marker davegut.samsungTvApps, line 79
exit() // library marker davegut.samsungTvApps, line 80
logWarn(logData) // library marker davegut.samsungTvApps, line 81
} // library marker davegut.samsungTvApps, line 82
if (connectST) { runIn(5, deviceRefresh) } // library marker davegut.samsungTvApps, line 83
sendEvent(name: "appName", value: " ") // library marker davegut.samsungTvApps, line 84
sendEvent(name: "appId", value: " ") // library marker davegut.samsungTvApps, line 85
} // library marker davegut.samsungTvApps, line 86
def updateAppCodes() { // library marker davegut.samsungTvApps, line 88
Map logData = [method: "updateAppCodes", findAppCodes: findAppCodes] // library marker davegut.samsungTvApps, line 89
if (findAppCodes != "off" && // library marker davegut.samsungTvApps, line 90
device.currentValue("switch") == "on") { // library marker davegut.samsungTvApps, line 91
device.updateSetting("findAppCodes", [type:"enum", value: "off"]) // library marker davegut.samsungTvApps, line 92
if (findAppCodes == "startOver") { // library marker davegut.samsungTvApps, line 93
state.appData = [:] // library marker davegut.samsungTvApps, line 94
logData << [appData: "reset"] // library marker davegut.samsungTvApps, line 95
} // library marker davegut.samsungTvApps, line 96
unschedule("onPoll") // library marker davegut.samsungTvApps, line 97
state.appsInstalled = [] // library marker davegut.samsungTvApps, line 98
def appIds = appIdList() // library marker davegut.samsungTvApps, line 99
def appId = 0 // library marker davegut.samsungTvApps, line 100
logData << [codesToCheck: appIds.size(), status: "OK"] // library marker davegut.samsungTvApps, line 101
runIn(5, getAppData) // library marker davegut.samsungTvApps, line 102
logInfo(logData) // library marker davegut.samsungTvApps, line 103
} else if (device.currentValue("switch") == "off") { // library marker davegut.samsungTvApps, line 104
logData << [status: "FAILED", reason: "tv off"] // library marker davegut.samsungTvApps, line 105
logWarn(logData) // library marker davegut.samsungTvApps, line 106
} // library marker davegut.samsungTvApps, line 107
return logData // library marker davegut.samsungTvApps, line 108
} // library marker davegut.samsungTvApps, line 109
def getAppData(appId = 0) { // library marker davegut.samsungTvApps, line 111
Map logData = [method: "getAppData", appId: appId] // library marker davegut.samsungTvApps, line 112
def appIds = appIdList() // library marker davegut.samsungTvApps, line 113
if (appId < appIds.size()) { // library marker davegut.samsungTvApps, line 114
def appCode = appIds[appId] // library marker davegut.samsungTvApps, line 115
logData << [appCode: appCode] // library marker davegut.samsungTvApps, line 116
def thisDevice = state.appData.find { it.value == appCode } // library marker davegut.samsungTvApps, line 117
if (thisDevice != null) { // library marker davegut.samsungTvApps, line 118
logData << [thisDevice: thisDevice, status: "Already in appData"] // library marker davegut.samsungTvApps, line 119
appId = appId + 1 // library marker davegut.samsungTvApps, line 120
runInMillis(100, getAppData, [data: appId]) // library marker davegut.samsungTvApps, line 121
} else { // library marker davegut.samsungTvApps, line 122
logData << [status: "looking for App"] // library marker davegut.samsungTvApps, line 123
Map params = [uri: "http://${deviceIp}:8001/api/v2/applications/${appCode}", // library marker davegut.samsungTvApps, line 124
timeout: 10] // library marker davegut.samsungTvApps, line 125
asynchttpGet("parseGetAppData", params, [appId:appId, appCode: appCode]) // library marker davegut.samsungTvApps, line 126
} // library marker davegut.samsungTvApps, line 127
logDebug(logData) // library marker davegut.samsungTvApps, line 128
} else { // library marker davegut.samsungTvApps, line 129
runIn(5, setOnPollInterval) // library marker davegut.samsungTvApps, line 130
logData << [status: "Done finding", totalApps: state.appData.size(), appsInstalled: state.appsInstalled] // library marker davegut.samsungTvApps, line 131
state.remove("appsInstalled") // library marker davegut.samsungTvApps, line 132
state.remove("retry") // library marker davegut.samsungTvApps, line 133
logInfo(logData) // library marker davegut.samsungTvApps, line 134
} // library marker davegut.samsungTvApps, line 135
} // library marker davegut.samsungTvApps, line 136
def parseGetAppData(resp, data) { // library marker davegut.samsungTvApps, line 138
Map logData = [method: "parseGetAppData", data: data, status: resp.status] // library marker davegut.samsungTvApps, line 139
if (resp.status == 200) { // library marker davegut.samsungTvApps, line 140
def respData = new JsonSlurper().parseText(resp.data) // library marker davegut.samsungTvApps, line 141
String name = shortenName(respData.name) // library marker davegut.samsungTvApps, line 142
logData << [name: name, status: "appAdded"] // library marker davegut.samsungTvApps, line 143
state.appData << ["${name}": respData.id] // library marker davegut.samsungTvApps, line 144
state.appsInstalled << name // library marker davegut.samsungTvApps, line 145
logDebug(logData) // library marker davegut.samsungTvApps, line 146
state.retry = false // library marker davegut.samsungTvApps, line 147
runIn(1, getAppData, [data: data.appId + 1]) // library marker davegut.samsungTvApps, line 148
} else if (resp.status == 404) { // library marker davegut.samsungTvApps, line 149
logData << [status: "appNotAdded", reason: "not installed in TV"] // library marker davegut.samsungTvApps, line 150
logDebug(logData) // library marker davegut.samsungTvApps, line 151
state.retry = false // library marker davegut.samsungTvApps, line 152
runIn(1, getAppData, [data: data.appId + 1]) // library marker davegut.samsungTvApps, line 153
} else { // library marker davegut.samsungTvApps, line 154
logData << [retry: state.retry, status: "appNotAdded", // library marker davegut.samsungTvApps, line 155
reason: "invalid response from device"] // library marker davegut.samsungTvApps, line 156
if (state.retry == false) { // library marker davegut.samsungTvApps, line 157
logData << [action: "RETRYING"] // library marker davegut.samsungTvApps, line 158
state.retry = true // library marker davegut.samsungTvApps, line 159
runIn(5, getAppData, [data: data.appId]) // library marker davegut.samsungTvApps, line 160
} else { // library marker davegut.samsungTvApps, line 161
runIn(1, getAppData, [data: data.appId + 1]) // library marker davegut.samsungTvApps, line 162
} // library marker davegut.samsungTvApps, line 163
logWarn(logData) // library marker davegut.samsungTvApps, line 164
} // library marker davegut.samsungTvApps, line 165
} // library marker davegut.samsungTvApps, line 166
def shortenName(name) { // library marker davegut.samsungTvApps, line 168
if (name.contains(" - ")) { // library marker davegut.samsungTvApps, line 169
name = name.substring(0, name.indexOf(" - ")) // library marker davegut.samsungTvApps, line 170
} else if (name.contains(" by ")) { // library marker davegut.samsungTvApps, line 171
name = name.substring(0, name.indexOf(" by ")) // library marker davegut.samsungTvApps, line 172
} else if (name.contains(": ")) { // library marker davegut.samsungTvApps, line 173
name = name.substring(0, name.indexOf(": ")) // library marker davegut.samsungTvApps, line 174
} else if (name.contains(" | ")) { // library marker davegut.samsungTvApps, line 175
name = name.substring(0, name.indexOf(" | ")) // library marker davegut.samsungTvApps, line 176
} // library marker davegut.samsungTvApps, line 177
return name // library marker davegut.samsungTvApps, line 178
} // library marker davegut.samsungTvApps, line 179
def appIdList() { // library marker davegut.samsungTvApps, line 181
def appList = [ // library marker davegut.samsungTvApps, line 182
"Nuvyyo0002.tablo", "5b8c3eb16b.BeamCTVDev", "kk8MbItQ0H.VUDU", "vYmY3ACVaa.emby", // library marker davegut.samsungTvApps, line 183
"ZmmGjO6VKO.slingtv", "PvWgqxV3Xa.YouTubeTV", "LBUAQX1exg.Hulu", // library marker davegut.samsungTvApps, line 184
"AQKO41xyKP.AmazonAlexa", "3KA0pm7a7V.TubiTV", "cj37Ni3qXM.HBONow", "gzcc4LRFBF.Peacock", // library marker davegut.samsungTvApps, line 185
"9Ur5IzDKqV.TizenYouTube", "BjyffU0l9h.Stream", "3201907018807", "3201910019365", // library marker davegut.samsungTvApps, line 186
"3201907018784", "kIciSQlYEM.plex", "ckfgqqzvt0.dplus", "H7DIeAitkn.DisneyNOW", // library marker davegut.samsungTvApps, line 187
"MCmYXNxgcu.DisneyPlus", "tCyZuSsCVw.Britbox", "tzo5Zi4mCPv.fuboTV", "3HYANqBDJD.DFW", // library marker davegut.samsungTvApps, line 188
"EYm8vc1St4.Philo", "N4St7cQBPD.SiriusXM", "sNUyBbfvHf.SpectrumTV", "rJeHak5zRg.Spotify", // library marker davegut.samsungTvApps, line 189
"3KA0pm7a7V.TubiTV", "r1mzFxGfYe.E","3201606009684", "3201910019365", "3201807016597", // library marker davegut.samsungTvApps, line 190
"3201601007625", "3201710015037", "3201908019041", "3201504001965", "3201907018784", // library marker davegut.samsungTvApps, line 191
"org.tizen.browser", "org.tizen.primevideo", "org.tizen.netflix-app", // library marker davegut.samsungTvApps, line 192
"com.samsung.tv.aria-video", "com.samsung.tv.gallery", "org.tizen.apple.apple-music", // library marker davegut.samsungTvApps, line 193
"com.samsung.tv.store", // library marker davegut.samsungTvApps, line 194
"3202203026841", "3202103023232", "3202103023185", "3202012022468", "3202012022421", // library marker davegut.samsungTvApps, line 196
"3202011022316", "3202011022131", "3202010022098", "3202009021877", "3202008021577", // library marker davegut.samsungTvApps, line 197
"3202008021462", "3202008021439", "3202007021336", "3202004020674", "3202004020626", // library marker davegut.samsungTvApps, line 198
"3202003020365", "3201910019457", "3201910019449", "3201910019420", "3201910019378", // library marker davegut.samsungTvApps, line 199
"3201910019354", "3201909019271", "3201909019175", "3201908019041", "3201908019022", // library marker davegut.samsungTvApps, line 200
"3201907018786", "3201906018693", // library marker davegut.samsungTvApps, line 201
"3201901017768", "3201901017640", "3201812017479", "3201810017091", "3201810017074", // library marker davegut.samsungTvApps, line 202
"3201807016597", "3201806016432", "3201806016390", "3201806016381", "3201805016367", // library marker davegut.samsungTvApps, line 203
"3201803015944", "3201803015934", "3201803015869", "3201711015226", "3201710015067", // library marker davegut.samsungTvApps, line 204
"3201710015037", "3201710015016", "3201710014874", "3201710014866", "3201707014489", // library marker davegut.samsungTvApps, line 205
"3201706014250", "3201706012478", "3201704012212", "3201704012147", "3201703012079", // library marker davegut.samsungTvApps, line 206
"3201703012065", "3201703012029", "3201702011851", "3201612011418", "3201611011210", // library marker davegut.samsungTvApps, line 207
"3201611011005", "3201611010983", "3201608010385", "3201608010191", "3201607010031", // library marker davegut.samsungTvApps, line 208
"3201606009910", "3201606009798", "3201606009684", "3201604009182", "3201603008746", // library marker davegut.samsungTvApps, line 209
"3201603008210", "3201602007865", "3201601007670", "3201601007625", "3201601007230", // library marker davegut.samsungTvApps, line 210
"3201512006963", "3201512006785", "3201511006428", "3201510005981", "3201506003488", // library marker davegut.samsungTvApps, line 211
"3201506003486", "3201506003175", "3201504001965", "121299000612", "121299000101", // library marker davegut.samsungTvApps, line 212
"121299000089", "111399002220", "111399002034", "111399000741", "111299002148", // library marker davegut.samsungTvApps, line 213
"111299001912", "111299000769", "111012010001", "11101200001", "11101000407", // library marker davegut.samsungTvApps, line 214
"11091000000" // library marker davegut.samsungTvApps, line 215
] // library marker davegut.samsungTvApps, line 216
return appList // library marker davegut.samsungTvApps, line 217
} // library marker davegut.samsungTvApps, line 218
def updateAppName(tvName = device.currentValue("tvChannelName")) { // library marker davegut.samsungTvApps, line 220
// If the tvChannel is blank, the the name may reflect the appId // library marker davegut.samsungTvApps, line 221
// that is used by the device. Thanks SmartThings. // library marker davegut.samsungTvApps, line 222
String appId = " " // library marker davegut.samsungTvApps, line 223
String appName = " " // library marker davegut.samsungTvApps, line 224
Map logData = [method: "updateAppName", tvName: tvName] // library marker davegut.samsungTvApps, line 225
// There are some names that need translation based on known // library marker davegut.samsungTvApps, line 226
// idiosyncracies with the SmartThings implementation. // library marker davegut.samsungTvApps, line 227
// Go to translation table and if the translation exists, // library marker davegut.samsungTvApps, line 228
// set the appName to that value. // library marker davegut.samsungTvApps, line 229
def tempName = transTable().find { it.key == tvName } // library marker davegut.samsungTvApps, line 230
if (tempName != null) { // library marker davegut.samsungTvApps, line 231
appName = tempName.value // library marker davegut.samsungTvApps, line 232
logData << [tempName: tempName] // library marker davegut.samsungTvApps, line 233
} // library marker davegut.samsungTvApps, line 234
// See if the name is in the app list. If so, update here // library marker davegut.samsungTvApps, line 235
// and in states. // library marker davegut.samsungTvApps, line 236
def thisApp = state.appData.find { it.key == appName } // library marker davegut.samsungTvApps, line 237
if (thisApp) { // library marker davegut.samsungTvApps, line 238
logData << [thisApp: thisApp] // library marker davegut.samsungTvApps, line 239
appId = thisApp.value // library marker davegut.samsungTvApps, line 240
} else { // library marker davegut.samsungTvApps, line 241
Map params = [uri: "http://${deviceIp}:8001/api/v2/applications/${tvName}", // library marker davegut.samsungTvApps, line 242
timeout: 10] // library marker davegut.samsungTvApps, line 243
try { // library marker davegut.samsungTvApps, line 244
httpGet(params) { resp -> // library marker davegut.samsungTvApps, line 245
appId = resp.data.id // library marker davegut.samsungTvApps, line 246
appName = shortenName(resp.data.name) // library marker davegut.samsungTvApps, line 247
logData << [appId: appId, appName: appName] // library marker davegut.samsungTvApps, line 248
} // library marker davegut.samsungTvApps, line 249
}catch (err) { // library marker davegut.samsungTvApps, line 250
logData << [error: err] // library marker davegut.samsungTvApps, line 251
} // library marker davegut.samsungTvApps, line 252
if (appId != "") { // library marker davegut.samsungTvApps, line 253
state.appData << ["${appName}": appId] // library marker davegut.samsungTvApps, line 254
logData << [appData: ["${appName}": appId]] // library marker davegut.samsungTvApps, line 255
} // library marker davegut.samsungTvApps, line 256
} // library marker davegut.samsungTvApps, line 257
sendEvent(name: "appName", value: appName) // library marker davegut.samsungTvApps, line 258
sendEvent(name: "appId", value: appId) // library marker davegut.samsungTvApps, line 259
logDebug(logData) // library marker davegut.samsungTvApps, line 260
} // library marker davegut.samsungTvApps, line 261
def updateTitle() { // library marker davegut.samsungTvApps, line 263
String tvChannel = device.currentValue("tvChannel") // library marker davegut.samsungTvApps, line 264
String title = "${tvChannel}: ${device.currentValue("tvChannelName")}" // library marker davegut.samsungTvApps, line 265
if (tvChannel == " ") { // library marker davegut.samsungTvApps, line 266
title = "app: ${device.currentValue("appName")}" // library marker davegut.samsungTvApps, line 267
} // library marker davegut.samsungTvApps, line 268
sendEvent(name: "nowPlaying", value: title) // library marker davegut.samsungTvApps, line 269
} // library marker davegut.samsungTvApps, line 270
def transTable() { // library marker davegut.samsungTvApps, line 272
def translations = [ // library marker davegut.samsungTvApps, line 273
"org.tizen.primevideo": "Prime Video", // library marker davegut.samsungTvApps, line 274
"org.tizen.netflix-app": "Netflix", // library marker davegut.samsungTvApps, line 275
"org.tizen.browser": "Internet", // library marker davegut.samsungTvApps, line 276
"com.samsung.tv.aria-video": "Apple TV", // library marker davegut.samsungTvApps, line 277
"com.samsung.tv.gallery": "Gallery", // library marker davegut.samsungTvApps, line 278
"org.tizen.apple.apple-music": "Apple Music" // library marker davegut.samsungTvApps, line 279
] // library marker davegut.samsungTvApps, line 280
return translations // library marker davegut.samsungTvApps, line 281
} // library marker davegut.samsungTvApps, line 282
// ~~~~~ end include (88) davegut.samsungTvApps ~~~~~
// ~~~~~ start include (93) davegut.samsungTvPresets ~~~~~
library ( // library marker davegut.samsungTvPresets, line 1
name: "samsungTvPresets", // library marker davegut.samsungTvPresets, line 2
namespace: "davegut", // library marker davegut.samsungTvPresets, line 3
author: "Dave Gutheinz", // library marker davegut.samsungTvPresets, line 4
description: "Samsung TV Preset Implementation", // library marker davegut.samsungTvPresets, line 5
category: "utilities", // library marker davegut.samsungTvPresets, line 6
documentationLink: "" // library marker davegut.samsungTvPresets, line 7
) // library marker davegut.samsungTvPresets, line 8
command "presetUpdateNext" // library marker davegut.samsungTvPresets, line 10
command "presetCreate", [ // library marker davegut.samsungTvPresets, line 11
[name: "Preset Number", type: "ENUM", // library marker davegut.samsungTvPresets, line 12
constraints: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]]] // library marker davegut.samsungTvPresets, line 13
command "presetExecute", [ // library marker davegut.samsungTvPresets, line 14
[name: "Preset Number", type: "ENUM", // library marker davegut.samsungTvPresets, line 15
constraints: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]]] // library marker davegut.samsungTvPresets, line 16
command "presetCreateTv", [ // library marker davegut.samsungTvPresets, line 17
[name: "Preset Number", type: "ENUM", // library marker davegut.samsungTvPresets, line 18
constraints: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]], // library marker davegut.samsungTvPresets, line 19
[name: "tvChannel", type: "STRING"], // library marker davegut.samsungTvPresets, line 20
[name: "tvChannelName", type: "STRING"]] // library marker davegut.samsungTvPresets, line 21
attribute "presetUpdateNext", "string" // library marker davegut.samsungTvPresets, line 22
def presetUpdateNext() { // library marker davegut.samsungTvPresets, line 24
// Sets up next presetExecute to update the preset selected // library marker davegut.samsungTvPresets, line 25
// Has a 10 second timer to select preset to reset. Will then // library marker davegut.samsungTvPresets, line 26
// revert back to false // library marker davegut.samsungTvPresets, line 27
sendEvent(name: "presetUpdateNext", value: "true") // library marker davegut.samsungTvPresets, line 28
runIn(5, undoUpdate) // library marker davegut.samsungTvPresets, line 29
} // library marker davegut.samsungTvPresets, line 30
def undoUpdate() { sendEvent(name: "presetUpdateNext", value: "false") } // library marker davegut.samsungTvPresets, line 31
def presetCreate(presetNumber) { // library marker davegut.samsungTvPresets, line 33
// Called from Hubitat Device's page for TV or from presetExecute // library marker davegut.samsungTvPresets, line 34
// when state.updateNextPreset is true // library marker davegut.samsungTvPresets, line 35
refresh() // library marker davegut.samsungTvPresets, line 36
pauseExecution(2000) // library marker davegut.samsungTvPresets, line 37
Map logData = [method: "presetCreate", presetNumber: presetNumber] // library marker davegut.samsungTvPresets, line 38
String appName = device.currentValue("appName") // library marker davegut.samsungTvPresets, line 39
String tvChannel = device.currentValue("tvChannel") // library marker davegut.samsungTvPresets, line 40
if (appName != " ") { // library marker davegut.samsungTvPresets, line 41
String appId = device.currentValue("appId") // library marker davegut.samsungTvPresets, line 42
presetCreateApp(presetNumber, appName, appId) // library marker davegut.samsungTvPresets, line 43
logData << [action: "appPresetCreate"] // library marker davegut.samsungTvPresets, line 44
} else if (tvChannel != " ") { // library marker davegut.samsungTvPresets, line 45
String tvChannelName = device.currentValue("tvChannelName") // library marker davegut.samsungTvPresets, line 46
presetCreateTv(presetNumber, tvChannel, tvChannelName) // library marker davegut.samsungTvPresets, line 47
logData << [action: "tvPresetCreate"] // library marker davegut.samsungTvPresets, line 48
} // library marker davegut.samsungTvPresets, line 49
logInfo(logData) // library marker davegut.samsungTvPresets, line 50
} // library marker davegut.samsungTvPresets, line 51
def presetCreateApp(presetNumber, appName, appId) { // library marker davegut.samsungTvPresets, line 53
Map logData = [method: "appPresetCreate", presetNumber: presetNumber, // library marker davegut.samsungTvPresets, line 54
appName: appName, appId: appId] // library marker davegut.samsungTvPresets, line 55
Map thisPresetData = [type: "application", execute: appName, appId: appId] // library marker davegut.samsungTvPresets, line 56
logData << [thisPresetData: thisPresetData, status: "updating, check state to confirm"] // library marker davegut.samsungTvPresets, line 57
presetDataUpdate(presetNumber, thisPresetData) // library marker davegut.samsungTvPresets, line 58
logInfo(logData) // library marker davegut.samsungTvPresets, line 59
} // library marker davegut.samsungTvPresets, line 60
def presetCreateTv(presetNumber, tvChannel, tvChannelName) { // library marker davegut.samsungTvPresets, line 62
Map logData = [method: "resetCreateTv", presetNumber: presetNumber, // library marker davegut.samsungTvPresets, line 63
tvChannel: tvChannel, tvChannelName: tvChannelName] // library marker davegut.samsungTvPresets, line 64
Map thisPresetData = [type: "tvChannel", execute: tvChannel, tvChannelName: tvChannelName] // library marker davegut.samsungTvPresets, line 65
logData << [thisPresetData: thisPresetData, status: "updating, check state to confirm"] // library marker davegut.samsungTvPresets, line 66
presetDataUpdate(presetNumber, thisPresetData) // library marker davegut.samsungTvPresets, line 67
logInfo(logData) // library marker davegut.samsungTvPresets, line 68
} // library marker davegut.samsungTvPresets, line 69
def presetDataUpdate(presetNumber, thisPresetData) { // library marker davegut.samsungTvPresets, line 71
Map presetData = state.presetData // library marker davegut.samsungTvPresets, line 72
state.remove("presetData") // library marker davegut.samsungTvPresets, line 73
if (presetData == null) { presetData = [:] } // library marker davegut.samsungTvPresets, line 74
if (presetData.find{it.key == presetNumber}) { // library marker davegut.samsungTvPresets, line 75
presetData.remove(presetNumber) // library marker davegut.samsungTvPresets, line 76
} // library marker davegut.samsungTvPresets, line 77
presetData << ["${presetNumber}": thisPresetData] // library marker davegut.samsungTvPresets, line 78
state.presetData = presetData // library marker davegut.samsungTvPresets, line 79
} // library marker davegut.samsungTvPresets, line 80
def presetExecute(presetNumber) { // library marker davegut.samsungTvPresets, line 82
Map logData = [method: "presetExecute", presetNumber: presetNumber] // library marker davegut.samsungTvPresets, line 83
if (device.currentValue("presetUpdateNext") == "true") { // library marker davegut.samsungTvPresets, line 84
sendEvent(name: "presetUpdateNext", value: "false") // library marker davegut.samsungTvPresets, line 85
logData << [action: "presetCreate"] // library marker davegut.samsungTvPresets, line 86
presetCreate(presetNumber) // library marker davegut.samsungTvPresets, line 87
} else { // library marker davegut.samsungTvPresets, line 88
def thisPreset = state.presetData.find { it.key == presetNumber } // library marker davegut.samsungTvPresets, line 89
if (thisPreset == null) { // library marker davegut.samsungTvPresets, line 90
logData << [error: "presetNotSet"] // library marker davegut.samsungTvPresets, line 91
logWarn(logData) // library marker davegut.samsungTvPresets, line 92
} else { // library marker davegut.samsungTvPresets, line 93
def execute = thisPreset.value.execute // library marker davegut.samsungTvPresets, line 94
def presetType = thisPreset.value.type // library marker davegut.samsungTvPresets, line 95
if (presetType == "application") { // library marker davegut.samsungTvPresets, line 96
// Simply open the app. // library marker davegut.samsungTvPresets, line 97
appOpenByName(execute) // library marker davegut.samsungTvPresets, line 98
sendEvent(name: "appId", value: thisPreset.value.appId) // library marker davegut.samsungTvPresets, line 99
sendEvent(name: "appName", value: execute) // library marker davegut.samsungTvPresets, line 100
sendEvent(name: "tvChannel", value: " ") // library marker davegut.samsungTvPresets, line 101
sendEvent(name: "tvChannelName", value: " ") // library marker davegut.samsungTvPresets, line 102
logData << [appName: execute, appId: thisPreset.value.appId] // library marker davegut.samsungTvPresets, line 103
} else if (presetType == "tvChannel") { // library marker davegut.samsungTvPresets, line 104
// Close running app the update channel // library marker davegut.samsungTvPresets, line 105
if (!ST && device.currentValue("appId") != " ") { // library marker davegut.samsungTvPresets, line 106
appClose() // library marker davegut.samsungTvPresets, line 107
pauseExecution(7000) // library marker davegut.samsungTvPresets, line 108
} // library marker davegut.samsungTvPresets, line 109
channelSet(execute) // library marker davegut.samsungTvPresets, line 110
sendEvent(name: "appId", value: " ") // library marker davegut.samsungTvPresets, line 111
sendEvent(name: "appName", value: " ") // library marker davegut.samsungTvPresets, line 112
sendEvent(name: "tvChannel", value: execute) // library marker davegut.samsungTvPresets, line 113
sendEvent(name: "tvChannelName", value: thisPreset.value.tvChannelName) // library marker davegut.samsungTvPresets, line 114
logData << [tvChannel: tvChannel, tvChannelName: thisPreset.value.tvChannelName] // library marker davegut.samsungTvPresets, line 115
} else { // library marker davegut.samsungTvPresets, line 116
logData << [error: "invalid preset type"] // library marker davegut.samsungTvPresets, line 117
logWarn(logData) // library marker davegut.samsungTvPresets, line 118
} // library marker davegut.samsungTvPresets, line 119
} // library marker davegut.samsungTvPresets, line 120
runIn(2, updateTitle) // library marker davegut.samsungTvPresets, line 121
} // library marker davegut.samsungTvPresets, line 122
logDebug(logData) // library marker davegut.samsungTvPresets, line 123
} // library marker davegut.samsungTvPresets, line 124
// ~~~~~ end include (93) davegut.samsungTvPresets ~~~~~
// ~~~~~ start include (91) davegut.SmartThingsInterface ~~~~~
library ( // library marker davegut.SmartThingsInterface, line 1
name: "SmartThingsInterface", // library marker davegut.SmartThingsInterface, line 2
namespace: "davegut", // library marker davegut.SmartThingsInterface, line 3
author: "Dave Gutheinz", // library marker davegut.SmartThingsInterface, line 4
description: "Samsung TV SmartThings Capabilities", // library marker davegut.SmartThingsInterface, line 5
category: "utilities", // library marker davegut.SmartThingsInterface, line 6
documentationLink: "" // library marker davegut.SmartThingsInterface, line 7
) // library marker davegut.SmartThingsInterface, line 8
def stPreferences() { // library marker davegut.SmartThingsInterface, line 10
input ("connectST", "bool", title: "Connect to SmartThings for added functions", defaultValue: false) // library marker davegut.SmartThingsInterface, line 11
if (connectST) { // library marker davegut.SmartThingsInterface, line 12
input ("stApiKey", "string", title: "SmartThings API Key", defaultValue: "") // library marker davegut.SmartThingsInterface, line 13
if (stApiKey) { // library marker davegut.SmartThingsInterface, line 14
input ("stDeviceId", "string", title: "SmartThings Device ID", defaultValue: "") // library marker davegut.SmartThingsInterface, line 15
} // library marker davegut.SmartThingsInterface, line 16
input ("stPollInterval", "enum", title: "SmartThings Poll Interval (minutes)", // library marker davegut.SmartThingsInterface, line 17
options: ["off", "1", "5", "15", "30"], defaultValue: "15") // library marker davegut.SmartThingsInterface, line 18
input ("stTestData", "bool", title: "Get ST data dump for developer", defaultValue: false) // library marker davegut.SmartThingsInterface, line 19
} // library marker davegut.SmartThingsInterface, line 20
} // library marker davegut.SmartThingsInterface, line 21
def stUpdate() { // library marker davegut.SmartThingsInterface, line 23
def stData = [:] // library marker davegut.SmartThingsInterface, line 24
if (connectST) { // library marker davegut.SmartThingsInterface, line 25
stData << [connectST: "true"] // library marker davegut.SmartThingsInterface, line 26
stData << [connectST: connectST] // library marker davegut.SmartThingsInterface, line 27
if (!stApiKey || stApiKey == "") { // library marker davegut.SmartThingsInterface, line 28
logWarn("\n\n\t\tEnter the ST API Key and Save Preferences\n\n") // library marker davegut.SmartThingsInterface, line 29
stData << [status: "ERROR", date: "no stApiKey"] // library marker davegut.SmartThingsInterface, line 30
} else if (!stDeviceId || stDeviceId == "") { // library marker davegut.SmartThingsInterface, line 31
getDeviceList() // library marker davegut.SmartThingsInterface, line 32
logWarn("\n\n\t\tEnter the deviceId from the log List and Save Preferences\n\n") // library marker davegut.SmartThingsInterface, line 33
stData << [status: "ERROR", date: "no stDeviceId"] // library marker davegut.SmartThingsInterface, line 34
} else { // library marker davegut.SmartThingsInterface, line 35
def stPollInterval = stPollInterval // library marker davegut.SmartThingsInterface, line 36
if (stPollInterval == null) { // library marker davegut.SmartThingsInterface, line 37
stPollInterval = "15" // library marker davegut.SmartThingsInterface, line 38
device.updateSetting("stPollInterval", [type:"enum", value: "15"]) // library marker davegut.SmartThingsInterface, line 39
} // library marker davegut.SmartThingsInterface, line 40
switch(stPollInterval) { // library marker davegut.SmartThingsInterface, line 41
case "1" : runEvery1Minute(refresh); break // library marker davegut.SmartThingsInterface, line 42
case "5" : runEvery5Minutes(refresh); break // library marker davegut.SmartThingsInterface, line 43
case "15" : runEvery15Minutes(refresh); break // library marker davegut.SmartThingsInterface, line 44
case "30" : runEvery30Minutes(refresh); break // library marker davegut.SmartThingsInterface, line 45
default: unschedule("refresh") // library marker davegut.SmartThingsInterface, line 46
} // library marker davegut.SmartThingsInterface, line 47
deviceSetup() // library marker davegut.SmartThingsInterface, line 48
stData << [stPollInterval: stPollInterval] // library marker davegut.SmartThingsInterface, line 49
} // library marker davegut.SmartThingsInterface, line 50
} else { // library marker davegut.SmartThingsInterface, line 51
stData << [connectST: "false"] // library marker davegut.SmartThingsInterface, line 52
} // library marker davegut.SmartThingsInterface, line 53
logInfo("stUpdate: ${stData}") // library marker davegut.SmartThingsInterface, line 54
} // library marker davegut.SmartThingsInterface, line 55
def deviceSetup() { // library marker davegut.SmartThingsInterface, line 57
if (!stDeviceId || stDeviceId.trim() == "") { // library marker davegut.SmartThingsInterface, line 58
respData = "[status: FAILED, data: no stDeviceId]" // library marker davegut.SmartThingsInterface, line 59
logWarn("poll: [status: ERROR, errorMsg: no stDeviceId]") // library marker davegut.SmartThingsInterface, line 60
} else { // library marker davegut.SmartThingsInterface, line 61
def sendData = [ // library marker davegut.SmartThingsInterface, line 62
path: "/devices/${stDeviceId.trim()}/status", // library marker davegut.SmartThingsInterface, line 63
parse: "distResp" // library marker davegut.SmartThingsInterface, line 64
] // library marker davegut.SmartThingsInterface, line 65
asyncGet(sendData, "deviceSetup") // library marker davegut.SmartThingsInterface, line 66
} // library marker davegut.SmartThingsInterface, line 67
} // library marker davegut.SmartThingsInterface, line 68
def getDeviceList() { // library marker davegut.SmartThingsInterface, line 70
def sendData = [ // library marker davegut.SmartThingsInterface, line 71
path: "/devices", // library marker davegut.SmartThingsInterface, line 72
parse: "getDeviceListParse" // library marker davegut.SmartThingsInterface, line 73
] // library marker davegut.SmartThingsInterface, line 74
asyncGet(sendData) // library marker davegut.SmartThingsInterface, line 75
} // library marker davegut.SmartThingsInterface, line 76
def getDeviceListParse(resp, data) { // library marker davegut.SmartThingsInterface, line 78
def respData // library marker davegut.SmartThingsInterface, line 79
if (resp.status != 200) { // library marker davegut.SmartThingsInterface, line 80
respData = [status: "ERROR", // library marker davegut.SmartThingsInterface, line 81
httpCode: resp.status, // library marker davegut.SmartThingsInterface, line 82
errorMsg: resp.errorMessage] // library marker davegut.SmartThingsInterface, line 83
} else { // library marker davegut.SmartThingsInterface, line 84
try { // library marker davegut.SmartThingsInterface, line 85
respData = new JsonSlurper().parseText(resp.data) // library marker davegut.SmartThingsInterface, line 86
} catch (err) { // library marker davegut.SmartThingsInterface, line 87
respData = [status: "ERROR", // library marker davegut.SmartThingsInterface, line 88
errorMsg: err, // library marker davegut.SmartThingsInterface, line 89
respData: resp.data] // library marker davegut.SmartThingsInterface, line 90
} // library marker davegut.SmartThingsInterface, line 91
} // library marker davegut.SmartThingsInterface, line 92
if (respData.status == "ERROR") { // library marker davegut.SmartThingsInterface, line 93
logWarn("getDeviceListParse: ${respData}") // library marker davegut.SmartThingsInterface, line 94
} else { // library marker davegut.SmartThingsInterface, line 95
log.info "" // library marker davegut.SmartThingsInterface, line 96
respData.items.each { // library marker davegut.SmartThingsInterface, line 97
log.trace "${it.label}: ${it.deviceId}" // library marker davegut.SmartThingsInterface, line 98
} // library marker davegut.SmartThingsInterface, line 99
log.trace "Copy your device's deviceId value and enter into the device Preferences." // library marker davegut.SmartThingsInterface, line 100
} // library marker davegut.SmartThingsInterface, line 101
} // library marker davegut.SmartThingsInterface, line 102
def deviceSetupParse(mainData) { // library marker davegut.SmartThingsInterface, line 104
def setupData = [:] // library marker davegut.SmartThingsInterface, line 105
def pictureModes = mainData["custom.picturemode"].supportedPictureModes.value // library marker davegut.SmartThingsInterface, line 107
state.pictureModes = pictureModes // library marker davegut.SmartThingsInterface, line 108
setupData << [pictureModes: pictureModes] // library marker davegut.SmartThingsInterface, line 109
def soundModes = mainData["custom.soundmode"].supportedSoundModes.value // library marker davegut.SmartThingsInterface, line 111
state.soundModes = soundModes // library marker davegut.SmartThingsInterface, line 112
setupData << [soundModes: soundModes] // library marker davegut.SmartThingsInterface, line 113
logInfo("deviceSetupParse: ${setupData}") // library marker davegut.SmartThingsInterface, line 115
} // library marker davegut.SmartThingsInterface, line 116
def deviceCommand(cmdData) { // library marker davegut.SmartThingsInterface, line 118
logDebug("deviceCommand: $cmdData") // library marker davegut.SmartThingsInterface, line 119
def respData = [:] // library marker davegut.SmartThingsInterface, line 120
if (!stDeviceId || stDeviceId.trim() == "") { // library marker davegut.SmartThingsInterface, line 121
respData << [status: "FAILED", data: "no stDeviceId"] // library marker davegut.SmartThingsInterface, line 122
} else { // library marker davegut.SmartThingsInterface, line 123
def sendData = [ // library marker davegut.SmartThingsInterface, line 124
path: "/devices/${stDeviceId.trim()}/commands", // library marker davegut.SmartThingsInterface, line 125
cmdData: cmdData // library marker davegut.SmartThingsInterface, line 126
] // library marker davegut.SmartThingsInterface, line 127
respData = syncPost(sendData) // library marker davegut.SmartThingsInterface, line 128
} // library marker davegut.SmartThingsInterface, line 129
if (respData.status == "OK") { // library marker davegut.SmartThingsInterface, line 130
if (cmdData.capability && cmdData.capability != "refresh") { // library marker davegut.SmartThingsInterface, line 131
deviceRefresh() // library marker davegut.SmartThingsInterface, line 132
} else { // library marker davegut.SmartThingsInterface, line 133
poll() // library marker davegut.SmartThingsInterface, line 134
} // library marker davegut.SmartThingsInterface, line 135
}else { // library marker davegut.SmartThingsInterface, line 136
logWarn("deviceCommand: [status: ${respData.status}, data: ${respData}]") // library marker davegut.SmartThingsInterface, line 137
if (respData.toString().contains("Conflict")) { // library marker davegut.SmartThingsInterface, line 138
logWarn("Conflict internal to SmartThings. Device may be offline in SmartThings") // library marker davegut.SmartThingsInterface, line 139
} // library marker davegut.SmartThingsInterface, line 140
} // library marker davegut.SmartThingsInterface, line 141
} // library marker davegut.SmartThingsInterface, line 142
def statusParse(mainData) { // library marker davegut.SmartThingsInterface, line 144
Map logData = [method: "statusParse"] // library marker davegut.SmartThingsInterface, line 145
if (stTestData) { // library marker davegut.SmartThingsInterface, line 146
device.updateSetting("stTestData", [type:"bool", value: false]) // library marker davegut.SmartThingsInterface, line 147
Map testData = [stTestData: mainData] // library marker davegut.SmartThingsInterface, line 148
} // library marker davegut.SmartThingsInterface, line 149
String onOff = mainData.switch.switch.value // library marker davegut.SmartThingsInterface, line 150
Map parseResults = [:] // library marker davegut.SmartThingsInterface, line 151
if (onOff == "on") { // library marker davegut.SmartThingsInterface, line 152
Integer volume = mainData.audioVolume.volume.value.toInteger() // library marker davegut.SmartThingsInterface, line 153
sendEvent(name: "volume", value: volume) // library marker davegut.SmartThingsInterface, line 154
sendEvent(name: "level", value: volume) // library marker davegut.SmartThingsInterface, line 155
parseResults << [volume: volume] // library marker davegut.SmartThingsInterface, line 156
String mute = mainData.audioMute.mute.value // library marker davegut.SmartThingsInterface, line 158
sendEvent(name: "mute", value: mute) // library marker davegut.SmartThingsInterface, line 159
parseResults << [mute: mute] // library marker davegut.SmartThingsInterface, line 160
String inputSource = mainData.mediaInputSource.inputSource.value // library marker davegut.SmartThingsInterface, line 162
sendEvent(name: "inputSource", value: inputSource) // library marker davegut.SmartThingsInterface, line 163
parseResults << [inputSource: inputSource] // library marker davegut.SmartThingsInterface, line 164
String tvChannel = mainData.tvChannel.tvChannel.value // library marker davegut.SmartThingsInterface, line 166
if (tvChannel == null) { tvChannel = " " } // library marker davegut.SmartThingsInterface, line 167
String tvChannelName = mainData.tvChannel.tvChannelName.value // library marker davegut.SmartThingsInterface, line 168
parseResults << [tvChannel: tvChannel, tvChannelName: tvChannelName] // library marker davegut.SmartThingsInterface, line 169
if (tvChannel == " " && tvChannelName != device.currentValue("tvChannelName")) { // library marker davegut.SmartThingsInterface, line 170
// tvChannel indicates app, tvChannelName is thrn spp code (ST Version) // library marker davegut.SmartThingsInterface, line 171
if (tvChannelName.contains(".")) { // library marker davegut.SmartThingsInterface, line 172
runIn(2, updateAppName) // library marker davegut.SmartThingsInterface, line 173
} // library marker davegut.SmartThingsInterface, line 174
} // library marker davegut.SmartThingsInterface, line 175
sendEvent(name: "tvChannel", value: tvChannel) // library marker davegut.SmartThingsInterface, line 176
sendEvent(name: "tvChannelName", value: tvChannelName) // library marker davegut.SmartThingsInterface, line 177
String pictureMode = mainData["custom.picturemode"].pictureMode.value // library marker davegut.SmartThingsInterface, line 179
sendEvent(name: "pictureMode",value: pictureMode) // library marker davegut.SmartThingsInterface, line 180
parseResults << [pictureMode: pictureMode] // library marker davegut.SmartThingsInterface, line 181
String soundMode = mainData["custom.soundmode"].soundMode.value // library marker davegut.SmartThingsInterface, line 183
sendEvent(name: "soundMode",value: soundMode) // library marker davegut.SmartThingsInterface, line 184
parseResults << [soundMode: soundMode] // library marker davegut.SmartThingsInterface, line 185
} // library marker davegut.SmartThingsInterface, line 186
logDebug(logData) // library marker davegut.SmartThingsInterface, line 187
} // library marker davegut.SmartThingsInterface, line 188
private asyncGet(sendData, passData = "none") { // library marker davegut.SmartThingsInterface, line 190
if (!stApiKey || stApiKey.trim() == "") { // library marker davegut.SmartThingsInterface, line 191
logWarn("asyncGet: [status: ERROR, errorMsg: no stApiKey]") // library marker davegut.SmartThingsInterface, line 192
} else { // library marker davegut.SmartThingsInterface, line 193
logDebug("asyncGet: ${sendData}, ${passData}") // library marker davegut.SmartThingsInterface, line 194
def sendCmdParams = [ // library marker davegut.SmartThingsInterface, line 195
uri: "https://api.smartthings.com/v1", // library marker davegut.SmartThingsInterface, line 196
path: sendData.path, // library marker davegut.SmartThingsInterface, line 197
headers: ['Authorization': 'Bearer ' + stApiKey.trim()]] // library marker davegut.SmartThingsInterface, line 198
try { // library marker davegut.SmartThingsInterface, line 199
asynchttpGet(sendData.parse, sendCmdParams, [reason: passData]) // library marker davegut.SmartThingsInterface, line 200
} catch (error) { // library marker davegut.SmartThingsInterface, line 201
logWarn("asyncGet: [status: FAILED, errorMsg: ${error}]") // library marker davegut.SmartThingsInterface, line 202
} // library marker davegut.SmartThingsInterface, line 203
} // library marker davegut.SmartThingsInterface, line 204
} // library marker davegut.SmartThingsInterface, line 205
private syncGet(path){ // library marker davegut.SmartThingsInterface, line 207
def respData = [:] // library marker davegut.SmartThingsInterface, line 208
if (!stApiKey || stApiKey.trim() == "") { // library marker davegut.SmartThingsInterface, line 209
respData << [status: "FAILED", // library marker davegut.SmartThingsInterface, line 210
errorMsg: "No stApiKey"] // library marker davegut.SmartThingsInterface, line 211
} else { // library marker davegut.SmartThingsInterface, line 212
logDebug("syncGet: ${sendData}") // library marker davegut.SmartThingsInterface, line 213
def sendCmdParams = [ // library marker davegut.SmartThingsInterface, line 214
uri: "https://api.smartthings.com/v1", // library marker davegut.SmartThingsInterface, line 215
path: path, // library marker davegut.SmartThingsInterface, line 216
headers: ['Authorization': 'Bearer ' + stApiKey.trim()] // library marker davegut.SmartThingsInterface, line 217
] // library marker davegut.SmartThingsInterface, line 218
try { // library marker davegut.SmartThingsInterface, line 219
httpGet(sendCmdParams) {resp -> // library marker davegut.SmartThingsInterface, line 220
if (resp.status == 200 && resp.data != null) { // library marker davegut.SmartThingsInterface, line 221
respData << [status: "OK", results: resp.data] // library marker davegut.SmartThingsInterface, line 222
} else { // library marker davegut.SmartThingsInterface, line 223
respData << [status: "FAILED", // library marker davegut.SmartThingsInterface, line 224
httpCode: resp.status, // library marker davegut.SmartThingsInterface, line 225
errorMsg: resp.errorMessage] // library marker davegut.SmartThingsInterface, line 226
} // library marker davegut.SmartThingsInterface, line 227
} // library marker davegut.SmartThingsInterface, line 228
} catch (error) { // library marker davegut.SmartThingsInterface, line 229
respData << [status: "FAILED", // library marker davegut.SmartThingsInterface, line 230
errorMsg: error] // library marker davegut.SmartThingsInterface, line 231
} // library marker davegut.SmartThingsInterface, line 232
} // library marker davegut.SmartThingsInterface, line 233
return respData // library marker davegut.SmartThingsInterface, line 234
} // library marker davegut.SmartThingsInterface, line 235
private syncPost(sendData){ // library marker davegut.SmartThingsInterface, line 237
def respData = [:] // library marker davegut.SmartThingsInterface, line 238
if (!stApiKey || stApiKey.trim() == "") { // library marker davegut.SmartThingsInterface, line 239
respData << [status: "FAILED", // library marker davegut.SmartThingsInterface, line 240
errorMsg: "No stApiKey"] // library marker davegut.SmartThingsInterface, line 241
} else { // library marker davegut.SmartThingsInterface, line 242
logDebug("syncPost: ${sendData}") // library marker davegut.SmartThingsInterface, line 243
def cmdBody = [commands: [sendData.cmdData]] // library marker davegut.SmartThingsInterface, line 244
def sendCmdParams = [ // library marker davegut.SmartThingsInterface, line 245
uri: "https://api.smartthings.com/v1", // library marker davegut.SmartThingsInterface, line 246
path: sendData.path, // library marker davegut.SmartThingsInterface, line 247
headers: ['Authorization': 'Bearer ' + stApiKey.trim()], // library marker davegut.SmartThingsInterface, line 248
body : new groovy.json.JsonBuilder(cmdBody).toString() // library marker davegut.SmartThingsInterface, line 249
] // library marker davegut.SmartThingsInterface, line 250
try { // library marker davegut.SmartThingsInterface, line 251
httpPost(sendCmdParams) {resp -> // library marker davegut.SmartThingsInterface, line 252
if (resp.status == 200 && resp.data != null) { // library marker davegut.SmartThingsInterface, line 253
respData << [status: "OK", results: resp.data.results] // library marker davegut.SmartThingsInterface, line 254
} else { // library marker davegut.SmartThingsInterface, line 255
respData << [status: "FAILED", // library marker davegut.SmartThingsInterface, line 256
httpCode: resp.status, // library marker davegut.SmartThingsInterface, line 257
errorMsg: resp.errorMessage] // library marker davegut.SmartThingsInterface, line 258
} // library marker davegut.SmartThingsInterface, line 259
} // library marker davegut.SmartThingsInterface, line 260
} catch (error) { // library marker davegut.SmartThingsInterface, line 261
respData << [status: "FAILED", // library marker davegut.SmartThingsInterface, line 262
errorMsg: error] // library marker davegut.SmartThingsInterface, line 263
} // library marker davegut.SmartThingsInterface, line 264
} // library marker davegut.SmartThingsInterface, line 265
return respData // library marker davegut.SmartThingsInterface, line 266
} // library marker davegut.SmartThingsInterface, line 267
def distResp(resp, data) { // library marker davegut.SmartThingsInterface, line 269
def resplog = [:] // library marker davegut.SmartThingsInterface, line 270
if (resp.status == 200) { // library marker davegut.SmartThingsInterface, line 271
try { // library marker davegut.SmartThingsInterface, line 272
def respData = new JsonSlurper().parseText(resp.data) // library marker davegut.SmartThingsInterface, line 273
if (data.reason == "deviceSetup") { // library marker davegut.SmartThingsInterface, line 274
deviceSetupParse(respData.components.main) // library marker davegut.SmartThingsInterface, line 275
runIn(1, statusParse, [data: respData.components.main]) // library marker davegut.SmartThingsInterface, line 276
} else { // library marker davegut.SmartThingsInterface, line 277
statusParse(respData.components.main) // library marker davegut.SmartThingsInterface, line 278
} // library marker davegut.SmartThingsInterface, line 279
} catch (err) { // library marker davegut.SmartThingsInterface, line 280
resplog << [status: "ERROR", // library marker davegut.SmartThingsInterface, line 281
errorMsg: err, // library marker davegut.SmartThingsInterface, line 282
respData: resp.data] // library marker davegut.SmartThingsInterface, line 283
} // library marker davegut.SmartThingsInterface, line 284
} else { // library marker davegut.SmartThingsInterface, line 285
resplog << [status: "ERROR", // library marker davegut.SmartThingsInterface, line 286
httpCode: resp.status, // library marker davegut.SmartThingsInterface, line 287
errorMsg: resp.errorMessage] // library marker davegut.SmartThingsInterface, line 288
} // library marker davegut.SmartThingsInterface, line 289
if (resplog != [:]) { // library marker davegut.SmartThingsInterface, line 290
logWarn("distResp: ${resplog}") // library marker davegut.SmartThingsInterface, line 291
} // library marker davegut.SmartThingsInterface, line 292
} // library marker davegut.SmartThingsInterface, line 293
// ~~~~~ end include (91) davegut.SmartThingsInterface ~~~~~
// ~~~~~ start include (90) davegut.samsungTvST ~~~~~
library ( // library marker davegut.samsungTvST, line 1
name: "samsungTvST", // library marker davegut.samsungTvST, line 2
namespace: "davegut", // library marker davegut.samsungTvST, line 3
author: "Dave Gutheinz", // library marker davegut.samsungTvST, line 4
description: "Samsung TV SmartThings Capabilities", // library marker davegut.samsungTvST, line 5
category: "utilities", // library marker davegut.samsungTvST, line 6
documentationLink: "" // library marker davegut.samsungTvST, line 7
) // library marker davegut.samsungTvST, line 8
command "toggleSoundMode", [[name: "SmartThings Function"]] // library marker davegut.samsungTvST, line 10
command "togglePictureMode", [[name: "SmartThings Function"]] // library marker davegut.samsungTvST, line 11
command "sourceSetST", ["SmartThings Function"] // library marker davegut.samsungTvST, line 12
attribute "inputSource", "string" // library marker davegut.samsungTvST, line 13
command "setVolume", ["SmartThings Function"] // library marker davegut.samsungTvST, line 14
command "setPictureMode", ["SmartThings Function"] // library marker davegut.samsungTvST, line 15
command "setSoundMode", ["SmartThings Function"] // library marker davegut.samsungTvST, line 16
command "setLevel", ["SmartThings Function"] // library marker davegut.samsungTvST, line 17
attribute "level", "NUMBER" // library marker davegut.samsungTvST, line 18
def deviceRefresh() { // library marker davegut.samsungTvST, line 20
if (connectST && stApiKey!= null) { // library marker davegut.samsungTvST, line 21
def cmdData = [ // library marker davegut.samsungTvST, line 22
component: "main", // library marker davegut.samsungTvST, line 23
capability: "refresh", // library marker davegut.samsungTvST, line 24
command: "refresh", // library marker davegut.samsungTvST, line 25
arguments: []] // library marker davegut.samsungTvST, line 26
deviceCommand(cmdData) // library marker davegut.samsungTvST, line 27
} // library marker davegut.samsungTvST, line 28
} // library marker davegut.samsungTvST, line 29
def poll() { // library marker davegut.samsungTvST, line 31
if (!stDeviceId || stDeviceId.trim() == "") { // library marker davegut.samsungTvST, line 32
respData = "[status: FAILED, data: no stDeviceId]" // library marker davegut.samsungTvST, line 33
logWarn("poll: [status: ERROR, errorMsg: no stDeviceId]") // library marker davegut.samsungTvST, line 34
} else { // library marker davegut.samsungTvST, line 35
def sendData = [ // library marker davegut.samsungTvST, line 36
path: "/devices/${stDeviceId.trim()}/status", // library marker davegut.samsungTvST, line 37
parse: "distResp" // library marker davegut.samsungTvST, line 38
] // library marker davegut.samsungTvST, line 39
asyncGet(sendData, "statusParse") // library marker davegut.samsungTvST, line 40
} // library marker davegut.samsungTvST, line 41
} // library marker davegut.samsungTvST, line 42
def setLevel(level) { setVolume(level) } // library marker davegut.samsungTvST, line 44
def setVolume(volume) { // library marker davegut.samsungTvST, line 46
def cmdData = [ // library marker davegut.samsungTvST, line 47
component: "main", // library marker davegut.samsungTvST, line 48
capability: "audioVolume", // library marker davegut.samsungTvST, line 49
command: "setVolume", // library marker davegut.samsungTvST, line 50
arguments: [volume.toInteger()]] // library marker davegut.samsungTvST, line 51
deviceCommand(cmdData) // library marker davegut.samsungTvST, line 52
} // library marker davegut.samsungTvST, line 53
def togglePictureMode() { // library marker davegut.samsungTvST, line 55
// requires state.pictureModes // library marker davegut.samsungTvST, line 56
def pictureModes = state.pictureModes // library marker davegut.samsungTvST, line 57
def totalModes = pictureModes.size() // library marker davegut.samsungTvST, line 58
def currentMode = device.currentValue("pictureMode") // library marker davegut.samsungTvST, line 59
def modeNo = pictureModes.indexOf(currentMode) // library marker davegut.samsungTvST, line 60
def newModeNo = modeNo + 1 // library marker davegut.samsungTvST, line 61
if (newModeNo == totalModes) { newModeNo = 0 } // library marker davegut.samsungTvST, line 62
def newPictureMode = pictureModes[newModeNo] // library marker davegut.samsungTvST, line 63
setPictureMode(newPictureMode) // library marker davegut.samsungTvST, line 64
} // library marker davegut.samsungTvST, line 65
def setPictureMode(pictureMode) { // library marker davegut.samsungTvST, line 67
def cmdData = [ // library marker davegut.samsungTvST, line 68
component: "main", // library marker davegut.samsungTvST, line 69
capability: "custom.picturemode", // library marker davegut.samsungTvST, line 70
command: "setPictureMode", // library marker davegut.samsungTvST, line 71
arguments: [pictureMode]] // library marker davegut.samsungTvST, line 72
deviceCommand(cmdData) // library marker davegut.samsungTvST, line 73
} // library marker davegut.samsungTvST, line 74
def toggleSoundMode() { // library marker davegut.samsungTvST, line 76
def soundModes = state.soundModes // library marker davegut.samsungTvST, line 77
def totalModes = soundModes.size() // library marker davegut.samsungTvST, line 78
def currentMode = device.currentValue("soundMode") // library marker davegut.samsungTvST, line 79
def modeNo = soundModes.indexOf(currentMode) // library marker davegut.samsungTvST, line 80
def newModeNo = modeNo + 1 // library marker davegut.samsungTvST, line 81
if (newModeNo == totalModes) { newModeNo = 0 } // library marker davegut.samsungTvST, line 82
def soundMode = soundModes[newModeNo] // library marker davegut.samsungTvST, line 83
setSoundMode(soundMode) // library marker davegut.samsungTvST, line 84
} // library marker davegut.samsungTvST, line 85
def setSoundMode(soundMode) { // library marker davegut.samsungTvST, line 87
def cmdData = [ // library marker davegut.samsungTvST, line 88
component: "main", // library marker davegut.samsungTvST, line 89
capability: "custom.soundmode", // library marker davegut.samsungTvST, line 90
command: "setSoundMode", // library marker davegut.samsungTvST, line 91
arguments: [soundMode]] // library marker davegut.samsungTvST, line 92
deviceCommand(cmdData) // library marker davegut.samsungTvST, line 93
} // library marker davegut.samsungTvST, line 94
def toggleInputSource() { sourceToggle() } // library marker davegut.samsungTvST, line 96
def setInputSource(inputSource) { sourceSetST(inputSource) } // library marker davegut.samsungTvST, line 98
def sourceSetST(inputSource) { // library marker davegut.samsungTvST, line 99
def cmdData = [ // library marker davegut.samsungTvST, line 100
component: "main", // library marker davegut.samsungTvST, line 101
capability: "mediaInputSource", // library marker davegut.samsungTvST, line 102
command: "setInputSource", // library marker davegut.samsungTvST, line 103
arguments: [inputSource]] // library marker davegut.samsungTvST, line 104
deviceCommand(cmdData) // library marker davegut.samsungTvST, line 105
} // library marker davegut.samsungTvST, line 106
def setTvChannel(newChannel) { // library marker davegut.samsungTvST, line 108
def cmdData = [ // library marker davegut.samsungTvST, line 109
component: "main", // library marker davegut.samsungTvST, line 110
capability: "tvChannel", // library marker davegut.samsungTvST, line 111
command: "setTvChannel", // library marker davegut.samsungTvST, line 112
arguments: [newChannel]] // library marker davegut.samsungTvST, line 113
deviceCommand(cmdData) // library marker davegut.samsungTvST, line 114
} // library marker davegut.samsungTvST, line 115
// ~~~~~ end include (90) davegut.samsungTvST ~~~~~
// ~~~~~ start include (79) davegut.Logging ~~~~~
library ( // library marker davegut.Logging, line 1
name: "Logging", // library marker davegut.Logging, line 2
namespace: "davegut", // library marker davegut.Logging, line 3
author: "Dave Gutheinz", // library marker davegut.Logging, line 4
description: "Common Logging and info gathering Methods", // library marker davegut.Logging, line 5
category: "utilities", // library marker davegut.Logging, line 6
documentationLink: "" // library marker davegut.Logging, line 7
) // library marker davegut.Logging, line 8
def nameSpace() { return "davegut" } // library marker davegut.Logging, line 10
def version() { return "2.3.9b" } // library marker davegut.Logging, line 12
def label() { // library marker davegut.Logging, line 14
if (device) { // library marker davegut.Logging, line 15
return device.displayName + "-${version()}" // library marker davegut.Logging, line 16
} else { // library marker davegut.Logging, line 17
return app.getLabel() + "-${version()}" // library marker davegut.Logging, line 18
} // library marker davegut.Logging, line 19
} // library marker davegut.Logging, line 20
def listAttributes() { // library marker davegut.Logging, line 22
def attrData = device.getCurrentStates() // library marker davegut.Logging, line 23
Map attrs = [:] // library marker davegut.Logging, line 24
attrData.each { // library marker davegut.Logging, line 25
attrs << ["${it.name}": it.value] // library marker davegut.Logging, line 26
} // library marker davegut.Logging, line 27
return attrs // library marker davegut.Logging, line 28
} // library marker davegut.Logging, line 29
def setLogsOff() { // library marker davegut.Logging, line 31
def logData = [logEnable: logEnable] // library marker davegut.Logging, line 32
if (logEnable) { // library marker davegut.Logging, line 33
runIn(1800, debugLogOff) // library marker davegut.Logging, line 34
logData << [debugLogOff: "scheduled"] // library marker davegut.Logging, line 35
} // library marker davegut.Logging, line 36
return logData // library marker davegut.Logging, line 37
} // library marker davegut.Logging, line 38
def logTrace(msg){ log.trace "${label()}: ${msg}" } // library marker davegut.Logging, line 40
def logInfo(msg) { // library marker davegut.Logging, line 42
if (infoLog) { log.info "${label()}: ${msg}" } // library marker davegut.Logging, line 43
} // library marker davegut.Logging, line 44
def debugLogOff() { // library marker davegut.Logging, line 46
if (device) { // library marker davegut.Logging, line 47
device.updateSetting("logEnable", [type:"bool", value: false]) // library marker davegut.Logging, line 48
} else { // library marker davegut.Logging, line 49
app.updateSetting("logEnable", false) // library marker davegut.Logging, line 50
} // library marker davegut.Logging, line 51
logInfo("debugLogOff") // library marker davegut.Logging, line 52
} // library marker davegut.Logging, line 53
def logDebug(msg) { // library marker davegut.Logging, line 55
if (logEnable) { log.debug "${label()}: ${msg}" } // library marker davegut.Logging, line 56
} // library marker davegut.Logging, line 57
def logWarn(msg) { log.warn "${label()}: ${msg}" } // library marker davegut.Logging, line 59
def logError(msg) { log.error "${label()}: ${msg}" } // library marker davegut.Logging, line 61
// ~~~~~ end include (79) davegut.Logging ~~~~~