diff --git a/pom.xml b/pom.xml
index 5207462..dc541b0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
com.bwssystems.HABridge
ha-bridge
- 1.3.8f
+ 1.3.8g
jar
HA Bridge
diff --git a/src/main/java/com/bwssystems/HABridge/SystemControl.java b/src/main/java/com/bwssystems/HABridge/SystemControl.java
index 2a43171..1140b6f 100644
--- a/src/main/java/com/bwssystems/HABridge/SystemControl.java
+++ b/src/main/java/com/bwssystems/HABridge/SystemControl.java
@@ -58,7 +58,7 @@ public class SystemControl {
});
// http://ip_address:port/system/settings which returns the bridge configuration settings
put(SYSTEM_CONTEXT + "/settings", "application/json", (request, response) -> {
- log.info("save bridge settings requested from " + request.ip() + " with body: " + request.body());
+ log.debug("save bridge settings requested from " + request.ip() + " with body: " + request.body());
BridgeSettingsDescriptor newBridgeSettings = new Gson().fromJson(request.body(), BridgeSettingsDescriptor.class);
bridgeSettings.save(newBridgeSettings);
response.status(200);
@@ -174,7 +174,7 @@ public class SystemControl {
socket.close();
}
catch (IOException e) {
- log.warn("Error pinging listener.", e);
+ log.warn("Error pinging listener. " + e.getMessage());
}
}
diff --git a/src/main/java/com/bwssystems/HABridge/dao/ErrorMessage.java b/src/main/java/com/bwssystems/HABridge/dao/ErrorMessage.java
new file mode 100644
index 0000000..a1b2f22
--- /dev/null
+++ b/src/main/java/com/bwssystems/HABridge/dao/ErrorMessage.java
@@ -0,0 +1,18 @@
+package com.bwssystems.HABridge.dao;
+
+public class ErrorMessage {
+ private String message;
+
+ public ErrorMessage(String message) {
+ super();
+ this.message = message;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+}
diff --git a/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java b/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java
index 77c8cb6..bd08962 100644
--- a/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java
+++ b/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java
@@ -20,8 +20,11 @@ import com.bwssystems.HABridge.JsonTransformer;
import com.bwssystems.HABridge.dao.BackupFilename;
import com.bwssystems.HABridge.dao.DeviceDescriptor;
import com.bwssystems.HABridge.dao.DeviceRepository;
+import com.bwssystems.HABridge.dao.ErrorMessage;
import com.bwssystems.NestBridge.NestHome;
import com.bwssystems.harmony.HarmonyHome;
+import com.bwssystems.luupRequests.Device;
+import com.bwssystems.luupRequests.Scene;
import com.bwssystems.vera.VeraHome;
import com.google.gson.Gson;
@@ -88,7 +91,7 @@ public class DeviceResource {
if (devices[i].getContentType() == null || devices[i].getHttpVerb() == null || !supportedVerbs.contains(devices[i].getHttpVerb().toLowerCase())) {
response.status(HttpStatus.SC_BAD_REQUEST);
log.debug("Bad http verb in create a Device(s): " + request.body());
- return devices;
+ return new ErrorMessage("Bad http verb in create a Device(s): " + request.body() + " ");
}
}
}
@@ -118,6 +121,7 @@ public class DeviceResource {
if(deviceEntry == null){
log.debug("Could not save an edited Device Id: " + request.params(":id"));
response.status(HttpStatus.SC_BAD_REQUEST);
+ return new ErrorMessage("Could not save an edited Device Id: " + request.params(":id") + " ");
}
else
{
@@ -157,8 +161,10 @@ public class DeviceResource {
get (API_CONTEXT + "/:id", "application/json", (request, response) -> {
log.debug("Get a device");
DeviceDescriptor descriptor = deviceRepository.findOne(request.params(":id"));
- if(descriptor == null)
+ if(descriptor == null) {
response.status(HttpStatus.SC_NOT_FOUND);
+ return new ErrorMessage("Could not find, id: " + request.params(":id") + " ");
+ }
else
response.status(HttpStatus.SC_OK);
return descriptor;
@@ -168,8 +174,10 @@ public class DeviceResource {
String anId = request.params(":id");
log.debug("Delete a device: " + anId);
DeviceDescriptor deleted = deviceRepository.findOne(anId);
- if(deleted == null)
+ if(deleted == null) {
response.status(HttpStatus.SC_NOT_FOUND);
+ return new ErrorMessage("Could not delete, id: " + anId + " not found. ");
+ }
else
{
deviceRepository.delete(deleted);
@@ -182,28 +190,39 @@ public class DeviceResource {
log.debug("Get vera devices");
if(veraHome == null){
response.status(HttpStatus.SC_NOT_FOUND);
- return null;
+ return new ErrorMessage("A Vera is not available.");
}
-
- response.status(HttpStatus.SC_OK);
- return veraHome.getDevices();
+ List theDevices = veraHome.getDevices();
+ if(theDevices == null) {
+ response.status(HttpStatus.SC_SERVICE_UNAVAILABLE);
+ return new ErrorMessage("A Vera request failed to get devices. Check your Vera IP addresses.");
+ }
+ else
+ response.status(HttpStatus.SC_OK);
+ return theDevices;
}, new JsonTransformer());
get (API_CONTEXT + "/vera/scenes", "application/json", (request, response) -> {
log.debug("Get vera scenes");
if(veraHome == null){
response.status(HttpStatus.SC_NOT_FOUND);
- return null;
+ return new ErrorMessage("A Vera is not available.");
}
- response.status(HttpStatus.SC_OK);
- return veraHome.getScenes();
+ List theScenes = veraHome.getScenes();
+ if(theScenes == null) {
+ response.status(HttpStatus.SC_SERVICE_UNAVAILABLE);
+ return new ErrorMessage("A Vera is not available and failed to get scenes. Check your Vera IP addresses.");
+ }
+ else
+ response.status(HttpStatus.SC_OK);
+ return theScenes;
}, new JsonTransformer());
get (API_CONTEXT + "/harmony/activities", "application/json", (request, response) -> {
log.debug("Get harmony activities");
if(myHarmonyHome == null) {
response.status(HttpStatus.SC_NOT_FOUND);
- return null;
+ return new ErrorMessage("A Harmony is not available.");
}
response.status(HttpStatus.SC_OK);
return myHarmonyHome.getActivities();
@@ -213,7 +232,7 @@ public class DeviceResource {
log.debug("Get harmony current activity");
if(myHarmonyHome == null) {
response.status(HttpStatus.SC_NOT_FOUND);
- return null;
+ return new ErrorMessage("A Harmony is not available.");
}
response.status(HttpStatus.SC_OK);
return myHarmonyHome.getCurrentActivities();
@@ -223,7 +242,7 @@ public class DeviceResource {
log.debug("Get harmony devices");
if(myHarmonyHome == null) {
response.status(HttpStatus.SC_NOT_FOUND);
- return null;
+ return new ErrorMessage("A Harmony is not available.");
}
response.status(HttpStatus.SC_OK);
return myHarmonyHome.getDevices();
@@ -233,7 +252,7 @@ public class DeviceResource {
log.debug("Get nest items");
if(nestHome == null) {
response.status(HttpStatus.SC_NOT_FOUND);
- return null;
+ return new ErrorMessage("A Nest is not available.");
}
response.status(HttpStatus.SC_OK);
return nestHome.getItems();
diff --git a/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java b/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java
index 08a3f18..08d5cad 100644
--- a/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java
+++ b/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java
@@ -245,7 +245,7 @@ public class HueMulator {
DeviceDescriptor device = repository.findOne(lightId);
if (device == null) {
response.status(HttpStatus.SC_NOT_FOUND);
- return null;
+ return "[{\"error\":{\"type\": 3, \"address\": \"/lights/" + lightId + ",\"description\": \"Object not found\"}}]";
} else {
log.debug("found device named: " + device.getName());
}
diff --git a/src/main/java/com/bwssystems/vera/VeraHome.java b/src/main/java/com/bwssystems/vera/VeraHome.java
index 39d8078..96c57fb 100644
--- a/src/main/java/com/bwssystems/vera/VeraHome.java
+++ b/src/main/java/com/bwssystems/vera/VeraHome.java
@@ -13,6 +13,7 @@ import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.NamedIP;
import com.bwssystems.luupRequests.Device;
import com.bwssystems.luupRequests.Scene;
+import com.bwssystems.luupRequests.Sdata;
public class VeraHome {
private static final Logger log = LoggerFactory.getLogger(VeraHome.class);
@@ -35,9 +36,16 @@ public class VeraHome {
ArrayList deviceList = new ArrayList();
while(keys.hasNext()) {
String key = keys.next();
- Iterator devices = veras.get(key).getSdata().getDevices().iterator();
- while(devices.hasNext()) {
- deviceList.add(devices.next());
+ Sdata theSdata = veras.get(key).getSdata();
+ if(theSdata != null) {
+ Iterator devices = theSdata.getDevices().iterator();
+ while(devices.hasNext()) {
+ deviceList.add(devices.next());
+ }
+ }
+ else {
+ deviceList = null;
+ break;
}
}
return deviceList;
@@ -48,9 +56,16 @@ public class VeraHome {
ArrayList sceneList = new ArrayList();
while(keys.hasNext()) {
String key = keys.next();
- Iterator scenes = veras.get(key).getSdata().getScenes().iterator();
- while(scenes.hasNext()) {
- sceneList.add(scenes.next());
+ Sdata theSdata = veras.get(key).getSdata();
+ if(theSdata != null) {
+ Iterator scenes = theSdata.getScenes().iterator();
+ while(scenes.hasNext()) {
+ sceneList.add(scenes.next());
+ }
+ }
+ else {
+ sceneList = null;
+ break;
}
}
return sceneList;
diff --git a/src/main/java/com/bwssystems/vera/VeraInfo.java b/src/main/java/com/bwssystems/vera/VeraInfo.java
index a371e12..9f89084 100644
--- a/src/main/java/com/bwssystems/vera/VeraInfo.java
+++ b/src/main/java/com/bwssystems/vera/VeraInfo.java
@@ -37,16 +37,19 @@ public class VeraInfo {
}
public Sdata getSdata() {
+ Sdata theSdata = null;
if(!validVera)
- return new Sdata();
+ return theSdata;
String theUrl = "http://" + veraAddress.getIp() + SDATA_REQUEST;
String theData;
theData = doHttpGETRequest(theUrl);
- Sdata theSdata = new Gson().fromJson(theData, Sdata.class);
- log.debug("GET sdata - full: " + theSdata.getFull() + ", version: " + theSdata.getVersion());
- denormalizeSdata(theSdata);
+ if(theData != null) {
+ theSdata = new Gson().fromJson(theData, Sdata.class);
+ log.debug("GET sdata - full: " + theSdata.getFull() + ", version: " + theSdata.getVersion());
+ denormalizeSdata(theSdata);
+ }
return theSdata;
}
@@ -91,19 +94,19 @@ public class VeraInfo {
// This function executes the url against the vera
protected String doHttpGETRequest(String url) {
+ String theContent = null;
log.debug("calling GET on URL: " + url);
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse response = httpClient.execute(httpGet);
- String theContent = EntityUtils.toString(response.getEntity()); //read content for data
- EntityUtils.consume(response.getEntity()); //close out inputstream ignore content
log.debug("GET on URL responded: " + response.getStatusLine().getStatusCode());
if(response.getStatusLine().getStatusCode() == 200){
- return theContent;
+ theContent = EntityUtils.toString(response.getEntity()); //read content for data
+ EntityUtils.consume(response.getEntity()); //close out inputstream ignore content
}
} catch (IOException e) {
- log.error("Error calling out to HA gateway", e);
+ log.error("doHttpGETRequest: Error calling out to HA gateway: " + e.getMessage());
}
- return null;
+ return theContent;
}
}
diff --git a/src/main/resources/public/css/slider.css b/src/main/resources/public/css/slider.css
new file mode 100644
index 0000000..efb28ad
--- /dev/null
+++ b/src/main/resources/public/css/slider.css
@@ -0,0 +1,75 @@
+/* line 2, slider.scss */
+slider, [slider] {
+ display: inline-block;
+ position: relative;
+ height: 7px;
+ width: 100%;
+ margin: 25px 5px 25px 5px;
+ vertical-align: middle;
+}
+/* line 10, slider.scss */
+slider div, [slider] div {
+ white-space: nowrap;
+ position: absolute;
+}
+/* line 14, slider.scss */
+slider div.bar, [slider] div.bar {
+ width: 100%;
+ height: 100%;
+ border-radius: 7px;
+ background: #444;
+ overflow: hidden;
+}
+/* line 21, slider.scss */
+slider div.bar .selection, [slider] div.bar .selection {
+ width: 0%;
+ height: 100%;
+ background: #13b6ff;
+}
+/* line 28, slider.scss */
+slider div.handle, [slider] div.handle {
+ cursor: pointer;
+ width: 20px;
+ height: 20px;
+ top: -8px;
+ background-color: #fff;
+ border: 1px solid #000;
+ z-index: 2;
+ border-radius: 100%;
+}
+/* line 38, slider.scss */
+slider div.handle:after, [slider] div.handle:after {
+ content: '';
+ background-color: #777;
+ width: 8px;
+ height: 8px;
+ position: absolute;
+ top: 6px;
+ left: 6px;
+ border-radius: 100%;
+}
+/* line 48, slider.scss */
+slider div.handle:after:hover, [slider] div.handle:after:hover {
+ background-color: #000;
+}
+/* line 53, slider.scss */
+slider div.handle.active:after, [slider] div.handle.active:after {
+ background-color: #f00;
+}
+/* line 58, slider.scss */
+slider div.bubble, [slider] div.bubble {
+ display: none;
+ cursor: default;
+ top: -22px;
+ padding: 1px 3px 1px 3px;
+ font-size: 0.7em;
+ font-family: sans-serif;
+}
+/* line 66, slider.scss */
+slider div.bubble.active, [slider] div.bubble.active {
+ display: inline-block;
+}
+/* line 70, slider.scss */
+slider div.bubble.limit, [slider] div.bubble.limit {
+ color: #777;
+}
diff --git a/src/main/resources/public/index.html b/src/main/resources/public/index.html
index c624a84..44db56a 100644
--- a/src/main/resources/public/index.html
+++ b/src/main/resources/public/index.html
@@ -8,6 +8,7 @@
+