mirror of
https://github.com/mtan93/SmartThingsPublic.git
synced 2026-03-20 13:20:53 +00:00
Compare commits
8 Commits
MSA-1494-2
...
DEVC-489-1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
22bbe08d0c | ||
|
|
218cc43520 | ||
|
|
9ddc020f04 | ||
|
|
9fbbaec8f6 | ||
|
|
e4c1824afd | ||
|
|
797a58cb68 | ||
|
|
c428267d63 | ||
|
|
230541a145 |
@@ -87,16 +87,27 @@ def beep() {
|
|||||||
up to this long from the time you send the message to the time you hear a sound.
|
up to this long from the time you send the message to the time you hear a sound.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Used source endpoint of 0x02 because we are using smartthings manufacturer specific cluster.
|
||||||
[
|
[
|
||||||
"raw 0xFC05 {15 0A 11 00 00 15 01}",
|
"raw 0xFC05 {15 0A 11 00 00 15 01}",
|
||||||
|
"delay 200",
|
||||||
|
"send 0x$zigbee.deviceNetworkId 0x02 0x$zigbee.endpointId",
|
||||||
"delay 7000",
|
"delay 7000",
|
||||||
"raw 0xFC05 {15 0A 11 00 00 15 01}",
|
"raw 0xFC05 {15 0A 11 00 00 15 01}",
|
||||||
|
"delay 200",
|
||||||
|
"send 0x$zigbee.deviceNetworkId 0x02 0x$zigbee.endpointId",
|
||||||
"delay 7000",
|
"delay 7000",
|
||||||
"raw 0xFC05 {15 0A 11 00 00 15 01}",
|
"raw 0xFC05 {15 0A 11 00 00 15 01}",
|
||||||
|
"delay 200",
|
||||||
|
"send 0x$zigbee.deviceNetworkId 0x02 0x$zigbee.endpointId",
|
||||||
"delay 7000",
|
"delay 7000",
|
||||||
"raw 0xFC05 {15 0A 11 00 00 15 01}",
|
"raw 0xFC05 {15 0A 11 00 00 15 01}",
|
||||||
|
"delay 200",
|
||||||
|
"send 0x$zigbee.deviceNetworkId 0x02 0x$zigbee.endpointId",
|
||||||
"delay 7000",
|
"delay 7000",
|
||||||
"raw 0xFC05 {15 0A 11 00 00 15 01}"
|
"raw 0xFC05 {15 0A 11 00 00 15 01}",
|
||||||
|
"delay 200",
|
||||||
|
"send 0x$zigbee.deviceNetworkId 0x02 0x$zigbee.endpointId",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -105,11 +105,21 @@ def parseDescriptionAsMap(description) {
|
|||||||
|
|
||||||
// Commands to device
|
// Commands to device
|
||||||
def on() {
|
def on() {
|
||||||
'zcl on-off on'
|
[
|
||||||
|
'zcl on-off on',
|
||||||
|
'delay 200',
|
||||||
|
"send 0x${zigbee.deviceNetworkId} 0x01 0x${zigbee.endpointId}",
|
||||||
|
'delay 500'
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
def off() {
|
def off() {
|
||||||
'zcl on-off off'
|
[
|
||||||
|
'zcl on-off off',
|
||||||
|
'delay 200',
|
||||||
|
"send 0x${zigbee.deviceNetworkId} 0x01 0x${zigbee.endpointId}",
|
||||||
|
'delay 500'
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
def setLevel(value) {
|
def setLevel(value) {
|
||||||
|
|||||||
@@ -47,9 +47,21 @@ def parse(String description) {
|
|||||||
|
|
||||||
// Commands to device
|
// Commands to device
|
||||||
def on() {
|
def on() {
|
||||||
'zcl on-off on'
|
[
|
||||||
|
'zcl on-off on',
|
||||||
|
'delay 200',
|
||||||
|
"send 0x${zigbee.deviceNetworkId} 0x01 0x${zigbee.endpointId}",
|
||||||
|
'delay 500'
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def off() {
|
def off() {
|
||||||
'zcl on-off off'
|
[
|
||||||
|
'zcl on-off off',
|
||||||
|
'delay 200',
|
||||||
|
"send 0x${zigbee.deviceNetworkId} 0x01 0x${zigbee.endpointId}",
|
||||||
|
'delay 500'
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ metadata {
|
|||||||
|
|
||||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006"
|
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006"
|
||||||
fingerprint profileId: "0104", inClusters: "0000, 0003, 0006", outClusters: "0003, 0006, 0019, 0406", manufacturer: "Leviton", model: "ZSS-10", deviceJoinName: "Leviton Switch"
|
fingerprint profileId: "0104", inClusters: "0000, 0003, 0006", outClusters: "0003, 0006, 0019, 0406", manufacturer: "Leviton", model: "ZSS-10", deviceJoinName: "Leviton Switch"
|
||||||
|
fingerprint profileId: "0104", inClusters: "0000, 0003, 0006", outClusters: "000A", manufacturer: "HAI", model: "65A21-1", deviceJoinName: "Leviton Wireless Load Control Module-30amp"
|
||||||
}
|
}
|
||||||
|
|
||||||
// simulator metadata
|
// simulator metadata
|
||||||
@@ -79,4 +80,4 @@ def refresh() {
|
|||||||
def configure() {
|
def configure() {
|
||||||
log.debug "Configuring Reporting and Bindings."
|
log.debug "Configuring Reporting and Bindings."
|
||||||
zigbee.onOffConfig() + zigbee.onOffRefresh()
|
zigbee.onOffConfig() + zigbee.onOffRefresh()
|
||||||
}
|
}
|
||||||
@@ -454,17 +454,23 @@ def sendStopEvent(source) {
|
|||||||
eventData.value += "cancelled"
|
eventData.value += "cancelled"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// send 100% completion event
|
||||||
|
sendTimeRemainingEvent(100)
|
||||||
|
|
||||||
|
// send a non-displayed 0% completion to reset tiles
|
||||||
|
sendTimeRemainingEvent(0, false)
|
||||||
|
|
||||||
|
// send sessionStatus event last so the event feed is ordered properly
|
||||||
sendControllerEvent(eventData)
|
sendControllerEvent(eventData)
|
||||||
sendTimeRemainingEvent(0)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def sendTimeRemainingEvent(percentComplete) {
|
def sendTimeRemainingEvent(percentComplete, displayed = true) {
|
||||||
log.trace "sendTimeRemainingEvent(${percentComplete})"
|
log.trace "sendTimeRemainingEvent(${percentComplete})"
|
||||||
|
|
||||||
def percentCompleteEventData = [
|
def percentCompleteEventData = [
|
||||||
name: "percentComplete",
|
name: "percentComplete",
|
||||||
value: percentComplete as int,
|
value: percentComplete as int,
|
||||||
displayed: true,
|
displayed: displayed,
|
||||||
isStateChange: true
|
isStateChange: true
|
||||||
]
|
]
|
||||||
sendControllerEvent(percentCompleteEventData)
|
sendControllerEvent(percentCompleteEventData)
|
||||||
@@ -474,7 +480,7 @@ def sendTimeRemainingEvent(percentComplete) {
|
|||||||
def timeRemainingEventData = [
|
def timeRemainingEventData = [
|
||||||
name: "timeRemaining",
|
name: "timeRemaining",
|
||||||
value: displayableTime(timeRemaining),
|
value: displayableTime(timeRemaining),
|
||||||
displayed: true,
|
displayed: displayed,
|
||||||
isStateChange: true
|
isStateChange: true
|
||||||
]
|
]
|
||||||
sendControllerEvent(timeRemainingEventData)
|
sendControllerEvent(timeRemainingEventData)
|
||||||
@@ -608,8 +614,6 @@ private completion() {
|
|||||||
handleCompletionMessaging()
|
handleCompletionMessaging()
|
||||||
|
|
||||||
handleCompletionModesAndPhrases()
|
handleCompletionModesAndPhrases()
|
||||||
|
|
||||||
sendTimeRemainingEvent(100)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleCompletionSwitches() {
|
private handleCompletionSwitches() {
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
* locks | lock | lock, unlock | locked, unlocked
|
* locks | lock | lock, unlock | locked, unlocked
|
||||||
* ---------------------+-------------------+-----------------------------+------------------------------------
|
* ---------------------+-------------------+-----------------------------+------------------------------------
|
||||||
*/
|
*/
|
||||||
|
include 'asynchttp_v1'
|
||||||
|
|
||||||
definition(
|
definition(
|
||||||
name: "Logitech Harmony (Connect)",
|
name: "Logitech Harmony (Connect)",
|
||||||
@@ -109,26 +110,28 @@ def authPage() {
|
|||||||
//device discovery request every 5 //25 seconds
|
//device discovery request every 5 //25 seconds
|
||||||
int deviceRefreshCount = !state.deviceRefreshCount ? 0 : state.deviceRefreshCount as int
|
int deviceRefreshCount = !state.deviceRefreshCount ? 0 : state.deviceRefreshCount as int
|
||||||
state.deviceRefreshCount = deviceRefreshCount + 1
|
state.deviceRefreshCount = deviceRefreshCount + 1
|
||||||
def refreshInterval = 3
|
def refreshInterval = 5
|
||||||
|
|
||||||
def huboptions = state.HarmonyHubs ?: []
|
def huboptions = state.HarmonyHubs ?: []
|
||||||
def actoptions = state.HarmonyActivities ?: []
|
def actoptions = state.HarmonyActivities ?: []
|
||||||
|
|
||||||
def numFoundHub = huboptions.size() ?: 0
|
def numFoundHub = huboptions.size() ?: 0
|
||||||
def numFoundAct = actoptions.size() ?: 0
|
def numFoundAct = actoptions.size() ?: 0
|
||||||
|
|
||||||
if((deviceRefreshCount % 5) == 0) {
|
if((deviceRefreshCount % 5) == 0) {
|
||||||
discoverDevices()
|
discoverDevices()
|
||||||
}
|
}
|
||||||
|
|
||||||
return dynamicPage(name:"Credentials", title:"Discovery Started!", nextPage:"", refreshInterval:refreshInterval, install:true, uninstall: true) {
|
return dynamicPage(name:"Credentials", title:"Discovery Started!", nextPage:"", refreshInterval:refreshInterval, install:true, uninstall: true) {
|
||||||
section("Please wait while we discover your Harmony Hubs and Activities. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.") {
|
section("Please wait while we discover your Harmony Hubs and Activities. Discovery can take five minutes or more, so sit back and relax! Select your device below once discovered.") {
|
||||||
input "selectedhubs", "enum", required:false, title:"Select Harmony Hubs (${numFoundHub} found)", multiple:true, options:huboptions
|
input "selectedhubs", "enum", required:false, title:"Select Harmony Hubs (${numFoundHub} found)", multiple:true, submitOnChange: true, options:huboptions
|
||||||
}
|
}
|
||||||
// Virtual activity flag
|
// Virtual activity flag
|
||||||
if (numFoundHub > 0 && numFoundAct > 0 && true)
|
if (numFoundHub > 0 && numFoundAct > 0 && true)
|
||||||
section("You can also add activities as virtual switches for other convenient integrations") {
|
section("You can also add activities as virtual switches for other convenient integrations") {
|
||||||
input "selectedactivities", "enum", required:false, title:"Select Harmony Activities (${numFoundAct} found)", multiple:true, options:actoptions
|
input "selectedactivities", "enum", required:false, title:"Select Harmony Activities (${numFoundAct} found)", multiple:true, submitOnChange: true, options:actoptions
|
||||||
}
|
}
|
||||||
if (state.resethub)
|
if (state.resethub)
|
||||||
section("Connection to the hub timed out. Please restart the hub and try again.") {}
|
section("Connection to the hub timed out. Please restart the hub and try again.") {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -380,8 +383,6 @@ def discovery() {
|
|||||||
log.debug "valid Token"
|
log.debug "valid Token"
|
||||||
state.Harmonydevices = response.data
|
state.Harmonydevices = response.data
|
||||||
state.resethub = false
|
state.resethub = false
|
||||||
getActivityList()
|
|
||||||
poll()
|
|
||||||
} else {
|
} else {
|
||||||
log.debug "Error: $response.status"
|
log.debug "Error: $response.status"
|
||||||
}
|
}
|
||||||
@@ -430,142 +431,182 @@ def addDevice() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def activity(dni,mode) {
|
def activity(dni,mode) {
|
||||||
def Params = [auth: state.HarmonyAccessToken]
|
def tokenParam = [auth: state.HarmonyAccessToken]
|
||||||
def msg = "Command failed"
|
def url
|
||||||
def url = ''
|
|
||||||
if (dni == "all") {
|
if (dni == "all") {
|
||||||
url = "https://home.myharmony.com/cloudapi/activity/off?${toQueryString(Params)}"
|
url = "https://home.myharmony.com/cloudapi/activity/off?${toQueryString(tokenParam)}"
|
||||||
} else {
|
} else {
|
||||||
def aux = dni.split('-')
|
def aux = dni.split('-')
|
||||||
def hubId = aux[1]
|
def hubId = aux[1]
|
||||||
if (mode == "hub" || (aux.size() <= 2) || (aux[2] == "off")){
|
if (mode == "hub" || (aux.size() <= 2) || (aux[2] == "off")){
|
||||||
url = "https://home.myharmony.com/cloudapi/hub/${hubId}/activity/off?${toQueryString(Params)}"
|
url = "https://home.myharmony.com/cloudapi/hub/${hubId}/activity/off?${toQueryString(tokenParam)}"
|
||||||
} else {
|
} else {
|
||||||
def activityId = aux[2]
|
def activityId = aux[2]
|
||||||
url = "https://home.myharmony.com/cloudapi/hub/${hubId}/activity/${activityId}/${mode}?${toQueryString(Params)}"
|
url = "https://home.myharmony.com/cloudapi/hub/${hubId}/activity/${activityId}/${mode}?${toQueryString(tokenParam)}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
def params = [
|
||||||
httpPostJson(uri: url) { response ->
|
uri: url,
|
||||||
if (response.data.code == 200 || dni == "all") {
|
contentType: 'application/json'
|
||||||
msg = "Command sent succesfully"
|
]
|
||||||
state.aux = 0
|
asynchttp_v1.post('activityResponse', params)
|
||||||
} else {
|
return "Command Sent"
|
||||||
msg = "Command failed. Error: $response.data.code"
|
}
|
||||||
}
|
|
||||||
}
|
def activityResponse(response, data) {
|
||||||
} catch (groovyx.net.http.HttpResponseException ex) {
|
if (response.hasError()) {
|
||||||
log.error ex
|
log.error "Logitech Harmony - response has error: $response.errorMessage"
|
||||||
if (state.aux == 0) {
|
if (response.status == 401) { // token is expired
|
||||||
state.aux = 1
|
state.remove("HarmonyAccessToken")
|
||||||
activity(dni,mode)
|
log.warn "Logitech Harmony - Access token has expired"
|
||||||
} else {
|
|
||||||
msg = ex
|
|
||||||
state.aux = 0
|
|
||||||
}
|
|
||||||
} catch(Exception ex) {
|
|
||||||
msg = ex
|
|
||||||
}
|
}
|
||||||
runIn(10, "poll", [overwrite: true])
|
} else {
|
||||||
return msg
|
def ResponseValues
|
||||||
|
try {
|
||||||
|
// json response already parsed into JSONElement object
|
||||||
|
ResponseValues = response.json
|
||||||
|
} catch (e) {
|
||||||
|
log.error "Logitech Harmony - error parsing json from response: $e"
|
||||||
|
}
|
||||||
|
if (ResponseValues) {
|
||||||
|
if (ResponseValues.code == 200) {
|
||||||
|
log.trace "Command sent succesfully"
|
||||||
|
poll()
|
||||||
|
} else {
|
||||||
|
log.trace "Command failed. Error: $response.data.code"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.debug "Logitech Harmony - did not get json results from response body: $response.data"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def poll() {
|
def poll() {
|
||||||
// GET THE LIST OF ACTIVITIES
|
// GET THE LIST OF ACTIVITIES
|
||||||
if (state.HarmonyAccessToken) {
|
if (state.HarmonyAccessToken) {
|
||||||
getActivityList()
|
getActivityList()
|
||||||
def Params = [auth: state.HarmonyAccessToken]
|
def tokenParam = [auth: state.HarmonyAccessToken]
|
||||||
def url = "https://home.myharmony.com/cloudapi/state?${toQueryString(Params)}"
|
def params = [
|
||||||
try {
|
uri: "https://home.myharmony.com/cloudapi/state?${toQueryString(tokenParam)}",
|
||||||
httpGet(uri: url, headers: ["Accept": "application/json"]) {response ->
|
headers: ["Accept": "application/json"],
|
||||||
def map = [:]
|
contentType: 'application/json'
|
||||||
response.data.hubs.each {
|
]
|
||||||
if (it.value.message == "OK") {
|
asynchttp_v1.get('pollResponse', params)
|
||||||
map["${it.key}"] = "${it.value.response.data.currentAvActivity},${it.value.response.data.activityStatus}"
|
} else {
|
||||||
def hub = getChildDevice("harmony-${it.key}")
|
log.warn "Logitech Harmony - Access token has expired"
|
||||||
if (hub) {
|
}
|
||||||
if (it.value.response.data.currentAvActivity == "-1") {
|
}
|
||||||
hub.sendEvent(name: "currentActivity", value: "--", descriptionText: "There isn't any activity running", display: false)
|
|
||||||
} else {
|
def pollResponse(response, data) {
|
||||||
def currentActivity = getActivityName(it.value.response.data.currentAvActivity,it.key)
|
if (response.hasError()) {
|
||||||
hub.sendEvent(name: "currentActivity", value: currentActivity, descriptionText: "Current activity is ${currentActivity}", display: false)
|
log.error "Logitech Harmony - response has error: $response.errorMessage"
|
||||||
}
|
if (response.status == 401) { // token is expired
|
||||||
}
|
state.remove("HarmonyAccessToken")
|
||||||
} else {
|
log.warn "Logitech Harmony - Access token has expired"
|
||||||
log.trace it.value.message
|
}
|
||||||
}
|
} else {
|
||||||
}
|
def ResponseValues
|
||||||
def activities = getChildDevices()
|
try {
|
||||||
def activitynotrunning = true
|
// json response already parsed into JSONElement object
|
||||||
activities.each { activity ->
|
ResponseValues = response.json
|
||||||
def act = activity.deviceNetworkId.split('-')
|
} catch (e) {
|
||||||
if (act.size() > 2) {
|
log.error "Logitech Harmony - error parsing json from response: $e"
|
||||||
def aux = map.find { it.key == act[1] }
|
}
|
||||||
if (aux) {
|
if (ResponseValues) {
|
||||||
def aux2 = aux.value.split(',')
|
def map = [:]
|
||||||
def childDevice = getChildDevice(activity.deviceNetworkId)
|
ResponseValues.hubs.each {
|
||||||
if ((act[2] == aux2[0]) && (aux2[1] == "1" || aux2[1] == "2")) {
|
if (it.value.message == "OK") {
|
||||||
childDevice?.sendEvent(name: "switch", value: "on")
|
map["${it.key}"] = "${it.value.response.data.currentAvActivity},${it.value.response.data.activityStatus}"
|
||||||
if (aux2[1] == "1")
|
def hub = getChildDevice("harmony-${it.key}")
|
||||||
runIn(5, "poll", [overwrite: true])
|
if (hub) {
|
||||||
} else {
|
if (it.value.response.data.currentAvActivity == "-1") {
|
||||||
childDevice?.sendEvent(name: "switch", value: "off")
|
hub.sendEvent(name: "currentActivity", value: "--", descriptionText: "There isn't any activity running", display: false)
|
||||||
if (aux2[1] == "3")
|
} else {
|
||||||
runIn(5, "poll", [overwrite: true])
|
def currentActivity = getChildDevice("harmony-${it.key}-${it.value.response.data.currentAvActivity}").device.displayName
|
||||||
}
|
hub.sendEvent(name: "currentActivity", value: currentActivity, descriptionText: "Current activity is ${currentActivity}", display: false)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.trace "Logitech Harmony - error response: $it.value.message"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
def activities = getChildDevices()
|
||||||
|
def activitynotrunning = true
|
||||||
|
activities.each { activity ->
|
||||||
|
def act = activity.deviceNetworkId.split('-')
|
||||||
|
if (act.size() > 2) {
|
||||||
|
def aux = map.find { it.key == act[1] }
|
||||||
|
if (aux) {
|
||||||
|
def aux2 = aux.value.split(',')
|
||||||
|
def childDevice = getChildDevice(activity.deviceNetworkId)
|
||||||
|
if ((act[2] == aux2[0]) && (aux2[1] == "1" || aux2[1] == "2")) {
|
||||||
|
childDevice?.sendEvent(name: "switch", value: "on")
|
||||||
|
if (aux2[1] == "1")
|
||||||
|
runIn(5, "poll", [overwrite: true])
|
||||||
|
} else {
|
||||||
|
childDevice?.sendEvent(name: "switch", value: "off")
|
||||||
|
if (aux2[1] == "3")
|
||||||
|
runIn(5, "poll", [overwrite: true])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "Poll completed $map - $state.hubs"
|
|
||||||
}
|
}
|
||||||
} catch (groovyx.net.http.HttpResponseException e) {
|
|
||||||
if (e.statusCode == 401) { // token is expired
|
|
||||||
state.remove("HarmonyAccessToken")
|
|
||||||
log.warn "Harmony Access token has expired"
|
|
||||||
}
|
|
||||||
} catch (java.net.SocketTimeoutException e) {
|
|
||||||
log.warn "Connection to the hub timed out. Please restart the hub and try again."
|
|
||||||
state.resethub = true
|
|
||||||
} catch (e) {
|
|
||||||
log.info "Logitech Harmony - Error: $e"
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
log.debug "Logitech Harmony - did not get json results from response body: $response.data"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def getActivityList() {
|
||||||
|
if (state.HarmonyAccessToken) {
|
||||||
|
def tokenParam = [auth: state.HarmonyAccessToken]
|
||||||
|
def params = [
|
||||||
|
uri: "https://home.myharmony.com/cloudapi/activity/all?${toQueryString(tokenParam)}",
|
||||||
|
headers: ["Accept": "application/json"],
|
||||||
|
contentType: 'application/json'
|
||||||
|
]
|
||||||
|
asynchttp_v1.get('activityListResponse', params)
|
||||||
|
} else {
|
||||||
|
log.warn "Logitech Harmony - Access token has expired"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def activityListResponse(response, data) {
|
||||||
def getActivityList() {
|
if (response.hasError()) {
|
||||||
// GET ACTIVITY'S NAME
|
log.error "Logitech Harmony - response has error: $response.errorMessage"
|
||||||
if (state.HarmonyAccessToken) {
|
if (response.status == 401) { // token is expired
|
||||||
def Params = [auth: state.HarmonyAccessToken]
|
state.remove("HarmonyAccessToken")
|
||||||
def url = "https://home.myharmony.com/cloudapi/activity/all?${toQueryString(Params)}"
|
log.warn "Logitech Harmony - Access token has expired"
|
||||||
try {
|
}
|
||||||
httpGet(uri: url, headers: ["Accept": "application/json"]) {response ->
|
} else {
|
||||||
response.data.hubs.each {
|
def ResponseValues
|
||||||
def hub = getChildDevice("harmony-${it.key}")
|
try {
|
||||||
if (hub) {
|
// json response already parsed into JSONElement object
|
||||||
def hubname = getHubName("${it.key}")
|
ResponseValues = response.json
|
||||||
def activities = []
|
} catch (e) {
|
||||||
def aux = it.value.response.data.activities.size()
|
log.error "Logitech Harmony - error parsing json from response: $e"
|
||||||
if (aux >= 1) {
|
}
|
||||||
activities = it.value.response.data.activities.collect {
|
if (ResponseValues) {
|
||||||
[id: it.key, name: it.value['name'], type: it.value['type']]
|
ResponseValues.hubs.each {
|
||||||
}
|
def hub = getChildDevice("harmony-${it.key}")
|
||||||
activities += [id: "off", name: "Activity OFF", type: "0"]
|
if (hub) {
|
||||||
log.trace activities
|
def hubname = getHubName("${it.key}")
|
||||||
}
|
def activities = []
|
||||||
hub.sendEvent(name: "activities", value: new groovy.json.JsonBuilder(activities).toString(), descriptionText: "Activities are ${activities.collect { it.name }?.join(', ')}", display: false)
|
def aux = it.value.response?.data.activities.size()
|
||||||
}
|
if (aux >= 1) {
|
||||||
}
|
activities = it.value.response.data.activities.collect {
|
||||||
}
|
[id: it.key, name: it.value['name'], type: it.value['type']]
|
||||||
} catch (groovyx.net.http.HttpResponseException e) {
|
}
|
||||||
log.trace e
|
activities += [id: "off", name: "Activity OFF", type: "0"]
|
||||||
} catch (java.net.SocketTimeoutException e) {
|
log.trace activities
|
||||||
log.trace e
|
}
|
||||||
} catch(Exception e) {
|
hub.sendEvent(name: "activities", value: new groovy.json.JsonBuilder(activities).toString(), descriptionText: "Activities are ${activities.collect { it.name }?.join(', ')}", display: false)
|
||||||
log.trace e
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
return activity
|
log.debug "Logitech Harmony - did not get json results from response body: $response.data"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def getActivityName(activity,hubId) {
|
def getActivityName(activity,hubId) {
|
||||||
@@ -746,7 +787,7 @@ def addSubscription() {
|
|||||||
def attribute = data.attributeName
|
def attribute = data.attributeName
|
||||||
def callbackUrl = data.callbackUrl
|
def callbackUrl = data.callbackUrl
|
||||||
|
|
||||||
log.debug "addSubscription, params: ${params}, request: ${data}"
|
log.debug "Logitech Harmony - addSubscription, params: ${params}, request: ${data}"
|
||||||
if (!attribute) {
|
if (!attribute) {
|
||||||
render status: 400, data: '{"msg": "attributeName is required"}'
|
render status: 400, data: '{"msg": "attributeName is required"}'
|
||||||
} else {
|
} else {
|
||||||
@@ -808,6 +849,7 @@ def deviceHandler(evt) {
|
|||||||
def deviceInfo = state[evt.deviceId]
|
def deviceInfo = state[evt.deviceId]
|
||||||
if (state.harmonyHubs) {
|
if (state.harmonyHubs) {
|
||||||
state.harmonyHubs.each { harmonyHub ->
|
state.harmonyHubs.each { harmonyHub ->
|
||||||
|
log.trace "Logitech Harmony - Sending data to $harmonyHub.name"
|
||||||
sendToHarmony(evt, harmonyHub.callbackUrl)
|
sendToHarmony(evt, harmonyHub.callbackUrl)
|
||||||
}
|
}
|
||||||
} else if (deviceInfo) {
|
} else if (deviceInfo) {
|
||||||
|
|||||||
Reference in New Issue
Block a user