mirror of
https://github.com/bwssytems/ha-bridge.git
synced 2025-12-16 18:24:36 +00:00
Merge branch 'Fixes-for-v4.5' into master
This commit is contained in:
43
README.md
43
README.md
@@ -70,8 +70,10 @@ Create the directory and make sure that ha-bridge-4.5.0.jar is in your /home/pi/
|
|||||||
```
|
```
|
||||||
pi@raspberrypi:~ $ mkdir habridge
|
pi@raspberrypi:~ $ mkdir habridge
|
||||||
pi@raspberrypi:~ $ cd habridge
|
pi@raspberrypi:~ $ cd habridge
|
||||||
|
|
||||||
pi@raspberrypi:~/habridge $ wget https://github.com/bwssytems/ha-bridge/releases/download/v4.5.0/ha-bridge-4.5.0.jar
|
pi@raspberrypi:~/habridge $ wget https://github.com/bwssytems/ha-bridge/releases/download/v4.5.0/ha-bridge-4.5.0.jar
|
||||||
```
|
```
|
||||||
|
|
||||||
#### System Control Setup on a pi (preferred)
|
#### System Control Setup on a pi (preferred)
|
||||||
For next gen Linux systems (this includes the Raspberry Pi), here is a systemctl unit file that you can install. Here is a link on how to do this: https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units
|
For next gen Linux systems (this includes the Raspberry Pi), here is a systemctl unit file that you can install. Here is a link on how to do this: https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units
|
||||||
|
|
||||||
@@ -143,12 +145,14 @@ pi@raspberrypi:~/habridge $ tail -f habridge-log.txt
|
|||||||
```
|
```
|
||||||
## Run ha-bridge alongside web server already on port 80
|
## Run ha-bridge alongside web server already on port 80
|
||||||
These examples will help you proxy your current webserver requests to the ha-bridge running on a different port, such as 8080.
|
These examples will help you proxy your current webserver requests to the ha-bridge running on a different port, such as 8080.
|
||||||
|
|
||||||
### Apache Example
|
### Apache Example
|
||||||
|
|
||||||
Reverse proxy with Apache on Ubuntu linux:
|
Reverse proxy with Apache on Ubuntu linux:
|
||||||
|
|
||||||
a2enmod proxy
|
Enable the required Apache modules:
|
||||||
a2enmod proxy_http
|
|
||||||
a2enmod headers
|
`a2enmod proxy proxy_http headers`
|
||||||
|
|
||||||
Added the following lines to my Apache config file “000-default”
|
Added the following lines to my Apache config file “000-default”
|
||||||
|
|
||||||
@@ -170,7 +174,10 @@ Added the following lines to my Apache config file “000-default”
|
|||||||
</VirtualHost>
|
</VirtualHost>
|
||||||
```
|
```
|
||||||
|
|
||||||
service apache2 restart
|
Restart apache for the changes to take effect.
|
||||||
|
|
||||||
|
`service apache2 restart`
|
||||||
|
|
||||||
### lighthttpd Example
|
### lighthttpd Example
|
||||||
```
|
```
|
||||||
server.modules += ( "mod_proxy" )
|
server.modules += ( "mod_proxy" )
|
||||||
@@ -503,8 +510,8 @@ contentBodyOff | string | This is the content body that you would like to send w
|
|||||||
{
|
{
|
||||||
"name" : "bedroom light",
|
"name" : "bedroom light",
|
||||||
"deviceType" : "switch",
|
"deviceType" : "switch",
|
||||||
"onUrl" : [{"item":"http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1&DeviceNum=41","type":"veraDevice"}],
|
"onUrl" : "[{\"item\":\"http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1&DeviceNum=41\",\"type\":\"veraDevice\"}]",
|
||||||
"offUrl" : [{"item":"http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=41","type":"veraDevice"}]
|
"offUrl" : "[{\"item\":\"http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=41\",\"type\":\"veraDevice\"}]"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
#### Dimming Control Example
|
#### Dimming Control Example
|
||||||
@@ -514,8 +521,8 @@ e.g.
|
|||||||
{
|
{
|
||||||
"name": "entry light",
|
"name": "entry light",
|
||||||
"deviceType": "switch",
|
"deviceType": "switch",
|
||||||
"offUrl": [{"item":"http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=31","type":"veraDevice"}],
|
"offUrl": "[{\"item\":\"http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=31\",\"type\":\"veraDevice\"}]",
|
||||||
"onUrl": [{"item":"http://192.168.1.201:3480/data_request?id=action&output_format=json&DeviceNum=31&serviceId=urn:upnp-org:serviceId:Dimming1&action=SetLoadLevelTarget&newLoadlevelTarget=${intensity.percent}","type":"veraDevice"}]
|
"onUrl": "[{\"item\":\"http://192.168.1.201:3480/data_request?id=action&output_format=json&DeviceNum=31&serviceId=urn:upnp-org:serviceId:Dimming1&action=SetLoadLevelTarget&newLoadlevelTarget=${intensity.percent}\",\"type\":\"veraDevice\"}]"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
See the echo's documentation for the dimming phrase.
|
See the echo's documentation for the dimming phrase.
|
||||||
@@ -527,8 +534,8 @@ e.g.
|
|||||||
{
|
{
|
||||||
"name": "Thermostat,
|
"name": "Thermostat,
|
||||||
"deviceType": "custom",
|
"deviceType": "custom",
|
||||||
"offUrl": [{"item":"http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=10","type":"veraDevice"}],
|
"offUrl": "[{\"item\":\"http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=10\",\"type\":\"veraDevice\"}]",
|
||||||
"onUrl": [{"item":"http://192.168.1.201:3480/data_request?id=action&output_format=json&DeviceNum=10&serviceId=urn:upnp-org:serviceId:Dimming1&action=SetLoadLevelTarget&newLoadlevelTarget=${intensity.math(X/4)}","type":"veraDevice"}]
|
"onUrl": "[{\"item\":\"http://192.168.1.201:3480/data_request?id=action&output_format=json&DeviceNum=10&serviceId=urn:upnp-org:serviceId:Dimming1&action=SetLoadLevelTarget&newLoadlevelTarget=${intensity.math(X/4)}\",\"type\":\"veraDevice\"}]"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
See the echo's documentation for the dimming phrase.
|
See the echo's documentation for the dimming phrase.
|
||||||
@@ -540,8 +547,8 @@ e.g:
|
|||||||
{
|
{
|
||||||
"name": "test device",
|
"name": "test device",
|
||||||
"deviceType": "custom",
|
"deviceType": "custom",
|
||||||
"offUrl": [{"item":"http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=31","httpVerb":"POST","contentType" : "application/json","httpBody" : "{\"fooBar\":\"baz_off\"}],
|
"offUrl": "[{\"item\":\"http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=31\",\"httpVerb\":\"POST\",\"contentType\" : \"application/json\",\"httpBody\" : \"{\"fooBar\":\"baz_off\"}]",
|
||||||
"onUrl": [{"item":"http://192.168.1.201:3480/data_request?id=action&output_format=json&DeviceNum=31&serviceId=urn:upnp-org:serviceId:Dimming1&action=SetLoadLevelTarget&newLoadlevelTarget=${intensity.percent}","type":"httpDevice","httpVerb":"POST","contentType" : "application/json","httpBody" : "{\"fooBar\":\"baz_on\"}]
|
"onUrl": "[{\"item\":\"http://192.168.1.201:3480/data_request?id=action&output_format=json&DeviceNum=31&serviceId=urn:upnp-org:serviceId:Dimming1&action=SetLoadLevelTarget&newLoadlevelTarget=${intensity.percent}\",\"type\":\"httpDevice\",\"httpVerb\":\"POST\",\"contentType\" : \"application/json\",\"httpBody\" : \"{\"fooBar\":\"baz_on\"}]"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
#### Custom Usage URLs Example
|
#### Custom Usage URLs Example
|
||||||
@@ -550,8 +557,8 @@ Anything that takes an action as a result of an HTTP request will probably work
|
|||||||
{
|
{
|
||||||
"name": "night mode",
|
"name": "night mode",
|
||||||
"deviceType": ""custom",
|
"deviceType": ""custom",
|
||||||
"offUrl": [{"item":"http://192.168.1.201:3480/data_request?id=lu_action&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=SetHouseMode&Mode=1","type":"httpDevice"}],
|
"offUrl": "[{\"item\":\"http://192.168.1.201:3480/data_request?id=lu_action&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=SetHouseMode&Mode=1\",\"type\":\"httpDevice\"}]",
|
||||||
"onUrl": [{"item":"http://192.168.1.201:3480/data_request?id=lu_action&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=SetHouseMode&Mode=3","type":"httpDevice"}]
|
"onUrl": "[{\"item\":\"http://192.168.1.201:3480/data_request?id=lu_action&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=SetHouseMode&Mode=3\",\"type\":\"httpDevice\"}]"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Here is a UDP example that can send binary data.
|
Here is a UDP example that can send binary data.
|
||||||
@@ -559,8 +566,8 @@ Here is a UDP example that can send binary data.
|
|||||||
{
|
{
|
||||||
"name": "UDPPacket",
|
"name": "UDPPacket",
|
||||||
"deviceType": "custom",
|
"deviceType": "custom",
|
||||||
"offUrl": [{"item":"udp://192.168.1.1:8899/0x460055","type":"udpDevice"}],
|
"offUrl": "[{\"item\":\"udp://192.168.1.1:8899/0x460055\",\"type\":\"udpDevice\"}]",
|
||||||
"onUrl": [{"item":"udp://192.168.1.1:8899/0x450055","type":"udpDevice"}]
|
"onUrl": "[{\"item\":\"udp://192.168.1.1:8899/0x450055\",\"type\":\"udpDevice\"}]"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
#### Response
|
#### Response
|
||||||
@@ -619,8 +626,8 @@ contentBodyOff | string | This is the content body that you would like to send w
|
|||||||
"id" : "6789",
|
"id" : "6789",
|
||||||
"name" : "table light",
|
"name" : "table light",
|
||||||
"deviceType" : "switch",
|
"deviceType" : "switch",
|
||||||
"onUrl" : [{"item":"http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1&DeviceNum=41","type":"veraDevice"}],
|
"onUrl" : "[{\"item\":\"http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1&DeviceNum=41\",\"type\":\"veraDevice\"}]",
|
||||||
"offUrl" : [{"item":"http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=41","type":"veraDevice"}]
|
"offUrl" : "[{\"item\":\"http://192.168.1.201:3480/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum=41\",\"type\":\"veraDevice\"}]"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
#### Response
|
#### Response
|
||||||
|
|||||||
2
pom.xml
2
pom.xml
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
<groupId>com.bwssystems.HABridge</groupId>
|
<groupId>com.bwssystems.HABridge</groupId>
|
||||||
<artifactId>ha-bridge</artifactId>
|
<artifactId>ha-bridge</artifactId>
|
||||||
<version>4.5.0</version>
|
<version>4.5.0b</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>HA Bridge</name>
|
<name>HA Bridge</name>
|
||||||
|
|||||||
@@ -212,26 +212,26 @@ public class BridgeSecurity {
|
|||||||
Iterator<String> userIterator = theUserIds.iterator();
|
Iterator<String> userIterator = theUserIds.iterator();
|
||||||
while (userIterator.hasNext()) {
|
while (userIterator.hasNext()) {
|
||||||
validUser = userIterator.next();
|
validUser = userIterator.next();
|
||||||
if (validUser.equals(aUser))
|
if (validUser.equals(aUser)) {
|
||||||
found = true;
|
found = true;
|
||||||
|
log.debug("validateWhitelistUser: found a user <" + aUser + ">");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!found && !strict) {
|
if(!found && !strict) {
|
||||||
|
log.debug("validateWhitelistUser: a user was not found and it is not strict rules <" + aUser + "> being created");
|
||||||
newWhitelistUser(aUser, userDescription);
|
newWhitelistUser(aUser, userDescription);
|
||||||
|
|
||||||
found = true;
|
found = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found) {
|
if (!found) {
|
||||||
return HueErrorResponse.createResponse("1", "/api/" + aUser, "unauthorized user", null, null, null).getTheErrors();
|
log.debug("validateWhitelistUser: a user was not found and it is strict rules <" + aUser + ">");
|
||||||
|
return HueErrorResponse.createResponse("1", "/api/" + aUser == null ? "" : aUser, "unauthorized user", null, null, null).getTheErrors();
|
||||||
}
|
}
|
||||||
|
|
||||||
Object anUser = securityDescriptor.getWhitelist().remove(DEPRACATED_INTERNAL_USER);
|
|
||||||
if(anUser != null)
|
|
||||||
setSettingsChanged(true);
|
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ public class HABridge {
|
|||||||
staticFileLocation("/public");
|
staticFileLocation("/public");
|
||||||
while(!bridgeSettings.getBridgeControl().isStop()) {
|
while(!bridgeSettings.getBridgeControl().isStop()) {
|
||||||
bridgeSettings.buildSettings();
|
bridgeSettings.buildSettings();
|
||||||
|
bridgeSettings.getBridgeSecurity().removeTestUsers();
|
||||||
log.info("HA Bridge initializing....");
|
log.info("HA Bridge initializing....");
|
||||||
// sparkjava config directive to set ip address for the web server to listen on
|
// sparkjava config directive to set ip address for the web server to listen on
|
||||||
ipAddress(bridgeSettings.getBridgeSettingsDescriptor().getWebaddress());
|
ipAddress(bridgeSettings.getBridgeSettingsDescriptor().getWebaddress());
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.bwssystems.HABridge.hue;
|
|||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.commons.lang3.Conversion;
|
import org.apache.commons.lang3.Conversion;
|
||||||
@@ -83,7 +84,7 @@ public class BrightnessDecode {
|
|||||||
replaceTarget = INTENSITY_PERCENT_HEX;
|
replaceTarget = INTENSITY_PERCENT_HEX;
|
||||||
notDone = true;
|
notDone = true;
|
||||||
} else if (request.contains(INTENSITY_DECIMAL_PERCENT)) {
|
} else if (request.contains(INTENSITY_DECIMAL_PERCENT)) {
|
||||||
replaceValue = String.format("%1.2f", decimalBrightness);
|
replaceValue = String.format(Locale.ROOT, "%1.2f", decimalBrightness);
|
||||||
replaceTarget = INTENSITY_DECIMAL_PERCENT;
|
replaceTarget = INTENSITY_DECIMAL_PERCENT;
|
||||||
notDone = true;
|
notDone = true;
|
||||||
} else if (request.contains(INTENSITY_MATH_CLOSE)) {
|
} else if (request.contains(INTENSITY_MATH_CLOSE)) {
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ public class HueMulator {
|
|||||||
public void setupServer() {
|
public void setupServer() {
|
||||||
log.info("Hue emulator service started....");
|
log.info("Hue emulator service started....");
|
||||||
before(HUE_CONTEXT + "/*", (request, response) -> {
|
before(HUE_CONTEXT + "/*", (request, response) -> {
|
||||||
|
log.debug("HueMulator GET called on api/* with request <" + request.pathInfo() + ">");
|
||||||
if(bridgeSettingMaster.getBridgeSecurity().isSecure()) {
|
if(bridgeSettingMaster.getBridgeSecurity().isSecure()) {
|
||||||
String pathInfo = request.pathInfo();
|
String pathInfo = request.pathInfo();
|
||||||
if(pathInfo != null && pathInfo.contains(HUE_CONTEXT + "/devices")) {
|
if(pathInfo != null && pathInfo.contains(HUE_CONTEXT + "/devices")) {
|
||||||
@@ -118,6 +119,17 @@ public class HueMulator {
|
|||||||
log.debug("group add requested from " + request.ip() + " user " + request.params(":userid") + " with body " + request.body());
|
log.debug("group add requested from " + request.ip() + " user " + request.params(":userid") + " with body " + request.body());
|
||||||
return "[{\"success\":{\"id\":\"1\"}}]";
|
return "[{\"success\":{\"id\":\"1\"}}]";
|
||||||
});
|
});
|
||||||
|
// http://ip_address:port/api/:userid/groups/<groupid>/action
|
||||||
|
// Dummy handler
|
||||||
|
// Error forces Logitech Pop to fall back to individual light control
|
||||||
|
// instead of scene-based control.
|
||||||
|
put(HUE_CONTEXT + "/:userid/groups/:groupid/action", "application/json", (request, response) -> {
|
||||||
|
response.header("Access-Control-Allow-Origin", request.headers("Origin"));
|
||||||
|
response.type("application/json");
|
||||||
|
response.status(HttpStatus.SC_OK);
|
||||||
|
log.debug("put action to groups API from " + request.ip() + " user " + request.params(":userid") + " with body " + request.body());
|
||||||
|
return "[{\"error\":{\"address\": \"/groups/0/action/scene\", \"type\":7, \"description\": \"invalid value, dummy for parameter, scene\"}}]";
|
||||||
|
});
|
||||||
// http://ip_address:port/api/{userId}/scenes returns json objects of
|
// http://ip_address:port/api/{userId}/scenes returns json objects of
|
||||||
// all scenes configured
|
// all scenes configured
|
||||||
get(HUE_CONTEXT + "/:userid/scenes", "application/json", (request, response) -> {
|
get(HUE_CONTEXT + "/:userid/scenes", "application/json", (request, response) -> {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ public class HalDevice {
|
|||||||
private String haldevicename;
|
private String haldevicename;
|
||||||
private String haladdress;
|
private String haladdress;
|
||||||
private String halname;
|
private String halname;
|
||||||
|
private Boolean secure;
|
||||||
private DeviceElements buttons;
|
private DeviceElements buttons;
|
||||||
public String getHaldevicetype() {
|
public String getHaldevicetype() {
|
||||||
return haldevicetype;
|
return haldevicetype;
|
||||||
@@ -30,6 +31,12 @@ public class HalDevice {
|
|||||||
public void setHalname(String halname) {
|
public void setHalname(String halname) {
|
||||||
this.halname = halname;
|
this.halname = halname;
|
||||||
}
|
}
|
||||||
|
public Boolean getSecure() {
|
||||||
|
return secure;
|
||||||
|
}
|
||||||
|
public void setSecure(Boolean secure) {
|
||||||
|
this.secure = secure;
|
||||||
|
}
|
||||||
public DeviceElements getButtons() {
|
public DeviceElements getButtons() {
|
||||||
return buttons;
|
return buttons;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,8 +13,14 @@ import com.bwssystems.HABridge.BridgeSettings;
|
|||||||
import com.bwssystems.HABridge.Home;
|
import com.bwssystems.HABridge.Home;
|
||||||
import com.bwssystems.HABridge.NamedIP;
|
import com.bwssystems.HABridge.NamedIP;
|
||||||
import com.bwssystems.HABridge.api.CallItem;
|
import com.bwssystems.HABridge.api.CallItem;
|
||||||
|
import com.bwssystems.HABridge.api.hue.HueError;
|
||||||
|
import com.bwssystems.HABridge.api.hue.HueErrorResponse;
|
||||||
import com.bwssystems.HABridge.dao.DeviceDescriptor;
|
import com.bwssystems.HABridge.dao.DeviceDescriptor;
|
||||||
|
import com.bwssystems.HABridge.hue.BrightnessDecode;
|
||||||
|
import com.bwssystems.HABridge.hue.DeviceDataDecode;
|
||||||
import com.bwssystems.HABridge.hue.MultiCommandUtil;
|
import com.bwssystems.HABridge.hue.MultiCommandUtil;
|
||||||
|
import com.bwssystems.HABridge.hue.TimeDecode;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
|
||||||
public class HalHome implements Home {
|
public class HalHome implements Home {
|
||||||
private static final Logger log = LoggerFactory.getLogger(HalHome.class);
|
private static final Logger log = LoggerFactory.getLogger(HalHome.class);
|
||||||
@@ -30,7 +36,7 @@ public class HalHome implements Home {
|
|||||||
public Object getItems(String type) {
|
public Object getItems(String type) {
|
||||||
if(!validHal)
|
if(!validHal)
|
||||||
return null;
|
return null;
|
||||||
log.debug("consolidating devices for hues");
|
log.debug("consolidating devices for HALs");
|
||||||
List<HalDevice> theResponse = null;
|
List<HalDevice> theResponse = null;
|
||||||
Iterator<String> keys = hals.keySet().iterator();
|
Iterator<String> keys = hals.keySet().iterator();
|
||||||
List<HalDevice> deviceList = new ArrayList<HalDevice>();
|
List<HalDevice> deviceList = new ArrayList<HalDevice>();
|
||||||
@@ -106,8 +112,41 @@ public class HalHome implements Home {
|
|||||||
@Override
|
@Override
|
||||||
public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int intensity,
|
public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int intensity,
|
||||||
Integer targetBri,Integer targetBriInc, DeviceDescriptor device, String body) {
|
Integer targetBri,Integer targetBriInc, DeviceDescriptor device, String body) {
|
||||||
// Not a device handler
|
String responseString = null;
|
||||||
return null;
|
String theUrl = anItem.getItem().getAsString();
|
||||||
|
if(theUrl != null && !theUrl.isEmpty () && theUrl.contains("http://")) {
|
||||||
|
String intermediate = theUrl.substring(theUrl.indexOf("://") + 3);
|
||||||
|
String hostPortion = intermediate.substring(0, intermediate.indexOf('/'));
|
||||||
|
// String theUrlBody = intermediate.substring(intermediate.indexOf('/') + 1);
|
||||||
|
String hostAddr = null;
|
||||||
|
// String port = null;
|
||||||
|
if (hostPortion.contains(":")) {
|
||||||
|
hostAddr = hostPortion.substring(0, intermediate.indexOf(':'));
|
||||||
|
// port = hostPortion.substring(intermediate.indexOf(':') + 1);
|
||||||
|
} else
|
||||||
|
hostAddr = hostPortion;
|
||||||
|
log.debug("executing HUE api request to Http "
|
||||||
|
+ (anItem.getHttpVerb() == null ? "GET" : anItem.getHttpVerb()) + ": "
|
||||||
|
+ anItem.getItem().getAsString());
|
||||||
|
|
||||||
|
String anUrl = BrightnessDecode.calculateReplaceIntensityValue(theUrl,
|
||||||
|
intensity, targetBri, targetBriInc, false);
|
||||||
|
anUrl = DeviceDataDecode.replaceDeviceData(anUrl, device);
|
||||||
|
anUrl = TimeDecode.replaceTimeValue(anUrl);
|
||||||
|
|
||||||
|
for (Map.Entry<String, HalInfo> entry : hals.entrySet())
|
||||||
|
{
|
||||||
|
if(entry.getValue().getHalAddress().getIp().equals(hostAddr)) {
|
||||||
|
if (entry.getValue().deviceCommand(anUrl) == null) {
|
||||||
|
log.warn("Error on calling hal to change device state: " + anUrl);
|
||||||
|
responseString = new Gson().toJson(HueErrorResponse.createResponse("6", "/lights/" + lightId,
|
||||||
|
"Error on calling url to change device state", "/lights/"
|
||||||
|
+ lightId + "state", null, null).getTheErrors(), HueError[].class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return responseString;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -98,7 +98,11 @@ public class HalInfo {
|
|||||||
|
|
||||||
String theUrl = null;
|
String theUrl = null;
|
||||||
String theData;
|
String theData;
|
||||||
theUrl = "http://" + halAddress.getIp() + apiType + theToken;
|
if(halAddress.getSecure())
|
||||||
|
theUrl = "https://";
|
||||||
|
else
|
||||||
|
theUrl = "http://";
|
||||||
|
theUrl = theUrl + halAddress.getIp() + apiType + theToken;
|
||||||
theData = httpClient.doHttpRequest(theUrl, null, null, null, null);
|
theData = httpClient.doHttpRequest(theUrl, null, null, null, null);
|
||||||
if(theData != null) {
|
if(theData != null) {
|
||||||
log.debug("GET " + deviceType + " HalApiResponse - data: " + theData);
|
log.debug("GET " + deviceType + " HalApiResponse - data: " + theData);
|
||||||
@@ -123,6 +127,7 @@ public class HalInfo {
|
|||||||
aNewHalDevice.setHaldevicename(theDevice.getDeviceName());
|
aNewHalDevice.setHaldevicename(theDevice.getDeviceName());
|
||||||
aNewHalDevice.setHaladdress(halAddress.getIp());
|
aNewHalDevice.setHaladdress(halAddress.getIp());
|
||||||
aNewHalDevice.setHalname(halAddress.getName());
|
aNewHalDevice.setHalname(halAddress.getName());
|
||||||
|
aNewHalDevice.setSecure(halAddress.getSecure());
|
||||||
deviceList.add(aNewHalDevice);
|
deviceList.add(aNewHalDevice);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -145,7 +150,11 @@ public class HalInfo {
|
|||||||
deviceList = new ArrayList<HalDevice>();
|
deviceList = new ArrayList<HalDevice>();
|
||||||
while (theHalDevices.hasNext()) {
|
while (theHalDevices.hasNext()) {
|
||||||
HalDevice theHalDevice = theHalDevices.next();
|
HalDevice theHalDevice = theHalDevices.next();
|
||||||
theUrl = "http://" + halAddress.getIp() + IRBUTTON_REQUEST + TextStringFormatter.forQuerySpaceUrl(theHalDevice.getHaldevicename()) + TOKEN_REQUEST + theToken;
|
if(halAddress.getSecure())
|
||||||
|
theUrl = "https://";
|
||||||
|
else
|
||||||
|
theUrl = "http://";
|
||||||
|
theUrl = theUrl + halAddress.getIp() + IRBUTTON_REQUEST + TextStringFormatter.forQuerySpaceUrl(theHalDevice.getHaldevicename()) + TOKEN_REQUEST + theToken;
|
||||||
theData = httpClient.doHttpRequest(theUrl, null, null, null, null);
|
theData = httpClient.doHttpRequest(theUrl, null, null, null, null);
|
||||||
if (theData != null) {
|
if (theData != null) {
|
||||||
log.debug("GET IrData for IR Device " + theHalDevice.getHaldevicename() + " HalApiResponse - data: " + theData);
|
log.debug("GET IrData for IR Device " + theHalDevice.getHaldevicename() + " HalApiResponse - data: " + theData);
|
||||||
@@ -177,6 +186,12 @@ public class HalInfo {
|
|||||||
return deviceList;
|
return deviceList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String deviceCommand(String theUrl) {
|
||||||
|
String theData = null;
|
||||||
|
theData = httpClient.doHttpRequest(theUrl, null, null, null, null);
|
||||||
|
return theData;
|
||||||
|
}
|
||||||
|
|
||||||
public NamedIP getHalAddress() {
|
public NamedIP getHalAddress() {
|
||||||
return halAddress;
|
return halAddress;
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -77,7 +77,7 @@ app.config (function ($locationProvider, $routeProvider) {
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
app.run( async function ($rootScope, $location, Auth, bridgeService) {
|
app.run(function ($rootScope, $location, Auth, bridgeService) {
|
||||||
bridgeService.getHABridgeVersion();
|
bridgeService.getHABridgeVersion();
|
||||||
|
|
||||||
$rootScope.$on('securitySetupReceived', function(event, data) {
|
$rootScope.$on('securitySetupReceived', function(event, data) {
|
||||||
@@ -1285,11 +1285,11 @@ app.controller ('SystemController', function ($scope, $location, bridgeService,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
$scope.addHarmonytoSettings = function (newharmonyname, newharmonyip) {
|
$scope.addHarmonytoSettings = function (newharmonyname, newharmonyip, newharmonywebhook) {
|
||||||
if($scope.bridge.settings.harmonyaddress === undefined || $scope.bridge.settings.harmonyaddress === null) {
|
if($scope.bridge.settings.harmonyaddress === undefined || $scope.bridge.settings.harmonyaddress === null) {
|
||||||
$scope.bridge.settings.harmonyaddress = { devices: [] };
|
$scope.bridge.settings.harmonyaddress = { devices: [] };
|
||||||
}
|
}
|
||||||
var newharmony = {name: newharmonyname, ip: newharmonyip }
|
var newharmony = {name: newharmonyname, ip: newharmonyip, webhook: newharmonywebhook}
|
||||||
$scope.bridge.settings.harmonyaddress.devices.push(newharmony);
|
$scope.bridge.settings.harmonyaddress.devices.push(newharmony);
|
||||||
$scope.newharmonyname = null;
|
$scope.newharmonyname = null;
|
||||||
$scope.newharmonyip = null;
|
$scope.newharmonyip = null;
|
||||||
@@ -3383,7 +3383,6 @@ app.controller('LoginController', function ($scope, $location, Auth) {
|
|||||||
$scope.logout = function() {
|
$scope.logout = function() {
|
||||||
Auth.logout();
|
Auth.logout();
|
||||||
$scope.loggedIn = Auth.isLoggedIn();
|
$scope.loggedIn = Auth.isLoggedIn();
|
||||||
bridgeService.displaySuccess("User Logged Out");
|
|
||||||
$location.path("/login");
|
$location.path("/login");
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -147,7 +147,7 @@
|
|||||||
<td>{{harmony.ip}}</td>
|
<td>{{harmony.ip}}</td>
|
||||||
<td>{{harmony.webhook}}</td>
|
<td>{{harmony.webhook}}</td>
|
||||||
<td><button class="btn btn-danger" type="submit"
|
<td><button class="btn btn-danger" type="submit"
|
||||||
ng-click="removeHarmonytoSettings(harmony.name, harmony.ip, harmony.webhook)">Del</button></td>
|
ng-click="removeHarmonytoSettings(harmony.name, harmony.ip)">Del</button></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><input id="bridge-settings-next-harmony-name"
|
<td><input id="bridge-settings-next-harmony-name"
|
||||||
@@ -201,12 +201,14 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th>Name</th>
|
<th>Name</th>
|
||||||
<th>IP</th>
|
<th>IP</th>
|
||||||
|
<th>Use SSL</th>
|
||||||
<th>Manage</th>
|
<th>Manage</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tr ng-repeat="hal in bridge.settings.haladdress.devices">
|
<tr ng-repeat="hal in bridge.settings.haladdress.devices">
|
||||||
<td>{{hal.name}}</td>
|
<td>{{hal.name}}</td>
|
||||||
<td>{{hal.ip}}</td>
|
<td>{{hal.ip}}</td>
|
||||||
|
<td>{{hal.secure}}</td>
|
||||||
<td><button class="btn btn-danger" type="submit"
|
<td><button class="btn btn-danger" type="submit"
|
||||||
ng-click="removeHaltoSettings(hal.name, hal.ip)">Del</button></td>
|
ng-click="removeHaltoSettings(hal.name, hal.ip)">Del</button></td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -217,8 +219,11 @@
|
|||||||
<td><input id="bridge-settings-next-hal-ip"
|
<td><input id="bridge-settings-next-hal-ip"
|
||||||
class="form-control" type="text" ng-model="newhalip"
|
class="form-control" type="text" ng-model="newhalip"
|
||||||
placeholder="192.168.1.3:82"></td>
|
placeholder="192.168.1.3:82"></td>
|
||||||
|
<td><input type="checkbox"
|
||||||
|
ng-model="newhalsecure" ng-true-value=true
|
||||||
|
ng-false-value=false></td>
|
||||||
<td><button class="btn btn-success" type="submit"
|
<td><button class="btn btn-success" type="submit"
|
||||||
ng-click="addHaltoSettings(newhalname, newhalip)">Add</button></td>
|
ng-click="addHaltoSettings(newhalname, newhalip, newhalsecure)">Add</button></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table></td>
|
</table></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
Reference in New Issue
Block a user