mirror of
https://github.com/bwssytems/ha-bridge.git
synced 2025-12-18 08:13:23 +00:00
Basic OpenHAB functionality added. Need to add String selection
functionality.
This commit is contained in:
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>5.1.0a</version>
|
<version>5.1.0b</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>HA Bridge</name>
|
<name>HA Bridge</name>
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<>();
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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
|
|
||||||
|
if(!validOpenhab)
|
||||||
return null;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
|
||||||
password.setValue(theOpenHAB.getPassword());
|
|
||||||
headers = new NameValue[1];
|
|
||||||
headers[0] = password;
|
|
||||||
}
|
|
||||||
if(aCommand.getState().equalsIgnoreCase("on")) {
|
|
||||||
aUrl = aUrl + "/turn_on";
|
|
||||||
if(aCommand.getBri() != null)
|
|
||||||
aBody = aBody + ",\"brightness\":" + aCommand.getBri() + "}";
|
|
||||||
else
|
else
|
||||||
aBody = aBody + "}";
|
aUrl = "http://";
|
||||||
|
if(theOpenHAB.getUsername() != null && !theOpenHAB.getUsername().isEmpty() && theOpenHAB.getPassword() != null && !theOpenHAB.getPassword().isEmpty()) {
|
||||||
|
aUrl = aUrl + theOpenHAB.getUsername() + ":" + theOpenHAB.getPassword() + "@";
|
||||||
}
|
}
|
||||||
else {
|
aUrl = aUrl + theOpenHAB.getIp() + ":" + theOpenHAB.getPort() + "/" + aCommand;
|
||||||
aUrl = aUrl + "/turn_off";
|
String theData = httpClient.doHttpRequest(aUrl, HttpPost.METHOD_NAME, "text/plain", commandData, headers);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 = [];
|
||||||
|
|||||||
@@ -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()">
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
141
src/main/resources/public/views/openhabdevice.html
Normal file
141
src/main/resources/public/views/openhabdevice.html
Normal 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>
|
||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user