/* ===== HUBITAT INTEGRATION VERSION =====================================================
Hubitat - Samsung TV Remote Driver
Copyright 2022 Dave Gutheinz
License: https://github.com/DaveGut/HubitatActive/blob/master/KasaDevices/License.md
===== 2022 Version 4.1 ====================================================================
Version 4.1-2
a. Fix issue of commands sometimes not executing when WS is closed by increasing delay
between wsOpen and sendCommand.
b. Added wsOpen and wsClose to user interface per request.
c. Clarified "conflict" error on SmartThings Command with additional message. If a
Conflict is detected, the device is off-line in SmartThings. It can take several
minutes for ST to detect. This is a ST issue.
d. Created libraries to ease code maintenance and reuse.
===========================================================================================*/
def driverVer() { return "4.1-2" }
import groovy.json.JsonOutput
import groovy.json.JsonSlurper
metadata {
definition (name: "Samsung TV Remote",
namespace: "davegut",
author: "David Gutheinz",
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) {
input ("tvPwrOnMode", "enum", title: "TV Startup Display",
options: ["ART_MODE", "Ambient", "none"], defaultValue: "none")
input ("logEnable", "bool",
title: "Enable debug logging for 30 minutes", defaultValue: false)
input ("infoLog", "bool",
title: "Enable information logging " + helpLogo(),
defaultValue: true)
input ("traceLog", "bool", title: "Enable trace logging as directed by developer", defaultValue: false)
stPreferences()
}
def onPollOptions = ["local": "Local", "off": "DISABLE"]
input ("pollMethod", "enum", title: "Power Polling Method", defaultValue: "local",
options: onPollOptions)
input ("pollInterval","enum", title: "Power Polling Interval (seconds)",
options: ["off", "10", "15", "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: "wsStatus", value: "45")
runIn(1, updated)
}
def updated() {
unschedule()
close()
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) }
if (traceLog) { runIn(600, traceLogOff) }
updStatus << [logEnable: logEnable, infoLog: infoLog, traceLog: traceLog]
updStatus << [setOnPollInterval: setOnPollInterval()]
if (!pollMethod) {
pollMethod = "local"
device.updateSetting("pollMethod", [type:"enum", value: "local"])
}
updStatus << [pollMethod: newPollMethod]
if (!state.appData) { state.appData == [:] }
if (findAppCodes) {
runIn(1, updateAppCodes)
}
runIn(1, configure)
}
sendEvent(name: "numberOfButtons", value: 45)
sendEvent(name: "wsStatus", value: "closed")
updStatus << [attributes: listAttributes()]
state.standbyTest = false
logInfo("updated: ${updStatus}")
logTrace("updated: onPollCount = $state.onPollCount")
state.onPollCount = 0
}
def setOnPollInterval() {
if (pollMethod == "off") {
pollInterval = "DISABLED"
device.updateSetting("pollInterval", [type:"enum", value: "off"])
} else {
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)
state.configured = true
} else {
respData << tvData
}
runIn(1, stUpdate)
logInfo("configure: ${respData}")
return respData
}
// ===== Polling/Refresh Capability =====
def onPoll() {
if (traceLog) { state.onPollCount += 1 }
if (pollMethod == "st") {
def sendData = [
path: "/devices/${stDeviceId.trim()}/status",
parse: "stPollParse"
]
asyncGet(sendData, "stPollParse")
} else if (pollMethod == "local") {
def sendCmdParams = [
uri: "http://${deviceIp}:8001/api/v2/",
timeout: 6
]
asynchttpGet("onPollParse", sendCmdParams)
} else {
logWarn("onPoll: Polling is disabled")
}
if (getDataValue("driverVersion") != driverVer()) {
logInfo("Auto Configuring changes to this TV.")
updated()
pauseExecution(3000)
}
}
def stPollParse(resp, data) {
def respLog = [:]
if (resp.status == 200) {
try {
def respData = new JsonSlurper().parseText(resp.data)
def onOff = respData.components.main.switch.switch.value
if (device.currentValue("switch") != onOff) {
logInfo("stPollParse: [switch: ${onOff}]")
sendEvent(name: "switch", value: onOff)
if (onOff == "on") {
runIn(3, setPowerOnMode)
} else {
close()
}
}
} catch (err) {
respLog << [status: "ERROR",
errorMsg: err,
respData: resp.data]
}
} else {
respLog << [status: "ERROR",
httpCode: resp.status,
errorMsg: resp.errorMessage]
}
if (respLog != [:]) {
logWarn("stPollParse: ${respLog}")
}
}
def onPollParse(resp, data) {
def powerState
if (resp.status == 200) {
def tempPower = new JsonSlurper().parseText(resp.data).device.PowerState
if (tempPower == null) {
powerState = "on"
} else {
powerState = tempPower
}
} else {
logTrace("onPollParse: [state: error, status: $resp.status]")
powerState = "NC"
}
def onOff = "on"
if (powerState == "on") {
state.standbyTest = false
onOff = "on"
} else {
if (device.currentValue("switch") == "on") {
// If currently on, will need two non-"on" values to set switch off
if (!state.standbyTest) {
state.standbyTest = true
runIn(5, onPoll)
} else {
state.standbyTest = false
onOff = "off"
}
} else {
// If powerState goes to standby, this indicates tv screen is off
// as the tv powers down (takes 0.5 to 2 minutes to disconnect).
onOff = "off"
}
logTrace("onPollParse: [switch: ${device.currentValue("switch")}, onOff: ${onOff}, powerState: $powerState, stbyTest: $state.standbyTest]")
}
if (device.currentValue("switch") != onOff) {
sendEvent(name: "switch", value: onOff)
if (onOff == "on") {
runIn(5, setPowerOnMode)
refresh()
} else {
close()
refresh()
}
logInfo("onPollParse: [switch: ${onOff}, powerState: ${powerState}]")
}
}
// ===== Capability Switch =====
def on() {
logInfo("on: [frameTv: ${getDataValue("frameTv")}]")
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(5, onPoll)
}
def setPowerOnMode() {
logInfo("setPowerOnMode: [tvPwrOnMode: ${tvPwrOnMode}]")
if(tvPwrOnMode == "ART_MODE") {
getArtModeStatus()
pauseExecution(1000)
artMode()
} else if (tvPwrOnMode == "Ambient") {
ambientMode()
}
refresh()
}
def off() {
logInfo("off: [frameTv: ${getDataValue("frameTv")}]")
sendKey("POWER", "Press")
pauseExecution(3000)
sendKey("POWER", "Release")
runIn(5, onPoll)
}
// ===== 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
case 3 : numericKeyPad(); break
case 4 : Return(); break
case 6 : artMode(); break
case 7 : ambientMode(); break
case 45: ambientmodeExit(); break
case 8 : arrowLeft(); break
case 9 : arrowRight(); break
case 10: arrowUp(); break
case 11: arrowDown(); break
case 12: enter(); break
case 13: exit(); break
case 14: home(); break
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
case 24: source(); break
case 25: info(); break
case 26: channelList(); break
// ===== Other Commands =====
case 34: previousChannel(); break
case 35: hdmi(); break
case 36: fastBack(); break
case 37: fastForward(); break
// ===== Application Interface =====
case 38: appOpenByName("Browser"); break
case 39: appOpenByName("YouTube"); break
case 40: appOpenByName("RunNetflix"); break
case 41: close()
case 42: toggleSoundMode(); break
case 43: togglePictureMode(); break
case 44: appOpenByName(device.currentValue("variable")); break
default:
logDebug("push: Invalid Button Number!")
break
}
}
// ===== Libraries =====
// ~~~~~ start include (1367) 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
command "artMode" // library marker davegut.samsungTvWebsocket, line 16
attribute "artModeStatus", "string" // library marker davegut.samsungTvWebsocket, line 17
command "ambientMode" // library marker davegut.samsungTvWebsocket, line 18
// Remote Control Keys (samsungTV-Keys) // library marker davegut.samsungTvWebsocket, line 19
command "pause" // library marker davegut.samsungTvWebsocket, line 20
command "play" // library marker davegut.samsungTvWebsocket, line 21
command "stop" // library marker davegut.samsungTvWebsocket, line 22
command "sendKey", ["string"] // library marker davegut.samsungTvWebsocket, line 23
// Cursor and Entry Control // library marker davegut.samsungTvWebsocket, line 24
command "arrowLeft" // library marker davegut.samsungTvWebsocket, line 25
command "arrowRight" // library marker davegut.samsungTvWebsocket, line 26
command "arrowUp" // library marker davegut.samsungTvWebsocket, line 27
command "arrowDown" // library marker davegut.samsungTvWebsocket, line 28
command "enter" // library marker davegut.samsungTvWebsocket, line 29
command "numericKeyPad" // library marker davegut.samsungTvWebsocket, line 30
// Menu Access // library marker davegut.samsungTvWebsocket, line 31
command "home" // library marker davegut.samsungTvWebsocket, line 32
command "menu" // library marker davegut.samsungTvWebsocket, line 33
command "guide" // library marker davegut.samsungTvWebsocket, line 34
command "info" // library marker davegut.samsungTvWebsocket, line 35
// Source Commands // library marker davegut.samsungTvWebsocket, line 36
command "source" // library marker davegut.samsungTvWebsocket, line 37
command "hdmi" // library marker davegut.samsungTvWebsocket, line 38
// TV Channel // library marker davegut.samsungTvWebsocket, line 39
command "channelList" // library marker davegut.samsungTvWebsocket, line 40
command "channelUp" // library marker davegut.samsungTvWebsocket, line 41
command "channelDown" // library marker davegut.samsungTvWebsocket, line 42
command "previousChannel" // library marker davegut.samsungTvWebsocket, line 43
// Playing Navigation Commands // library marker davegut.samsungTvWebsocket, line 44
command "exit" // library marker davegut.samsungTvWebsocket, line 45
command "Return" // library marker davegut.samsungTvWebsocket, line 46
command "fastBack" // library marker davegut.samsungTvWebsocket, line 47
command "fastForward" // library marker davegut.samsungTvWebsocket, line 48
command "nextTrack", [[name: "Sets Channel Up"]] // library marker davegut.samsungTvWebsocket, line 49
command "previousTrack", [[name: "Sets Channel Down"]] // library marker davegut.samsungTvWebsocket, line 50
// == ART/Ambient Mode // library marker davegut.samsungTvWebsocket, line 52
def artMode() { // library marker davegut.samsungTvWebsocket, line 53
def artModeStatus = device.currentValue("artModeStatus") // library marker davegut.samsungTvWebsocket, line 54
def logData = [artModeStatus: artModeStatus, artModeWs: state.artModeWs] // library marker davegut.samsungTvWebsocket, line 55
if (getDataValue("frameTv") != "true") { // library marker davegut.samsungTvWebsocket, line 56
logData << [status: "Not a Frame TV"] // library marker davegut.samsungTvWebsocket, line 57
} else if (artModeStatus == "on") { // library marker davegut.samsungTvWebsocket, line 58
logData << [status: "artMode already set"] // library marker davegut.samsungTvWebsocket, line 59
} else { // library marker davegut.samsungTvWebsocket, line 60
if (state.artModeWs) { // library marker davegut.samsungTvWebsocket, line 61
def data = [value:"on", // library marker davegut.samsungTvWebsocket, line 62
request:"set_artmode_status", // library marker davegut.samsungTvWebsocket, line 63
id: "${getDataValue("uuid")}"] // library marker davegut.samsungTvWebsocket, line 64
data = JsonOutput.toJson(data) // library marker davegut.samsungTvWebsocket, line 65
artModeCmd(data) // library marker davegut.samsungTvWebsocket, line 66
logData << [status: "Sending artMode WS Command"] // library marker davegut.samsungTvWebsocket, line 67
} else { // library marker davegut.samsungTvWebsocket, line 68
sendKey("POWER") // library marker davegut.samsungTvWebsocket, line 69
logData << [status: "Sending Power WS Command"] // library marker davegut.samsungTvWebsocket, line 70
if (artModeStatus == "none") { // library marker davegut.samsungTvWebsocket, line 71
logData << [NOTE: "SENT BLIND. Enable SmartThings interface!"] // library marker davegut.samsungTvWebsocket, line 72
} // library marker davegut.samsungTvWebsocket, line 73
} // library marker davegut.samsungTvWebsocket, line 74
runIn(10, getArtModeStatus) // library marker davegut.samsungTvWebsocket, line 75
} // library marker davegut.samsungTvWebsocket, line 76
logInfo("artMode: ${logData}") // library marker davegut.samsungTvWebsocket, line 77
} // library marker davegut.samsungTvWebsocket, line 78
def getArtModeStatus() { // library marker davegut.samsungTvWebsocket, line 80
if (getDataValue("frameTv") == "true") { // library marker davegut.samsungTvWebsocket, line 81
if (state.artModeWs) { // library marker davegut.samsungTvWebsocket, line 82
def data = [request:"get_artmode_status", // library marker davegut.samsungTvWebsocket, line 83
id: "${getDataValue("uuid")}"] // library marker davegut.samsungTvWebsocket, line 84
data = JsonOutput.toJson(data) // library marker davegut.samsungTvWebsocket, line 85
artModeCmd(data) // library marker davegut.samsungTvWebsocket, line 86
} else { // library marker davegut.samsungTvWebsocket, line 87
refresh() // library marker davegut.samsungTvWebsocket, line 88
} // library marker davegut.samsungTvWebsocket, line 89
} // library marker davegut.samsungTvWebsocket, line 90
} // library marker davegut.samsungTvWebsocket, line 91
def artModeCmd(data) { // library marker davegut.samsungTvWebsocket, line 93
def cmdData = [method:"ms.channel.emit", // library marker davegut.samsungTvWebsocket, line 94
params:[data:"${data}", // library marker davegut.samsungTvWebsocket, line 95
to:"host", // library marker davegut.samsungTvWebsocket, line 96
event:"art_app_request"]] // library marker davegut.samsungTvWebsocket, line 97
cmdData = JsonOutput.toJson(cmdData) // library marker davegut.samsungTvWebsocket, line 98
sendMessage("frameArt", cmdData) // library marker davegut.samsungTvWebsocket, line 99
} // library marker davegut.samsungTvWebsocket, line 100
def ambientMode() { // library marker davegut.samsungTvWebsocket, line 102
sendKey("AMBIENT") // library marker davegut.samsungTvWebsocket, line 103
runIn(10, refresh) // library marker davegut.samsungTvWebsocket, line 104
} // library marker davegut.samsungTvWebsocket, line 105
// == Remote Commands // library marker davegut.samsungTvWebsocket, line 107
def mute() { sendKeyThenRefresh("MUTE") } // library marker davegut.samsungTvWebsocket, line 108
def unmute() { sendKeyThenRefresh("MUTE") } // library marker davegut.samsungTvWebsocket, line 110
def volumeUp() { sendKeyThenRefresh("VOLUP") } // library marker davegut.samsungTvWebsocket, line 112
def volumeDown() { sendKeyThenRefresh("VOLDOWN") } // library marker davegut.samsungTvWebsocket, line 114
def play() { sendKeyThenRefresh("PLAY") } // library marker davegut.samsungTvWebsocket, line 116
def pause() { sendKeyThenRefresh("PAUSE") } // library marker davegut.samsungTvWebsocket, line 118
def stop() { sendKeyThenRefresh("STOP") } // library marker davegut.samsungTvWebsocket, line 120
def exit() { sendKeyThenRefresh("EXIT") } // library marker davegut.samsungTvWebsocket, line 122
def Return() { sendKey("RETURN") } // library marker davegut.samsungTvWebsocket, line 124
def fastBack() { // library marker davegut.samsungTvWebsocket, line 126
sendKey("LEFT", "Press") // library marker davegut.samsungTvWebsocket, line 127
pauseExecution(1000) // library marker davegut.samsungTvWebsocket, line 128
sendKey("LEFT", "Release") // library marker davegut.samsungTvWebsocket, line 129
} // library marker davegut.samsungTvWebsocket, line 130
def fastForward() { // library marker davegut.samsungTvWebsocket, line 132
sendKey("RIGHT", "Press") // library marker davegut.samsungTvWebsocket, line 133
pauseExecution(1000) // library marker davegut.samsungTvWebsocket, line 134
sendKey("RIGHT", "Release") // library marker davegut.samsungTvWebsocket, line 135
} // library marker davegut.samsungTvWebsocket, line 136
def arrowLeft() { sendKey("LEFT") } // library marker davegut.samsungTvWebsocket, line 138
def arrowRight() { sendKey("RIGHT") } // library marker davegut.samsungTvWebsocket, line 140
def arrowUp() { sendKey("UP") } // library marker davegut.samsungTvWebsocket, line 142
def arrowDown() { sendKey("DOWN") } // library marker davegut.samsungTvWebsocket, line 144
def enter() { sendKey("ENTER") } // library marker davegut.samsungTvWebsocket, line 146
def numericKeyPad() { sendKey("MORE") } // library marker davegut.samsungTvWebsocket, line 148
def home() { sendKey("HOME") } // library marker davegut.samsungTvWebsocket, line 150
def menu() { sendKey("MENU") } // library marker davegut.samsungTvWebsocket, line 152
def guide() { sendKey("GUIDE") } // library marker davegut.samsungTvWebsocket, line 154
def info() { sendKey("INFO") } // library marker davegut.samsungTvWebsocket, line 156
def source() { sendKeyThenRefresh("SOURCE") } // library marker davegut.samsungTvWebsocket, line 158
def hdmi() { sendKeyThenRefresh("HDMI") } // library marker davegut.samsungTvWebsocket, line 160
def channelList() { sendKey("CH_LIST") } // library marker davegut.samsungTvWebsocket, line 162
def channelUp() { sendKeyThenRefresh("CHUP") } // library marker davegut.samsungTvWebsocket, line 164
def nextTrack() { channelUp() } // library marker davegut.samsungTvWebsocket, line 166
def channelDown() { sendKeyThenRefresh("CHDOWN") } // library marker davegut.samsungTvWebsocket, line 168
def previousTrack() { channelDown() } // library marker davegut.samsungTvWebsocket, line 170
def previousChannel() { sendKeyThenRefresh("PRECH") } // library marker davegut.samsungTvWebsocket, line 172
def showMessage() { logWarn("showMessage: not implemented") } // library marker davegut.samsungTvWebsocket, line 174
// == WebSocket Communications / Parse // library marker davegut.samsungTvWebsocket, line 176
def sendKeyThenRefresh(key) { // library marker davegut.samsungTvWebsocket, line 177
sendKey(key) // library marker davegut.samsungTvWebsocket, line 178
if (connectST) { runIn(5, deviceRefresh) } // library marker davegut.samsungTvWebsocket, line 179
} // library marker davegut.samsungTvWebsocket, line 180
def sendKey(key, cmd = "Click") { // library marker davegut.samsungTvWebsocket, line 182
key = "KEY_${key.toUpperCase()}" // library marker davegut.samsungTvWebsocket, line 183
def data = [method:"ms.remote.control", // library marker davegut.samsungTvWebsocket, line 184
params:[Cmd:"${cmd}", // library marker davegut.samsungTvWebsocket, line 185
DataOfCmd:"${key}", // library marker davegut.samsungTvWebsocket, line 186
TypeOfRemote:"SendRemoteKey"]] // library marker davegut.samsungTvWebsocket, line 187
sendMessage("remote", JsonOutput.toJson(data) ) // library marker davegut.samsungTvWebsocket, line 188
} // library marker davegut.samsungTvWebsocket, line 189
def sendMessage(funct, data) { // library marker davegut.samsungTvWebsocket, line 191
def wsStat = device.currentValue("wsStatus") // library marker davegut.samsungTvWebsocket, line 192
logDebug("sendMessage: [wsStatus: ${wsStat}, function: ${funct}, data: ${data}, connectType: ${state.currentFunction}") // library marker davegut.samsungTvWebsocket, line 193
logTrace("sendMessage: [wsStatus: ${wsStat}, function: ${funct}, data: ${data}, connectType: ${state.currentFunction}") // library marker davegut.samsungTvWebsocket, line 194
if (wsStat != "open" || state.currentFunction != funct) { // library marker davegut.samsungTvWebsocket, line 195
connect(funct) // library marker davegut.samsungTvWebsocket, line 196
pauseExecution(1200) // library marker davegut.samsungTvWebsocket, line 197
} // library marker davegut.samsungTvWebsocket, line 198
interfaces.webSocket.sendMessage(data) // library marker davegut.samsungTvWebsocket, line 199
runIn(60, close) // library marker davegut.samsungTvWebsocket, line 200
} // library marker davegut.samsungTvWebsocket, line 201
def webSocketOpen() { connect("remote") } // library marker davegut.samsungTvWebsocket, line 203
def webSocketClose() { close() } // library marker davegut.samsungTvWebsocket, line 204
def connect(funct) { // library marker davegut.samsungTvWebsocket, line 206
logDebug("connect: function = ${funct}") // library marker davegut.samsungTvWebsocket, line 207
def url // library marker davegut.samsungTvWebsocket, line 208
def name = "SHViaXRhdCBTYW1zdW5nIFJlbW90ZQ==" // library marker davegut.samsungTvWebsocket, line 209
if (getDataValue("tokenSupport") == "true") { // library marker davegut.samsungTvWebsocket, line 210
if (funct == "remote") { // library marker davegut.samsungTvWebsocket, line 211
url = "wss://${deviceIp}:8002/api/v2/channels/samsung.remote.control?name=${name}&token=${state.token}" // library marker davegut.samsungTvWebsocket, line 212
} else if (funct == "frameArt") { // library marker davegut.samsungTvWebsocket, line 213
url = "wss://${deviceIp}:8002/api/v2/channels/com.samsung.art-app?name=${name}&token=${state.token}" // library marker davegut.samsungTvWebsocket, line 214
} else { // library marker davegut.samsungTvWebsocket, line 215
logWarn("sendMessage: Invalid Function = ${funct}, tokenSupport = true") // library marker davegut.samsungTvWebsocket, line 216
} // library marker davegut.samsungTvWebsocket, line 217
} else { // library marker davegut.samsungTvWebsocket, line 218
if (funct == "remote") { // library marker davegut.samsungTvWebsocket, line 219
url = "ws://${deviceIp}:8001/api/v2/channels/samsung.remote.control?name=${name}" // library marker davegut.samsungTvWebsocket, line 220
} else if (funct == "frameArt") { // library marker davegut.samsungTvWebsocket, line 221
url = "ws://${deviceIp}:8001/api/v2/channels/com.samsung.art-app?name=${name}" // library marker davegut.samsungTvWebsocket, line 222
} else { // library marker davegut.samsungTvWebsocket, line 223
logWarn("sendMessage: Invalid Function = ${funct}, tokenSupport = false") // library marker davegut.samsungTvWebsocket, line 224
} // library marker davegut.samsungTvWebsocket, line 225
} // library marker davegut.samsungTvWebsocket, line 226
state.currentFunction = funct // library marker davegut.samsungTvWebsocket, line 227
interfaces.webSocket.connect(url, ignoreSSLIssues: true) // library marker davegut.samsungTvWebsocket, line 228
} // library marker davegut.samsungTvWebsocket, line 229
def close() { // library marker davegut.samsungTvWebsocket, line 231
logDebug("close") // library marker davegut.samsungTvWebsocket, line 232
interfaces.webSocket.close() // library marker davegut.samsungTvWebsocket, line 233
sendEvent(name: "wsStatus", value: "closed") // library marker davegut.samsungTvWebsocket, line 234
} // library marker davegut.samsungTvWebsocket, line 235
def webSocketStatus(message) { // library marker davegut.samsungTvWebsocket, line 237
def status // library marker davegut.samsungTvWebsocket, line 238
if (message == "status: open") { // library marker davegut.samsungTvWebsocket, line 239
status = "open" // library marker davegut.samsungTvWebsocket, line 240
} else if (message == "status: closing") { // library marker davegut.samsungTvWebsocket, line 241
status = "closed" // library marker davegut.samsungTvWebsocket, line 242
state.currentFunction = "close" // library marker davegut.samsungTvWebsocket, line 243
} else if (message.substring(0,7) == "failure") { // library marker davegut.samsungTvWebsocket, line 244
status = "closed-failure" // library marker davegut.samsungTvWebsocket, line 245
state.currentFunction = "close" // library marker davegut.samsungTvWebsocket, line 246
close() // library marker davegut.samsungTvWebsocket, line 247
} // library marker davegut.samsungTvWebsocket, line 248
sendEvent(name: "wsStatus", value: status) // library marker davegut.samsungTvWebsocket, line 249
logDebug("webSocketStatus: [status: ${status}, message: ${message}]") // library marker davegut.samsungTvWebsocket, line 250
} // library marker davegut.samsungTvWebsocket, line 251
def parse(resp) { // library marker davegut.samsungTvWebsocket, line 253
def logData = [:] // library marker davegut.samsungTvWebsocket, line 254
try { // library marker davegut.samsungTvWebsocket, line 255
resp = parseJson(resp) // library marker davegut.samsungTvWebsocket, line 256
def event = resp.event // library marker davegut.samsungTvWebsocket, line 257
logData << [EVENT: event] // library marker davegut.samsungTvWebsocket, line 258
switch(event) { // library marker davegut.samsungTvWebsocket, line 259
case "ms.channel.connect": // library marker davegut.samsungTvWebsocket, line 260
def newToken = resp.data.token // library marker davegut.samsungTvWebsocket, line 261
if (newToken != null && newToken != state.token) { // library marker davegut.samsungTvWebsocket, line 262
state.token = newToken // library marker davegut.samsungTvWebsocket, line 263
logData << [TOKEN: "updated"] // library marker davegut.samsungTvWebsocket, line 264
} else { // library marker davegut.samsungTvWebsocket, line 265
logData << [TOKEN: "noChange"] // library marker davegut.samsungTvWebsocket, line 266
} // library marker davegut.samsungTvWebsocket, line 267
break // library marker davegut.samsungTvWebsocket, line 268
case "d2d_service_message": // library marker davegut.samsungTvWebsocket, line 269
def data = parseJson(resp.data) // library marker davegut.samsungTvWebsocket, line 270
if (data.event == "artmode_status" || // library marker davegut.samsungTvWebsocket, line 271
data.event == "art_mode_changed") { // library marker davegut.samsungTvWebsocket, line 272
def status = data.value // library marker davegut.samsungTvWebsocket, line 273
if (status == null) { status = data.status } // library marker davegut.samsungTvWebsocket, line 274
sendEvent(name: "artModeStatus", value: status) // library marker davegut.samsungTvWebsocket, line 275
logData << [artModeStatus: status] // library marker davegut.samsungTvWebsocket, line 276
state.artModeWs = true // library marker davegut.samsungTvWebsocket, line 277
} // library marker davegut.samsungTvWebsocket, line 278
break // library marker davegut.samsungTvWebsocket, line 279
case "ms.error": // library marker davegut.samsungTvWebsocket, line 280
logData << [STATUS: "Error, Closing WS",DATA: resp.data] // library marker davegut.samsungTvWebsocket, line 281
close() // library marker davegut.samsungTvWebsocket, line 282
break // library marker davegut.samsungTvWebsocket, line 283
case "ms.channel.ready": // library marker davegut.samsungTvWebsocket, line 284
case "ms.channel.clientConnect": // library marker davegut.samsungTvWebsocket, line 285
case "ms.channel.clientDisconnect": // library marker davegut.samsungTvWebsocket, line 286
case "ms.remote.touchEnable": // library marker davegut.samsungTvWebsocket, line 287
case "ms.remote.touchDisable": // library marker davegut.samsungTvWebsocket, line 288
break // library marker davegut.samsungTvWebsocket, line 289
default: // library marker davegut.samsungTvWebsocket, line 290
logData << [STATUS: "Not Parsed", DATA: resp.data] // library marker davegut.samsungTvWebsocket, line 291
break // library marker davegut.samsungTvWebsocket, line 292
} // library marker davegut.samsungTvWebsocket, line 293
logDebug("parse: ${logData}") // library marker davegut.samsungTvWebsocket, line 294
} catch (e) { // library marker davegut.samsungTvWebsocket, line 295
logData << [STATUS: "unhandled", ERROR: e] // library marker davegut.samsungTvWebsocket, line 296
logWarn("parse: ${logData}") // library marker davegut.samsungTvWebsocket, line 297
} // library marker davegut.samsungTvWebsocket, line 298
} // library marker davegut.samsungTvWebsocket, line 299
// ~~~~~ end include (1367) davegut.samsungTvWebsocket ~~~~~
// ~~~~~ start include (1366) 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
command "appOpenByName", ["string"] // library marker davegut.samsungTvApps, line 10
command "appOpenByCode", ["string"] // library marker davegut.samsungTvApps, line 11
command "appClose" // library marker davegut.samsungTvApps, line 12
attribute "currentApp", "string" // library marker davegut.samsungTvApps, line 13
command "appRunBrowser" // library marker davegut.samsungTvApps, line 14
command "appRunYouTube" // library marker davegut.samsungTvApps, line 15
command "appRunNetflix" // library marker davegut.samsungTvApps, line 16
command "appRunPrimeVideo" // library marker davegut.samsungTvApps, line 17
command "appRunYouTubeTV" // library marker davegut.samsungTvApps, line 18
command "appRunHulu" // library marker davegut.samsungTvApps, line 19
def tvAppsPreferences() { // library marker davegut.samsungTvApps, line 21
input ("findAppCodes", "bool", title: "Scan for App Codes (takes 10 minutes)", defaultValue: false) // library marker davegut.samsungTvApps, line 22
} // library marker davegut.samsungTvApps, line 23
import groovy.json.JsonSlurper // library marker davegut.samsungTvApps, line 25
def appOpenByName(appName) { // library marker davegut.samsungTvApps, line 27
def thisApp = findThisApp(appName) // library marker davegut.samsungTvApps, line 28
def logData = [appName: thisApp[0], appId: thisApp[1]] // library marker davegut.samsungTvApps, line 29
if (thisApp[1] != "none") { // library marker davegut.samsungTvApps, line 30
[status: "execute appOpenByCode"] // library marker davegut.samsungTvApps, line 31
appOpenByCode(thisApp[1]) // library marker davegut.samsungTvApps, line 32
} else { // library marker davegut.samsungTvApps, line 33
def url = "http://${deviceIp}:8080/ws/apps/${appName}" // library marker davegut.samsungTvApps, line 34
try { // library marker davegut.samsungTvApps, line 35
httpPost(url, "") { resp -> // library marker davegut.samsungTvApps, line 36
sendEvent(name: "currentApp", value: respData.name) // library marker davegut.samsungTvApps, line 37
logData << [status: "OK", currentApp: respData.name] // library marker davegut.samsungTvApps, line 38
} // library marker davegut.samsungTvApps, line 39
runIn(5, refresh) // library marker davegut.samsungTvApps, line 40
} catch (err) { // library marker davegut.samsungTvApps, line 41
logData << [status: "appName Not Found", data: err] // library marker davegut.samsungTvApps, line 42
logWarn("appOpenByName: ${logData}") // library marker davegut.samsungTvApps, line 43
} // library marker davegut.samsungTvApps, line 44
} // library marker davegut.samsungTvApps, line 45
logDebug("appOpenByName: ${logData}") // library marker davegut.samsungTvApps, line 46
} // library marker davegut.samsungTvApps, line 47
def appOpenByCode(appId) { // library marker davegut.samsungTvApps, line 49
def appName = state.appData.find { it.value == appId } // library marker davegut.samsungTvApps, line 50
if (appName != null) { // library marker davegut.samsungTvApps, line 51
appName = appName.key // library marker davegut.samsungTvApps, line 52
} // library marker davegut.samsungTvApps, line 53
def logData = [appId: appId, appName: appName] // library marker davegut.samsungTvApps, line 54
def uri = "http://${deviceIp}:8001/api/v2/applications/${appId}" // library marker davegut.samsungTvApps, line 55
try { // library marker davegut.samsungTvApps, line 56
httpPost(uri, body) { resp -> // library marker davegut.samsungTvApps, line 57
if (appName == null) { // library marker davegut.samsungTvApps, line 58
runIn(3, getAppData, [data: appId]) // library marker davegut.samsungTvApps, line 59
} else { // library marker davegut.samsungTvApps, line 60
sendEvent(name: "currentApp", value: appName) // library marker davegut.samsungTvApps, line 61
logData << [currentApp: appName] // library marker davegut.samsungTvApps, line 62
} // library marker davegut.samsungTvApps, line 63
runIn(5, refresh) // library marker davegut.samsungTvApps, line 64
logData << [status: "OK", data: resp.data] // library marker davegut.samsungTvApps, line 65
} // library marker davegut.samsungTvApps, line 66
} catch (err) { // library marker davegut.samsungTvApps, line 67
logData << [status: "appId Not Found", data: err] // library marker davegut.samsungTvApps, line 68
logWarn("appOpenByCode: ${logData}") // library marker davegut.samsungTvApps, line 69
} // library marker davegut.samsungTvApps, line 70
logDebug("appOpenByCode: ${logData}") // library marker davegut.samsungTvApps, line 71
} // library marker davegut.samsungTvApps, line 72
def appClose() { // library marker davegut.samsungTvApps, line 74
def appId // library marker davegut.samsungTvApps, line 75
def appName = device.currentValue("currentApp") // library marker davegut.samsungTvApps, line 76
if (appName == " " || appName == null) { // library marker davegut.samsungTvApps, line 77
logWarn("appClose: [status: FAILED, reason: appName not set.]") // library marker davegut.samsungTvApps, line 78
return // library marker davegut.samsungTvApps, line 79
} // library marker davegut.samsungTvApps, line 80
def thisApp = findThisApp(appName) // library marker davegut.samsungTvApps, line 81
appId = thisApp[1] // library marker davegut.samsungTvApps, line 82
def logData = [appName: appName, appId: appId] // library marker davegut.samsungTvApps, line 83
Map params = [uri: "http://${deviceIp}:8001/api/v2/applications/${appId}", // library marker davegut.samsungTvApps, line 84
timeout: 3] // library marker davegut.samsungTvApps, line 85
try { // library marker davegut.samsungTvApps, line 86
asynchttpDelete("appCloseParse", params, [appId: appId]) // library marker davegut.samsungTvApps, line 87
logData: [status: "OK"] // library marker davegut.samsungTvApps, line 88
exit() // library marker davegut.samsungTvApps, line 89
} catch (err) { // library marker davegut.samsungTvApps, line 90
logData: [status: "FAILED", data: err] // library marker davegut.samsungTvApps, line 91
logWarn("appClose: ${logData}") // library marker davegut.samsungTvApps, line 92
} // library marker davegut.samsungTvApps, line 93
logDebug("appClose: ${logData}") // library marker davegut.samsungTvApps, line 94
} // library marker davegut.samsungTvApps, line 95
def appCloseParse(resp, data) { // library marker davegut.samsungTvApps, line 97
def logData = [appId: data.appId] // library marker davegut.samsungTvApps, line 98
if (resp.status == 200) { // library marker davegut.samsungTvApps, line 99
sendEvent(name: "currentApp", value: " ") // library marker davegut.samsungTvApps, line 100
logData << [status: "OK"] // library marker davegut.samsungTvApps, line 101
} else { // library marker davegut.samsungTvApps, line 102
logData << [status: "FAILED", status: resp.status] // library marker davegut.samsungTvApps, line 103
logWarn("appCloseParse: ${logData}") // library marker davegut.samsungTvApps, line 104
} // library marker davegut.samsungTvApps, line 105
logDebug("appCloseParse: ${logData}") // library marker davegut.samsungTvApps, line 106
} // library marker davegut.samsungTvApps, line 107
def findThisApp(appName) { // library marker davegut.samsungTvApps, line 109
def thisApp = state.appData.find { it.key.toLowerCase().contains(appName.toLowerCase()) } // library marker davegut.samsungTvApps, line 110
def appId = "none" // library marker davegut.samsungTvApps, line 111
if (thisApp != null) { // library marker davegut.samsungTvApps, line 112
appName = thisApp.key // library marker davegut.samsungTvApps, line 113
appId = thisApp.value // library marker davegut.samsungTvApps, line 114
} else { // library marker davegut.samsungTvApps, line 115
// Handle special case for browser (using switch to add other cases. // library marker davegut.samsungTvApps, line 116
switch(appName.toLowerCase()) { // library marker davegut.samsungTvApps, line 117
case "browser": // library marker davegut.samsungTvApps, line 118
appId = "org.tizen.browser" // library marker davegut.samsungTvApps, line 119
appName = "Browser" // library marker davegut.samsungTvApps, line 120
break // library marker davegut.samsungTvApps, line 121
case "youtubetv": // library marker davegut.samsungTvApps, line 122
appId = "PvWgqxV3Xa.YouTubeTV" // library marker davegut.samsungTvApps, line 123
appName = "YouTube TV" // library marker davegut.samsungTvApps, line 124
break // library marker davegut.samsungTvApps, line 125
case "netflix": // library marker davegut.samsungTvApps, line 126
appId = "3201907018807" // library marker davegut.samsungTvApps, line 127
appName = "Netflix" // library marker davegut.samsungTvApps, line 128
break // library marker davegut.samsungTvApps, line 129
case "youtube": // library marker davegut.samsungTvApps, line 130
appId = "9Ur5IzDKqV.TizenYouTube" // library marker davegut.samsungTvApps, line 131
appName = "YouTube" // library marker davegut.samsungTvApps, line 132
break // library marker davegut.samsungTvApps, line 133
case "amazoninstantvideo": // library marker davegut.samsungTvApps, line 134
appId = "3201910019365" // library marker davegut.samsungTvApps, line 135
appName = "Prime Video" // library marker davegut.samsungTvApps, line 136
break // library marker davegut.samsungTvApps, line 137
default: // library marker davegut.samsungTvApps, line 138
logWarn("findThisApp: ${appName} not found in appData") // library marker davegut.samsungTvApps, line 139
} // library marker davegut.samsungTvApps, line 140
} // library marker davegut.samsungTvApps, line 141
return [appName, appId] // library marker davegut.samsungTvApps, line 142
} // library marker davegut.samsungTvApps, line 143
def getAppData(appId) { // library marker davegut.samsungTvApps, line 145
def logData = [appId: appId] // library marker davegut.samsungTvApps, line 146
def thisApp = state.appData.find { it.value == appId } // library marker davegut.samsungTvApps, line 147
if (thisApp && !state.appIdIndex) { // library marker davegut.samsungTvApps, line 148
sendEvent(name: "currentApp", value: thisApp.key) // library marker davegut.samsungTvApps, line 149
logData << [currentApp: thisApp.key] // library marker davegut.samsungTvApps, line 150
} else { // library marker davegut.samsungTvApps, line 151
Map params = [uri: "http://${deviceIp}:8001/api/v2/applications/${appId}", // library marker davegut.samsungTvApps, line 152
timeout: 3] // library marker davegut.samsungTvApps, line 153
try { // library marker davegut.samsungTvApps, line 154
asynchttpGet("getAppDataParse", params, [appId: appId]) // library marker davegut.samsungTvApps, line 155
} catch (err) { // library marker davegut.samsungTvApps, line 156
logData: [status: "FAILED", data: err] // library marker davegut.samsungTvApps, line 157
} // library marker davegut.samsungTvApps, line 158
} // library marker davegut.samsungTvApps, line 159
logDebug("getAppData: ${logData}") // library marker davegut.samsungTvApps, line 160
} // library marker davegut.samsungTvApps, line 161
def getAppDataParse(resp, data) { // library marker davegut.samsungTvApps, line 163
def logData = [appId: data.appId] // library marker davegut.samsungTvApps, line 164
if (resp.status == 200) { // library marker davegut.samsungTvApps, line 165
def respData = new JsonSlurper().parseText(resp.data) // library marker davegut.samsungTvApps, line 166
logData << [resp: respData] // library marker davegut.samsungTvApps, line 167
state.appData << ["${respData.name}": respData.id] // library marker davegut.samsungTvApps, line 168
if(!state.appIdIndex && device.currentValue("currentApp") != currApp) { // library marker davegut.samsungTvApps, line 169
sendEvent(name: "currentApp", value: respData.name) // library marker davegut.samsungTvApps, line 170
logData << [currentApp: respData.name] // library marker davegut.samsungTvApps, line 171
} // library marker davegut.samsungTvApps, line 172
} else if (resp.status == 404) { // library marker davegut.samsungTvApps, line 173
logData << [status: "appNotPresent", code: resp.status] // library marker davegut.samsungTvApps, line 174
} else { // library marker davegut.samsungTvApps, line 175
logData << [status: "FAILED", reason: "${resp.status} response from TV"] // library marker davegut.samsungTvApps, line 176
} // library marker davegut.samsungTvApps, line 177
if (logData.status == "FAO:ED") { // library marker davegut.samsungTvApps, line 178
logWarn("getAppDataParse: ${logData}") // library marker davegut.samsungTvApps, line 179
} else { // library marker davegut.samsungTvApps, line 180
logInfo("getAppDataParse: ${logData}") // library marker davegut.samsungTvApps, line 181
} // library marker davegut.samsungTvApps, line 182
} // library marker davegut.samsungTvApps, line 183
def updateAppCodes() { // library marker davegut.samsungTvApps, line 185
state.appData = [:] // library marker davegut.samsungTvApps, line 186
if (device.currentValue("switch") == "on") { // library marker davegut.samsungTvApps, line 187
logInfo("updateAppCodes: [currentDbSize: ${state.appData.size()}, availableCodes: ${appIdList().size()}]") // library marker davegut.samsungTvApps, line 188
unschedule("onPoll") // library marker davegut.samsungTvApps, line 189
runIn(900, setOnPollInterval) // library marker davegut.samsungTvApps, line 190
state.appIdIndex = 0 // library marker davegut.samsungTvApps, line 191
findNextApp() // library marker davegut.samsungTvApps, line 192
} else { // library marker davegut.samsungTvApps, line 193
logWarn("getAppList: [status: FAILED, reason: tvOff]") // library marker davegut.samsungTvApps, line 194
} // library marker davegut.samsungTvApps, line 195
device.updateSetting("findAppCodes", [type:"bool", value: false]) // library marker davegut.samsungTvApps, line 196
} // library marker davegut.samsungTvApps, line 197
def findNextApp() { // library marker davegut.samsungTvApps, line 199
def appIds = appIdList() // library marker davegut.samsungTvApps, line 200
def logData = [:] // library marker davegut.samsungTvApps, line 201
if (state.appIdIndex < appIds.size()) { // library marker davegut.samsungTvApps, line 202
def nextApp = appIds[state.appIdIndex] // library marker davegut.samsungTvApps, line 203
state.appIdIndex += 1 // library marker davegut.samsungTvApps, line 204
getAppData(nextApp) // library marker davegut.samsungTvApps, line 205
runIn(6, findNextApp) // library marker davegut.samsungTvApps, line 206
} else { // library marker davegut.samsungTvApps, line 207
runIn(20, setOnPollInterval) // library marker davegut.samsungTvApps, line 208
logData << [status: "Complete", appIdsScanned: state.appIdIndex] // library marker davegut.samsungTvApps, line 209
logData << [totalApps: state.appData.size(), appData: state.appData] // library marker davegut.samsungTvApps, line 210
state.remove("appIdIndex") // library marker davegut.samsungTvApps, line 211
logInfo("findNextApp: ${logData}") // library marker davegut.samsungTvApps, line 212
} // library marker davegut.samsungTvApps, line 213
} // library marker davegut.samsungTvApps, line 214
def appIdList() { // library marker davegut.samsungTvApps, line 216
def appList = [ // library marker davegut.samsungTvApps, line 217
"kk8MbItQ0H.VUDU", "vYmY3ACVaa.emby", "ZmmGjO6VKO.slingtv", "MCmYXNxgcu.DisneyPlus", // library marker davegut.samsungTvApps, line 218
"PvWgqxV3Xa.YouTubeTV", "LBUAQX1exg.Hulu", "AQKO41xyKP.AmazonAlexa", "3KA0pm7a7V.TubiTV", // library marker davegut.samsungTvApps, line 219
"cj37Ni3qXM.HBONow", "gzcc4LRFBF.Peacock", "9Ur5IzDKqV.TizenYouTube", "BjyffU0l9h.Stream", // library marker davegut.samsungTvApps, line 220
"3202203026841", "3202103023232", "3202103023185", "3202012022468", "3202012022421", // library marker davegut.samsungTvApps, line 221
"3202011022316", "3202011022131", "3202010022098", "3202009021877", "3202008021577", // library marker davegut.samsungTvApps, line 222
"3202008021462", "3202008021439", "3202007021336", "3202004020674", "3202004020626", // library marker davegut.samsungTvApps, line 223
"3202003020365", "3201910019457", "3201910019449", "3201910019420", "3201910019378", // library marker davegut.samsungTvApps, line 224
"3201910019365", "3201910019354", "3201909019271", "3201909019175", "3201908019041", // library marker davegut.samsungTvApps, line 225
"3201908019022", "3201907018807", "3201907018786", "3201907018784", "3201906018693", // library marker davegut.samsungTvApps, line 226
"3201901017768", "3201901017640", "3201812017479", "3201810017091", "3201810017074", // library marker davegut.samsungTvApps, line 227
"3201807016597", "3201806016432", "3201806016390", "3201806016381", "3201805016367", // library marker davegut.samsungTvApps, line 228
"3201803015944", "3201803015934", "3201803015869", "3201711015226", "3201710015067", // library marker davegut.samsungTvApps, line 229
"3201710015037", "3201710015016", "3201710014874", "3201710014866", "3201707014489", // library marker davegut.samsungTvApps, line 230
"3201706014250", "3201706012478", "3201704012212", "3201704012147", "3201703012079", // library marker davegut.samsungTvApps, line 231
"3201703012065", "3201703012029", "3201702011851", "3201612011418", "3201611011210", // library marker davegut.samsungTvApps, line 232
"3201611011005", "3201611010983", "3201608010385", "3201608010191", "3201607010031", // library marker davegut.samsungTvApps, line 233
"3201606009910", "3201606009798", "3201606009684", "3201604009182", "3201603008746", // library marker davegut.samsungTvApps, line 234
"3201603008210", "3201602007865", "3201601007670", "3201601007625", "3201601007230", // library marker davegut.samsungTvApps, line 235
"3201512006963", "3201512006785", "3201511006428", "3201510005981", "3201506003488", // library marker davegut.samsungTvApps, line 236
"3201506003486", "3201506003175", "3201504001965", "121299000612", "121299000101", // library marker davegut.samsungTvApps, line 237
"121299000089", "111399002220", "111399002034", "111399000741", "111299002148", // library marker davegut.samsungTvApps, line 238
"111299001912", "111299000769", "111012010001", "11101200001", "11101000407", // library marker davegut.samsungTvApps, line 239
"11091000000" // library marker davegut.samsungTvApps, line 240
] // library marker davegut.samsungTvApps, line 241
return appList // library marker davegut.samsungTvApps, line 242
} // library marker davegut.samsungTvApps, line 243
def appRunBrowser() { appOpenByName("Browser") } // library marker davegut.samsungTvApps, line 245
def appRunYouTube() { appOpenByName("YouTube") } // library marker davegut.samsungTvApps, line 247
def appRunNetflix() { appOpenByName("Netflix") } // library marker davegut.samsungTvApps, line 249
def appRunPrimeVideo() { appOpenByName("Prime Video") } // library marker davegut.samsungTvApps, line 251
def appRunYouTubeTV() { appOpenByName("YouTubeTV") } // library marker davegut.samsungTvApps, line 253
def appRunHulu() { appOpenByName("Hulu") } // library marker davegut.samsungTvApps, line 255
// ~~~~~ end include (1366) davegut.samsungTvApps ~~~~~
// ~~~~~ start include (1369) 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
onPollOptions = ["st": "SmartThings", "local": "Local", "off": "DISABLE"] // library marker davegut.SmartThingsInterface, line 13
input ("stApiKey", "string", title: "SmartThings API Key", defaultValue: "") // library marker davegut.SmartThingsInterface, line 14
if (stApiKey) { // library marker davegut.SmartThingsInterface, line 15
input ("stDeviceId", "string", title: "SmartThings Device ID", defaultValue: "") // library marker davegut.SmartThingsInterface, line 16
} // library marker davegut.SmartThingsInterface, line 17
input ("stPollInterval", "enum", title: "SmartThings Poll Interval (minutes)", // library marker davegut.SmartThingsInterface, line 18
options: ["off", "1", "5", "15", "30"], defaultValue: "15") // library marker davegut.SmartThingsInterface, line 19
input ("stTestData", "bool", title: "Get ST data dump for developer", defaultValue: false) // library marker davegut.SmartThingsInterface, line 20
} // library marker davegut.SmartThingsInterface, line 21
} // library marker davegut.SmartThingsInterface, line 22
def stUpdate() { // library marker davegut.SmartThingsInterface, line 24
def stData = [:] // library marker davegut.SmartThingsInterface, line 25
if (connectST) { // library marker davegut.SmartThingsInterface, line 26
stData << [connectST: "true"] // library marker davegut.SmartThingsInterface, line 27
stData << [connectST: connectST] // library marker davegut.SmartThingsInterface, line 28
if (!stApiKey || stApiKey == "") { // library marker davegut.SmartThingsInterface, line 29
logWarn("\n\n\t\tEnter the ST API Key and Save Preferences\n\n") // library marker davegut.SmartThingsInterface, line 30
stData << [status: "ERROR", date: "no stApiKey"] // library marker davegut.SmartThingsInterface, line 31
} else if (!stDeviceId || stDeviceId == "") { // library marker davegut.SmartThingsInterface, line 32
getDeviceList() // library marker davegut.SmartThingsInterface, line 33
logWarn("\n\n\t\tEnter the deviceId from the Log List and Save Preferences\n\n") // library marker davegut.SmartThingsInterface, line 34
stData << [status: "ERROR", date: "no stDeviceId"] // library marker davegut.SmartThingsInterface, line 35
} else { // library marker davegut.SmartThingsInterface, line 36
def stPollInterval = stPollInterval // library marker davegut.SmartThingsInterface, line 37
if (stPollInterval == null) { // library marker davegut.SmartThingsInterface, line 38
stPollInterval = "15" // library marker davegut.SmartThingsInterface, line 39
device.updateSetting("stPollInterval", [type:"enum", value: "15"]) // library marker davegut.SmartThingsInterface, line 40
} // library marker davegut.SmartThingsInterface, line 41
switch(stPollInterval) { // library marker davegut.SmartThingsInterface, line 42
case "1" : runEvery1Minute(refresh); break // library marker davegut.SmartThingsInterface, line 43
case "5" : runEvery5Minutes(refresh); break // library marker davegut.SmartThingsInterface, line 44
case "15" : runEvery15Minutes(refresh); break // library marker davegut.SmartThingsInterface, line 45
case "30" : runEvery30Minutes(refresh); break // library marker davegut.SmartThingsInterface, line 46
default: unschedule("refresh") // library marker davegut.SmartThingsInterface, line 47
} // library marker davegut.SmartThingsInterface, line 48
deviceSetup() // library marker davegut.SmartThingsInterface, line 49
stData << [stPollInterval: stPollInterval] // library marker davegut.SmartThingsInterface, line 50
} // library marker davegut.SmartThingsInterface, line 51
} else { // library marker davegut.SmartThingsInterface, line 52
stData << [connectST: "false"] // library marker davegut.SmartThingsInterface, line 53
} // library marker davegut.SmartThingsInterface, line 54
logInfo("stUpdate: ${stData}") // library marker davegut.SmartThingsInterface, line 55
} // library marker davegut.SmartThingsInterface, line 56
def deviceSetup() { // library marker davegut.SmartThingsInterface, line 58
if (!stDeviceId || stDeviceId.trim() == "") { // library marker davegut.SmartThingsInterface, line 59
respData = "[status: FAILED, data: no stDeviceId]" // library marker davegut.SmartThingsInterface, line 60
logWarn("poll: [status: ERROR, errorMsg: no stDeviceId]") // library marker davegut.SmartThingsInterface, line 61
} else { // library marker davegut.SmartThingsInterface, line 62
def sendData = [ // library marker davegut.SmartThingsInterface, line 63
path: "/devices/${stDeviceId.trim()}/status", // library marker davegut.SmartThingsInterface, line 64
parse: "distResp" // library marker davegut.SmartThingsInterface, line 65
] // library marker davegut.SmartThingsInterface, line 66
asyncGet(sendData, "deviceSetup") // library marker davegut.SmartThingsInterface, line 67
} // library marker davegut.SmartThingsInterface, line 68
} // library marker davegut.SmartThingsInterface, line 69
def getDeviceList() { // library marker davegut.SmartThingsInterface, line 71
def sendData = [ // library marker davegut.SmartThingsInterface, line 72
path: "/devices", // library marker davegut.SmartThingsInterface, line 73
parse: "getDeviceListParse" // library marker davegut.SmartThingsInterface, line 74
] // library marker davegut.SmartThingsInterface, line 75
asyncGet(sendData) // library marker davegut.SmartThingsInterface, line 76
} // library marker davegut.SmartThingsInterface, line 77
def getDeviceListParse(resp, data) { // library marker davegut.SmartThingsInterface, line 79
def respData // library marker davegut.SmartThingsInterface, line 80
if (resp.status != 200) { // library marker davegut.SmartThingsInterface, line 81
respData = [status: "ERROR", // library marker davegut.SmartThingsInterface, line 82
httpCode: resp.status, // library marker davegut.SmartThingsInterface, line 83
errorMsg: resp.errorMessage] // library marker davegut.SmartThingsInterface, line 84
} else { // library marker davegut.SmartThingsInterface, line 85
try { // library marker davegut.SmartThingsInterface, line 86
respData = new JsonSlurper().parseText(resp.data) // library marker davegut.SmartThingsInterface, line 87
} catch (err) { // library marker davegut.SmartThingsInterface, line 88
respData = [status: "ERROR", // library marker davegut.SmartThingsInterface, line 89
errorMsg: err, // library marker davegut.SmartThingsInterface, line 90
respData: resp.data] // library marker davegut.SmartThingsInterface, line 91
} // library marker davegut.SmartThingsInterface, line 92
} // library marker davegut.SmartThingsInterface, line 93
if (respData.status == "ERROR") { // library marker davegut.SmartThingsInterface, line 94
logWarn("getDeviceListParse: ${respData}") // library marker davegut.SmartThingsInterface, line 95
} else { // library marker davegut.SmartThingsInterface, line 96
log.info "" // library marker davegut.SmartThingsInterface, line 97
respData.items.each { // library marker davegut.SmartThingsInterface, line 98
log.trace "${it.label}: ${it.deviceId}" // library marker davegut.SmartThingsInterface, line 99
} // library marker davegut.SmartThingsInterface, line 100
log.trace "Copy your device's deviceId value and enter into the device Preferences." // library marker davegut.SmartThingsInterface, line 101
} // library marker davegut.SmartThingsInterface, line 102
} // library marker davegut.SmartThingsInterface, line 103
def deviceSetupParse(mainData) { // library marker davegut.SmartThingsInterface, line 105
def setupData = [:] // library marker davegut.SmartThingsInterface, line 106
def supportedInputs = mainData.mediaInputSource.supportedInputSources.value // library marker davegut.SmartThingsInterface, line 107
state.supportedInputs = supportedInputs // library marker davegut.SmartThingsInterface, line 108
setupData << [supportedInputs: supportedInputs] // library marker davegut.SmartThingsInterface, line 109
def pictureModes = mainData["custom.picturemode"].supportedPictureModes.value // library marker davegut.SmartThingsInterface, line 111
state.pictureModes = pictureModes // library marker davegut.SmartThingsInterface, line 112
setupData << [pictureModes: pictureModes] // library marker davegut.SmartThingsInterface, line 113
def soundModes = mainData["custom.soundmode"].supportedSoundModes.value // library marker davegut.SmartThingsInterface, line 115
state.soundModes = soundModes // library marker davegut.SmartThingsInterface, line 116
setupData << [soundModes: soundModes] // library marker davegut.SmartThingsInterface, line 117
logInfo("deviceSetupParse: ${setupData}") // library marker davegut.SmartThingsInterface, line 119
} // library marker davegut.SmartThingsInterface, line 120
def deviceCommand(cmdData) { // library marker davegut.SmartThingsInterface, line 122
logTrace("deviceCommand: $cmdData") // library marker davegut.SmartThingsInterface, line 123
def respData = [:] // library marker davegut.SmartThingsInterface, line 124
if (!stDeviceId || stDeviceId.trim() == "") { // library marker davegut.SmartThingsInterface, line 125
respData << [status: "FAILED", data: "no stDeviceId"] // library marker davegut.SmartThingsInterface, line 126
} else { // library marker davegut.SmartThingsInterface, line 127
def sendData = [ // library marker davegut.SmartThingsInterface, line 128
path: "/devices/${stDeviceId.trim()}/commands", // library marker davegut.SmartThingsInterface, line 129
cmdData: cmdData // library marker davegut.SmartThingsInterface, line 130
] // library marker davegut.SmartThingsInterface, line 131
respData = syncPost(sendData) // library marker davegut.SmartThingsInterface, line 132
} // library marker davegut.SmartThingsInterface, line 133
if (respData.status == "OK") { // library marker davegut.SmartThingsInterface, line 134
if (respData.results[0].status == "COMPLETED") { // library marker davegut.SmartThingsInterface, line 135
if (cmdData.capability && cmdData.capability != "refresh") { // library marker davegut.SmartThingsInterface, line 136
refresh() // library marker davegut.SmartThingsInterface, line 137
} else { // library marker davegut.SmartThingsInterface, line 138
poll() // library marker davegut.SmartThingsInterface, line 139
} // library marker davegut.SmartThingsInterface, line 140
} // library marker davegut.SmartThingsInterface, line 141
}else { // library marker davegut.SmartThingsInterface, line 142
logWarn("deviceCommand: [status: ${respData.status}, data: ${respData}]") // library marker davegut.SmartThingsInterface, line 143
if (respData.toString().contains("Conflict")) { // library marker davegut.SmartThingsInterface, line 144
logWarn("Conflict internal to SmartThings. Device may be offline in SmartThings") // library marker davegut.SmartThingsInterface, line 145
} // library marker davegut.SmartThingsInterface, line 146
} // library marker davegut.SmartThingsInterface, line 147
} // library marker davegut.SmartThingsInterface, line 148
def statusParse(mainData) { // library marker davegut.SmartThingsInterface, line 150
if (stTestData) { // library marker davegut.SmartThingsInterface, line 151
device.updateSetting("stTestData", [type:"bool", value: false]) // library marker davegut.SmartThingsInterface, line 152
log.warn mainData // library marker davegut.SmartThingsInterface, line 153
} // library marker davegut.SmartThingsInterface, line 154
def stData = [:] // library marker davegut.SmartThingsInterface, line 155
if (logEnable || traceLog) { // library marker davegut.SmartThingsInterface, line 156
def quickLog = [:] // library marker davegut.SmartThingsInterface, line 157
try { // library marker davegut.SmartThingsInterface, line 158
quickLog << [ // library marker davegut.SmartThingsInterface, line 159
switch: [device.currentValue("switch"), mainData.switch.switch.value], // library marker davegut.SmartThingsInterface, line 160
volume: [device.currentValue("volume"), mainData.audioVolume.volume.value.toInteger()], // library marker davegut.SmartThingsInterface, line 161
mute: [device.currentValue("mute"), mainData.audioMute.mute.value], // library marker davegut.SmartThingsInterface, line 162
input: [device.currentValue("inputSource"), mainData.mediaInputSource.inputSource.value], // library marker davegut.SmartThingsInterface, line 163
channel: [device.currentValue("tvChannel"), mainData.tvChannel.tvChannel.value.toString()], // library marker davegut.SmartThingsInterface, line 164
channelName: [device.currentValue("tvChannelName"), mainData.tvChannel.tvChannelName.value], // library marker davegut.SmartThingsInterface, line 165
pictureMode: [device.currentValue("pictureMode"), mainData["custom.picturemode"].pictureMode.value], // library marker davegut.SmartThingsInterface, line 166
soundMode: [device.currentValue("soundMode"), mainData["custom.soundmode"].soundMode.value], // library marker davegut.SmartThingsInterface, line 167
transportStatus: [device.currentValue("transportStatus"), mainData.mediaPlayback.playbackStatus.value]] // library marker davegut.SmartThingsInterface, line 168
} catch (err) { // library marker davegut.SmartThingsInterface, line 169
quickLog << [error: ${err}, data: mainData] // library marker davegut.SmartThingsInterface, line 170
} // library marker davegut.SmartThingsInterface, line 171
logDebug("statusParse: [quickLog: ${quickLog}]") // library marker davegut.SmartThingsInterface, line 172
logTrace("statusParse: [quickLog: ${quickLog}]") // library marker davegut.SmartThingsInterface, line 173
} // library marker davegut.SmartThingsInterface, line 174
if (device.currentValue("switch") == "on") { // library marker davegut.SmartThingsInterface, line 176
Integer volume = mainData.audioVolume.volume.value.toInteger() // library marker davegut.SmartThingsInterface, line 177
if (device.currentValue("volume") != volume) { // library marker davegut.SmartThingsInterface, line 178
sendEvent(name: "volume", value: volume) // library marker davegut.SmartThingsInterface, line 179
sendEvent(name: "level", value: volume) // library marker davegut.SmartThingsInterface, line 180
stData << [volume: volume] // library marker davegut.SmartThingsInterface, line 181
} // library marker davegut.SmartThingsInterface, line 182
String mute = mainData.audioMute.mute.value // library marker davegut.SmartThingsInterface, line 184
if (device.currentValue("mute") != mute) { // library marker davegut.SmartThingsInterface, line 185
sendEvent(name: "mute", value: mute) // library marker davegut.SmartThingsInterface, line 186
stData << [mute: mute] // library marker davegut.SmartThingsInterface, line 187
} // library marker davegut.SmartThingsInterface, line 188
String inputSource = mainData.mediaInputSource.inputSource.value // library marker davegut.SmartThingsInterface, line 190
if (device.currentValue("inputSource") != inputSource) { // library marker davegut.SmartThingsInterface, line 191
sendEvent(name: "inputSource", value: inputSource) // library marker davegut.SmartThingsInterface, line 192
stData << [inputSource: inputSource] // library marker davegut.SmartThingsInterface, line 193
} // library marker davegut.SmartThingsInterface, line 194
String tvChannel = mainData.tvChannel.tvChannel.value.toString() // library marker davegut.SmartThingsInterface, line 196
if (tvChannel == "" || tvChannel == null) { // library marker davegut.SmartThingsInterface, line 197
tvChannel = " " // library marker davegut.SmartThingsInterface, line 198
} // library marker davegut.SmartThingsInterface, line 199
String tvChannelName = mainData.tvChannel.tvChannelName.value // library marker davegut.SmartThingsInterface, line 200
if (tvChannelName == "") { // library marker davegut.SmartThingsInterface, line 201
tvChannelName = " " // library marker davegut.SmartThingsInterface, line 202
} // library marker davegut.SmartThingsInterface, line 203
if (device.currentValue("tvChannelName") != tvChannelName) { // library marker davegut.SmartThingsInterface, line 204
sendEvent(name: "tvChannel", value: tvChannel) // library marker davegut.SmartThingsInterface, line 205
sendEvent(name: "tvChannelName", value: tvChannelName) // library marker davegut.SmartThingsInterface, line 206
if (tvChannelName.contains(".")) { // library marker davegut.SmartThingsInterface, line 207
getAppData(tvChannelName) // library marker davegut.SmartThingsInterface, line 208
} else { // library marker davegut.SmartThingsInterface, line 209
sendEvent(name: "currentApp", value: " ") // library marker davegut.SmartThingsInterface, line 210
} // library marker davegut.SmartThingsInterface, line 211
stData << [tvChannel: tvChannel, tvChannelName: tvChannelName] // library marker davegut.SmartThingsInterface, line 212
if (getDataValue("frameTv") == "true" && !state.artModeWs) { // library marker davegut.SmartThingsInterface, line 213
String artMode = "off" // library marker davegut.SmartThingsInterface, line 214
if (tvChannelName == "art") { artMode = "on" } // library marker davegut.SmartThingsInterface, line 215
sendEvent(name: "artModeStatus", value: artMode) // library marker davegut.SmartThingsInterface, line 216
} // library marker davegut.SmartThingsInterface, line 217
} // library marker davegut.SmartThingsInterface, line 218
String trackDesc = inputSource // library marker davegut.SmartThingsInterface, line 220
if (tvChannelName != " ") { trackDesc = tvChannelName } // library marker davegut.SmartThingsInterface, line 221
if (device.currentValue("trackDescription") != trackDesc) { // library marker davegut.SmartThingsInterface, line 222
sendEvent(name: "trackDescription", value:trackDesc) // library marker davegut.SmartThingsInterface, line 223
stData << [trackDescription: trackDesc] // library marker davegut.SmartThingsInterface, line 224
} // library marker davegut.SmartThingsInterface, line 225
String pictureMode = mainData["custom.picturemode"].pictureMode.value // library marker davegut.SmartThingsInterface, line 227
if (device.currentValue("pictureMode") != pictureMode) { // library marker davegut.SmartThingsInterface, line 228
sendEvent(name: "pictureMode",value: pictureMode) // library marker davegut.SmartThingsInterface, line 229
stData << [pictureMode: pictureMode] // library marker davegut.SmartThingsInterface, line 230
} // library marker davegut.SmartThingsInterface, line 231
String soundMode = mainData["custom.soundmode"].soundMode.value // library marker davegut.SmartThingsInterface, line 233
if (device.currentValue("soundMode") != soundMode) { // library marker davegut.SmartThingsInterface, line 234
sendEvent(name: "soundMode",value: soundMode) // library marker davegut.SmartThingsInterface, line 235
stData << [soundMode: soundMode] // library marker davegut.SmartThingsInterface, line 236
} // library marker davegut.SmartThingsInterface, line 237
String transportStatus = mainData.mediaPlayback.playbackStatus.value // library marker davegut.SmartThingsInterface, line 239
if (transportStatus == null || transportStatus == "") { // library marker davegut.SmartThingsInterface, line 240
transportStatus = "n/a" // library marker davegut.SmartThingsInterface, line 241
} // library marker davegut.SmartThingsInterface, line 242
if (device.currentValue("transportStatus") != transportStatus) { // library marker davegut.SmartThingsInterface, line 243
sendEvent(name: "transportStatus", value: transportStatus) // library marker davegut.SmartThingsInterface, line 244
stData << [transportStatus: transportStatus] // library marker davegut.SmartThingsInterface, line 245
} // library marker davegut.SmartThingsInterface, line 246
} // library marker davegut.SmartThingsInterface, line 247
if (stData != [:]) { // library marker davegut.SmartThingsInterface, line 249
logInfo("statusParse: ${stData}") // library marker davegut.SmartThingsInterface, line 250
} // library marker davegut.SmartThingsInterface, line 251
} // library marker davegut.SmartThingsInterface, line 252
private asyncGet(sendData, passData = "none") { // library marker davegut.SmartThingsInterface, line 254
if (!stApiKey || stApiKey.trim() == "") { // library marker davegut.SmartThingsInterface, line 255
logWarn("asyncGet: [status: ERROR, errorMsg: no stApiKey]") // library marker davegut.SmartThingsInterface, line 256
} else { // library marker davegut.SmartThingsInterface, line 257
logDebug("asyncGet: ${sendData}, ${passData}") // library marker davegut.SmartThingsInterface, line 258
def sendCmdParams = [ // library marker davegut.SmartThingsInterface, line 259
uri: "https://api.smartthings.com/v1", // library marker davegut.SmartThingsInterface, line 260
path: sendData.path, // library marker davegut.SmartThingsInterface, line 261
headers: ['Authorization': 'Bearer ' + stApiKey.trim()]] // library marker davegut.SmartThingsInterface, line 262
try { // library marker davegut.SmartThingsInterface, line 263
asynchttpGet(sendData.parse, sendCmdParams, [reason: passData]) // library marker davegut.SmartThingsInterface, line 264
} catch (error) { // library marker davegut.SmartThingsInterface, line 265
logWarn("asyncGet: [status: FAILED, errorMsg: ${error}]") // library marker davegut.SmartThingsInterface, line 266
} // library marker davegut.SmartThingsInterface, line 267
} // library marker davegut.SmartThingsInterface, line 268
} // library marker davegut.SmartThingsInterface, line 269
private syncGet(path){ // library marker davegut.SmartThingsInterface, line 271
def respData = [:] // library marker davegut.SmartThingsInterface, line 272
if (!stApiKey || stApiKey.trim() == "") { // library marker davegut.SmartThingsInterface, line 273
respData << [status: "FAILED", // library marker davegut.SmartThingsInterface, line 274
errorMsg: "No stApiKey"] // library marker davegut.SmartThingsInterface, line 275
} else { // library marker davegut.SmartThingsInterface, line 276
logDebug("syncGet: ${sendData}") // library marker davegut.SmartThingsInterface, line 277
def sendCmdParams = [ // library marker davegut.SmartThingsInterface, line 278
uri: "https://api.smartthings.com/v1", // library marker davegut.SmartThingsInterface, line 279
path: path, // library marker davegut.SmartThingsInterface, line 280
headers: ['Authorization': 'Bearer ' + stApiKey.trim()] // library marker davegut.SmartThingsInterface, line 281
] // library marker davegut.SmartThingsInterface, line 282
try { // library marker davegut.SmartThingsInterface, line 283
httpGet(sendCmdParams) {resp -> // library marker davegut.SmartThingsInterface, line 284
if (resp.status == 200 && resp.data != null) { // library marker davegut.SmartThingsInterface, line 285
respData << [status: "OK", results: resp.data] // library marker davegut.SmartThingsInterface, line 286
} else { // library marker davegut.SmartThingsInterface, line 287
respData << [status: "FAILED", // library marker davegut.SmartThingsInterface, line 288
httpCode: resp.status, // library marker davegut.SmartThingsInterface, line 289
errorMsg: resp.errorMessage] // library marker davegut.SmartThingsInterface, line 290
} // library marker davegut.SmartThingsInterface, line 291
} // library marker davegut.SmartThingsInterface, line 292
} catch (error) { // library marker davegut.SmartThingsInterface, line 293
respData << [status: "FAILED", // library marker davegut.SmartThingsInterface, line 294
errorMsg: error] // library marker davegut.SmartThingsInterface, line 295
} // library marker davegut.SmartThingsInterface, line 296
} // library marker davegut.SmartThingsInterface, line 297
return respData // library marker davegut.SmartThingsInterface, line 298
} // library marker davegut.SmartThingsInterface, line 299
private syncPost(sendData){ // library marker davegut.SmartThingsInterface, line 301
def respData = [:] // library marker davegut.SmartThingsInterface, line 302
if (!stApiKey || stApiKey.trim() == "") { // library marker davegut.SmartThingsInterface, line 303
respData << [status: "FAILED", // library marker davegut.SmartThingsInterface, line 304
errorMsg: "No stApiKey"] // library marker davegut.SmartThingsInterface, line 305
} else { // library marker davegut.SmartThingsInterface, line 306
logDebug("syncPost: ${sendData}") // library marker davegut.SmartThingsInterface, line 307
def cmdBody = [commands: [sendData.cmdData]] // library marker davegut.SmartThingsInterface, line 308
def sendCmdParams = [ // library marker davegut.SmartThingsInterface, line 309
uri: "https://api.smartthings.com/v1", // library marker davegut.SmartThingsInterface, line 310
path: sendData.path, // library marker davegut.SmartThingsInterface, line 311
headers: ['Authorization': 'Bearer ' + stApiKey.trim()], // library marker davegut.SmartThingsInterface, line 312
body : new groovy.json.JsonBuilder(cmdBody).toString() // library marker davegut.SmartThingsInterface, line 313
] // library marker davegut.SmartThingsInterface, line 314
try { // library marker davegut.SmartThingsInterface, line 315
httpPost(sendCmdParams) {resp -> // library marker davegut.SmartThingsInterface, line 316
if (resp.status == 200 && resp.data != null) { // library marker davegut.SmartThingsInterface, line 317
respData << [status: "OK", results: resp.data.results] // library marker davegut.SmartThingsInterface, line 318
} else { // library marker davegut.SmartThingsInterface, line 319
respData << [status: "FAILED", // library marker davegut.SmartThingsInterface, line 320
httpCode: resp.status, // library marker davegut.SmartThingsInterface, line 321
errorMsg: resp.errorMessage] // library marker davegut.SmartThingsInterface, line 322
} // library marker davegut.SmartThingsInterface, line 323
} // library marker davegut.SmartThingsInterface, line 324
} catch (error) { // library marker davegut.SmartThingsInterface, line 325
respData << [status: "FAILED", // library marker davegut.SmartThingsInterface, line 326
errorMsg: error] // library marker davegut.SmartThingsInterface, line 327
} // library marker davegut.SmartThingsInterface, line 328
} // library marker davegut.SmartThingsInterface, line 329
return respData // library marker davegut.SmartThingsInterface, line 330
} // library marker davegut.SmartThingsInterface, line 331
def distResp(resp, data) { // library marker davegut.SmartThingsInterface, line 333
def respLog = [:] // library marker davegut.SmartThingsInterface, line 334
if (resp.status == 200) { // library marker davegut.SmartThingsInterface, line 335
try { // library marker davegut.SmartThingsInterface, line 336
def respData = new JsonSlurper().parseText(resp.data) // library marker davegut.SmartThingsInterface, line 337
if (data.reason == "deviceSetup") { // library marker davegut.SmartThingsInterface, line 338
deviceSetupParse(respData.components.main) // library marker davegut.SmartThingsInterface, line 339
runIn(1, statusParse, [data: respData.components.main]) // library marker davegut.SmartThingsInterface, line 340
} else { // library marker davegut.SmartThingsInterface, line 341
statusParse(respData.components.main) // library marker davegut.SmartThingsInterface, line 342
} // library marker davegut.SmartThingsInterface, line 343
} catch (err) { // library marker davegut.SmartThingsInterface, line 344
respLog << [status: "ERROR", // library marker davegut.SmartThingsInterface, line 345
errorMsg: err, // library marker davegut.SmartThingsInterface, line 346
respData: resp.data] // library marker davegut.SmartThingsInterface, line 347
} // library marker davegut.SmartThingsInterface, line 348
} else { // library marker davegut.SmartThingsInterface, line 349
respLog << [status: "ERROR", // library marker davegut.SmartThingsInterface, line 350
httpCode: resp.status, // library marker davegut.SmartThingsInterface, line 351
errorMsg: resp.errorMessage] // library marker davegut.SmartThingsInterface, line 352
} // library marker davegut.SmartThingsInterface, line 353
if (respLog != [:]) { // library marker davegut.SmartThingsInterface, line 354
logWarn("distResp: ${respLog}") // library marker davegut.SmartThingsInterface, line 355
} // library marker davegut.SmartThingsInterface, line 356
} // library marker davegut.SmartThingsInterface, line 357
// ~~~~~ end include (1369) davegut.SmartThingsInterface ~~~~~
// ~~~~~ start include (1368) 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 "toggleInputSource", [[name: "SmartThings Function"]] // library marker davegut.samsungTvST, line 10
command "toggleSoundMode", [[name: "SmartThings Function"]] // library marker davegut.samsungTvST, line 11
command "togglePictureMode", [[name: "SmartThings Function"]] // library marker davegut.samsungTvST, line 12
command "setTvChannel", ["SmartThings Function"] // library marker davegut.samsungTvST, line 13
attribute "tvChannel", "string" // library marker davegut.samsungTvST, line 14
attribute "tvChannelName", "string" // library marker davegut.samsungTvST, line 15
command "setInputSource", ["SmartThings Function"] // library marker davegut.samsungTvST, line 16
attribute "inputSource", "string" // library marker davegut.samsungTvST, line 17
command "setVolume", ["SmartThings Function"] // library marker davegut.samsungTvST, line 18
command "setPictureMode", ["SmartThings Function"] // library marker davegut.samsungTvST, line 19
command "setSoundMode", ["SmartThings Function"] // library marker davegut.samsungTvST, line 20
command "setLevel", ["SmartThings Function"] // library marker davegut.samsungTvST, line 21
attribute "transportStatus", "string" // library marker davegut.samsungTvST, line 22
attribute "level", "NUMBER" // library marker davegut.samsungTvST, line 23
attribute "trackDescription", "string" // library marker davegut.samsungTvST, line 24
/* // library marker davegut.samsungTvST, line 27
def stPreferences() { // library marker davegut.samsungTvST, line 28
input ("connectST", "bool", title: "Connect to SmartThings for added functions", defaultValue: false) // library marker davegut.samsungTvST, line 29
if (connectST) { // library marker davegut.samsungTvST, line 30
onPollOptions = ["st": "SmartThings", "local": "Local", "off": "DISABLE"] // library marker davegut.samsungTvST, line 31
input ("stApiKey", "string", title: "SmartThings API Key", defaultValue: "") // library marker davegut.samsungTvST, line 32
if (stApiKey) { // library marker davegut.samsungTvST, line 33
input ("stDeviceId", "string", title: "SmartThings Device ID", defaultValue: "") // library marker davegut.samsungTvST, line 34
} // library marker davegut.samsungTvST, line 35
input ("stPollInterval", "enum", title: "SmartThings Poll Interval (minutes)", // library marker davegut.samsungTvST, line 36
options: ["off", "1", "5", "15", "30"], defaultValue: "15") // library marker davegut.samsungTvST, line 37
input ("stTestData", "bool", title: "Get ST data dump for developer", defaultValue: false) // library marker davegut.samsungTvST, line 38
} // library marker davegut.samsungTvST, line 39
} // library marker davegut.samsungTvST, line 42
def stUpdate() { // library marker davegut.samsungTvST, line 44
def stData = [:] // library marker davegut.samsungTvST, line 45
if (connectST) { // library marker davegut.samsungTvST, line 46
stData << [connectST: "true"] // library marker davegut.samsungTvST, line 47
stData << [connectST: connectST] // library marker davegut.samsungTvST, line 48
if (!stApiKey || stApiKey == "") { // library marker davegut.samsungTvST, line 49
logWarn("\n\n\t\tEnter the ST API Key and Save Preferences\n\n") // library marker davegut.samsungTvST, line 50
stData << [status: "ERROR", date: "no stApiKey"] // library marker davegut.samsungTvST, line 51
} else if (!stDeviceId || stDeviceId == "") { // library marker davegut.samsungTvST, line 52
getDeviceList() // library marker davegut.samsungTvST, line 53
logWarn("\n\n\t\tEnter the deviceId from the Log List and Save Preferences\n\n") // library marker davegut.samsungTvST, line 54
stData << [status: "ERROR", date: "no stDeviceId"] // library marker davegut.samsungTvST, line 55
} else { // library marker davegut.samsungTvST, line 56
if (device.currentValue("volume") == null) { // library marker davegut.samsungTvST, line 57
// sendEvent(name: "volume", value: 0) // library marker davegut.samsungTvST, line 58
// sendEvent(name: "level", value: 0) // library marker davegut.samsungTvST, line 59
} // library marker davegut.samsungTvST, line 60
def stPollInterval = stPollInterval // library marker davegut.samsungTvST, line 61
if (stPollInterval == null) { // library marker davegut.samsungTvST, line 62
stPollInterval = "15" // library marker davegut.samsungTvST, line 63
device.updateSetting("stPollInterval", [type:"enum", value: "15"]) // library marker davegut.samsungTvST, line 64
} // library marker davegut.samsungTvST, line 65
switch(stPollInterval) { // library marker davegut.samsungTvST, line 66
case "1" : runEvery1Minute(refresh); break // library marker davegut.samsungTvST, line 67
case "5" : runEvery5Minutes(refresh); break // library marker davegut.samsungTvST, line 68
case "15" : runEvery15Minutes(refresh); break // library marker davegut.samsungTvST, line 69
case "30" : runEvery30Minutes(refresh); break // library marker davegut.samsungTvST, line 70
default: unschedule("refresh") // library marker davegut.samsungTvST, line 71
} // library marker davegut.samsungTvST, line 72
deviceSetup() // library marker davegut.samsungTvST, line 73
stData << [stPollInterval: stPollInterval] // library marker davegut.samsungTvST, line 74
} // library marker davegut.samsungTvST, line 75
} else { // library marker davegut.samsungTvST, line 76
stData << [connectST: "false"] // library marker davegut.samsungTvST, line 77
} // library marker davegut.samsungTvST, line 78
logInfo("stUpdate: ${stData}") // library marker davegut.samsungTvST, line 79
} // library marker davegut.samsungTvST, line 80
def deviceSetup() { // library marker davegut.samsungTvST, line 82
if (!stDeviceId || stDeviceId.trim() == "") { // library marker davegut.samsungTvST, line 83
respData = "[status: FAILED, data: no stDeviceId]" // library marker davegut.samsungTvST, line 84
logWarn("poll: [status: ERROR, errorMsg: no stDeviceId]") // library marker davegut.samsungTvST, line 85
} else { // library marker davegut.samsungTvST, line 86
def sendData = [ // library marker davegut.samsungTvST, line 87
path: "/devices/${stDeviceId.trim()}/status", // library marker davegut.samsungTvST, line 88
parse: "distResp" // library marker davegut.samsungTvST, line 89
] // library marker davegut.samsungTvST, line 90
asyncGet(sendData, "deviceSetup") // library marker davegut.samsungTvST, line 91
} // library marker davegut.samsungTvST, line 92
} // library marker davegut.samsungTvST, line 93
def getDeviceList() { // library marker davegut.samsungTvST, line 95
def sendData = [ // library marker davegut.samsungTvST, line 96
path: "/devices", // library marker davegut.samsungTvST, line 97
parse: "getDeviceListParse" // library marker davegut.samsungTvST, line 98
] // library marker davegut.samsungTvST, line 99
asyncGet(sendData) // library marker davegut.samsungTvST, line 100
} // library marker davegut.samsungTvST, line 101
def getDeviceListParse(resp, data) { // library marker davegut.samsungTvST, line 103
def respData // library marker davegut.samsungTvST, line 104
if (resp.status != 200) { // library marker davegut.samsungTvST, line 105
respData = [status: "ERROR", // library marker davegut.samsungTvST, line 106
httpCode: resp.status, // library marker davegut.samsungTvST, line 107
errorMsg: resp.errorMessage] // library marker davegut.samsungTvST, line 108
} else { // library marker davegut.samsungTvST, line 109
try { // library marker davegut.samsungTvST, line 110
respData = new JsonSlurper().parseText(resp.data) // library marker davegut.samsungTvST, line 111
} catch (err) { // library marker davegut.samsungTvST, line 112
respData = [status: "ERROR", // library marker davegut.samsungTvST, line 113
errorMsg: err, // library marker davegut.samsungTvST, line 114
respData: resp.data] // library marker davegut.samsungTvST, line 115
} // library marker davegut.samsungTvST, line 116
} // library marker davegut.samsungTvST, line 117
if (respData.status == "ERROR") { // library marker davegut.samsungTvST, line 118
logWarn("getDeviceListParse: ${respData}") // library marker davegut.samsungTvST, line 119
} else { // library marker davegut.samsungTvST, line 120
log.info "" // library marker davegut.samsungTvST, line 121
respData.items.each { // library marker davegut.samsungTvST, line 122
log.trace "${it.label}: ${it.deviceId}" // library marker davegut.samsungTvST, line 123
} // library marker davegut.samsungTvST, line 124
log.trace "Copy your device's deviceId value and enter into the device Preferences." // library marker davegut.samsungTvST, line 125
} // library marker davegut.samsungTvST, line 126
} // library marker davegut.samsungTvST, line 127
def deviceSetupParse(mainData) { // library marker davegut.samsungTvST, line 129
def setupData = [:] // library marker davegut.samsungTvST, line 130
def supportedInputs = mainData.mediaInputSource.supportedInputSources.value // library marker davegut.samsungTvST, line 131
state.supportedInputs = supportedInputs // library marker davegut.samsungTvST, line 132
setupData << [supportedInputs: supportedInputs] // library marker davegut.samsungTvST, line 133
def pictureModes = mainData["custom.picturemode"].supportedPictureModes.value // library marker davegut.samsungTvST, line 135
state.pictureModes = pictureModes // library marker davegut.samsungTvST, line 136
setupData << [pictureModes: pictureModes] // library marker davegut.samsungTvST, line 137
def soundModes = mainData["custom.soundmode"].supportedSoundModes.value // library marker davegut.samsungTvST, line 139
state.soundModes = soundModes // library marker davegut.samsungTvST, line 140
setupData << [soundModes: soundModes] // library marker davegut.samsungTvST, line 141
logInfo("deviceSetupParse: ${setupData}") // library marker davegut.samsungTvST, line 143
} // library marker davegut.samsungTvST, line 144
*/ // library marker davegut.samsungTvST, line 145
def deviceRefresh() { refresh() } // library marker davegut.samsungTvST, line 149
def refresh() { // library marker davegut.samsungTvST, line 151
if (connectST && stApiKey!= null) { // library marker davegut.samsungTvST, line 152
def cmdData = [ // library marker davegut.samsungTvST, line 153
component: "main", // library marker davegut.samsungTvST, line 154
capability: "refresh", // library marker davegut.samsungTvST, line 155
command: "refresh", // library marker davegut.samsungTvST, line 156
arguments: []] // library marker davegut.samsungTvST, line 157
deviceCommand(cmdData) // library marker davegut.samsungTvST, line 158
} // library marker davegut.samsungTvST, line 159
} // library marker davegut.samsungTvST, line 160
def poll() { // library marker davegut.samsungTvST, line 162
if (!stDeviceId || stDeviceId.trim() == "") { // library marker davegut.samsungTvST, line 163
respData = "[status: FAILED, data: no stDeviceId]" // library marker davegut.samsungTvST, line 164
logWarn("poll: [status: ERROR, errorMsg: no stDeviceId]") // library marker davegut.samsungTvST, line 165
} else { // library marker davegut.samsungTvST, line 166
def sendData = [ // library marker davegut.samsungTvST, line 167
path: "/devices/${stDeviceId.trim()}/status", // library marker davegut.samsungTvST, line 168
parse: "distResp" // library marker davegut.samsungTvST, line 169
] // library marker davegut.samsungTvST, line 170
asyncGet(sendData, "statusParse") // library marker davegut.samsungTvST, line 171
} // library marker davegut.samsungTvST, line 172
} // library marker davegut.samsungTvST, line 173
def setLevel(level) { setVolume(level) } // library marker davegut.samsungTvST, line 175
def setVolume(volume) { // library marker davegut.samsungTvST, line 177
def cmdData = [ // library marker davegut.samsungTvST, line 178
component: "main", // library marker davegut.samsungTvST, line 179
capability: "audioVolume", // library marker davegut.samsungTvST, line 180
command: "setVolume", // library marker davegut.samsungTvST, line 181
arguments: [volume.toInteger()]] // library marker davegut.samsungTvST, line 182
deviceCommand(cmdData) // library marker davegut.samsungTvST, line 183
} // library marker davegut.samsungTvST, line 184
def togglePictureMode() { // library marker davegut.samsungTvST, line 186
// requires state.pictureModes // library marker davegut.samsungTvST, line 187
def pictureModes = state.pictureModes // library marker davegut.samsungTvST, line 188
def totalModes = pictureModes.size() // library marker davegut.samsungTvST, line 189
def currentMode = device.currentValue("pictureMode") // library marker davegut.samsungTvST, line 190
def modeNo = pictureModes.indexOf(currentMode) // library marker davegut.samsungTvST, line 191
def newModeNo = modeNo + 1 // library marker davegut.samsungTvST, line 192
if (newModeNo == totalModes) { newModeNo = 0 } // library marker davegut.samsungTvST, line 193
def newPictureMode = pictureModes[newModeNo] // library marker davegut.samsungTvST, line 194
setPictureMode(newPictureMode) // library marker davegut.samsungTvST, line 195
} // library marker davegut.samsungTvST, line 196
def setPictureMode(pictureMode) { // library marker davegut.samsungTvST, line 198
def cmdData = [ // library marker davegut.samsungTvST, line 199
component: "main", // library marker davegut.samsungTvST, line 200
capability: "custom.picturemode", // library marker davegut.samsungTvST, line 201
command: "setPictureMode", // library marker davegut.samsungTvST, line 202
arguments: [pictureMode]] // library marker davegut.samsungTvST, line 203
deviceCommand(cmdData) // library marker davegut.samsungTvST, line 204
} // library marker davegut.samsungTvST, line 205
def toggleSoundMode() { // library marker davegut.samsungTvST, line 207
def soundModes = state.soundModes // library marker davegut.samsungTvST, line 208
def totalModes = soundModes.size() // library marker davegut.samsungTvST, line 209
def currentMode = device.currentValue("soundMode") // library marker davegut.samsungTvST, line 210
def modeNo = soundModes.indexOf(currentMode) // library marker davegut.samsungTvST, line 211
def newModeNo = modeNo + 1 // library marker davegut.samsungTvST, line 212
if (newModeNo == totalModes) { newModeNo = 0 } // library marker davegut.samsungTvST, line 213
def soundMode = soundModes[newModeNo] // library marker davegut.samsungTvST, line 214
setSoundMode(soundMode) // library marker davegut.samsungTvST, line 215
} // library marker davegut.samsungTvST, line 216
def setSoundMode(soundMode) { // library marker davegut.samsungTvST, line 218
def cmdData = [ // library marker davegut.samsungTvST, line 219
component: "main", // library marker davegut.samsungTvST, line 220
capability: "custom.soundmode", // library marker davegut.samsungTvST, line 221
command: "setSoundMode", // library marker davegut.samsungTvST, line 222
arguments: [soundMode]] // library marker davegut.samsungTvST, line 223
deviceCommand(cmdData) // library marker davegut.samsungTvST, line 224
} // library marker davegut.samsungTvST, line 225
def toggleInputSource() { // library marker davegut.samsungTvST, line 227
def inputSources = state.supportedInputs // library marker davegut.samsungTvST, line 228
def totalSources = inputSources.size() // library marker davegut.samsungTvST, line 229
def currentSource = device.currentValue("inputSource") // library marker davegut.samsungTvST, line 230
def sourceNo = inputSources.indexOf(currentSource) // library marker davegut.samsungTvST, line 231
def newSourceNo = sourceNo + 1 // library marker davegut.samsungTvST, line 232
if (newSourceNo == totalSources) { newSourceNo = 0 } // library marker davegut.samsungTvST, line 233
def inputSource = inputSources[newSourceNo] // library marker davegut.samsungTvST, line 234
setInputSource(inputSource) // library marker davegut.samsungTvST, line 235
} // library marker davegut.samsungTvST, line 236
def setInputSource(inputSource) { // library marker davegut.samsungTvST, line 238
def cmdData = [ // library marker davegut.samsungTvST, line 239
component: "main", // library marker davegut.samsungTvST, line 240
capability: "mediaInputSource", // library marker davegut.samsungTvST, line 241
command: "setInputSource", // library marker davegut.samsungTvST, line 242
arguments: [inputSource]] // library marker davegut.samsungTvST, line 243
deviceCommand(cmdData) // library marker davegut.samsungTvST, line 244
} // library marker davegut.samsungTvST, line 245
def setTvChannel(newChannel) { // library marker davegut.samsungTvST, line 247
def cmdData = [ // library marker davegut.samsungTvST, line 248
component: "main", // library marker davegut.samsungTvST, line 249
capability: "tvChannel", // library marker davegut.samsungTvST, line 250
command: "setTvChannel", // library marker davegut.samsungTvST, line 251
arguments: [newChannel]] // library marker davegut.samsungTvST, line 252
deviceCommand(cmdData) // library marker davegut.samsungTvST, line 253
} // library marker davegut.samsungTvST, line 254
/* // library marker davegut.samsungTvST, line 257
def deviceCommand(cmdData) { // library marker davegut.samsungTvST, line 258
logTrace("deviceCommand: $cmdData") // library marker davegut.samsungTvST, line 259
def respData = [:] // library marker davegut.samsungTvST, line 260
if (!stDeviceId || stDeviceId.trim() == "") { // library marker davegut.samsungTvST, line 261
respData << [status: "FAILED", data: "no stDeviceId"] // library marker davegut.samsungTvST, line 262
} else { // library marker davegut.samsungTvST, line 263
def sendData = [ // library marker davegut.samsungTvST, line 264
path: "/devices/${stDeviceId.trim()}/commands", // library marker davegut.samsungTvST, line 265
cmdData: cmdData // library marker davegut.samsungTvST, line 266
] // library marker davegut.samsungTvST, line 267
respData = syncPost(sendData) // library marker davegut.samsungTvST, line 268
} // library marker davegut.samsungTvST, line 269
if (respData.status == "OK") { // library marker davegut.samsungTvST, line 270
if (respData.results[0].status == "COMPLETED") { // library marker davegut.samsungTvST, line 271
if (cmdData.capability && cmdData.capability != "refresh") { // library marker davegut.samsungTvST, line 272
refresh() // library marker davegut.samsungTvST, line 273
} else { // library marker davegut.samsungTvST, line 274
poll() // library marker davegut.samsungTvST, line 275
} // library marker davegut.samsungTvST, line 276
} // library marker davegut.samsungTvST, line 277
}else { // library marker davegut.samsungTvST, line 278
logWarn("deviceCommand: [status: ${respData.status}, data: ${respData}]") // library marker davegut.samsungTvST, line 279
if (respData.toString().contains("Conflict")) { // library marker davegut.samsungTvST, line 280
logWarn("Conflict internal to SmartThings. Device may be offline in SmartThings") // library marker davegut.samsungTvST, line 281
} // library marker davegut.samsungTvST, line 282
} // library marker davegut.samsungTvST, line 283
} // library marker davegut.samsungTvST, line 284
def statusParse(mainData) { // library marker davegut.samsungTvST, line 286
if (stTestData) { // library marker davegut.samsungTvST, line 287
device.updateSetting("stTestData", [type:"bool", value: false]) // library marker davegut.samsungTvST, line 288
log.warn mainData // library marker davegut.samsungTvST, line 289
} // library marker davegut.samsungTvST, line 290
def stData = [:] // library marker davegut.samsungTvST, line 291
if (logEnable || traceLog) { // library marker davegut.samsungTvST, line 292
def quickLog = [:] // library marker davegut.samsungTvST, line 293
try { // library marker davegut.samsungTvST, line 294
quickLog << [ // library marker davegut.samsungTvST, line 295
switch: [device.currentValue("switch"), mainData.switch.switch.value], // library marker davegut.samsungTvST, line 296
volume: [device.currentValue("volume"), mainData.audioVolume.volume.value.toInteger()], // library marker davegut.samsungTvST, line 297
mute: [device.currentValue("mute"), mainData.audioMute.mute.value], // library marker davegut.samsungTvST, line 298
input: [device.currentValue("inputSource"), mainData.mediaInputSource.inputSource.value], // library marker davegut.samsungTvST, line 299
channel: [device.currentValue("tvChannel"), mainData.tvChannel.tvChannel.value.toString()], // library marker davegut.samsungTvST, line 300
channelName: [device.currentValue("tvChannelName"), mainData.tvChannel.tvChannelName.value], // library marker davegut.samsungTvST, line 301
pictureMode: [device.currentValue("pictureMode"), mainData["custom.picturemode"].pictureMode.value], // library marker davegut.samsungTvST, line 302
soundMode: [device.currentValue("soundMode"), mainData["custom.soundmode"].soundMode.value], // library marker davegut.samsungTvST, line 303
transportStatus: [device.currentValue("transportStatus"), mainData.mediaPlayback.playbackStatus.value]] // library marker davegut.samsungTvST, line 304
} catch (err) { // library marker davegut.samsungTvST, line 305
quickLog << [error: ${err}, data: mainData] // library marker davegut.samsungTvST, line 306
} // library marker davegut.samsungTvST, line 307
logDebug("statusParse: [quickLog: ${quickLog}]") // library marker davegut.samsungTvST, line 308
logTrace("statusParse: [quickLog: ${quickLog}]") // library marker davegut.samsungTvST, line 309
} // library marker davegut.samsungTvST, line 310
if (device.currentValue("switch") == "on") { // library marker davegut.samsungTvST, line 312
Integer volume = mainData.audioVolume.volume.value.toInteger() // library marker davegut.samsungTvST, line 313
if (device.currentValue("volume") != volume) { // library marker davegut.samsungTvST, line 314
sendEvent(name: "volume", value: volume) // library marker davegut.samsungTvST, line 315
sendEvent(name: "level", value: volume) // library marker davegut.samsungTvST, line 316
stData << [volume: volume] // library marker davegut.samsungTvST, line 317
} // library marker davegut.samsungTvST, line 318
String mute = mainData.audioMute.mute.value // library marker davegut.samsungTvST, line 320
if (device.currentValue("mute") != mute) { // library marker davegut.samsungTvST, line 321
sendEvent(name: "mute", value: mute) // library marker davegut.samsungTvST, line 322
stData << [mute: mute] // library marker davegut.samsungTvST, line 323
} // library marker davegut.samsungTvST, line 324
String inputSource = mainData.mediaInputSource.inputSource.value // library marker davegut.samsungTvST, line 326
if (device.currentValue("inputSource") != inputSource) { // library marker davegut.samsungTvST, line 327
sendEvent(name: "inputSource", value: inputSource) // library marker davegut.samsungTvST, line 328
stData << [inputSource: inputSource] // library marker davegut.samsungTvST, line 329
} // library marker davegut.samsungTvST, line 330
String tvChannel = mainData.tvChannel.tvChannel.value.toString() // library marker davegut.samsungTvST, line 332
if (tvChannel == "" || tvChannel == null) { // library marker davegut.samsungTvST, line 333
tvChannel = " " // library marker davegut.samsungTvST, line 334
} // library marker davegut.samsungTvST, line 335
String tvChannelName = mainData.tvChannel.tvChannelName.value // library marker davegut.samsungTvST, line 336
if (tvChannelName == "") { // library marker davegut.samsungTvST, line 337
tvChannelName = " " // library marker davegut.samsungTvST, line 338
} // library marker davegut.samsungTvST, line 339
if (device.currentValue("tvChannelName") != tvChannelName) { // library marker davegut.samsungTvST, line 340
sendEvent(name: "tvChannel", value: tvChannel) // library marker davegut.samsungTvST, line 341
sendEvent(name: "tvChannelName", value: tvChannelName) // library marker davegut.samsungTvST, line 342
if (tvChannelName.contains(".")) { // library marker davegut.samsungTvST, line 343
getAppData(tvChannelName) // library marker davegut.samsungTvST, line 344
} else { // library marker davegut.samsungTvST, line 345
sendEvent(name: "currentApp", value: " ") // library marker davegut.samsungTvST, line 346
} // library marker davegut.samsungTvST, line 347
stData << [tvChannel: tvChannel, tvChannelName: tvChannelName] // library marker davegut.samsungTvST, line 348
if (getDataValue("frameTv") == "true" && !state.artModeWs) { // library marker davegut.samsungTvST, line 349
String artMode = "off" // library marker davegut.samsungTvST, line 350
if (tvChannelName == "art") { artMode = "on" } // library marker davegut.samsungTvST, line 351
sendEvent(name: "artModeStatus", value: artMode) // library marker davegut.samsungTvST, line 352
} // library marker davegut.samsungTvST, line 353
} // library marker davegut.samsungTvST, line 354
String trackDesc = inputSource // library marker davegut.samsungTvST, line 356
if (tvChannelName != " ") { trackDesc = tvChannelName } // library marker davegut.samsungTvST, line 357
if (device.currentValue("trackDescription") != trackDesc) { // library marker davegut.samsungTvST, line 358
sendEvent(name: "trackDescription", value:trackDesc) // library marker davegut.samsungTvST, line 359
stData << [trackDescription: trackDesc] // library marker davegut.samsungTvST, line 360
} // library marker davegut.samsungTvST, line 361
String pictureMode = mainData["custom.picturemode"].pictureMode.value // library marker davegut.samsungTvST, line 363
if (device.currentValue("pictureMode") != pictureMode) { // library marker davegut.samsungTvST, line 364
sendEvent(name: "pictureMode",value: pictureMode) // library marker davegut.samsungTvST, line 365
stData << [pictureMode: pictureMode] // library marker davegut.samsungTvST, line 366
} // library marker davegut.samsungTvST, line 367
String soundMode = mainData["custom.soundmode"].soundMode.value // library marker davegut.samsungTvST, line 369
if (device.currentValue("soundMode") != soundMode) { // library marker davegut.samsungTvST, line 370
sendEvent(name: "soundMode",value: soundMode) // library marker davegut.samsungTvST, line 371
stData << [soundMode: soundMode] // library marker davegut.samsungTvST, line 372
} // library marker davegut.samsungTvST, line 373
String transportStatus = mainData.mediaPlayback.playbackStatus.value // library marker davegut.samsungTvST, line 375
if (transportStatus == null || transportStatus == "") { // library marker davegut.samsungTvST, line 376
transportStatus = "n/a" // library marker davegut.samsungTvST, line 377
} // library marker davegut.samsungTvST, line 378
if (device.currentValue("transportStatus") != transportStatus) { // library marker davegut.samsungTvST, line 379
sendEvent(name: "transportStatus", value: transportStatus) // library marker davegut.samsungTvST, line 380
stData << [transportStatus: transportStatus] // library marker davegut.samsungTvST, line 381
} // library marker davegut.samsungTvST, line 382
} // library marker davegut.samsungTvST, line 383
if (stData != [:]) { // library marker davegut.samsungTvST, line 385
logInfo("statusParse: ${stData}") // library marker davegut.samsungTvST, line 386
} // library marker davegut.samsungTvST, line 387
} // library marker davegut.samsungTvST, line 388
private asyncGet(sendData, passData = "none") { // library marker davegut.samsungTvST, line 390
if (!stApiKey || stApiKey.trim() == "") { // library marker davegut.samsungTvST, line 391
logWarn("asyncGet: [status: ERROR, errorMsg: no stApiKey]") // library marker davegut.samsungTvST, line 392
} else { // library marker davegut.samsungTvST, line 393
logDebug("asyncGet: ${sendData}, ${passData}") // library marker davegut.samsungTvST, line 394
def sendCmdParams = [ // library marker davegut.samsungTvST, line 395
uri: "https://api.smartthings.com/v1", // library marker davegut.samsungTvST, line 396
path: sendData.path, // library marker davegut.samsungTvST, line 397
headers: ['Authorization': 'Bearer ' + stApiKey.trim()]] // library marker davegut.samsungTvST, line 398
try { // library marker davegut.samsungTvST, line 399
asynchttpGet(sendData.parse, sendCmdParams, [reason: passData]) // library marker davegut.samsungTvST, line 400
} catch (error) { // library marker davegut.samsungTvST, line 401
logWarn("asyncGet: [status: FAILED, errorMsg: ${error}]") // library marker davegut.samsungTvST, line 402
} // library marker davegut.samsungTvST, line 403
} // library marker davegut.samsungTvST, line 404
} // library marker davegut.samsungTvST, line 405
private syncGet(path){ // library marker davegut.samsungTvST, line 407
def respData = [:] // library marker davegut.samsungTvST, line 408
if (!stApiKey || stApiKey.trim() == "") { // library marker davegut.samsungTvST, line 409
respData << [status: "FAILED", // library marker davegut.samsungTvST, line 410
errorMsg: "No stApiKey"] // library marker davegut.samsungTvST, line 411
} else { // library marker davegut.samsungTvST, line 412
logDebug("syncGet: ${sendData}") // library marker davegut.samsungTvST, line 413
def sendCmdParams = [ // library marker davegut.samsungTvST, line 414
uri: "https://api.smartthings.com/v1", // library marker davegut.samsungTvST, line 415
path: path, // library marker davegut.samsungTvST, line 416
headers: ['Authorization': 'Bearer ' + stApiKey.trim()] // library marker davegut.samsungTvST, line 417
] // library marker davegut.samsungTvST, line 418
try { // library marker davegut.samsungTvST, line 419
httpGet(sendCmdParams) {resp -> // library marker davegut.samsungTvST, line 420
if (resp.status == 200 && resp.data != null) { // library marker davegut.samsungTvST, line 421
respData << [status: "OK", results: resp.data] // library marker davegut.samsungTvST, line 422
} else { // library marker davegut.samsungTvST, line 423
respData << [status: "FAILED", // library marker davegut.samsungTvST, line 424
httpCode: resp.status, // library marker davegut.samsungTvST, line 425
errorMsg: resp.errorMessage] // library marker davegut.samsungTvST, line 426
} // library marker davegut.samsungTvST, line 427
} // library marker davegut.samsungTvST, line 428
} catch (error) { // library marker davegut.samsungTvST, line 429
respData << [status: "FAILED", // library marker davegut.samsungTvST, line 430
errorMsg: error] // library marker davegut.samsungTvST, line 431
} // library marker davegut.samsungTvST, line 432
} // library marker davegut.samsungTvST, line 433
return respData // library marker davegut.samsungTvST, line 434
} // library marker davegut.samsungTvST, line 435
private syncPost(sendData){ // library marker davegut.samsungTvST, line 437
def respData = [:] // library marker davegut.samsungTvST, line 438
if (!stApiKey || stApiKey.trim() == "") { // library marker davegut.samsungTvST, line 439
respData << [status: "FAILED", // library marker davegut.samsungTvST, line 440
errorMsg: "No stApiKey"] // library marker davegut.samsungTvST, line 441
} else { // library marker davegut.samsungTvST, line 442
logDebug("syncPost: ${sendData}") // library marker davegut.samsungTvST, line 443
def cmdBody = [commands: [sendData.cmdData]] // library marker davegut.samsungTvST, line 444
def sendCmdParams = [ // library marker davegut.samsungTvST, line 445
uri: "https://api.smartthings.com/v1", // library marker davegut.samsungTvST, line 446
path: sendData.path, // library marker davegut.samsungTvST, line 447
headers: ['Authorization': 'Bearer ' + stApiKey.trim()], // library marker davegut.samsungTvST, line 448
body : new groovy.json.JsonBuilder(cmdBody).toString() // library marker davegut.samsungTvST, line 449
] // library marker davegut.samsungTvST, line 450
try { // library marker davegut.samsungTvST, line 451
httpPost(sendCmdParams) {resp -> // library marker davegut.samsungTvST, line 452
if (resp.status == 200 && resp.data != null) { // library marker davegut.samsungTvST, line 453
respData << [status: "OK", results: resp.data.results] // library marker davegut.samsungTvST, line 454
} else { // library marker davegut.samsungTvST, line 455
respData << [status: "FAILED", // library marker davegut.samsungTvST, line 456
httpCode: resp.status, // library marker davegut.samsungTvST, line 457
errorMsg: resp.errorMessage] // library marker davegut.samsungTvST, line 458
} // library marker davegut.samsungTvST, line 459
} // library marker davegut.samsungTvST, line 460
} catch (error) { // library marker davegut.samsungTvST, line 461
respData << [status: "FAILED", // library marker davegut.samsungTvST, line 462
errorMsg: error] // library marker davegut.samsungTvST, line 463
} // library marker davegut.samsungTvST, line 464
} // library marker davegut.samsungTvST, line 465
return respData // library marker davegut.samsungTvST, line 466
} // library marker davegut.samsungTvST, line 467
def distResp(resp, data) { // library marker davegut.samsungTvST, line 469
def respLog = [:] // library marker davegut.samsungTvST, line 470
if (resp.status == 200) { // library marker davegut.samsungTvST, line 471
try { // library marker davegut.samsungTvST, line 472
def respData = new JsonSlurper().parseText(resp.data) // library marker davegut.samsungTvST, line 473
if (data.reason == "deviceSetup") { // library marker davegut.samsungTvST, line 474
deviceSetupParse(respData.components.main) // library marker davegut.samsungTvST, line 475
runIn(1, statusParse, [data: respData.components.main]) // library marker davegut.samsungTvST, line 476
} else { // library marker davegut.samsungTvST, line 477
statusParse(respData.components.main) // library marker davegut.samsungTvST, line 478
} // library marker davegut.samsungTvST, line 479
} catch (err) { // library marker davegut.samsungTvST, line 480
respLog << [status: "ERROR", // library marker davegut.samsungTvST, line 481
errorMsg: err, // library marker davegut.samsungTvST, line 482
respData: resp.data] // library marker davegut.samsungTvST, line 483
} // library marker davegut.samsungTvST, line 484
} else { // library marker davegut.samsungTvST, line 485
respLog << [status: "ERROR", // library marker davegut.samsungTvST, line 486
httpCode: resp.status, // library marker davegut.samsungTvST, line 487
errorMsg: resp.errorMessage] // library marker davegut.samsungTvST, line 488
} // library marker davegut.samsungTvST, line 489
if (respLog != [:]) { // library marker davegut.samsungTvST, line 490
logWarn("distResp: ${respLog}") // library marker davegut.samsungTvST, line 491
} // library marker davegut.samsungTvST, line 492
} // library marker davegut.samsungTvST, line 493
*/ // library marker davegut.samsungTvST, line 494
// ~~~~~ end include (1368) davegut.samsungTvST ~~~~~
// ~~~~~ start include (1339) 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
preferences { // library marker davegut.Logging, line 10
input ("logEnable", "bool", title: "Enable debug logging for 30 minutes", defaultValue: false) // library marker davegut.Logging, line 11
input ("infoLog", "bool", title: "Enable information logging",defaultValue: true) // library marker davegut.Logging, line 12
input ("traceLog", "bool", title: "Enable trace logging as directed by developer", defaultValue: false) // library marker davegut.Logging, line 13
} // library marker davegut.Logging, line 14
def listAttributes() { // library marker davegut.Logging, line 16
def attrData = device.getCurrentStates() // library marker davegut.Logging, line 17
Map attrs = [:] // library marker davegut.Logging, line 18
attrData.each { // library marker davegut.Logging, line 19
attrs << ["${it.name}": it.value] // library marker davegut.Logging, line 20
} // library marker davegut.Logging, line 21
return attrs // library marker davegut.Logging, line 22
} // library marker davegut.Logging, line 23
def setLogsOff() { // library marker davegut.Logging, line 25
def logData = [logEnagle: logEnable, infoLog: infoLog, traceLog:traceLog] // library marker davegut.Logging, line 26
if (logEnable) { // library marker davegut.Logging, line 27
runIn(1800, debugLogOff) // library marker davegut.Logging, line 28
logData << [debugLogOff: "scheduled"] // library marker davegut.Logging, line 29
} // library marker davegut.Logging, line 30
if (traceLog) { // library marker davegut.Logging, line 31
runIn(1800, traceLogOff) // library marker davegut.Logging, line 32
logData << [traceLogOff: "scheduled"] // library marker davegut.Logging, line 33
} // library marker davegut.Logging, line 34
return logData // library marker davegut.Logging, line 35
} // library marker davegut.Logging, line 36
def logTrace(msg){ // library marker davegut.Logging, line 38
if (traceLog == true) { // library marker davegut.Logging, line 39
log.trace "${device.displayName}-${driverVer()}: ${msg}" // library marker davegut.Logging, line 40
} // library marker davegut.Logging, line 41
} // library marker davegut.Logging, line 42
def traceLogOff() { // library marker davegut.Logging, line 44
device.updateSetting("traceLog", [type:"bool", value: false]) // library marker davegut.Logging, line 45
logInfo("traceLogOff") // library marker davegut.Logging, line 46
} // library marker davegut.Logging, line 47
def logInfo(msg) { // library marker davegut.Logging, line 49
if (textEnable || infoLog) { // library marker davegut.Logging, line 50
log.info "${device.displayName}-${driverVer()}: ${msg}" // library marker davegut.Logging, line 51
} // library marker davegut.Logging, line 52
} // library marker davegut.Logging, line 53
def debugLogOff() { // library marker davegut.Logging, line 55
device.updateSetting("logEnable", [type:"bool", value: false]) // library marker davegut.Logging, line 56
logInfo("debugLogOff") // library marker davegut.Logging, line 57
} // library marker davegut.Logging, line 58
def logDebug(msg) { // library marker davegut.Logging, line 60
if (logEnable || debugLog) { // library marker davegut.Logging, line 61
log.debug "${device.displayName}-${driverVer()}: ${msg}" // library marker davegut.Logging, line 62
} // library marker davegut.Logging, line 63
} // library marker davegut.Logging, line 64
def logWarn(msg) { log.warn "${device.displayName}-${driverVer()}: ${msg}" } // library marker davegut.Logging, line 66
def logError(msg) { log.error "${device.displayName}-${driverVer()}: ${msg}" } // library marker davegut.Logging, line 68
// ~~~~~ end include (1339) davegut.Logging ~~~~~