From 5a052d93741be9e787012e730ce5da57896351d3 Mon Sep 17 00:00:00 2001 From: bsamuels Date: Thu, 18 Jan 2018 16:54:21 -0600 Subject: [PATCH] Updated FHEM for command Started Broadlink implementation --- pom.xml | 7 +- .../HABridge/BridgeSettingsDescriptor.java | 17 +- .../bwssystems/HABridge/Configuration.java | 2 + .../bwssystems/HABridge/DeviceMapTypes.java | 2 + .../com/bwssystems/HABridge/HomeManager.java | 5 + .../devicemanagmeent/DeviceResource.java | 6 + .../plugins/broadlink/BroadlinkEntry.java | 39 +++ .../plugins/broadlink/BroadlinkHome.java | 305 ++++++++++++++++++ .../HABridge/plugins/fhem/FHEMHome.java | 7 +- .../HABridge/plugins/fhem/FHEMInstance.java | 2 +- .../HABridge/plugins/fhem/FHEMTestData.java | 288 +++++++++++++++++ .../plugins/http/HttpTestHandler.java | 42 ++- src/main/resources/public/scripts/app.js | 4 + src/main/resources/public/views/system.html | 6 + .../fhem/test/FHEMInstanceConstructor.java | 298 +---------------- 15 files changed, 725 insertions(+), 305 deletions(-) create mode 100644 src/main/java/com/bwssystems/HABridge/plugins/broadlink/BroadlinkEntry.java create mode 100644 src/main/java/com/bwssystems/HABridge/plugins/broadlink/BroadlinkHome.java create mode 100644 src/main/java/com/bwssystems/HABridge/plugins/fhem/FHEMTestData.java diff --git a/pom.xml b/pom.xml index fa5ebe7..5e61576 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.bwssystems.HABridge ha-bridge - 5.2.0RC5 + 5.2.0RC6 jar HA Bridge @@ -126,6 +126,11 @@ lifx-sdk-java 2.1.6 + + com.github.mob41 + broadlink-java-api + -SNAPSHOT + org.apache.commons commons-lang3 diff --git a/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java b/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java index 47327f7..bf24a34 100644 --- a/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java +++ b/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java @@ -108,6 +108,12 @@ public class BridgeSettingsDescriptor { @SerializedName("fhemaddress") @Expose private IpList fhemaddress; + @SerializedName("lifxconfigured") + @Expose + private boolean lifxconfigured; + @SerializedName("broadlinkconfigured") + @Expose + private boolean broadlinkconfigured; // @SerializedName("activeloggers") // @Expose // private List activeloggers; @@ -123,7 +129,6 @@ public class BridgeSettingsDescriptor { private boolean hassconfigured; private boolean domoticzconfigured; private boolean somfyconfigured; - private boolean lifxconfigured; private boolean homewizardconfigured; private boolean openhabconfigured; private boolean fhemconfigured; @@ -160,6 +165,7 @@ public class BridgeSettingsDescriptor { this.hubmac = null; // this.activeloggers = null; this.upnpsenddelay = 1500; + this.broadlinkconfigured = false; } public String getUpnpConfigAddress() { return upnpconfigaddress; @@ -473,6 +479,12 @@ public class BridgeSettingsDescriptor { // public void setActiveloggers(List activeloggers) { // this.activeloggers = activeloggers; // } + public boolean isBroadlinkconfigured() { + return broadlinkconfigured; + } + public void setBroadlinkconfigured(boolean broadlinkconfigured) { + this.broadlinkconfigured = broadlinkconfigured; + } public Boolean isValidVera() { if(this.getVeraAddress() == null || this.getVeraAddress().getDevices().size() <= 0) return false; @@ -600,4 +612,7 @@ public class BridgeSettingsDescriptor { return true; } + public Boolean isValidBroadlink() { + return this.isBroadlinkconfigured(); + } } diff --git a/src/main/java/com/bwssystems/HABridge/Configuration.java b/src/main/java/com/bwssystems/HABridge/Configuration.java index bcb16ca..d4076d9 100644 --- a/src/main/java/com/bwssystems/HABridge/Configuration.java +++ b/src/main/java/com/bwssystems/HABridge/Configuration.java @@ -14,4 +14,6 @@ public class Configuration { public static final String CONFIG_FILE = "data/habridge.config"; public static final int NUMBER_OF_LOG_MESSAGES = 512; public static final long UPNP_NOTIFY_TIMEOUT = 20000; + public static final int BROADLINK_DISCOVER_PORT = 40000; + public static final int BROADLINK_DISCONVER_TIMEOUT = 5000; } diff --git a/src/main/java/com/bwssystems/HABridge/DeviceMapTypes.java b/src/main/java/com/bwssystems/HABridge/DeviceMapTypes.java index 80b1f33..24f8f5f 100644 --- a/src/main/java/com/bwssystems/HABridge/DeviceMapTypes.java +++ b/src/main/java/com/bwssystems/HABridge/DeviceMapTypes.java @@ -33,6 +33,7 @@ public class DeviceMapTypes { public final static String[] LIFX_DEVICE = { "lifxDevice", "LIFX Device"}; public final static String[] OPENHAB_DEVICE = { "openhabDevice", "OpenHAB Device"}; public final static String[] FHEM_DEVICE = { "fhemDevice", "FHEM Device"}; + public final static String[] BROADLINK_DEVICE = { "broadlinkDevice", "Broadlink Device"}; public final static int typeIndex = 0; public final static int displayIndex = 1; @@ -67,6 +68,7 @@ public class DeviceMapTypes { deviceMapTypes.add(SOMFY_DEVICE); deviceMapTypes.add(OPENHAB_DEVICE); deviceMapTypes.add(FHEM_DEVICE); + deviceMapTypes.add(BROADLINK_DEVICE); } public static int getTypeIndex() { return typeIndex; diff --git a/src/main/java/com/bwssystems/HABridge/HomeManager.java b/src/main/java/com/bwssystems/HABridge/HomeManager.java index 5fcc3e3..4339b5e 100644 --- a/src/main/java/com/bwssystems/HABridge/HomeManager.java +++ b/src/main/java/com/bwssystems/HABridge/HomeManager.java @@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory; import com.bwssystems.HABridge.devicemanagmeent.ResourceHandler; import com.bwssystems.HABridge.plugins.NestBridge.NestHome; +import com.bwssystems.HABridge.plugins.broadlink.BroadlinkHome; import com.bwssystems.HABridge.plugins.domoticz.DomoticzHome; import com.bwssystems.HABridge.plugins.exec.CommandHome; import com.bwssystems.HABridge.plugins.fhem.FHEMHome; @@ -123,6 +124,10 @@ public class HomeManager { aHome = new FHEMHome(bridgeSettings); resourceList.put(DeviceMapTypes.FHEM_DEVICE[DeviceMapTypes.typeIndex], aHome); homeList.put(DeviceMapTypes.FHEM_DEVICE[DeviceMapTypes.typeIndex], aHome); + //setup the Broadlink configuration if available + aHome = new BroadlinkHome(bridgeSettings); + resourceList.put(DeviceMapTypes.BROADLINK_DEVICE[DeviceMapTypes.typeIndex], aHome); + homeList.put(DeviceMapTypes.BROADLINK_DEVICE[DeviceMapTypes.typeIndex], aHome); } public Home findHome(String type) { diff --git a/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java b/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java index ed598c6..b360411 100644 --- a/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java +++ b/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java @@ -327,6 +327,12 @@ public class DeviceResource { return homeManager.findResource(DeviceMapTypes.FHEM_DEVICE[DeviceMapTypes.typeIndex]).getItems(DeviceMapTypes.FHEM_DEVICE[DeviceMapTypes.typeIndex]); }, new JsonTransformer()); + get (API_CONTEXT + "/broadlink/devices", "application/json", (request, response) -> { + log.debug("Get Broadlink devices"); + response.status(HttpStatus.SC_OK); + return homeManager.findResource(DeviceMapTypes.BROADLINK_DEVICE[DeviceMapTypes.typeIndex]).getItems(DeviceMapTypes.BROADLINK_DEVICE[DeviceMapTypes.typeIndex]); + }, new JsonTransformer()); + get (API_CONTEXT + "/map/types", "application/json", (request, response) -> { log.debug("Get map types"); return new DeviceMapTypes().getDeviceMapTypes(); diff --git a/src/main/java/com/bwssystems/HABridge/plugins/broadlink/BroadlinkEntry.java b/src/main/java/com/bwssystems/HABridge/plugins/broadlink/BroadlinkEntry.java new file mode 100644 index 0000000..56665bb --- /dev/null +++ b/src/main/java/com/bwssystems/HABridge/plugins/broadlink/BroadlinkEntry.java @@ -0,0 +1,39 @@ +package com.bwssystems.HABridge.plugins.broadlink; + +public class BroadlinkEntry { + private String name; + private String id; + private String command; + private String data; + private String type; + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getCommand() { + return command; + } + public void setCommand(String command) { + this.command = command; + } + public String getData() { + return data; + } + public void setData(String data) { + this.data = data; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } +} diff --git a/src/main/java/com/bwssystems/HABridge/plugins/broadlink/BroadlinkHome.java b/src/main/java/com/bwssystems/HABridge/plugins/broadlink/BroadlinkHome.java new file mode 100644 index 0000000..fb464db --- /dev/null +++ b/src/main/java/com/bwssystems/HABridge/plugins/broadlink/BroadlinkHome.java @@ -0,0 +1,305 @@ +package com.bwssystems.HABridge.plugins.broadlink; + +import java.io.IOException; +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.xml.bind.DatatypeConverter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.bwssystems.HABridge.BridgeSettings; +import com.bwssystems.HABridge.Configuration; +import com.bwssystems.HABridge.Home; +import com.bwssystems.HABridge.api.CallItem; +import com.bwssystems.HABridge.dao.DeviceDescriptor; +import com.bwssystems.HABridge.hue.BrightnessDecode; +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.TimeDecode; +import com.github.mob41.blapi.BLDevice; +import com.github.mob41.blapi.MP1Device; +import com.github.mob41.blapi.RM2Device; +import com.github.mob41.blapi.SP1Device; +import com.github.mob41.blapi.SP2Device; +import com.github.mob41.blapi.pkt.cmd.rm2.SendDataCmdPayload; +import com.google.gson.Gson; + +public class BroadlinkHome implements Home { + private static final Logger log = LoggerFactory.getLogger(BroadlinkHome.class); + private static final String _a1 = "A1"; + private static final String _mp1 = "MP1"; + private static final String _sp1 = "SP1"; + private static final String _sp2 = "SP2"; + private static final String _rm2 = "RM2"; + private Map broadlinkMap; + private Boolean validBroadlink; + private Gson aGsonHandler; + private boolean closed; + private Boolean isDevMode; + + public BroadlinkHome(BridgeSettings bridgeSettings) { + super(); + closed = true; + createHome(bridgeSettings); + closed = false; + } + + @Override + public Home createHome(BridgeSettings bridgeSettings) { + broadlinkMap = null; + aGsonHandler = null; + BLDevice[] clients; + + isDevMode = Boolean.parseBoolean(System.getProperty("dev.mode", "false")); + validBroadlink = bridgeSettings.getBridgeSettingsDescriptor().isValidBroadlink(); + + log.info("Broadlink Home created." + (validBroadlink ? "" : " No Broadlinks configured.") + (isDevMode ? " DevMode is set." : "")); + if(validBroadlink) { + broadlinkMap = new HashMap(); + try { + log.info("Broadlink discover...."); + if(isDevMode) { + clients = TestBLDevice.discoverDevices(InetAddress.getByName(bridgeSettings.getBridgeSettingsDescriptor().getUpnpConfigAddress()), Configuration.BROADLINK_DISCOVER_PORT, Configuration.BROADLINK_DISCONVER_TIMEOUT); + } + else + clients = BLDevice.discoverDevices(InetAddress.getByName(bridgeSettings.getBridgeSettingsDescriptor().getUpnpConfigAddress()), Configuration.BROADLINK_DISCOVER_PORT, Configuration.BROADLINK_DISCONVER_TIMEOUT); + if(clients.length <= 0) { + log.warn("Did not discover any Broadlinks, try again with bridge reinitialization"); + broadlinkMap = null; + validBroadlink = false; + return this; + } + for(int i = 0; i < clients.length; i++) { + if(clients[i].getDeviceType() != BLDevice.DEV_A1) + broadlinkMap.put(clients[i].getHost() + "-" + String.format("%04x", clients[i].getDeviceType()), clients[i]); + } + } catch (IOException e) { + log.warn("Could not discover Broadlinks, with IO Exception", e); + broadlinkMap = null; + validBroadlink = false; + return this; + } + } + return this; + } + + @Override + public Object getItems(String type) { + log.debug("consolidating devices for Broadlink"); + if(!validBroadlink) + return null; + BroadlinkEntry theResponse = null; + Iterator keys = broadlinkMap.keySet().iterator(); + List deviceList = new ArrayList(); + while(keys.hasNext()) { + String key = keys.next(); + theResponse = toEntry(broadlinkMap.get(key)); + if(theResponse != null) + deviceList.add(theResponse); + else { + log.warn("Cannot get BroadlinkDevice with name: " + key + ", skipping this Broadlink."); + continue; + } + } + return deviceList; + } + + @Override + public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int intensity, + Integer targetBri, Integer targetBriInc, ColorData colorData, DeviceDescriptor device, String body) { + String theReturn = null; + boolean changeState = false; + String theStringData = null; + log.debug("executing HUE api request to send message to BroadlinkDevice: " + anItem.getItem().toString()); + if(!validBroadlink) { + log.warn("Should not get here, no Broadlinks configured"); + theReturn = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + + "\",\"description\": \"Should not get here, no LifxDevices configured\", \"parameter\": \"/lights/" + + lightId + "state\"}}]"; + + } else { + BroadlinkEntry broadlinkCommand = null; + if(anItem.getItem().isJsonObject()) + broadlinkCommand = aGsonHandler.fromJson(anItem.getItem(), BroadlinkEntry.class); + else + broadlinkCommand = aGsonHandler.fromJson(anItem.getItem().getAsString(), BroadlinkEntry.class); + BLDevice theDevice = broadlinkMap.get(broadlinkCommand.getId()); + if (theDevice == null) { + log.warn("Should not get here, no BroadlinkDevices available"); + theReturn = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + + "\",\"description\": \"Should not get here, no Broadlinks available\", \"parameter\": \"/lights/" + + lightId + "state\"}}]"; + } else { + log.debug("calling BroadlinkDevice: " + broadlinkCommand.getName()); + switch (theDevice.getDeviceType()) { + case BLDevice.DEV_A1: + log.debug("Broadlink A1 device called and not supported. No Action, device name = " + device.getName() + ", id= " + broadlinkCommand.getId()); + break; + case BLDevice.DEV_MP1: + if(broadlinkCommand.getCommand().equals("on")) + changeState = true; + else + changeState = false; + try { + ((MP1Device) theDevice).setState(Integer.parseInt(broadlinkCommand.getData()), changeState); + } catch (NumberFormatException e1) { + log.error("Call to " + _mp1 + " device failed with number format exception.", e1); + theReturn = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + + "\",\"description\": \"" + _mp1 + " number format error.\", \"parameter\": \"/lights/" + + lightId + "state\"}}]"; + } catch (Exception e1) { + log.error("Call to " + _mp1 + " device failed with exception.", e1); + theReturn = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + + "\",\"description\": \"" + _mp1 + " device call error.\", \"parameter\": \"/lights/" + + lightId + "state\"}}]"; + }; + break; + case BLDevice.DEV_SP2: + case BLDevice.DEV_SP2_HONEYWELL_ALT1: + case BLDevice.DEV_SP2_HONEYWELL_ALT2: + case BLDevice.DEV_SP2_HONEYWELL_ALT3: + case BLDevice.DEV_SP2_HONEYWELL_ALT4: + case BLDevice.DEV_SPMINI: + case BLDevice.DEV_SP3: + case BLDevice.DEV_SPMINI2: + case BLDevice.DEV_SPMINI_OEM_ALT1: + case BLDevice.DEV_SPMINI_OEM_ALT2: + case BLDevice.DEV_SPMINI_PLUS: + if(broadlinkCommand.getCommand().equals("on")) + changeState = true; + else + changeState = false; + try { + ((SP2Device) theDevice).setState(changeState); + } catch (Exception e1) { + log.error("Call to " + _sp2 + " device failed with exception.", e1); + theReturn = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + + "\",\"description\": \"" + _sp2 + " device call error.\", \"parameter\": \"/lights/" + + lightId + "state\"}}]"; + } + break; + case BLDevice.DEV_SP1: + if(broadlinkCommand.getCommand().equals("on")) + changeState = true; + else + changeState = false; + try { + ((SP1Device) theDevice).setPower(changeState); + } catch (Exception e) { + log.error("Call to " + _sp1 + " device failed with exception.", e); + theReturn = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + + "\",\"description\": \"" + _sp1 + " device call error.\", \"parameter\": \"/lights/" + + lightId + "state\"}}]"; + } + break; + case BLDevice.DEV_RM_2: + case BLDevice.DEV_RM_MINI: + case BLDevice.DEV_RM_PRO_PHICOMM: + case BLDevice.DEV_RM_2_HOME_PLUS: + case BLDevice.DEV_RM_2_2HOME_PLUS_GDT: + case BLDevice.DEV_RM_2_PRO_PLUS: + case BLDevice.DEV_RM_2_PRO_PLUS_2: + case BLDevice.DEV_RM_2_PRO_PLUS_2_BL: + case BLDevice.DEV_RM_MINI_SHATE: + if(broadlinkCommand.getData() != null && !broadlinkCommand.getData().trim().isEmpty()) { + if(targetBri != null || targetBriInc != null) { + theStringData = BrightnessDecode.calculateReplaceIntensityValue(broadlinkCommand.getData().trim(), intensity, targetBri, targetBriInc, true); + } + if(colorData != null) { + theStringData = ColorDecode.replaceColorData(theStringData, colorData, BrightnessDecode.calculateIntensity(intensity, targetBri, targetBriInc), true); + } + theStringData = DeviceDataDecode.replaceDeviceData(theStringData, device); + theStringData = TimeDecode.replaceTimeValue(theStringData); + byte[] theData = DatatypeConverter.parseHexBinary(theStringData); + SendDataCmdPayload thePayload = new SendDataCmdPayload(theData); + try { + ((RM2Device) theDevice).sendCmdPkt(Configuration.BROADLINK_DISCONVER_TIMEOUT, thePayload); + } catch (IOException e) { + log.error("Call to " + _rm2 + " device failed with exception.", e); + theReturn = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + + "\",\"description\": \"" + _rm2 + " device call error.\", \"parameter\": \"/lights/" + + lightId + "state\"}}]"; + } + } + else { + log.error("Call to " + _rm2 + " with no data, noop"); + theReturn = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + + "\",\"description\": \"" + _rm2 + " could not call device without data.\", \"parameter\": \"/lights/" + + lightId + "state\"}}]"; + } + break; + + } + } + } + return theReturn; + } + + private BroadlinkEntry toEntry(BLDevice broadlinkObject) { + BroadlinkEntry anEntry = new BroadlinkEntry(); + anEntry.setId(broadlinkObject.getHost() + "-" + String.format("%04x", broadlinkObject.getDeviceType())); + anEntry.setName(broadlinkObject.getDeviceDescription()); + anEntry.setType(convertType(broadlinkObject)); + return anEntry; + } + + private String convertType(BLDevice aDevice) { + String theType = null; + switch (aDevice.getDeviceType()) { + case BLDevice.DEV_A1: + theType = _a1; + break; + case BLDevice.DEV_MP1: + theType = _mp1; + break; + case BLDevice.DEV_SP2: + case BLDevice.DEV_SP2_HONEYWELL_ALT1: + case BLDevice.DEV_SP2_HONEYWELL_ALT2: + case BLDevice.DEV_SP2_HONEYWELL_ALT3: + case BLDevice.DEV_SP2_HONEYWELL_ALT4: + case BLDevice.DEV_SPMINI: + case BLDevice.DEV_SP3: + case BLDevice.DEV_SPMINI2: + case BLDevice.DEV_SPMINI_OEM_ALT1: + case BLDevice.DEV_SPMINI_OEM_ALT2: + case BLDevice.DEV_SPMINI_PLUS: + theType = _sp2; + break; + case BLDevice.DEV_SP1: + theType = _sp1; + break; + case BLDevice.DEV_RM_2: + case BLDevice.DEV_RM_MINI: + case BLDevice.DEV_RM_PRO_PHICOMM: + case BLDevice.DEV_RM_2_HOME_PLUS: + case BLDevice.DEV_RM_2_2HOME_PLUS_GDT: + case BLDevice.DEV_RM_2_PRO_PLUS: + case BLDevice.DEV_RM_2_PRO_PLUS_2: + case BLDevice.DEV_RM_2_PRO_PLUS_2_BL: + case BLDevice.DEV_RM_MINI_SHATE: + theType = _rm2; + break; + + } + return theType; + } + @Override + public void closeHome() { + if(!validBroadlink) + return; + log.debug("Closing Home."); + if(closed) { + log.debug("Home is already closed...."); + return; + } + closed = true; + } +} diff --git a/src/main/java/com/bwssystems/HABridge/plugins/fhem/FHEMHome.java b/src/main/java/com/bwssystems/HABridge/plugins/fhem/FHEMHome.java index 21521e2..4db0abf 100644 --- a/src/main/java/com/bwssystems/HABridge/plugins/fhem/FHEMHome.java +++ b/src/main/java/com/bwssystems/HABridge/plugins/fhem/FHEMHome.java @@ -25,7 +25,6 @@ import com.bwssystems.HABridge.hue.TimeDecode; import com.bwssystems.HABridge.plugins.http.HTTPHandler; import com.bwssystems.HABridge.plugins.http.HTTPHome; import com.bwssystems.HABridge.plugins.http.HttpTestHandler; -import com.bwssystems.fhem.test.FHEMInstanceConstructor; import com.google.gson.Gson; public class FHEMHome implements Home { @@ -165,13 +164,15 @@ public class FHEMHome implements Home { isDevMode = Boolean.parseBoolean(System.getProperty("dev.mode", "false")); fhemMap = null; validFhem = bridgeSettings.getBridgeSettingsDescriptor().isValidFhem(); - log.info("FHEM Home created." + (validFhem ? "" : " No FHEMs configured.")); + log.info("FHEM Home created." + (validFhem ? "" : " No FHEMs configured.") + (isDevMode ? " DevMode is set." : "")); if(validFhem) { fhemMap = new HashMap(); httpClient = HTTPHome.getHandler(); if(isDevMode) { httpClient = new HttpTestHandler(); - ((HttpTestHandler)httpClient).setTheData(FHEMInstanceConstructor.TestData); + ((HttpTestHandler)httpClient).setTheData("jsonlist2", FHEMTestData.TestData); + ((HttpTestHandler)httpClient).setTheData("set", "Command Received"); + ((HttpTestHandler)httpClient).setTheData(null, "no match"); } Iterator theList = bridgeSettings.getBridgeSettingsDescriptor().getFhemaddress().getDevices().iterator(); while(theList.hasNext() && validFhem) { diff --git a/src/main/java/com/bwssystems/HABridge/plugins/fhem/FHEMInstance.java b/src/main/java/com/bwssystems/HABridge/plugins/fhem/FHEMInstance.java index 2916eee..9c5edda 100644 --- a/src/main/java/com/bwssystems/HABridge/plugins/fhem/FHEMInstance.java +++ b/src/main/java/com/bwssystems/HABridge/plugins/fhem/FHEMInstance.java @@ -40,7 +40,7 @@ public class FHEMInstance { if(theFhem.getUsername() != null && !theFhem.getUsername().isEmpty() && theFhem.getPassword() != null && !theFhem.getPassword().isEmpty()) { aUrl = aUrl + theFhem.getUsername() + ":" + theFhem.getPassword() + "@"; } - aUrl = aUrl + theFhem.getIp() + ":" + theFhem.getPort() + "/" + aCommand + "/" + commandData; + aUrl = aUrl + theFhem.getIp() + ":" + theFhem.getPort() + "/" + aCommand + commandData; log.debug("calling FHEM: " + aUrl); String theData = httpClient.doHttpRequest(aUrl, HttpPost.METHOD_NAME, "text/plain", null, headers); if(theData != null) diff --git a/src/main/java/com/bwssystems/HABridge/plugins/fhem/FHEMTestData.java b/src/main/java/com/bwssystems/HABridge/plugins/fhem/FHEMTestData.java new file mode 100644 index 0000000..224bfe8 --- /dev/null +++ b/src/main/java/com/bwssystems/HABridge/plugins/fhem/FHEMTestData.java @@ -0,0 +1,288 @@ +package com.bwssystems.HABridge.plugins.fhem; + +public class FHEMTestData { + public final static String TestData = "\n" + + "\n" + + " \n" + + " Home, Sweet Home\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + " \n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + " Save config\n" + + " ?\n" + + "
\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + " Alexa\n" + + "
\n" + + "
\n" + + "
\n" + + " System\n" + + "
\n" + + "
\n" + + "
\n" + + " WG-Zimmer\n" + + "
\n" + + "
\n" + + "
\n" + + " habridge\n" + + "
\n" + + "
\n" + + " \n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + " Logfile\n" + + "
\n" + + "
\n" + + "
\n" + + " Commandref\n" + + "
\n" + + "
\n" + + "
\n" + + " Remote doc\n" + + "
\n" + + "
\n" + + "
\n" + + " Edit files\n" + + "
\n" + + "
\n" + + "
\n" + + " Select style\n" + + "
\n" + + "
\n" + + "
\n" + + " Event monitor\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
{ \n" + 
+			"  \"Arg\":\"room=habridge\", \n" + 
+			"  \"Results\": [ \n" + 
+			"  { \n" + 
+			"    \"Name\":\"Arbeitslicht\", \n" + 
+			"    \"PossibleSets\":\"on off\", \n" + 
+			"    \"PossibleAttrs\":\"alias comment:textField-long eventMap group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 readingList setList useSetExtensions disable disabledForIntervals event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat:textField-long timestamp-on-change-reading alexaName alexaRoom cmdIcon devStateIcon devStateStyle fhem_widget_command fhem_widget_command_2 fhem_widget_command_3 genericDeviceType:security,ignore,switch,outlet,light,blind,thermometer,thermostat,contact,garage,window,lock homebridgeMapping:textField-long icon sortby webCmd widgetOverride userattr\", \n" + 
+			"    \"Internals\": { \n" + 
+			"      \"NAME\": \"Arbeitslicht\", \n" + 
+			"      \"NR\": \"28\", \n" + 
+			"      \"STATE\": \"-\", \n" + 
+			"      \"TYPE\": \"dummy\" \n" + 
+			"    }, \n" + 
+			"    \"Readings\": {      \"state\": { \"Value\":\"on\", \"Time\":\"2017-12-14 15:41:05\" } }, \n" + 
+			"    \"Attributes\": { \n" + 
+			"      \"alexaName\": \"Arbeitslicht\", \n" + 
+			"      \"alexaRoom\": \"alexaroom\", \n" + 
+			"      \"fhem_widget_command\": \"{  \\u0022allowed_values\\u0022 : [    \\u0022on\\u0022  ],  \\u0022order\\u0022 : 0}\", \n" + 
+			"      \"icon\": \"scene_office\", \n" + 
+			"      \"room\": \"Alexa,habridge\", \n" + 
+			"      \"setList\": \"on off\", \n" + 
+			"      \"stateFormat\": \"-\", \n" + 
+			"      \"webCmd\": \"on\" \n" + 
+			"    } \n" + 
+			"  }, \n" + 
+			"  { \n" + 
+			"    \"Name\":\"DeckenlampeLinks\", \n" + 
+			"    \"PossibleSets\":\"on off dim dimup dimdown HSV RGB sync pair unpair\", \n" + 
+			"    \"PossibleAttrs\":\"alias comment:textField-long eventMap group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 gamma dimStep defaultColor defaultRamp colorCast whitePoint event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat:textField-long timestamp-on-change-reading alexaName alexaRoom cmdIcon devStateIcon devStateStyle fhem_widget_command fhem_widget_command_2 fhem_widget_command_3 genericDeviceType:security,ignore,switch,outlet,light,blind,thermometer,thermostat,contact,garage,window,lock homebridgeMapping:textField-long icon sortby webCmd widgetOverride \n" + 
+			"                AlleLampen AlleLampen_map\n" + 
+			"                DeckenLampen DeckenLampen_map structexclude userattr\", \n" + 
+			"    \"Internals\": { \n" + 
+			"      \"CONNECTION\": \"bridge-V3\", \n" + 
+			"      \"DEF\": \"RGBW2 bridge-V3:10.2.3.3\", \n" + 
+			"      \"IP\": \"10.2.3.3\", \n" + 
+			"      \"LEDTYPE\": \"RGBW2\", \n" + 
+			"      \"NAME\": \"DeckenlampeLinks\", \n" + 
+			"      \"NR\": \"18\", \n" + 
+			"      \"NTFY_ORDER\": \"50-DeckenlampeLinks\", \n" + 
+			"      \"PORT\": \"8899\", \n" + 
+			"      \"PROTO\": \"0\", \n" + 
+			"      \"SLOT\": \"5\", \n" + 
+			"      \"STATE\": \"off\", \n" + 
+			"      \"TYPE\": \"WifiLight\" \n" + 
+			"    }, \n" + 
+			"    \"Readings\": { \n" + 
+			"      \"RGB\": { \"Value\":\"000000\", \"Time\":\"2017-12-14 15:41:10\" }, \n" + 
+			"      \"brightness\": { \"Value\":\"0\", \"Time\":\"2017-12-14 15:41:10\" }, \n" + 
+			"      \"hue\": { \"Value\":\"0\", \"Time\":\"2017-12-14 15:41:10\" }, \n" + 
+			"      \"saturation\": { \"Value\":\"0\", \"Time\":\"2017-12-14 15:41:10\" }, \n" + 
+			"      \"state\": { \"Value\":\"off\", \"Time\":\"2017-12-14 15:41:10\" } \n" + 
+			"    }, \n" + 
+			"    \"Attributes\": { \n" + 
+			"      \"AlleLampen\": \"AlleLampen\", \n" + 
+			"      \"DeckenLampen\": \"DeckenLampen\", \n" + 
+			"      \"fhem_widget_command\": \"{ \\u0022locations\\u0022 : [ \\u0022APP\\u0022, \\u0022WATCH\\u0022, \\u0022WIDGET\\u0022 ], \\u0022allowed_values\\u0022 : [ \\u0022off\\u0022, \\u0022on\\u0022 ], \\u0022order\\u0022 : 6}\", \n" + 
+			"      \"room\": \"habridge,Alexa,WG-Zimmer\", \n" + 
+			"      \"userattr\": \"AlleLampen AlleLampen_map\n" + 
+			"                DeckenLampen DeckenLampen_map structexclude\", \n" + 
+			"      \"webCmd\": \"RGB\", \n" + 
+			"      \"widgetOverride\": \"RGB:colorpicker,RGB\" \n" + 
+			"    } \n" + 
+			"  }  ], \n" + 
+			"  \"totalResultsReturned\":2 \n" + 
+			"}\n" + 
+			"            
\n" + + "
\n" + + " \n" + + ""; + + public final static String TestData2 = "
\n" + + "
\n" + "{   \"Arg\":\"room=HaBridge\",   \"Results\": [   {     \"Name\":\"wifi_steckdose3\",     \"PossibleSets\":\"on:noArg off:noArg off on toggle\",     \"PossibleAttrs\":\"alias comment:textField-long eventMap group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 IODev qos retain publishSet publishSet_.* subscribeReading_.* autoSubscribeReadings event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat:textField-long timestamp-on-change-reading alarmDevice:Actor,Sensor alarmSettings cmdIcon devStateIcon devStateStyle icon lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0 sortby structexclude webCmd webCmdLabel:textField-long widgetOverride userattr\",     \"Internals\": {       \"CHANGED\": \"null\",       \"NAME\": \"wifi_steckdose3\",       \"NR\": \"270\",       \"STATE\": \"off\",       \"TYPE\": \"MQTT_DEVICE\",       \"retain\": \"*:1 \"     },     \"Readings\": {       \"state\": { \"Value\":\"OFF\", \"Time\":\"2018-01-01 23:01:21\" },       \"transmission-state\": { \"Value\":\"subscription acknowledged\", \"Time\":\"2018-01-03 22:34:00\" }     },     \"Attributes\": {       \"IODev\": \"myBroker\",       \"alias\": \"Stecki\",       \"devStateIcon\": \"on:black_Steckdose.on off:black_Steckdose.off\",       \"event-on-change-reading\": \"state\",       \"eventMap\": \"ON:on OFF:off\",       \"publishSet\": \"on off toggle /SmartHome/az/stecker/cmnd/POWER\",       \"retain\": \"1\",       \"room\": \"HaBridge,Arbeitszimmer,mqtt\",       \"stateFormat\": \"state\",       \"subscribeReading_state\": \"/SmartHome/az/stecker/stat/POWER\",       \"webCmd\": \"on:off:toggle\"     }   }  ],   \"totalResultsReturned\":1 }" + 
+			"            
\n" + + "
\n" + + " \n" + + ""; + public final static String TestData3 ="DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n" + + "\n" + + "\n" + + "Home, Sweet Home\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "
\n" + + "
\n" + + "
\n" + + "
{\n" + 
+			"\"Arg\":\"room=HaBridge\",\n" + 
+			"\"Results\": [\n" + 
+			"{\n" + 
+			"\"Name\":\"wifi_steckdose3\",\n" + 
+			"\"PossibleSets\":\"on:noArg off:noArg off on toggle\",\n" + 
+			"\"PossibleAttrs\":\"alias comment:textField-long eventMap group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 IODev qos retain publishSet publishSet_.* subscribeReading_.* autoSubscribeReadings event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat:textField-long timestamp-on-change-reading alarmDevice:Actor,Sensor alarmSettings cmdIcon devStateIcon devStateStyle icon lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0 sortby structexclude webCmd webCmdLabel:textField-long widgetOverride userattr\",\n" + 
+			"\"Internals\": {\n" + 
+			"\"NAME\": \"wifi_steckdose3\",\n" + 
+			"\"NR\": \"270\",\n" + 
+			"\"STATE\": \"off\",\n" + 
+			"\"TYPE\": \"MQTT_DEVICE\",\n" + 
+			"\"retain\": \"*:1 \"\n" + 
+			"},\n" + 
+			"\"Readings\": {\n" + 
+			"\"state\": { \"Value\":\"OFF\", \"Time\":\"2018-01-07 05:16:01\" },\n" + 
+			"\"transmission-state\": { \"Value\":\"incoming publish received\", \"Time\":\"2018-01-07 05:16:01\" }\n" + 
+			"},\n" + 
+			"\"Attributes\": {\n" + 
+			"\"IODev\": \"myBroker\",\n" + 
+			"\"alias\": \"Stecki\",\n" + 
+			"\"devStateIcon\": \"on:black_Steckdose.on off:black_Steckdose.off\",\n" + 
+			"\"event-on-change-reading\": \"state\",\n" + 
+			"\"eventMap\": \"ON:on OFF:off\",\n" + 
+			"\"publishSet\": \"on off toggle /SmartHome/az/stecker/cmnd/POWER\",\n" + 
+			"\"retain\": \"1\",\n" + 
+			"\"room\": \"HaBridge,Arbeitszimmer,mqtt\",\n" + 
+			"\"stateFormat\": \"state\",\n" + 
+			"\"subscribeReading_state\": \"/SmartHome/az/stecker/stat/POWER\",\n" + 
+			"\"webCmd\": \"on:off:toggle\"\n" + 
+			"}\n" + 
+			"}  ],\n" + 
+			"\"totalResultsReturned\":1\n" + 
+			"}\n" + 
+			"
\n" + + "
\n" + + ""; +} diff --git a/src/main/java/com/bwssystems/HABridge/plugins/http/HttpTestHandler.java b/src/main/java/com/bwssystems/HABridge/plugins/http/HttpTestHandler.java index 276406f..440f73a 100644 --- a/src/main/java/com/bwssystems/HABridge/plugins/http/HttpTestHandler.java +++ b/src/main/java/com/bwssystems/HABridge/plugins/http/HttpTestHandler.java @@ -1,20 +1,50 @@ package com.bwssystems.HABridge.plugins.http; +import java.util.ArrayList; +import java.util.List; + import com.bwssystems.HABridge.api.NameValue; import com.bwssystems.HABridge.plugins.http.HTTPHandler; public class HttpTestHandler extends HTTPHandler { - private String theData; + private List theData; - public String getTheData() { - return theData; + public void setTheData(String compareValue, String testData) { + if( this.theData == null ) + this.theData = new ArrayList(); + NameValue aValueSet = new NameValue(); + aValueSet.setName(compareValue); + aValueSet.setValue(testData); + this.theData.add(aValueSet); } - public void setTheData(String theData) { - this.theData = theData; + public void updateTheData(String compareValue, String testData) { + if( this.theData == null ) { + this.theData = new ArrayList(); + NameValue aValueSet = new NameValue(); + aValueSet.setName(compareValue); + aValueSet.setValue(testData); + this.theData.add(aValueSet); + } + else { + for(NameValue aTest:this.theData) { + if(aTest.getName().equals(compareValue)); + aTest.setValue(testData); + } + } } public String doHttpRequest(String url, String httpVerb, String contentType, String body, NameValue[] headers) { - return theData; + String responseData = null; + for(NameValue aTest:theData) { + if(url.contains(aTest.getName())) + responseData = aTest.getValue(); + else if(aTest.getName() == null || aTest.getName().isEmpty()) + responseData = aTest.getValue(); + + if(responseData != null) + break; + } + return responseData; } } diff --git a/src/main/resources/public/scripts/app.js b/src/main/resources/public/scripts/app.js index 9eb0e98..6f6008e 100644 --- a/src/main/resources/public/scripts/app.js +++ b/src/main/resources/public/scripts/app.js @@ -4123,6 +4123,7 @@ app.controller('EditController', function ($scope, $location, bridgeService) { $scope.onDevices.splice(i, 1); } } + $scope.newOnItem = {}; }; $scope.addItemDim = function (anItem) { @@ -4140,6 +4141,7 @@ app.controller('EditController', function ($scope, $location, bridgeService) { $scope.dimDevices.splice(i, 1); } } + $scope.newDimItem = {}; }; $scope.addItemOff = function (anItem) { @@ -4157,6 +4159,7 @@ app.controller('EditController', function ($scope, $location, bridgeService) { $scope.offDevices.splice(i, 1); } } + $scope.newOffItem = {}; }; $scope.addItemColor = function (anItem) { @@ -4174,6 +4177,7 @@ app.controller('EditController', function ($scope, $location, bridgeService) { $scope.colorDevices.splice(i, 1); } } + $scope.newColorItem = {}; }; diff --git a/src/main/resources/public/views/system.html b/src/main/resources/public/views/system.html index e164fbf..84d4ed3 100644 --- a/src/main/resources/public/views/system.html +++ b/src/main/resources/public/views/system.html @@ -718,6 +718,12 @@ ng-model="bridge.settings.lifxconfigured" ng-true-value=true ng-false-value=false> {{bridge.settings.lifxconfigured}} + + Broadlink Support + {{bridge.settings.broadlinkconfigured}} + Emulate Hue Hub Version \n" + - "\n" + - " \n" + - " Home, Sweet Home\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - " Save config\n" + - " ?\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - " Alexa\n" + - "
\n" + - "
\n" + - "
\n" + - " System\n" + - "
\n" + - "
\n" + - "
\n" + - " WG-Zimmer\n" + - "
\n" + - "
\n" + - "
\n" + - " habridge\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - " Logfile\n" + - "
\n" + - "
\n" + - "
\n" + - " Commandref\n" + - "
\n" + - "
\n" + - "
\n" + - " Remote doc\n" + - "
\n" + - "
\n" + - "
\n" + - " Edit files\n" + - "
\n" + - "
\n" + - "
\n" + - " Select style\n" + - "
\n" + - "
\n" + - "
\n" + - " Event monitor\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
{ \n" + 
-			"  \"Arg\":\"room=habridge\", \n" + 
-			"  \"Results\": [ \n" + 
-			"  { \n" + 
-			"    \"Name\":\"Arbeitslicht\", \n" + 
-			"    \"PossibleSets\":\"on off\", \n" + 
-			"    \"PossibleAttrs\":\"alias comment:textField-long eventMap group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 readingList setList useSetExtensions disable disabledForIntervals event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat:textField-long timestamp-on-change-reading alexaName alexaRoom cmdIcon devStateIcon devStateStyle fhem_widget_command fhem_widget_command_2 fhem_widget_command_3 genericDeviceType:security,ignore,switch,outlet,light,blind,thermometer,thermostat,contact,garage,window,lock homebridgeMapping:textField-long icon sortby webCmd widgetOverride userattr\", \n" + 
-			"    \"Internals\": { \n" + 
-			"      \"NAME\": \"Arbeitslicht\", \n" + 
-			"      \"NR\": \"28\", \n" + 
-			"      \"STATE\": \"-\", \n" + 
-			"      \"TYPE\": \"dummy\" \n" + 
-			"    }, \n" + 
-			"    \"Readings\": {      \"state\": { \"Value\":\"on\", \"Time\":\"2017-12-14 15:41:05\" } }, \n" + 
-			"    \"Attributes\": { \n" + 
-			"      \"alexaName\": \"Arbeitslicht\", \n" + 
-			"      \"alexaRoom\": \"alexaroom\", \n" + 
-			"      \"fhem_widget_command\": \"{  \\u0022allowed_values\\u0022 : [    \\u0022on\\u0022  ],  \\u0022order\\u0022 : 0}\", \n" + 
-			"      \"icon\": \"scene_office\", \n" + 
-			"      \"room\": \"Alexa,habridge\", \n" + 
-			"      \"setList\": \"on off\", \n" + 
-			"      \"stateFormat\": \"-\", \n" + 
-			"      \"webCmd\": \"on\" \n" + 
-			"    } \n" + 
-			"  }, \n" + 
-			"  { \n" + 
-			"    \"Name\":\"DeckenlampeLinks\", \n" + 
-			"    \"PossibleSets\":\"on off dim dimup dimdown HSV RGB sync pair unpair\", \n" + 
-			"    \"PossibleAttrs\":\"alias comment:textField-long eventMap group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 gamma dimStep defaultColor defaultRamp colorCast whitePoint event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat:textField-long timestamp-on-change-reading alexaName alexaRoom cmdIcon devStateIcon devStateStyle fhem_widget_command fhem_widget_command_2 fhem_widget_command_3 genericDeviceType:security,ignore,switch,outlet,light,blind,thermometer,thermostat,contact,garage,window,lock homebridgeMapping:textField-long icon sortby webCmd widgetOverride \n" + 
-			"                AlleLampen AlleLampen_map\n" + 
-			"                DeckenLampen DeckenLampen_map structexclude userattr\", \n" + 
-			"    \"Internals\": { \n" + 
-			"      \"CONNECTION\": \"bridge-V3\", \n" + 
-			"      \"DEF\": \"RGBW2 bridge-V3:10.2.3.3\", \n" + 
-			"      \"IP\": \"10.2.3.3\", \n" + 
-			"      \"LEDTYPE\": \"RGBW2\", \n" + 
-			"      \"NAME\": \"DeckenlampeLinks\", \n" + 
-			"      \"NR\": \"18\", \n" + 
-			"      \"NTFY_ORDER\": \"50-DeckenlampeLinks\", \n" + 
-			"      \"PORT\": \"8899\", \n" + 
-			"      \"PROTO\": \"0\", \n" + 
-			"      \"SLOT\": \"5\", \n" + 
-			"      \"STATE\": \"off\", \n" + 
-			"      \"TYPE\": \"WifiLight\" \n" + 
-			"    }, \n" + 
-			"    \"Readings\": { \n" + 
-			"      \"RGB\": { \"Value\":\"000000\", \"Time\":\"2017-12-14 15:41:10\" }, \n" + 
-			"      \"brightness\": { \"Value\":\"0\", \"Time\":\"2017-12-14 15:41:10\" }, \n" + 
-			"      \"hue\": { \"Value\":\"0\", \"Time\":\"2017-12-14 15:41:10\" }, \n" + 
-			"      \"saturation\": { \"Value\":\"0\", \"Time\":\"2017-12-14 15:41:10\" }, \n" + 
-			"      \"state\": { \"Value\":\"off\", \"Time\":\"2017-12-14 15:41:10\" } \n" + 
-			"    }, \n" + 
-			"    \"Attributes\": { \n" + 
-			"      \"AlleLampen\": \"AlleLampen\", \n" + 
-			"      \"DeckenLampen\": \"DeckenLampen\", \n" + 
-			"      \"fhem_widget_command\": \"{ \\u0022locations\\u0022 : [ \\u0022APP\\u0022, \\u0022WATCH\\u0022, \\u0022WIDGET\\u0022 ], \\u0022allowed_values\\u0022 : [ \\u0022off\\u0022, \\u0022on\\u0022 ], \\u0022order\\u0022 : 6}\", \n" + 
-			"      \"room\": \"habridge,Alexa,WG-Zimmer\", \n" + 
-			"      \"userattr\": \"AlleLampen AlleLampen_map\n" + 
-			"                DeckenLampen DeckenLampen_map structexclude\", \n" + 
-			"      \"webCmd\": \"RGB\", \n" + 
-			"      \"widgetOverride\": \"RGB:colorpicker,RGB\" \n" + 
-			"    } \n" + 
-			"  }  ], \n" + 
-			"  \"totalResultsReturned\":2 \n" + 
-			"}\n" + 
-			"            
\n" + - "
\n" + - " \n" + - ""; - - public final static String TestData2 = "
\n" + - "
\n" + "{   \"Arg\":\"room=HaBridge\",   \"Results\": [   {     \"Name\":\"wifi_steckdose3\",     \"PossibleSets\":\"on:noArg off:noArg off on toggle\",     \"PossibleAttrs\":\"alias comment:textField-long eventMap group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 IODev qos retain publishSet publishSet_.* subscribeReading_.* autoSubscribeReadings event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat:textField-long timestamp-on-change-reading alarmDevice:Actor,Sensor alarmSettings cmdIcon devStateIcon devStateStyle icon lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0 sortby structexclude webCmd webCmdLabel:textField-long widgetOverride userattr\",     \"Internals\": {       \"CHANGED\": \"null\",       \"NAME\": \"wifi_steckdose3\",       \"NR\": \"270\",       \"STATE\": \"off\",       \"TYPE\": \"MQTT_DEVICE\",       \"retain\": \"*:1 \"     },     \"Readings\": {       \"state\": { \"Value\":\"OFF\", \"Time\":\"2018-01-01 23:01:21\" },       \"transmission-state\": { \"Value\":\"subscription acknowledged\", \"Time\":\"2018-01-03 22:34:00\" }     },     \"Attributes\": {       \"IODev\": \"myBroker\",       \"alias\": \"Stecki\",       \"devStateIcon\": \"on:black_Steckdose.on off:black_Steckdose.off\",       \"event-on-change-reading\": \"state\",       \"eventMap\": \"ON:on OFF:off\",       \"publishSet\": \"on off toggle /SmartHome/az/stecker/cmnd/POWER\",       \"retain\": \"1\",       \"room\": \"HaBridge,Arbeitszimmer,mqtt\",       \"stateFormat\": \"state\",       \"subscribeReading_state\": \"/SmartHome/az/stecker/stat/POWER\",       \"webCmd\": \"on:off:toggle\"     }   }  ],   \"totalResultsReturned\":1 }" + 
-			"            
\n" + - "
\n" + - " \n" + - ""; - public final static String TestData3 ="DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n" + - "\n" + - "\n" + - "Home, Sweet Home\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "
{\n" + 
-			"\"Arg\":\"room=HaBridge\",\n" + 
-			"\"Results\": [\n" + 
-			"{\n" + 
-			"\"Name\":\"wifi_steckdose3\",\n" + 
-			"\"PossibleSets\":\"on:noArg off:noArg off on toggle\",\n" + 
-			"\"PossibleAttrs\":\"alias comment:textField-long eventMap group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 IODev qos retain publishSet publishSet_.* subscribeReading_.* autoSubscribeReadings event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat:textField-long timestamp-on-change-reading alarmDevice:Actor,Sensor alarmSettings cmdIcon devStateIcon devStateStyle icon lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0 sortby structexclude webCmd webCmdLabel:textField-long widgetOverride userattr\",\n" + 
-			"\"Internals\": {\n" + 
-			"\"NAME\": \"wifi_steckdose3\",\n" + 
-			"\"NR\": \"270\",\n" + 
-			"\"STATE\": \"off\",\n" + 
-			"\"TYPE\": \"MQTT_DEVICE\",\n" + 
-			"\"retain\": \"*:1 \"\n" + 
-			"},\n" + 
-			"\"Readings\": {\n" + 
-			"\"state\": { \"Value\":\"OFF\", \"Time\":\"2018-01-07 05:16:01\" },\n" + 
-			"\"transmission-state\": { \"Value\":\"incoming publish received\", \"Time\":\"2018-01-07 05:16:01\" }\n" + 
-			"},\n" + 
-			"\"Attributes\": {\n" + 
-			"\"IODev\": \"myBroker\",\n" + 
-			"\"alias\": \"Stecki\",\n" + 
-			"\"devStateIcon\": \"on:black_Steckdose.on off:black_Steckdose.off\",\n" + 
-			"\"event-on-change-reading\": \"state\",\n" + 
-			"\"eventMap\": \"ON:on OFF:off\",\n" + 
-			"\"publishSet\": \"on off toggle /SmartHome/az/stecker/cmnd/POWER\",\n" + 
-			"\"retain\": \"1\",\n" + 
-			"\"room\": \"HaBridge,Arbeitszimmer,mqtt\",\n" + 
-			"\"stateFormat\": \"state\",\n" + 
-			"\"subscribeReading_state\": \"/SmartHome/az/stecker/stat/POWER\",\n" + 
-			"\"webCmd\": \"on:off:toggle\"\n" + 
-			"}\n" + 
-			"}  ],\n" + 
-			"\"totalResultsReturned\":1\n" + 
-			"}\n" + 
-			"
\n" + - "
\n" + - ""; - public static void main(String[] args){ - FHEMInstanceConstructor aTestService = new FHEMInstanceConstructor(); - if(aTestService.validateStructure()) - System.out.println("Test Successful"); - } public Boolean validateStructure() { Gson aGson; @@ -316,15 +28,15 @@ public class FHEMInstanceConstructor { for(int i = 0; i < 3; i++) { if(i == 0) - theTestData = TestData; + theTestData = FHEMTestData.TestData; else if(i == 1) { - theTestData = TestData2; + theTestData = FHEMTestData.TestData2; anAddress.setName(anAddress.getName().replace("1", "2")); anInstance = new FHEMInstance(anAddress); } else { anAddress.setName(anAddress.getName().replace("2", "3")); - theTestData = TestData3; + theTestData = FHEMTestData.TestData3; } decodeData = anInstance.getJSONData(theTestData); try { @@ -343,7 +55,7 @@ public class FHEMInstanceConstructor { } System.out.println("----------------------------------"); try { - theHttpTestClient.setTheData(theTestData); + theHttpTestClient.updateTheData("jsonlist2", theTestData); deviceList = anInstance.getDevices(theHttpTestClient); if(deviceList == null) return false;