diff --git a/pom.xml b/pom.xml index d60d566..6fb9fef 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.bwssystems.HABridge ha-bridge - 3.5.1g + 3.5.1h jar HA Bridge diff --git a/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java b/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java index 184d248..af0d9e9 100644 --- a/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java +++ b/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java @@ -195,7 +195,7 @@ public class HueMulator implements HueErrorStringSet { return new Gson().toJson(theResponse, GroupResponse.class); } - return "[{\"error\":{\"type\":\"3\", \"address\": \"/api/" + userId + "/groups/" + "0" + return "[{\"error\":{\"type\":\"3\", \"address\": \"/api/" + userId + "/groups/" + groupId + "\",\"description\": \"Object not found\"}}]"; }); // http://ip_address:port/api/{userId}/scenes returns json objects of @@ -495,6 +495,37 @@ public class HueMulator implements HueErrorStringSet { return apiResponse; } , new JsonTransformer()); + // http://ip_address:port/api/{userId}/ returns json objects for the full + // state + get(HUE_CONTEXT + "/:userid/", "application/json", (request, response) -> { + String userId = request.params(":userid"); + response.header("Access-Control-Allow-Origin", request.headers("Origin")); + response.type("application/json"); + response.status(HttpStatus.SC_OK); + log.debug("hue api full state requested: " + userId + " from " + request.ip()); + if (validateWhitelistUser(userId, false) == null) { + log.debug("Valudate user, No User supplied"); + HueErrorResponse theErrorResp = new HueErrorResponse(); + theErrorResp.addError(new HueError( + new HueErrorDetails("1", "/api/" + userId, "unauthorized user", null, null, null))); + return theErrorResp.getTheErrors(); + } + + List descriptorList = repository.findAll(); + HueApiResponse apiResponse = new HueApiResponse("Philips hue", bridgeSettings.getUpnpConfigAddress(), + bridgeSettings.getWhitelist()); + Map deviceList = new HashMap<>(); + if (descriptorList != null) { + descriptorList.forEach(descriptor -> { + DeviceResponse deviceResponse = DeviceResponse.createResponse(descriptor); + deviceList.put(descriptor.getId(), deviceResponse); + }); + apiResponse.setLights(deviceList); + } + + return apiResponse; + } , new JsonTransformer()); + // http://ip_address:port/api/{userId}/lights/{lightId} returns json // object for a given light get(HUE_CONTEXT + "/:userid/lights/:id", "application/json", (request, response) -> { diff --git a/src/main/java/com/bwssystems/hass/HassDevice.java b/src/main/java/com/bwssystems/hass/HassDevice.java index e3ddb59..22df367 100644 --- a/src/main/java/com/bwssystems/hass/HassDevice.java +++ b/src/main/java/com/bwssystems/hass/HassDevice.java @@ -2,6 +2,8 @@ package com.bwssystems.hass; public class HassDevice { private State deviceState; + private String deviceName; + private String domain; private String hassaddress; private String hassname; public State getDeviceState() { @@ -10,6 +12,18 @@ public class HassDevice { public void setDeviceState(State deviceState) { this.deviceState = deviceState; } + public String getDeviceName() { + return deviceName; + } + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + public String getDomain() { + return domain; + } + public void setDomain(String domain) { + this.domain = domain; + } public String getHassaddress() { return hassaddress; } diff --git a/src/main/java/com/bwssystems/hass/HassHome.java b/src/main/java/com/bwssystems/hass/HassHome.java index 89aca34..88a7dc5 100644 --- a/src/main/java/com/bwssystems/hass/HassHome.java +++ b/src/main/java/com/bwssystems/hass/HassHome.java @@ -59,6 +59,8 @@ public class HassHome { aNewHassDevice.setDeviceState(theDevice); aNewHassDevice.setHassaddress(hassMap.get(theKey).getHassAddress().getIp()); aNewHassDevice.setHassname(theKey); + aNewHassDevice.setDeviceName(theDevice.getAttributes().get("friendly_name").getAsString()); + aNewHassDevice.setDomain(theDevice.getEntityId().substring(0, theDevice.getEntityId().indexOf("."))); theDeviceList.add(aNewHassDevice); } return true; diff --git a/src/main/resources/public/scripts/app.js b/src/main/resources/public/scripts/app.js index 7a31927..04c5b3b 100644 --- a/src/main/resources/public/scripts/app.js +++ b/src/main/resources/public/scripts/app.js @@ -41,7 +41,7 @@ app.config(function ($routeProvider) { templateUrl: 'views/mqttpublish.html', controller: 'MQTTController' }).when('/hassdevices', { - templateUrl: 'views/hassevice.html', + templateUrl: 'views/hassdevice.html', controller: 'HassController' }).otherwise({ templateUrl: 'views/configuration.html', @@ -742,6 +742,23 @@ app.controller('SystemController', function ($scope, $location, $http, $window, } } }; + $scope.addHasstoSettings = function (newhassname, newhassip, newhassport) { + if($scope.bridge.settings.hassaddress == null) { + $scope.bridge.settings.hassaddress = { devices: [] }; + } + var newhass = {name: newhassname, ip: newhassip, port: newhassport } + $scope.bridge.settings.hassaddress.devices.push(newhass); + $scope.newhassname = null; + $scope.newhassip = null; + $scope.newhassport = null; + }; + $scope.removeHasstoSettings = function (hassname, hassip) { + for(var i = $scope.bridge.settings.hassaddress.devices.length - 1; i >= 0; i--) { + if($scope.bridge.settings.hassaddress.devices[i].name === hassname && $scope.bridge.settings.hassaddress.devices[i].ip === hassip) { + $scope.bridge.settings.hassaddress.devices.splice(i, 1); + } + } + }; $scope.bridgeReinit = function () { bridgeService.reinit(); }; @@ -951,6 +968,10 @@ app.controller('DeleteMapandIdDialogCtrl', function ($scope, bridgeService, ngDi bridgeService.viewHueDevices(); if(mapandid.mapType == "halDevice") bridgeService.viewHalDevices(); + if(mapandid.mapType == "mqttMessage") + bridgeService.viewMQTTDevices(); + if(mapandid.mapType == "hassDevice") + bridgeService.viewHassDevices(); $scope.bridge.mapandid = null; }; }); @@ -1856,72 +1877,25 @@ app.controller('HassController', function ($scope, $location, $http, bridgeServi $scope.buildDeviceUrls = function (hassdevice, dim_control) { bridgeService.clearDevice(); $scope.device = $scope.bridge.device; - var preOnCmd = ""; - var preDimCmd = ""; - var preOffCmd = ""; - var nameCmd = "" - var postCmd = "?Token=" + $scope.bridge.settings.haltoken; - if(hassdevice.hassdevicetype == "Group") { - $scope.device.deviceType = "group"; - preOnCmd = "/GroupService!GroupCmd=On"; - preOffCmd = "/GroupService!GroupCmd=Off"; - nameCmd = "!GroupName="; + if( $scope.device.mapType == "hassDevice" ) { + $scope.device.mapId = $scope.device.mapId + "-" + hassdevice.deviceState.entity_id; + $scope.device.onUrl = currentOn.substr(0, currentOn.indexOf("]")) + ",{\"item\":\"{\"entityId\":\"" + hassdevice.deviceState.entity_id + "\",\"state\":\"on\"}\"}]"; + if((dim_control.indexOf("byte") >= 0 || dim_control.indexOf("percent") >= 0 || dim_control.indexOf("math") >= 0)) + $scope.device.dimUrl = currentOn.substr(0, currentOn.indexOf("]")) + ",{\"item\":\"{\"entityId\":\"" + hassdevice.deviceState.entity_id + "\",\"state\":\"on\",\"bri\":\"" + dim_control + "\"}\"}]"; + $scope.device.offUrl = currentOff.substr(0, currentOff.indexOf("]")) + ",{\"item\":\"{\"entityId\":\"" + hassdevice.deviceState.entity_id + "\",\"state\":\"off\"}\"}]"; } - else if(hassdevice.hassdevicetype == "Macro") { - $scope.device.deviceType = "macro"; - preOnCmd = "/MacroService!MacroCmd=Set!MacroName="; - preOffCmd = preOnCmd; + else if ($scope.device.mapType == null || $scope.device.mapType == "") { + bridgeService.clearDevice(); + $scope.device.deviceType = hassdevice.domain; + $scope.device.targetDevice = hassdevice.hassname; + $scope.device.name = hassdevice.deviceState.entity_id; + $scope.device.mapType = "hassDevice"; + $scope.device.mapId = hassdevice.hassname + "-" + hassdevice.deviceState.entity_id; + $scope.device.onUrl = "[{\"item\":\"{\"entityId\":\"" + hassdevice.deviceState.entity_id + "\",\"state\":\"on\"}\"}]"; + if((dim_control.indexOf("byte") >= 0 || dim_control.indexOf("percent") >= 0 || dim_control.indexOf("math") >= 0)) + $scope.device.dimUrl = "[{\"item\":\"{\"entityId\":\"" + hassdevice.deviceState.entity_id + "\",\"state\":\"on\",\"bri\":\"" + dim_control + "\"}\"}]"; + $scope.device.offUrl = "[{\"item\":\"{\"entityId\":\"" + hassdevice.deviceState.entity_id + "\",\"state\":\"off\"}\"}]"; } - else if(hassdevice.hassdevicetype == "Scene") { - $scope.device.deviceType = "scene"; - preOnCmd = "/SceneService!SceneCmd=Set!SceneName="; - preOffCmd = preOnCmd; - } - else { - $scope.device.deviceType = "switch"; - preOnCmd = "/DeviceService!DeviceCmd=SetDevice!DeviceValue=On"; - preDimCmd = "/DeviceService!DeviceCmd=SetDevice!DeviceValue=Dim!DevicePercent="; - preOffCmd = "/DeviceService!DeviceCmd=SetDevice!DeviceValue=Off"; - nameCmd = "!DeviceName="; - } - $scope.device.name = hassdevice.hassdevicename; - $scope.device.targetDevice = hassdevice.halname; - $scope.device.mapType = "hassdevice"; - $scope.device.mapId = hassdevice.hassdevicename + "-" + hassdevice.halname; - if((dim_control.indexOf("byte") >= 0 || dim_control.indexOf("percent") >= 0 || dim_control.indexOf("math") >= 0) && $scope.device.deviceType == "switch") - $scope.device.dimUrl = "http://" + hassdevice.haladdress - + preDimCmd - + dim_control - + nameCmd - + hassdevice.hassdevicename.replaceAll(" ", "%20") - + postCmd; - else - $scope.device.dimUrl = "http://" + hassdevice.haladdress - + preOnCmd - + nameCmd - + hassdevice.hassdevicename.replaceAll(" ", "%20") - + postCmd; - $scope.device.onUrl = "http://" + hassdevice.haladdress - + preOnCmd - + nameCmd - + hassdevice.hassdevicename.replaceAll(" ", "%20") - + postCmd; - $scope.device.offUrl = "http://" + hassdevice.haladdress - + preOffCmd - + nameCmd - + hassdevice.hassdevicename.replaceAll(" ", "%20") - + postCmd; - }; - - $scope.buildHassHomeUrls = function (hassdevice) { - bridgeService.clearDevice(); - $scope.device.deviceType = "home"; - $scope.device.name = hassdevice.hassdevicename; - $scope.device.targetDevice = hassdevice.halname; - $scope.device.mapType = "halHome"; - $scope.device.mapId = hassdevice.hassdevicename + "-" + hassdevice.halname + "-HomeAway"; - $scope.device.onUrl = "http://" + hassdevice.haladdress + "/ModeService!ModeCmd=Set!ModeName=Home?Token=" + $scope.bridge.settings.haltoken; - $scope.device.offUrl = "http://" + hassdevice.haladdress + "/ModeService!ModeCmd=Set!ModeName=Away?Token=" + $scope.bridge.settings.haltoken; }; $scope.buildHassHeatUrls = function (hassdevice) { diff --git a/src/main/resources/public/views/hassdevice.html b/src/main/resources/public/views/hassdevice.html index 558f589..e534dcd 100644 --- a/src/main/resources/public/views/hassdevice.html +++ b/src/main/resources/public/views/hassdevice.html @@ -70,10 +70,10 @@ {{hassdevice.deviceState.entity_id}} {{hassdevice.hassname}} - -