Basic OpenHAB functionality added. Need to add String selection

functionality.
This commit is contained in:
Admin
2017-12-15 16:34:58 -06:00
parent 4b247557d4
commit fe613f7688
16 changed files with 670 additions and 132 deletions

View File

@@ -5,7 +5,7 @@
<groupId>com.bwssystems.HABridge</groupId> <groupId>com.bwssystems.HABridge</groupId>
<artifactId>ha-bridge</artifactId> <artifactId>ha-bridge</artifactId>
<version>5.1.0a</version> <version>5.1.0b</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>HA Bridge</name> <name>HA Bridge</name>

View File

@@ -210,6 +210,7 @@ public class BridgeSettings extends BackupHandler {
theBridgeSettings.setDomoticzconfigured(theBridgeSettings.isValidDomoticz()); theBridgeSettings.setDomoticzconfigured(theBridgeSettings.isValidDomoticz());
theBridgeSettings.setSomfyconfigured(theBridgeSettings.isValidSomfy()); theBridgeSettings.setSomfyconfigured(theBridgeSettings.isValidSomfy());
theBridgeSettings.setHomeWizardConfigured(theBridgeSettings.isValidHomeWizard()); theBridgeSettings.setHomeWizardConfigured(theBridgeSettings.isValidHomeWizard());
theBridgeSettings.setOpenhabconfigured(theBridgeSettings.isValidOpenhab());
// Lifx is either configured or not, so it does not need an update. // Lifx is either configured or not, so it does not need an update.
if(serverPortOverride != null) if(serverPortOverride != null)
theBridgeSettings.setServerPort(serverPortOverride); theBridgeSettings.setServerPort(serverPortOverride);

View File

@@ -31,6 +31,7 @@ public class DeviceMapTypes {
public final static String[] DOMOTICZ_DEVICE = { "domoticzDevice", "Domoticz Device"}; public final static String[] DOMOTICZ_DEVICE = { "domoticzDevice", "Domoticz Device"};
public final static String[] SOMFY_DEVICE = { "somfyDevice", "Somfy Device"}; public final static String[] SOMFY_DEVICE = { "somfyDevice", "Somfy Device"};
public final static String[] LIFX_DEVICE = { "lifxDevice", "LIFX Device"}; public final static String[] LIFX_DEVICE = { "lifxDevice", "LIFX Device"};
public final static String[] OPENHAB_DEVICE = { "openhabDevice", "OpenHAB Device"};
public final static int typeIndex = 0; public final static int typeIndex = 0;
public final static int displayIndex = 1; public final static int displayIndex = 1;
@@ -56,7 +57,6 @@ public class DeviceMapTypes {
deviceMapTypes.add(MQTT_MESSAGE); deviceMapTypes.add(MQTT_MESSAGE);
deviceMapTypes.add(NEST_HOMEAWAY); deviceMapTypes.add(NEST_HOMEAWAY);
deviceMapTypes.add(NEST_THERMO_SET); deviceMapTypes.add(NEST_THERMO_SET);
deviceMapTypes.add(SOMFY_DEVICE);
deviceMapTypes.add(TCP_DEVICE); deviceMapTypes.add(TCP_DEVICE);
deviceMapTypes.add(UDP_DEVICE); deviceMapTypes.add(UDP_DEVICE);
deviceMapTypes.add(VERA_DEVICE); deviceMapTypes.add(VERA_DEVICE);
@@ -64,6 +64,7 @@ public class DeviceMapTypes {
deviceMapTypes.add(FIBARO_DEVICE); deviceMapTypes.add(FIBARO_DEVICE);
deviceMapTypes.add(FIBARO_SCENE); deviceMapTypes.add(FIBARO_SCENE);
deviceMapTypes.add(SOMFY_DEVICE); deviceMapTypes.add(SOMFY_DEVICE);
deviceMapTypes.add(OPENHAB_DEVICE);
} }
public static int getTypeIndex() { public static int getTypeIndex() {
return typeIndex; return typeIndex;

View File

@@ -19,6 +19,7 @@ import com.bwssystems.HABridge.plugins.http.HTTPHome;
import com.bwssystems.HABridge.plugins.hue.HueHome; import com.bwssystems.HABridge.plugins.hue.HueHome;
import com.bwssystems.HABridge.plugins.lifx.LifxHome; import com.bwssystems.HABridge.plugins.lifx.LifxHome;
import com.bwssystems.HABridge.plugins.mqtt.MQTTHome; import com.bwssystems.HABridge.plugins.mqtt.MQTTHome;
import com.bwssystems.HABridge.plugins.openhab.OpenHABHome;
import com.bwssystems.HABridge.plugins.somfy.SomfyHome; import com.bwssystems.HABridge.plugins.somfy.SomfyHome;
import com.bwssystems.HABridge.plugins.tcp.TCPHome; import com.bwssystems.HABridge.plugins.tcp.TCPHome;
import com.bwssystems.HABridge.plugins.udp.UDPHome; import com.bwssystems.HABridge.plugins.udp.UDPHome;
@@ -113,6 +114,10 @@ public class HomeManager {
aHome = new LifxHome(bridgeSettings); aHome = new LifxHome(bridgeSettings);
resourceList.put(DeviceMapTypes.LIFX_DEVICE[DeviceMapTypes.typeIndex], aHome); resourceList.put(DeviceMapTypes.LIFX_DEVICE[DeviceMapTypes.typeIndex], aHome);
homeList.put(DeviceMapTypes.LIFX_DEVICE[DeviceMapTypes.typeIndex], aHome); homeList.put(DeviceMapTypes.LIFX_DEVICE[DeviceMapTypes.typeIndex], aHome);
//setup the OpenHAB configuration if available
aHome = new OpenHABHome(bridgeSettings);
resourceList.put(DeviceMapTypes.OPENHAB_DEVICE[DeviceMapTypes.typeIndex], aHome);
homeList.put(DeviceMapTypes.OPENHAB_DEVICE[DeviceMapTypes.typeIndex], aHome);
} }
public Home findHome(String type) { public Home findHome(String type) {

View File

@@ -315,6 +315,12 @@ public class DeviceResource {
return homeManager.findResource(DeviceMapTypes.SOMFY_DEVICE[DeviceMapTypes.typeIndex]).getItems(DeviceMapTypes.SOMFY_DEVICE[DeviceMapTypes.typeIndex]); return homeManager.findResource(DeviceMapTypes.SOMFY_DEVICE[DeviceMapTypes.typeIndex]).getItems(DeviceMapTypes.SOMFY_DEVICE[DeviceMapTypes.typeIndex]);
}, new JsonTransformer()); }, new JsonTransformer());
get (API_CONTEXT + "/openhab/devices", "application/json", (request, response) -> {
log.debug("Get OpenHAB devices");
response.status(HttpStatus.SC_OK);
return homeManager.findResource(DeviceMapTypes.OPENHAB_DEVICE[DeviceMapTypes.typeIndex]).getItems(DeviceMapTypes.OPENHAB_DEVICE[DeviceMapTypes.typeIndex]);
}, new JsonTransformer());
get (API_CONTEXT + "/map/types", "application/json", (request, response) -> { get (API_CONTEXT + "/map/types", "application/json", (request, response) -> {
log.debug("Get map types"); log.debug("Get map types");
return new DeviceMapTypes().getDeviceMapTypes(); return new DeviceMapTypes().getDeviceMapTypes();

View File

@@ -18,7 +18,10 @@ 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.BrightnessDecode;
import com.bwssystems.HABridge.hue.ColorData; import com.bwssystems.HABridge.hue.ColorData;
import com.bwssystems.HABridge.hue.ColorDecode;
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.bwssystems.HABridge.plugins.http.HTTPHandler; import com.bwssystems.HABridge.plugins.http.HTTPHandler;
import com.bwssystems.HABridge.plugins.http.HTTPHome; import com.bwssystems.HABridge.plugins.http.HTTPHome;
import com.google.gson.Gson; import com.google.gson.Gson;
@@ -41,7 +44,7 @@ public class DomoticzHome implements Home {
public Object getItems(String type) { public Object getItems(String type) {
if(!validDomoticz) if(!validDomoticz)
return null; return null;
log.debug("consolidating devices for hues"); log.debug("consolidating devices for Domoticzs");
List<DomoticzDevice> theResponse = null; List<DomoticzDevice> theResponse = null;
Iterator<String> keys = domoticzs.keySet().iterator(); Iterator<String> keys = domoticzs.keySet().iterator();
List<DomoticzDevice> deviceList = new ArrayList<DomoticzDevice>(); List<DomoticzDevice> deviceList = new ArrayList<DomoticzDevice>();
@@ -95,7 +98,23 @@ public class DomoticzHome implements Home {
String theData; String theData;
String anUrl = BrightnessDecode.calculateReplaceIntensityValue(theUrlBody, String anUrl = BrightnessDecode.calculateReplaceIntensityValue(theUrlBody,
intensity, targetBri, targetBriInc, false); intensity, targetBri, targetBriInc, false);
theData = httpClient.doHttpRequest(theHandler.buildUrl(anUrl), null, null, null, theHandler.buildHeaders()); if (colorData != null) {
anUrl = ColorDecode.replaceColorData(anUrl, colorData, BrightnessDecode.calculateIntensity(intensity, targetBri, targetBriInc), false);
}
anUrl = DeviceDataDecode.replaceDeviceData(anUrl, device);
anUrl = TimeDecode.replaceTimeValue(anUrl);
String aBody = null;
if(anItem.getHttpBody()!= null && !anItem.getHttpBody().isEmpty()) {
aBody = BrightnessDecode.calculateReplaceIntensityValue(anItem.getHttpBody(),
intensity, targetBri, targetBriInc, false);
if (colorData != null) {
aBody = ColorDecode.replaceColorData(aBody, colorData, BrightnessDecode.calculateIntensity(intensity, targetBri, targetBriInc), false);
}
aBody = DeviceDataDecode.replaceDeviceData(aBody, device);
aBody = TimeDecode.replaceTimeValue(aBody);
}
theData = httpClient.doHttpRequest(theHandler.buildUrl(anUrl), null, null, aBody, theHandler.buildHeaders());
try { try {
theDomoticzApiResponse = new Gson().fromJson(theData, Devices.class); theDomoticzApiResponse = new Gson().fromJson(theData, Devices.class);
if(theDomoticzApiResponse.getStatus().equals("OK")) if(theDomoticzApiResponse.getStatus().equals("OK"))
@@ -167,7 +186,7 @@ public class DomoticzHome implements Home {
@Override @Override
public void closeHome() { public void closeHome() {
log.debug("Closing Home."); log.debug("Closing Home.");
if(closed) { if(closed || !validDomoticz) {
log.debug("Home is already closed...."); log.debug("Home is already closed....");
return; return;
} }
@@ -175,6 +194,7 @@ public class DomoticzHome implements Home {
if(httpClient != null) if(httpClient != null)
httpClient.closeHandler(); httpClient.closeHandler();
domoticzs = null;
closed = true; closed = true;
} }
} }

View File

@@ -85,7 +85,7 @@ public class HomeWizardHome implements Home {
public List<HomeWizardSmartPlugDevice> getDevices() { public List<HomeWizardSmartPlugDevice> getDevices() {
log.debug("consolidating devices for plug gateways"); log.debug("consolidating devices for HomeWizard plug gateways");
Iterator<String> keys = plugGateways.keySet().iterator(); Iterator<String> keys = plugGateways.keySet().iterator();
ArrayList<HomeWizardSmartPlugDevice> deviceList = new ArrayList<>(); ArrayList<HomeWizardSmartPlugDevice> deviceList = new ArrayList<>();

View File

@@ -0,0 +1,19 @@
package com.bwssystems.HABridge.plugins.openhab;
public class OpenHABCommand {
private String url;
private String command;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getCommand() {
return command;
}
public void setCommand(String command) {
this.command = command;
}
}

View File

@@ -0,0 +1,27 @@
package com.bwssystems.HABridge.plugins.openhab;
public class OpenHABDevice {
private String address;
private String name;
private OpenHABItem item;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public OpenHABItem getItem() {
return item;
}
public void setItem(OpenHABItem item) {
this.item = item;
}
}

View File

@@ -1,7 +1,9 @@
package com.bwssystems.HABridge.plugins.openhab; package com.bwssystems.HABridge.plugins.openhab;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Map; import java.util.Map;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -11,17 +13,24 @@ 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.ColorData; import com.bwssystems.HABridge.hue.ColorData;
import com.bwssystems.HABridge.hue.ColorDecode;
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.bwssystems.HABridge.plugins.http.HTTPHandler;
import com.bwssystems.HABridge.plugins.http.HTTPHome;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class OpenHABHome implements Home { public class OpenHABHome implements Home {
private static final Logger log = LoggerFactory.getLogger(OpenHABHome.class); private static final Logger log = LoggerFactory.getLogger(OpenHABHome.class);
private Map<String, OpenHABInstance> openhabMap; private Map<String, OpenHABInstance> openhabMap;
private Boolean validOpenhab; private Boolean validOpenhab;
private Gson aGsonHandler; private HTTPHandler httpClient;
private boolean closed; private boolean closed;
public OpenHABHome(BridgeSettings bridgeSettings) { public OpenHABHome(BridgeSettings bridgeSettings) {
@@ -35,34 +44,118 @@ public class OpenHABHome 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, ColorData colorData, DeviceDescriptor device, String body) { Integer targetBri, Integer targetBriInc, ColorData colorData, DeviceDescriptor device, String body) {
// TODO Auto-generated method stub
return null; String theUrl = anItem.getItem().getAsString();
String responseString = null;
if(theUrl != null && !theUrl.isEmpty()) {
OpenHABCommand theCommand = null;
try {
theCommand = new Gson().fromJson(theUrl, OpenHABCommand.class);
} catch(Exception e) {
log.warn("Cannot parse command to OpenHAB <<<" + theUrl + ">>>", e);
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;
}
String intermediate = theCommand.getUrl().substring(theCommand.getUrl().indexOf("://") + 3);
String hostPortion = intermediate.substring(0, intermediate.indexOf('/'));
String theUrlBody = intermediate.substring(intermediate.indexOf('/') + 1);
String hostAddr = null;
if (hostPortion.contains(":")) {
hostAddr = hostPortion.substring(0, intermediate.indexOf(':'));
} else
hostAddr = hostPortion;
OpenHABInstance theHandler = findHandlerByAddress(hostAddr);
if(theHandler != null) {
String anUrl = BrightnessDecode.calculateReplaceIntensityValue(theUrlBody,
intensity, targetBri, targetBriInc, false);
if (colorData != null) {
anUrl = ColorDecode.replaceColorData(anUrl, colorData, BrightnessDecode.calculateIntensity(intensity, targetBri, targetBriInc), false);
}
anUrl = DeviceDataDecode.replaceDeviceData(anUrl, device);
anUrl = TimeDecode.replaceTimeValue(anUrl);
String aCommand = null;
if(theCommand.getCommand() != null && !theCommand.getCommand().isEmpty()) {
aCommand = BrightnessDecode.calculateReplaceIntensityValue(theCommand.getCommand(),
intensity, targetBri, targetBriInc, false);
if (colorData != null) {
aCommand = ColorDecode.replaceColorData(aCommand, colorData, BrightnessDecode.calculateIntensity(intensity, targetBri, targetBriInc), false);
}
aCommand = DeviceDataDecode.replaceDeviceData(aCommand, device);
aCommand = TimeDecode.replaceTimeValue(aCommand);
}
try {
theHandler.callCommand(anUrl, aCommand, httpClient);
} catch (Exception e) {
log.warn("Cannot send comand to OpenHAB", e);
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);
}
} else {
log.warn("OpenHAB Call could not complete, no address found: " + theUrl);
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);
}
} else {
log.warn("OpenHAB Call to be presented as http(s)://<ip_address>(:<port>)/payload, format of request unknown: " + theUrl);
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
public Object getItems(String type) { public Object getItems(String type) {
// TODO Auto-generated method stub
return null; if(!validOpenhab)
return null;
log.debug("consolidating devices for OpenHAB");
List<OpenHABDevice> theResponse = null;
Iterator<String> keys = openhabMap.keySet().iterator();
List<OpenHABDevice> deviceList = new ArrayList<OpenHABDevice>();
while(keys.hasNext()) {
String key = keys.next();
theResponse = openhabMap.get(key).getDevices(httpClient);
if(theResponse != null)
addOpenhabDevices(deviceList, theResponse, key);
else {
log.warn("Cannot get devices for OpenHAB with name: " + key + ", skipping this OpenHAB.");
continue;
}
}
return deviceList;
}
private Boolean addOpenhabDevices(List<OpenHABDevice> theDeviceList, List<OpenHABDevice> theSourceList, String theKey) {
Iterator<OpenHABDevice> devices = theSourceList.iterator();
while(devices.hasNext()) {
OpenHABDevice theDevice = devices.next();
theDeviceList.add(theDevice);
}
return true;
} }
@Override @Override
public Home createHome(BridgeSettings bridgeSettings) { public Home createHome(BridgeSettings bridgeSettings) {
openhabMap = null; openhabMap = null;
aGsonHandler = null;
validOpenhab = bridgeSettings.getBridgeSettingsDescriptor().isValidOpenhab(); validOpenhab = bridgeSettings.getBridgeSettingsDescriptor().isValidOpenhab();
log.info("OpenHAB Home created." + (validOpenhab ? "" : " No OpenHABs configured.")); log.info("OpenHAB Home created." + (validOpenhab ? "" : " No OpenHABs configured."));
if(validOpenhab) { if(validOpenhab) {
openhabMap = new HashMap<String,OpenHABInstance>(); openhabMap = new HashMap<String,OpenHABInstance>();
aGsonHandler = httpClient = HTTPHome.getHandler();
new GsonBuilder() Iterator<NamedIP> theList = bridgeSettings.getBridgeSettingsDescriptor().getOpenhabaddress().getDevices().iterator();
.create();
Iterator<NamedIP> theList = bridgeSettings.getBridgeSettingsDescriptor().getHassaddress().getDevices().iterator();
while(theList.hasNext() && validOpenhab) { while(theList.hasNext() && validOpenhab) {
NamedIP anOpenhab = theList.next(); NamedIP anOpenhab = theList.next();
try { try {
openhabMap.put(anOpenhab.getName(), new OpenHABInstance(anOpenhab)); openhabMap.put(anOpenhab.getName(), new OpenHABInstance(anOpenhab));
} catch (Exception e) { } catch (Exception e) {
log.error("Cannot get hass (" + anOpenhab.getName() + ") setup, Exiting with message: " + e.getMessage(), e); log.error("Cannot get OpenHAB (" + anOpenhab.getName() + ") setup, Exiting with message: " + e.getMessage(), e);
validOpenhab = false; validOpenhab = false;
} }
} }
@@ -70,12 +163,36 @@ public class OpenHABHome implements Home {
return this; return this;
} }
private OpenHABInstance findHandlerByAddress(String hostAddress) {
OpenHABInstance aHandler = null;
boolean found = false;
Iterator<String> keys = openhabMap.keySet().iterator();
while(keys.hasNext()) {
String key = keys.next();
aHandler = openhabMap.get(key);
if(aHandler != null && aHandler.getOpenHABAddress().getIp().equals(hostAddress)) {
found = true;
break;
}
}
if(!found)
aHandler = null;
return aHandler;
}
@Override @Override
public void closeHome() { public void closeHome() {
if(!closed) { log.debug("Closing Home.");
if(!closed && validOpenhab) {
log.debug("Home is already closed....");
return;
} }
if(httpClient != null)
httpClient.closeHandler();
openhabMap = null;
closed = true;
} }

View File

@@ -1,7 +1,6 @@
package com.bwssystems.HABridge.plugins.openhab; package com.bwssystems.HABridge.plugins.openhab;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpGet;
@@ -12,17 +11,14 @@ import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.NamedIP; import com.bwssystems.HABridge.NamedIP;
import com.bwssystems.HABridge.api.NameValue; import com.bwssystems.HABridge.api.NameValue;
import com.bwssystems.HABridge.plugins.http.HTTPHandler; import com.bwssystems.HABridge.plugins.http.HTTPHandler;
import com.bwssystems.HABridge.plugins.http.HTTPHome;
import com.google.gson.Gson; import com.google.gson.Gson;
public class OpenHABInstance { public class OpenHABInstance {
private static final Logger log = LoggerFactory.getLogger(OpenHABInstance.class); private static final Logger log = LoggerFactory.getLogger(OpenHABInstance.class);
private NamedIP theOpenHAB; private NamedIP theOpenHAB;
private HTTPHandler anHttpHandler;
public OpenHABInstance(NamedIP openhabLocation) { public OpenHABInstance(NamedIP openhabLocation) {
super(); super();
anHttpHandler = HTTPHome.getHandler();
theOpenHAB = openhabLocation; theOpenHAB = openhabLocation;
} }
@@ -34,65 +30,38 @@ public class OpenHABInstance {
this.theOpenHAB = openhabAddress; this.theOpenHAB = openhabAddress;
} }
public Boolean callCommand(String aCommand) { public Boolean callCommand(String aCommand, String commandData, HTTPHandler httpClient) {
log.debug("calling HomeAssistant: " + aCommand); log.debug("calling OpenHAB: " + theOpenHAB.getIp() + ":" + theOpenHAB.getPort() + aCommand);
String aUrl = null; String aUrl = null;
if(theOpenHAB.getSecure() != null && theOpenHAB.getSecure())
aUrl = "https";
else
aUrl = "http";
/* String domain = aCommand.getEntityId().substring(0, aCommand.getEntityId().indexOf("."));
aUrl = aUrl + "://" + theOpenHAB.getIp() + ":" + theOpenHAB.getPort() + "/api/services/";
if(domain.equals("group"))
aUrl = aUrl + "homeassistant";
else
aUrl = aUrl + domain;
String aBody = "{\"entity_id\":\"" + aCommand.getEntityId() + "\"";
NameValue[] headers = null; NameValue[] headers = null;
if(theOpenHAB.getPassword() != null && !theOpenHAB.getPassword().isEmpty()) { if(theOpenHAB.getSecure() != null && theOpenHAB.getSecure())
NameValue password = new NameValue(); aUrl = "https://";
password.setName("x-ha-access"); else
password.setValue(theOpenHAB.getPassword()); aUrl = "http://";
headers = new NameValue[1]; if(theOpenHAB.getUsername() != null && !theOpenHAB.getUsername().isEmpty() && theOpenHAB.getPassword() != null && !theOpenHAB.getPassword().isEmpty()) {
headers[0] = password; aUrl = aUrl + theOpenHAB.getUsername() + ":" + theOpenHAB.getPassword() + "@";
} }
if(aCommand.getState().equalsIgnoreCase("on")) { aUrl = aUrl + theOpenHAB.getIp() + ":" + theOpenHAB.getPort() + "/" + aCommand;
aUrl = aUrl + "/turn_on"; String theData = httpClient.doHttpRequest(aUrl, HttpPost.METHOD_NAME, "text/plain", commandData, headers);
if(aCommand.getBri() != null)
aBody = aBody + ",\"brightness\":" + aCommand.getBri() + "}";
else
aBody = aBody + "}";
}
else {
aUrl = aUrl + "/turn_off";
aBody = aBody + "}";
}
log.debug("Calling HomeAssistant with url: " + aUrl);
String theData = anHttpHandler.doHttpRequest(aUrl, HttpPost.METHOD_NAME, "application/json", aBody, headers);
log.debug("call Command return is: <" + theData + ">"); log.debug("call Command return is: <" + theData + ">");
*/
return true; return true;
} }
public List<OpenHABItem> getDevices() { public List<OpenHABDevice> getDevices(HTTPHandler httpClient) {
List<OpenHABItem> theDeviceStates = null; List<OpenHABDevice> deviceList = null;
OpenHABItem[] theOpenhabStates; OpenHABItem[] theOpenhabStates;
String theUrl = null; String theUrl = null;
String theData; String theData;
NameValue[] headers = null; NameValue[] headers = null;
if(theOpenHAB.getPassword() != null && !theOpenHAB.getPassword().isEmpty()) {
NameValue password = new NameValue();
password.setName("x-ha-access");
password.setValue(theOpenHAB.getPassword());
headers = new NameValue[1];
headers[0] = password;
}
if(theOpenHAB.getSecure() != null && theOpenHAB.getSecure()) if(theOpenHAB.getSecure() != null && theOpenHAB.getSecure())
theUrl = "https"; theUrl = "https://";
else else
theUrl = "http"; theUrl = "http://";
theUrl = theUrl + "://" + theOpenHAB.getIp() + ":" + theOpenHAB.getPort() + "/rest/items?recursive=false"; if(theOpenHAB.getUsername() != null && !theOpenHAB.getUsername().isEmpty() && theOpenHAB.getPassword() != null && !theOpenHAB.getPassword().isEmpty()) {
theData = anHttpHandler.doHttpRequest(theUrl, HttpGet.METHOD_NAME, "application/json", null, headers); theUrl = theUrl + theOpenHAB.getUsername() + ":" + theOpenHAB.getPassword() + "@";
}
theUrl = theUrl + theOpenHAB.getIp() + ":" + theOpenHAB.getPort() + "/rest/items?recursive=false";
theData = httpClient.doHttpRequest(theUrl, HttpGet.METHOD_NAME, "application/json", null, headers);
if(theData != null) { if(theData != null) {
log.debug("GET OpenHAB States - data: " + theData); log.debug("GET OpenHAB States - data: " + theData);
theOpenhabStates = new Gson().fromJson(theData, OpenHABItem[].class); theOpenhabStates = new Gson().fromJson(theData, OpenHABItem[].class);
@@ -100,17 +69,24 @@ public class OpenHABInstance {
log.warn("Cannot get an devices for OpenHAB " + theOpenHAB.getName() + " as response is not parsable."); log.warn("Cannot get an devices for OpenHAB " + theOpenHAB.getName() + " as response is not parsable.");
} }
else { else {
theDeviceStates = new ArrayList<OpenHABItem>(Arrays.asList(theOpenhabStates)); deviceList = new ArrayList<OpenHABDevice>();
for (int i = 0; i < theOpenhabStates.length; i++) {
OpenHABDevice aNewOpenHABDeviceDevice = new OpenHABDevice();
aNewOpenHABDeviceDevice.setItem(theOpenhabStates[i]);
aNewOpenHABDeviceDevice.setAddress(theOpenHAB.getIp() + ":" + theOpenHAB.getPort());
aNewOpenHABDeviceDevice.setName(theOpenHAB.getName());
deviceList.add(aNewOpenHABDeviceDevice);
}
} }
} }
else else
log.warn("Cannot get an devices for OpenHAB " + theOpenHAB.getName() + " http call failed."); log.warn("Cannot get an devices for OpenHAB " + theOpenHAB.getName() + " http call failed.");
return theDeviceStates; return deviceList;
} }
protected void closeClient() { protected void closeClient() {
anHttpHandler.closeHandler();
anHttpHandler = null;
} }
} }

View File

@@ -79,6 +79,10 @@ app.config (function ($locationProvider, $routeProvider) {
templateUrl: 'views/lifxdevice.html', templateUrl: 'views/lifxdevice.html',
controller: 'LifxController', controller: 'LifxController',
requiresAuthentication: true requiresAuthentication: true
}).when ('/openhabdevices', {
templateUrl: 'views/openhabdevice.html',
controller: 'OpenHABController',
requiresAuthentication: true
}).when ('/login', { }).when ('/login', {
templateUrl: 'views/login.html', templateUrl: 'views/login.html',
controller: 'LoginController' controller: 'LoginController'
@@ -147,7 +151,7 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n
this.state = {base: "./api/devices", bridgelocation: ".", systemsbase: "./system", huebase: "./api", configs: [], backups: [], devices: [], device: {}, this.state = {base: "./api/devices", bridgelocation: ".", systemsbase: "./system", huebase: "./api", configs: [], backups: [], devices: [], device: {},
mapandid: [], type: "", settings: [], myToastMsg: [], logMsgs: [], loggerInfo: [], mapTypes: [], olddevicename: "", logShowAll: false, mapandid: [], type: "", settings: [], myToastMsg: [], logMsgs: [], loggerInfo: [], mapTypes: [], olddevicename: "", logShowAll: false,
isInControl: false, showVera: false, showFibaro: false, showHarmony: false, showNest: false, showHue: false, showHal: false, showMqtt: false, showHass: false, isInControl: false, showVera: false, showFibaro: false, showHarmony: false, showNest: false, showHue: false, showHal: false, showMqtt: false, showHass: false,
showHomeWizard: false, showDomoticz: false, showSomfy: false, showLifx: false, habridgeversion: {}, viewDevId: "", queueDevId: "", securityInfo: {}, filterDevicesByIpAddress: null, showHomeWizard: false, showDomoticz: false, showSomfy: false, showLifx: false, showOpenHAB: false, habridgeversion: {}, viewDevId: "", queueDevId: "", securityInfo: {}, filterDevicesByIpAddress: null,
filterDevicesOnlyFiltered: false, filterDeviceType: null}; filterDevicesOnlyFiltered: false, filterDeviceType: null};
this.displayWarn = function(errorTitle, error) { this.displayWarn = function(errorTitle, error) {
@@ -460,6 +464,7 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n
return false; return false;
} }
this.compareHarmonyNumber = function(r1, r2) { this.compareHarmonyNumber = function(r1, r2) {
if (r1.device !== undefined) { if (r1.device !== undefined) {
if (r1.device.id === r2.device.id) if (r1.device.id === r2.device.id)
@@ -557,6 +562,11 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n
return; return;
} }
this.updateShowOpenHAB = function () {
this.state.showOpenHAB = self.state.settings.openhabconfigured;
return;
}
this.loadBridgeSettings = function () { this.loadBridgeSettings = function () {
return $http.get(this.state.systemsbase + "/settings").then( return $http.get(this.state.systemsbase + "/settings").then(
function (response) { function (response) {
@@ -573,6 +583,7 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n
self.updateShowDomoticz(); self.updateShowDomoticz();
self.updateShowSomfy(); self.updateShowSomfy();
self.updateShowLifx(); self.updateShowLifx();
self.updateShowOpenHAB();
}, },
function (error) { function (error) {
if (error.status === 401) if (error.status === 401)
@@ -880,6 +891,22 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n
); );
}; };
this.viewOpenHABDevices = function () {
if (!this.state.showOpenHAB)
return;
return $http.get(this.state.base + "/openhab/devices").then(
function (response) {
self.state.openhabdevices = response.data;
},
function (error) {
if (error.status === 401)
$rootScope.$broadcast('securityReinit', 'done');
else
self.displayWarn("Get OpenHAB Devices Error: ", error);
}
);
};
this.formatCallItem = function (currentItem) { this.formatCallItem = function (currentItem) {
if(!currentItem.startsWith("{\"item") && !currentItem.startsWith("[{\"item")) { if(!currentItem.startsWith("{\"item") && !currentItem.startsWith("[{\"item")) {
if (currentItem.startsWith("[") || currentItem.startsWith("{")) if (currentItem.startsWith("[") || currentItem.startsWith("{"))
@@ -1584,6 +1611,25 @@ app.controller ('SystemController', function ($scope, $location, bridgeService,
} }
} }
}; };
$scope.addOpenHABtoSettings = function (newopenhabname, newopenhabip, newopenhabport, newopenhabusername, newopenhabpassword, newopenhabsecure) {
if($scope.bridge.settings.openhabaddress === undefined || $scope.bridge.settings.openhabaddress === null) {
$scope.bridge.settings.openhabaddress = { devices: [] };
}
var newopenhab = {name: newopenhabname, ip: newopenhabip, port: newopenhabport, username: newopenhabusername, password: newopenhabpassword, secure: newopenhabsecure }
$scope.bridge.settings.openhabaddress.devices.push(newopenhab);
$scope.newopenhabname = null;
$scope.newopenhabip = null;
$scope.newopenhabport = null;
$scope.newopenhabusername = null;
$scope.newopenhabpassword = null;
};
$scope.removeOpenHABtoSettings = function (openhabname, openhabip) {
for(var i = $scope.bridge.settings.openhabaddress.devices.length - 1; i >= 0; i--) {
if($scope.bridge.settings.openhabaddress.devices[i].name === openhabname && $scope.bridge.settings.openhabaddress.devices[i].ip === openhabip) {
$scope.bridge.settings.openhabaddress.devices.splice(i, 1);
}
}
};
$scope.bridgeReinit = function () { $scope.bridgeReinit = function () {
bridgeService.reinit(); bridgeService.reinit();
@@ -3549,6 +3595,134 @@ app.controller('SomfyController', function ($scope, $location, bridgeService, ng
}; };
}); });
app.controller('OpenHABController', function ($scope, $location, bridgeService, ngDialog) {
$scope.bridge = bridgeService.state;
$scope.device = bridgeService.state.device;
$scope.device_dim_control = "";
$scope.bulk = { devices: [] };
$scope.selectAll = false;
bridgeService.viewOpenHABDevices();
$scope.imgButtonsUrl = "glyphicon glyphicon-plus";
$scope.buttonsVisible = false;
$scope.clearDevice = function () {
bridgeService.clearDevice();
$scope.device = bridgeService.state.device;
};
$scope.buildDeviceUrls = function (openhabdevice, dim_control, buildonly) {
var preCmd = "/rest/items/" + openhabdevice.item.name;
if((dim_control.indexOf("byte") >= 0 || dim_control.indexOf("percent") >= 0 || dim_control.indexOf("math") >= 0)) {
dimpayload = "{\"url\":\"http://" + openhabdevice.address + preCmd + "\",\"command\":\"" + dim_control + "\"}";
}
else
dimpayload = null;
onpayload = "{\"url\":\"http://" + openhabdevice.address + preCmd + "\",\"command\":\"ON\"}";
offpayload = "{\"url\":\"http://" + openhabdevice.address + preCmd + "\",\"command\":\"OFF\"}";
bridgeService.buildUrls(onpayload, dimpayload, offpayload, null, true, openhabdevice.item.name + "-" + openhabdevice.name, openhabdevice.item.name, openhabdevice.name, openhabdevice.item.type, "openhabDevice", null, null);
$scope.device = bridgeService.state.device;
if (!buildonly) {
bridgeService.editNewDevice($scope.device);
$location.path('/editdevice');
}
};
$scope.bulkAddDevices = function(dim_control) {
var devicesList = [];
$scope.clearDevice();
for(var i = 0; i < $scope.bulk.devices.length; i++) {
for(var x = 0; x < bridgeService.state.openhabdevices.length; x++) {
if(bridgeService.state.openhabdevices[x].devicename === $scope.bulk.devices[i]) {
$scope.buildDeviceUrls(bridgeService.state.openhabdevices[x],dim_control,true);
devicesList[i] = {
name: $scope.device.name,
mapId: $scope.device.mapId,
mapType: $scope.device.mapType,
deviceType: $scope.device.deviceType,
targetDevice: $scope.device.targetDevice,
onUrl: $scope.device.onUrl,
dimUrl: $scope.device.dimUrl,
offUrl: $scope.device.offUrl,
colorUrl: $scope.device.colorUrl,
headers: $scope.device.headers,
httpVerb: $scope.device.httpVerb,
contentType: $scope.device.contentType,
contentBody: $scope.device.contentBody,
contentBodyDim: $scope.device.contentBodyDim,
contentBodyOff: $scope.device.contentBodyOff
};
$scope.clearDevice();
}
}
}
bridgeService.bulkAddDevice(devicesList).then(
function () {
$scope.clearDevice();
bridgeService.viewDevices();
bridgeService.viewHalDevices();
},
function (error) {
bridgeService.displayWarn("Error adding openhab devices in bulk.", error)
}
);
$scope.bulk = { devices: [] };
$scope.selectAll = false;
};
$scope.toggleSelection = function toggleSelection(deviceId) {
var idx = $scope.bulk.devices.indexOf(deviceId);
// is currently selected
if (idx > -1) {
$scope.bulk.devices.splice(idx, 1);
if($scope.bulk.devices.length === 0 && $scope.selectAll)
$scope.selectAll = false;
}
// is newly selected
else {
$scope.bulk.devices.push(deviceId);
$scope.selectAll = true;
}
};
$scope.toggleSelectAll = function toggleSelectAll() {
if($scope.selectAll) {
$scope.selectAll = false;
$scope.bulk = { devices: [] };
}
else {
$scope.selectAll = true;
for(var x = 0; x < bridgeService.state.openhabdevices.length; x++) {
if($scope.bulk.devices.indexOf(bridgeService.state.openhabdevices[x]) < 0)
$scope.bulk.devices.push(bridgeService.state.openhabdevices[x].devicename);
}
}
};
$scope.toggleButtons = function () {
$scope.buttonsVisible = !$scope.buttonsVisible;
if($scope.buttonsVisible)
$scope.imgButtonsUrl = "glyphicon glyphicon-minus";
else
$scope.imgButtonsUrl = "glyphicon glyphicon-plus";
};
$scope.deleteDevice = function (device) {
$scope.bridge.device = device;
ngDialog.open({
template: 'deleteDialog',
controller: 'DeleteDialogCtrl',
className: 'ngdialog-theme-default'
});
};
$scope.editDevice = function (device) {
bridgeService.editDevice(device);
$location.path('/editdevice');
};
});
app.controller('EditController', function ($scope, $location, bridgeService) { app.controller('EditController', function ($scope, $location, bridgeService) {
$scope.bridge = bridgeService.state; $scope.bridge = bridgeService.state;
$scope.device = bridgeService.state.device; $scope.device = bridgeService.state.device;
@@ -3966,6 +4140,20 @@ app.filter('configuredHomeWizardDevices', function (bridgeService) {
} }
}); });
app.filter('configuredOpenHABItems', function (bridgeService) {
return function(input) {
var out = [];
if(input === undefined || input === null || input.length === undefined)
return out;
for (var i = 0; i < input.length; i++) {
if (bridgeService.deviceContainsType(input[i], "openhab")) {
out.push(input[i]);
}
}
return out;
}
});
app.filter('filterDevicesByRequester', function () { app.filter('filterDevicesByRequester', function () {
return function(input,search,mustContain,deviceType) { return function(input,search,mustContain,deviceType) {
var out = []; var out = [];

View File

@@ -1,32 +1,24 @@
<ul class="nav nav-pills" role="tablist"> <ul class="nav nav-pills" role="tablist">
<li role="presentation" class="active"><a href="#!/">Bridge <li role="presentation" class="active"><a href="#!/">Bridge Devices</a></li>
Devices</a></li>
<li role="presentation"><a href="#!/system">Bridge Control</a></li> <li role="presentation"><a href="#!/system">Bridge Control</a></li>
<li role="presentation"><a href="#!/logs">Logs</a></li> <li role="presentation"><a href="#!/logs">Logs</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showVera" role="presentation"><a href="#!/veradevices">Vera Devices</a></li>
href="#!/veradevices">Vera Devices</a></li> <li ng-if="bridge.showVera" role="presentation"><a href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showFibaro" role="presentation"><a href="#!/fibarodevices">Fibaro Devices</a></li>
href="#!/verascenes">Vera Scenes</a></li> <li ng-if="bridge.showFibaro" role="presentation"><a href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonyactivities">Harmony Activities</a></li>
href="#!/fibarodevices">Fibaro Devices</a></li> <li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonydevices">Harmony Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonydevices">Harmony Devices</a></li>
<li ng-if="bridge.showNest" role="presentation"><a href="#!/nest">Nest</a></li> <li ng-if="bridge.showNest" role="presentation"><a href="#!/nest">Nest</a></li>
<li ng-if="bridge.showHue" role="presentation"><a <li ng-if="bridge.showHue" role="presentation"><a href="#!/huedevices">Hue Devices</a></li>
href="#!/huedevices">Hue Devices</a></li> <li ng-if="bridge.showHal" role="presentation"><a href="#!/haldevices">HAL Devices</a></li>
<li ng-if="bridge.showHal" role="presentation"><a
href="#!/haldevices">HAL Devices</a></li>
<li ng-if="bridge.showMqtt" role="presentation"><a href="#!/mqttmessages">MQTT Messages</a></li> <li ng-if="bridge.showMqtt" role="presentation"><a href="#!/mqttmessages">MQTT Messages</a></li>
<li ng-if="bridge.showHass" role="presentation"><a href="#!/hassdevices">HomeAssistant Devices</a></li> <li ng-if="bridge.showHass" role="presentation"><a href="#!/hassdevices">HomeAssistant Devices</a></li>
<li ng-if="bridge.showHomeWizard" role="presentation"><a href="#!/homewizarddevices">HomeWizard Devices</a></li>
<li ng-if="bridge.showDomoticz" role="presentation"><a href="#!/domoticzdevices">Domoticz Devices</a></li> <li ng-if="bridge.showDomoticz" role="presentation"><a href="#!/domoticzdevices">Domoticz Devices</a></li>
<li ng-if="bridge.showSomfy" role="presentation"><a href="#!/somfydevices">Somfy Devices</a></li> <li ng-if="bridge.showSomfy" role="presentation"><a href="#!/somfydevices">Somfy Devices</a></li>
<li ng-if="bridge.showLifx" role="presentation"><a href="#!/lifxdevices">LIFX Devices</a></li> <li ng-if="bridge.showLifx" role="presentation"><a href="#!/lifxdevices">LIFX Devices</a></li>
<li ng-if="bridge.showHomeWizard" role="presentation"><a href="#!/homewizarddevices">HomeWizard Devices</a></li>
<li ng-if="bridge.showOpenHAB" role="presentation"><a href="#!/openhabdevices">OpenHAB Devices</a></li>
<li role="presentation"><a href="#!/editdevice">Add/Edit</a></li> <li role="presentation"><a href="#!/editdevice">Add/Edit</a></li>
</ul> </ul>
<div postrender-action="goToRow()"> <div postrender-action="goToRow()">

View File

@@ -2,31 +2,23 @@
<li role="presentation"><a href="#!/">Bridge Devices</a></li> <li role="presentation"><a href="#!/">Bridge Devices</a></li>
<li role="presentation"><a href="#!/system">Bridge Control</a></li> <li role="presentation"><a href="#!/system">Bridge Control</a></li>
<li role="presentation"><a href="#!/logs">Logs</a></li> <li role="presentation"><a href="#!/logs">Logs</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showVera" role="presentation"><a href="#!/veradevices">Vera Devices</a></li>
href="#!/veradevices">Vera Devices</a></li> <li ng-if="bridge.showVera" role="presentation"><a href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showFibaro" role="presentation"><a href="#!/fibarodevices">Fibaro Devices</a></li>
href="#!/verascenes">Vera Scenes</a></li> <li ng-if="bridge.showFibaro" role="presentation"><a href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonyactivities">Harmony Activities</a></li>
href="#!/fibarodevices">Fibaro Devices</a></li> <li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonydevices">Harmony Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonydevices">Harmony Devices</a></li>
<li ng-if="bridge.showNest" role="presentation"><a href="#!/nest">Nest</a></li> <li ng-if="bridge.showNest" role="presentation"><a href="#!/nest">Nest</a></li>
<li ng-if="bridge.showHue" role="presentation"><a <li ng-if="bridge.showHue" role="presentation"><a href="#!/huedevices">Hue Devices</a></li>
href="#!/huedevices">Hue Devices</a></li> <li ng-if="bridge.showHal" role="presentation"><a href="#!/haldevices">HAL Devices</a></li>
<li ng-if="bridge.showHal" role="presentation"><a <li ng-if="bridge.showMqtt" role="presentation"><a href="#!/mqttmessages">MQTT Messages</a></li>
href="#!/haldevices">HAL Devices</a></li> <li ng-if="bridge.showHass" role="presentation"><a href="#!/hassdevices">HomeAssistant Devices</a></li>
<li ng-if="bridge.showMqtt" role="presentation"><a
href="#!/mqttmessages">MQTT Messages</a></li>
<li ng-if="bridge.showHass" role="presentation"><a
href="#!/hassdevices">HomeAssistant Devices</a></li>
<li ng-if="bridge.showHomeWizard" role="presentation"><a href="#!/homewizarddevices">HomeWizard Devices</a></li> <li ng-if="bridge.showHomeWizard" role="presentation"><a href="#!/homewizarddevices">HomeWizard Devices</a></li>
<li ng-if="bridge.showDomoticz" role="presentation"><a href="#!/domoticzdevices">Domoticz Devices</a></li> <li ng-if="bridge.showDomoticz" role="presentation"><a href="#!/domoticzdevices">Domoticz Devices</a></li>
<li ng-if="bridge.showSomfy" role="presentation"><a href="#!/somfydevices">Somfy Devices</a></li> <li ng-if="bridge.showSomfy" role="presentation"><a href="#!/somfydevices">Somfy Devices</a></li>
<li ng-if="bridge.showLifx" role="presentation"><a href="#!/lifxdevices">LIFX Devices</a></li> <li ng-if="bridge.showLifx" role="presentation"><a href="#!/lifxdevices">LIFX Devices</a></li>
<li ng-if="bridge.showHomeWizard" role="presentation"><a href="#!/homewizarddevices">HomeWizard Devices</a></li>
<li ng-if="bridge.showOpenHAB" role="presentation"><a href="#!/openhabdevices">OpenHAB Devices</a></li>
<li role="presentation" class="active"><a href="#!/editdevice">Add/Edit</a></li> <li role="presentation" class="active"><a href="#!/editdevice">Add/Edit</a></li>
</ul> </ul>

View File

@@ -0,0 +1,141 @@
<ul class="nav nav-pills" role="tablist">
<li role="presentation"><a href="#!/">Bridge Devices</a></li>
<li role="presentation"><a href="#!/system">Bridge Control</a></li>
<li role="presentation"><a href="#!/logs">Logs</a></li>
<li ng-if="bridge.showVera" role="presentation"><a href="#!/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a href="#!/fibarodevices">Fibaro Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonydevices">Harmony Devices</a></li>
<li ng-if="bridge.showNest" role="presentation"><a href="#!/nest">Nest</a></li>
<li ng-if="bridge.showHue" role="presentation"><a href="#!/huedevices">Hue Devices</a></li>
<li ng-if="bridge.showHal" role="presentation"><a href="#!/haldevices">HAL Devices</a></li>
<li ng-if="bridge.showMqtt" role="presentation"><a href="#!/mqttmessages">MQTT Messages</a></li>
<li ng-if="bridge.showHass" role="presentation"><a href="#!/hassdevices">HomeAssistant Devices</a></li>
<li ng-if="bridge.showDomoticz" role="presentation"><a href="#!/domoticzdevices">Domoticz Devices</a></li>
<li ng-if="bridge.showSomfy" role="presentation"><a href="#!/somfydevices">Somfy Devices</a></li>
<li ng-if="bridge.showLifx" role="presentation"><a href="#!/lifxdevices">LIFX Devices</a></li>
<li ng-if="bridge.showHomeWizard" role="presentation"><a href="#!/homewizarddevices">HomeWizard Devices</a></li>
<li role="presentation" class="active"><a href="#!/openhabdevices">OpenHAB Devices</a></li>
<li role="presentation"><a href="#!/editdevice">Add/Edit</a></li>
</ul>
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title">OpenHAB Device List
({{bridge.openhabdevices.length}})</h2>
</div>
<div class="panel-body">
<p class="text-muted">For any OpenHAB Device, use the build action buttons
to generate the item addition information into the ha-bridge device and this will put you into the edit screen. Then
you can modify the name to anything you want that will be the keyword
for the Echo or Google Home. Also, you can go back to any helper tab and click a build
action button to add another item for a multi-command. After you are
done in the edit tab, click the 'Add Bridge Device' to finish that selection
setup. The 'Already Configured OpenHAB Devices' list below will show what
is already setup for your OpenHAB.</p>
<p class="text-muted">
Also, use this select menu for which type of dim control you would
like to be generated: <select name="device-dim-control"
id="device-dim-control" ng-model="device_dim_control">
<option value="">none</option>
<option value="${intensity.byte}">Pass-thru Value</option>
<option value="${intensity.percent}">Percentage</option>
<option value="${intensity.decimal_percent}">Decimal Percentage</option>
<option value="${intensity.math(X*1)}">Custom Math</option>
</select>
</p>
<p class="text-muted">Use the check boxes by the names to use the bulk addition
feature. Select your items and dim control type if wanted, then click
bulk add below. Your items will be added with on and off or dim and
off if selected with the name of the device from the OpenHAB.</p>
<scrollable-table watch="bridge.openhabdevices">
<table class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>Row</th>
<th sortable-header col="name">
<span><input type="checkbox" name="selectAll"
value="{{selectAll}}"
ng-checked="selectAll"
ng-click="toggleSelectAll()"> Name</span></th>
<th sortable-header col="type">Type</th>
<th sortable-header col="openhabname">OpenHAB</th>
<th>Build Actions</th>
</tr>
</thead>
<tr ng-repeat="openhabdevice in bridge.openhabdevices">
<td>{{$index+1}}</td>
<td><input type="checkbox" name="bulk.devices[]"
value="{{openhabdevice.item.name}}"
ng-checked="bulk.devices.indexOf(openhabdevice.item.name) > -1"
ng-click="toggleSelection(openhabdevice.item.name)">
{{openhabdevice.item.name}}</td>
<td>{{openhabdevice.item.type}}</td>
<td>{{openhabdevice.name}}</td>
<td>
<button class="btn btn-success" type="submit"
ng-click="buildDeviceUrls(openhabdevice, device_dim_control, false)">Build Item</button>
</td>
</tr>
</table>
</scrollable-table>
<div class="panel-footer">
<button class="btn btn-success" type="submit"
ng-click="bulkAddDevices(device_dim_control)">Bulk Add
({{bulk.devices.length}})</button>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title">
Already Configured OpenHAB Devices <a ng-click="toggleButtons()"><span
class={{imgButtonsUrl}} aria-hidden="true"></span></a></a>
</h2>
</div>
<div ng-if="buttonsVisible" class="panel-body">
<scrollable-table watch="bridge.openhabdevices">
<table class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>Row</th>
<th sortable-header col="name">Name</th>
<th sortable-header col="category">Category</th>
<th sortable-header col="openhabname">OpenHAB</th>
<th>Map Id</th>
<th>Actions</th>
</tr>
</thead>
<tr
ng-repeat="device in bridge.devices | configuredOpenHABItems">
<td>{{$index+1}}</td>
<td>{{device.name}}</td>
<td>{{device.deviceType}}</td>
<td>{{device.targetDevice}}</td>
<td>{{device.mapId}}</td>
<td>
<p>
<button class="btn btn-warning" type="submit"
ng-click="editDevice(device)">Edit</button>
<button class="btn btn-danger" type="submit"
ng-click="deleteDevice(device)">Delete</button>
</p>
</td>
</tr>
</table>
</scrollable-table>
</div>
</div>
<script type="text/ng-template" id="deleteMapandIdDialog">
<div class="ngdialog-message">
<h2>Device Map and Id?</h2>
<p>{{mapandid.mapType}} with {{mapandid.id}}</p>
<p>Are you Sure?</p>
</div>
<div class="ngdialog-buttons mt">
<button type="button" class="ngdialog-button ngdialog-button-error" ng-click="deleteMapandId(mapandid)">Delete</button>
</div>
</script>

View File

@@ -3,29 +3,22 @@
<li role="presentation" class="active"><a href="#!/system">Bridge <li role="presentation" class="active"><a href="#!/system">Bridge
Control</a></li> Control</a></li>
<li role="presentation"><a href="#!/logs">Logs</a></li> <li role="presentation"><a href="#!/logs">Logs</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showVera" role="presentation"><a href="#!/veradevices">Vera Devices</a></li>
href="#!/veradevices">Vera Devices</a></li> <li ng-if="bridge.showVera" role="presentation"><a href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showFibaro" role="presentation"><a href="#!/fibarodevices">Fibaro Devices</a></li>
href="#!/verascenes">Vera Scenes</a></li> <li ng-if="bridge.showFibaro" role="presentation"><a href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonyactivities">Harmony Activities</a></li>
href="#!/fibarodevices">Fibaro Devices</a></li> <li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonydevices">Harmony Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonydevices">Harmony Devices</a></li>
<li ng-if="bridge.showNest" role="presentation"><a href="#!/nest">Nest</a></li> <li ng-if="bridge.showNest" role="presentation"><a href="#!/nest">Nest</a></li>
<li ng-if="bridge.showHue" role="presentation"><a <li ng-if="bridge.showHue" role="presentation"><a href="#!/huedevices">Hue Devices</a></li>
href="#!/huedevices">Hue Devices</a></li> <li ng-if="bridge.showHal" role="presentation"><a href="#!/haldevices">HAL Devices</a></li>
<li ng-if="bridge.showHal" role="presentation"><a
href="#!/haldevices">HAL Devices</a></li>
<li ng-if="bridge.showMqtt" role="presentation"><a href="#!/mqttmessages">MQTT Messages</a></li> <li ng-if="bridge.showMqtt" role="presentation"><a href="#!/mqttmessages">MQTT Messages</a></li>
<li ng-if="bridge.showHass" role="presentation"><a href="#!/hassdevices">HomeAssistant Devices</a></li> <li ng-if="bridge.showHass" role="presentation"><a href="#!/hassdevices">HomeAssistant Devices</a></li>
<li ng-if="bridge.showHomeWizard" role="presentation"><a href="#!/homewizarddevices">HomeWizard Devices</a></li>
<li ng-if="bridge.showDomoticz" role="presentation"><a href="#!/domoticzdevices">Domoticz Devices</a></li> <li ng-if="bridge.showDomoticz" role="presentation"><a href="#!/domoticzdevices">Domoticz Devices</a></li>
<li ng-if="bridge.showSomfy" role="presentation"><a href="#!/somfydevices">Somfy Devices</a></li> <li ng-if="bridge.showSomfy" role="presentation"><a href="#!/somfydevices">Somfy Devices</a></li>
<li ng-if="bridge.showLifx" role="presentation"><a href="#!/lifxdevices">LIFX Devices</a></li> <li ng-if="bridge.showLifx" role="presentation"><a href="#!/lifxdevices">LIFX Devices</a></li>
<li ng-if="bridge.showHomeWizard" role="presentation"><a href="#!/homewizarddevices">HomeWizard Devices</a></li>
<li ng-if="bridge.showOpenHAB" role="presentation"><a href="#!/openhabdevices">OpenHAB Devices</a></li>
<li role="presentation"><a href="#!/editdevice">Add/Edit</a></li> <li role="presentation"><a href="#!/editdevice">Add/Edit</a></li>
</ul> </ul>
@@ -572,6 +565,66 @@
</tr> </tr>
</table></td> </table></td>
</tr> </tr>
<tr>
<td>OpenHAB Names and IP Addresses</td>
<td><table
class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>Name</th>
<th>IP</th>
<th>Port</th>
<th>Password (opt)</th>
<th>Use SSL</th>
<th>Manage</th>
</tr>
</thead>
<tr ng-repeat="openhab in bridge.settings.openhabaddress.devices">
<td><input id="bridge-settings-next-openhab-name"
class="form-control" type="text" ng-model="openhab.name"
placeholder="An OpenHAB"></td>
<td><input id="bridge-settings-next-openhab-ip"
class="form-control" type="text" ng-model="openhab.ip"
placeholder="192.168.1.3"></td>
<td><input id="bridge-settings-next-openhab-port"
class="form-control" type="text" ng-model="openhab.port"
placeholder="8123"></td>
<td><input id="bridge-settings-next-openhab-username"
class="form-control" type="text" ng-model="openhab.username"
placeholder="OpenHAB username"></td>
<td><input id="bridge-settings-next-openhab-password"
class="form-control" type="password" ng-model="openhab.password"
placeholder="OpenHAB password (opt)"></td>
<td><input type="checkbox"
ng-model="openhab.secure" ng-true-value=true
ng-false-value=false></td>
<td><button class="btn btn-danger" type="submit"
ng-click="removeOpenHABtoSettings(openhab.name, openhab.ip)">Del</button></td>
</tr>
<tr>
<td><input id="bridge-settings-new-openhab-name"
class="form-control" type="text" ng-model="newopenhabname"
placeholder="A OpenHAB"></td>
<td><input id="bridge-settings-new-openhab-ip"
class="form-control" type="text" ng-model="newopenhabip"
placeholder="192.168.1.3"></td>
<td><input id="bridge-settings-new-openhab-port"
class="form-control" type="text" ng-model="newopenhabport"
placeholder="8123"></td>
<td><input id="bridge-settings-new-openhab-username"
class="form-control" type="text" ng-model="newopenhabusername"
placeholder="OpenHAB username"></td>
<td><input id="bridge-settings-new-openhab-password"
class="form-control" type="password" ng-model="newopenhabpassword"
placeholder="OpenHAB password (opt)"></td>
<td><input type="checkbox"
ng-model="newopenhabsecure" ng-true-value=true
ng-false-value=false></td>
<td><button class="btn btn-success" type="submit"
ng-click="addOpenHABtoSettings(newopenhabname, newopenhabip, newopenhabport, newsopenhabusername, newopenhabpassword, newopenhabsecure)">Add</button></td>
</tr>
</table></td>
</tr>
<tr> <tr>
<td>Nest Username</td> <td>Nest Username</td>
<td><input id="bridge-settings-nestuser" class="form-control" <td><input id="bridge-settings-nestuser" class="form-control"