mirror of
https://github.com/mtan93/SmartThingsPublic.git
synced 2026-03-08 05:31:56 +00:00
Plant link Exceptions
Adding try/catch blocks to reduce HTTP exceptions due to rate limits or unauthorized errors.
This commit is contained in:
@@ -57,7 +57,7 @@ def authPage(){
|
|||||||
atomicState.accessToken = state.accessToken
|
atomicState.accessToken = state.accessToken
|
||||||
}
|
}
|
||||||
|
|
||||||
def redirectUrl = oauthInitUrl()
|
def redirectUrl = oauthInitUrl()
|
||||||
def uninstallAllowed = false
|
def uninstallAllowed = false
|
||||||
def oauthTokenProvided = false
|
def oauthTokenProvided = false
|
||||||
if(atomicState.authToken){
|
if(atomicState.authToken){
|
||||||
@@ -78,9 +78,9 @@ def authPage(){
|
|||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
return dynamicPage(name: "auth", title: "Step 1 of 2 - Completed", nextPage:"deviceList", uninstall:uninstallAllowed) {
|
return dynamicPage(name: "auth", title: "Step 1 of 2 - Completed", nextPage:"deviceList", uninstall:uninstallAllowed) {
|
||||||
section(){
|
section(){
|
||||||
paragraph "You are logged in to myplantlink.com, tap next to continue", image: iconUrl
|
paragraph "You are logged in to myplantlink.com, tap next to continue", image: iconUrl
|
||||||
href(url:redirectUrl, title:"Or", description:"tap to switch accounts")
|
href(url:redirectUrl, title:"Or", description:"tap to switch accounts")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -137,36 +137,44 @@ def dock_sensor(device_serial, expected_plant_name) {
|
|||||||
contentType: "application/json",
|
contentType: "application/json",
|
||||||
]
|
]
|
||||||
log.debug "Creating new plant on myplantlink.com - ${expected_plant_name}"
|
log.debug "Creating new plant on myplantlink.com - ${expected_plant_name}"
|
||||||
httpPost(docking_params) { docking_response ->
|
try {
|
||||||
if (parse_api_response(docking_response, "Docking a link")) {
|
httpPost(docking_params) { docking_response ->
|
||||||
if (docking_response.data.plants.size() == 0) {
|
if (parse_api_response(docking_response, "Docking a link")) {
|
||||||
log.debug "creating plant for - ${expected_plant_name}"
|
if (docking_response.data.plants.size() == 0) {
|
||||||
plant_post_body_map["name"] = expected_plant_name
|
log.debug "creating plant for - ${expected_plant_name}"
|
||||||
plant_post_body_map['links_key'] = [docking_response.data.key]
|
plant_post_body_map["name"] = expected_plant_name
|
||||||
def plant_post_body_json_builder = new JsonBuilder(plant_post_body_map)
|
plant_post_body_map['links_key'] = [docking_response.data.key]
|
||||||
plant_post_params["body"] = plant_post_body_json_builder.toString()
|
def plant_post_body_json_builder = new JsonBuilder(plant_post_body_map)
|
||||||
httpPost(plant_post_params) { plant_post_response ->
|
plant_post_params["body"] = plant_post_body_json_builder.toString()
|
||||||
if(parse_api_response(plant_post_response, 'creating plant')){
|
try {
|
||||||
def attached_map = atomicState.attached_sensors
|
httpPost(plant_post_params) { plant_post_response ->
|
||||||
attached_map[device_serial] = plant_post_response.data
|
if(parse_api_response(plant_post_response, 'creating plant')){
|
||||||
atomicState.attached_sensors = attached_map
|
def attached_map = atomicState.attached_sensors
|
||||||
|
attached_map[device_serial] = plant_post_response.data
|
||||||
|
atomicState.attached_sensors = attached_map
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception f) {
|
||||||
|
log.debug "call failed $f"
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
def plant = docking_response.data.plants[0]
|
||||||
|
def attached_map = atomicState.attached_sensors
|
||||||
|
attached_map[device_serial] = plant
|
||||||
|
atomicState.attached_sensors = attached_map
|
||||||
|
checkAndUpdatePlantIfNeeded(plant, expected_plant_name)
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
def plant = docking_response.data.plants[0]
|
|
||||||
def attached_map = atomicState.attached_sensors
|
|
||||||
attached_map[device_serial] = plant
|
|
||||||
atomicState.attached_sensors = attached_map
|
|
||||||
checkAndUpdatePlantIfNeeded(plant, expected_plant_name)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.debug "call failed $e"
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
def checkAndUpdatePlantIfNeeded(plant, expected_plant_name){
|
def checkAndUpdatePlantIfNeeded(plant, expected_plant_name){
|
||||||
def plant_put_params = [
|
def plant_put_params = [
|
||||||
uri : appSettings.https_plantLinkServer,
|
uri : appSettings.https_plantLinkServer,
|
||||||
headers : ["Content-Type": "application/json", "Authorization": "Bearer ${atomicState.authToken}"],
|
headers : ["Content-Type": "application/json", "Authorization": "Bearer ${atomicState.authToken}"],
|
||||||
contentType : "application/json"
|
contentType : "application/json"
|
||||||
]
|
]
|
||||||
@@ -174,12 +182,16 @@ def checkAndUpdatePlantIfNeeded(plant, expected_plant_name){
|
|||||||
log.debug "updating plant for - ${expected_plant_name}"
|
log.debug "updating plant for - ${expected_plant_name}"
|
||||||
plant_put_params["path"] = "/api/v1/plants/${plant.key}"
|
plant_put_params["path"] = "/api/v1/plants/${plant.key}"
|
||||||
def plant_put_body_map = [
|
def plant_put_body_map = [
|
||||||
name: expected_plant_name
|
name: expected_plant_name
|
||||||
]
|
]
|
||||||
def plant_put_body_json_builder = new JsonBuilder(plant_put_body_map)
|
def plant_put_body_json_builder = new JsonBuilder(plant_put_body_map)
|
||||||
plant_put_params["body"] = plant_put_body_json_builder.toString()
|
plant_put_params["body"] = plant_put_body_json_builder.toString()
|
||||||
httpPut(plant_put_params) { plant_put_response ->
|
try {
|
||||||
parse_api_response(plant_put_response, 'updating plant name')
|
httpPut(plant_put_params) { plant_put_response ->
|
||||||
|
parse_api_response(plant_put_response, 'updating plant name')
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.debug "call failed $e"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -198,25 +210,29 @@ def moistureHandler(event){
|
|||||||
contentType: "application/json",
|
contentType: "application/json",
|
||||||
body: event.value
|
body: event.value
|
||||||
]
|
]
|
||||||
httpPost(measurement_post_params) { measurement_post_response ->
|
try {
|
||||||
if (parse_api_response(measurement_post_response, 'creating moisture measurement') &&
|
httpPost(measurement_post_params) { measurement_post_response ->
|
||||||
measurement_post_response.data.size() >0){
|
if (parse_api_response(measurement_post_response, 'creating moisture measurement') &&
|
||||||
def measurement = measurement_post_response.data[0]
|
measurement_post_response.data.size() >0){
|
||||||
def plant = measurement.plant
|
def measurement = measurement_post_response.data[0]
|
||||||
log.debug plant
|
def plant = measurement.plant
|
||||||
checkAndUpdatePlantIfNeeded(plant, expected_plant_name)
|
log.debug plant
|
||||||
plantlinksensors.each{ sensor_device ->
|
checkAndUpdatePlantIfNeeded(plant, expected_plant_name)
|
||||||
if (sensor_device.id == event.deviceId){
|
plantlinksensors.each{ sensor_device ->
|
||||||
sensor_device.setStatusIcon(plant.status)
|
if (sensor_device.id == event.deviceId){
|
||||||
if (plant.last_measurements && plant.last_measurements[0].moisture){
|
sensor_device.setStatusIcon(plant.status)
|
||||||
sensor_device.setPlantFuelLevel(plant.last_measurements[0].moisture * 100 as int)
|
if (plant.last_measurements && plant.last_measurements[0].moisture){
|
||||||
}
|
sensor_device.setPlantFuelLevel(plant.last_measurements[0].moisture * 100 as int)
|
||||||
if (plant.last_measurements && plant.last_measurements[0].battery){
|
}
|
||||||
sensor_device.setBatteryLevel(plant.last_measurements[0].battery * 100 as int)
|
if (plant.last_measurements && plant.last_measurements[0].battery){
|
||||||
|
sensor_device.setBatteryLevel(plant.last_measurements[0].battery * 100 as int)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.debug "call failed $e"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -235,8 +251,12 @@ def batteryHandler(event){
|
|||||||
contentType: "application/json",
|
contentType: "application/json",
|
||||||
body: event.value
|
body: event.value
|
||||||
]
|
]
|
||||||
httpPost(measurement_post_params) { measurement_post_response ->
|
try {
|
||||||
parse_api_response(measurement_post_response, 'creating battery measurement')
|
httpPost(measurement_post_params) { measurement_post_response ->
|
||||||
|
parse_api_response(measurement_post_response, 'creating battery measurement')
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.debug "call failed $e"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -248,7 +268,7 @@ def getDeviceSerialFromEvent(event){
|
|||||||
}
|
}
|
||||||
|
|
||||||
def oauthInitUrl(){
|
def oauthInitUrl(){
|
||||||
atomicState.oauthInitState = UUID.randomUUID().toString()
|
atomicState.oauthInitState = UUID.randomUUID().toString()
|
||||||
def oauthParams = [
|
def oauthParams = [
|
||||||
response_type: "code",
|
response_type: "code",
|
||||||
client_id: appSettings.client_id,
|
client_id: appSettings.client_id,
|
||||||
@@ -275,8 +295,12 @@ def swapToken(){
|
|||||||
]
|
]
|
||||||
|
|
||||||
def jsonMap
|
def jsonMap
|
||||||
httpPost(postParams) { resp ->
|
try {
|
||||||
jsonMap = resp.data
|
httpPost(postParams) { resp ->
|
||||||
|
jsonMap = resp.data
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.debug "call failed $e"
|
||||||
}
|
}
|
||||||
|
|
||||||
atomicState.refreshToken = jsonMap.refresh_token
|
atomicState.refreshToken = jsonMap.refresh_token
|
||||||
@@ -287,33 +311,33 @@ def swapToken(){
|
|||||||
<head>
|
<head>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<style>
|
<style>
|
||||||
.container {
|
.container {
|
||||||
padding:25px;
|
padding:25px;
|
||||||
}
|
}
|
||||||
.flex1 {
|
.flex1 {
|
||||||
width:33%;
|
width:33%;
|
||||||
float:left;
|
float:left;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
p {
|
p {
|
||||||
font-size: 2em;
|
font-size: 2em;
|
||||||
font-family: Verdana, Geneva, sans-serif;
|
font-family: Verdana, Geneva, sans-serif;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #777;
|
color: #777;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="flex1"><img src="https://dashboard.myplantlink.com/images/PLlogo.png" alt="PlantLink" height="75"/></div>
|
<div class="flex1"><img src="https://dashboard.myplantlink.com/images/PLlogo.png" alt="PlantLink" height="75"/></div>
|
||||||
<div class="flex1"><img src="https://s3.amazonaws.com/smartapp-icons/Partner/support/connected-device-icn%402x.png" alt="connected to" height="25" style="padding-top:25px;" /></div>
|
<div class="flex1"><img src="https://s3.amazonaws.com/smartapp-icons/Partner/support/connected-device-icn%402x.png" alt="connected to" height="25" style="padding-top:25px;" /></div>
|
||||||
<div class="flex1"><img src="https://s3.amazonaws.com/smartapp-icons/Partner/support/st-logo%402x.png" alt="SmartThings" height="75"/></div>
|
<div class="flex1"><img src="https://s3.amazonaws.com/smartapp-icons/Partner/support/st-logo%402x.png" alt="SmartThings" height="75"/></div>
|
||||||
<br clear="all">
|
<br clear="all">
|
||||||
</div>
|
</div>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<p>Your PlantLink Account is now connected to SmartThings!</p>
|
<p>Your PlantLink Account is now connected to SmartThings!</p>
|
||||||
<p style="color:green;">Click <strong>Done</strong> at the top right to finish setup.</p>
|
<p style="color:green;">Click <strong>Done</strong> at the top right to finish setup.</p>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user