Plant link Exceptions

Adding try/catch blocks to reduce HTTP exceptions due to rate limits or
unauthorized errors.
This commit is contained in:
Jason Botello
2017-01-24 14:53:23 -08:00
parent eb4d5dcfb8
commit 41adc9777a

View File

@@ -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>
""" """