diff --git a/pom.xml b/pom.xml index bfdf537..d3d65c2 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.bwssystems.HABridge ha-bridge - 3.5.1l + 3.5.1m jar HA Bridge diff --git a/src/main/java/com/bwssystems/HABridge/DeviceMapTypes.java b/src/main/java/com/bwssystems/HABridge/DeviceMapTypes.java index 1d983fc..37bff1e 100644 --- a/src/main/java/com/bwssystems/HABridge/DeviceMapTypes.java +++ b/src/main/java/com/bwssystems/HABridge/DeviceMapTypes.java @@ -1,167 +1,70 @@ package com.bwssystems.HABridge; +import java.util.ArrayList; + public class DeviceMapTypes { - public final static String[] CUSTOM_DEVICE = { "custom", "Custom"}; - public final static String[] VERA_DEVICE = { "veraDevice", "Vera Device"}; - public final static String[] VERA_SCENE = { "veraScene", "Vera Scene"}; - public final static String[] HARMONY_ACTIVITY = { "harmonyActivity", "Harmony Activity"}; - public final static String[] HARMONY_BUTTON = { "harmonyButton", "Harmony Button"}; - public final static String[] NEST_HOMEAWAY = { "nestHomeAway", "Nest Home Status"}; - public final static String[] NEST_THERMO_SET = { "nestThermoSet", "Nest Thermostat"}; - public final static String[] HUE_DEVICE = { "hueDevice", "Hue Device"}; - public final static String[] HAL_DEVICE = { "halDevice", "HAL Device"}; - public final static String[] HAL_BUTTON = { "halButton", "HAL Button"}; - public final static String[] HAL_HOME = { "halHome", "HAL Home Status"}; - public final static String[] HAL_THERMO_SET = { "halThermoSet", "HAL Thermostat"}; - public final static String[] MQTT_MESSAGE = { "mqttMessage", "MQTT Message"}; - public final static String[] EXEC_DEVICE = { "exec", "Execute Script/Program"}; - public final static String[] HASS_DEVICE = { "hassDevice", "HomeAssistant Device"}; + public final static String[] CUSTOM_DEVICE = { "custom", "Custom", "none"}; + public final static String[] VERA_DEVICE = { "veraDevice", "Vera Device", "vera"}; + public final static String[] VERA_SCENE = { "veraScene", "Vera Scene", "vera"}; + public final static String[] HARMONY_ACTIVITY = { "harmonyActivity", "Harmony Activity", "harmony"}; + public final static String[] HARMONY_BUTTON = { "harmonyButton", "Harmony Button", "harmony"}; + public final static String[] NEST_HOMEAWAY = { "nestHomeAway", "Nest Home Status", "nest"}; + public final static String[] NEST_THERMO_SET = { "nestThermoSet", "Nest Thermostat", "nest"}; + public final static String[] HUE_DEVICE = { "hueDevice", "Hue Device", "hue"}; + public final static String[] HAL_DEVICE = { "halDevice", "HAL Device", "hal"}; + public final static String[] HAL_BUTTON = { "halButton", "HAL Button", "hal"}; + public final static String[] HAL_HOME = { "halHome", "HAL Home Status", "hal"}; + public final static String[] HAL_THERMO_SET = { "halThermoSet", "HAL Thermostat", "hal"}; + public final static String[] MQTT_MESSAGE = { "mqttMessage", "MQTT Message", "mqtt"}; + public final static String[] EXEC_DEVICE = { "exec", "Execute Script/Program", "command"}; + public final static String[] CMD_DEVICE = { "cmdDevice", "Execute Command/Script/Program", "command"}; + public final static String[] HASS_DEVICE = { "hassDevice", "HomeAssistant Device", "hass"}; + public final static String[] TCP_DEVICE = { "tcpDevice", "TCP Device", "none"}; + public final static String[] UDP_DEVICE = { "udpDevice", "UDP Device", "none"}; + public final static String[] HTTP_DEVICE = { "httpDevice", "HTTP Device", "none"}; + public final static String[] DEFAULT_DEVICE = { "udpDevice", "Default Device", "none"}; public final static int typeIndex = 0; public final static int displayIndex = 1; + public final static int resourceIndex = 1; - public String[] customDevice; - public String[] veraDevice; - public String[] veraScene; - public String[] harmonyActivity; - public String[] harmonyButton; - public String[] nestHomeAway; - public String[] nestThermoSet; - public String[] hueDevice; - public String[] halDevice; - public String[] halButton; - public String[] halHome; - public String[] halThermoSet; - public String[] mqttMessage; - public String[] execDevice; - public String[] hassDevice; - - public int typeindex; - public int displayindex; - + ArrayList deviceMapTypes; public DeviceMapTypes() { super(); - this.setCustomDevice(CUSTOM_DEVICE); - this.setDisplayindex(displayIndex); - this.setExecDevice(EXEC_DEVICE); - this.setHalButton(HAL_BUTTON); - this.setHalDevice(HAL_DEVICE); - this.setHalHome(HAL_HOME); - this.setHalThermoSet(HAL_THERMO_SET); - this.setHarmonyActivity(HARMONY_ACTIVITY); - this.setHarmonyButton(HARMONY_BUTTON); - this.setHueDevice(HUE_DEVICE); - this.setMqttMessage(MQTT_MESSAGE); - this.setNestHomeAway(NEST_HOMEAWAY); - this.setNestThermoSet(NEST_THERMO_SET); - this.setTypeindex(typeIndex); - this.setVeraDevice(VERA_DEVICE); - this.setVeraScene(VERA_SCENE); - this.setHassDevice(HASS_DEVICE); + deviceMapTypes = new ArrayList(); + deviceMapTypes.add(CUSTOM_DEVICE); + deviceMapTypes.add(CMD_DEVICE); + deviceMapTypes.add(DEFAULT_DEVICE); + deviceMapTypes.add(EXEC_DEVICE); + deviceMapTypes.add(HAL_DEVICE); + deviceMapTypes.add(HAL_HOME); + deviceMapTypes.add(HAL_THERMO_SET); + deviceMapTypes.add(HASS_DEVICE); + deviceMapTypes.add(HTTP_DEVICE); + deviceMapTypes.add(HUE_DEVICE); + deviceMapTypes.add(MQTT_MESSAGE); + deviceMapTypes.add(NEST_HOMEAWAY); + deviceMapTypes.add(NEST_THERMO_SET); + deviceMapTypes.add(TCP_DEVICE); + deviceMapTypes.add(UDP_DEVICE); + deviceMapTypes.add(VERA_DEVICE); + deviceMapTypes.add(VERA_SCENE); + deviceMapTypes.add(HAL_BUTTON); + deviceMapTypes.add(HARMONY_ACTIVITY); + deviceMapTypes.add(HARMONY_BUTTON); } - public String[] getCustomDevice() { - return customDevice; + public static int getTypeIndex() { + return typeIndex; } - public void setCustomDevice(String[] customDevice) { - this.customDevice = customDevice; + public static int getDisplayIndex() { + return displayIndex; } - public String[] getVeraDevice() { - return veraDevice; + public static int getResourceindex() { + return resourceIndex; } - public void setVeraDevice(String[] veraDevice) { - this.veraDevice = veraDevice; + public ArrayList getDeviceMapTypes() { + return deviceMapTypes; } - public String[] getVeraScene() { - return veraScene; - } - public void setVeraScene(String[] veraScene) { - this.veraScene = veraScene; - } - public String[] getHarmonyActivity() { - return harmonyActivity; - } - public void setHarmonyActivity(String[] harmonyActivity) { - this.harmonyActivity = harmonyActivity; - } - public String[] getHarmonyButton() { - return harmonyButton; - } - public void setHarmonyButton(String[] harmonyButton) { - this.harmonyButton = harmonyButton; - } - public String[] getNestHomeAway() { - return nestHomeAway; - } - public void setNestHomeAway(String[] nestHomeAway) { - this.nestHomeAway = nestHomeAway; - } - public String[] getNestThermoSet() { - return nestThermoSet; - } - public void setNestThermoSet(String[] nestThermoSet) { - this.nestThermoSet = nestThermoSet; - } - public String[] getHueDevice() { - return hueDevice; - } - public void setHueDevice(String[] hueDevice) { - this.hueDevice = hueDevice; - } - public String[] getHalDevice() { - return halDevice; - } - public void setHalDevice(String[] halDevice) { - this.halDevice = halDevice; - } - public String[] getHalButton() { - return halButton; - } - public void setHalButton(String[] halButton) { - this.halButton = halButton; - } - public String[] getHalHome() { - return halHome; - } - public void setHalHome(String[] halHome) { - this.halHome = halHome; - } - public String[] getHalThermoSet() { - return halThermoSet; - } - public void setHalThermoSet(String[] halThermoSet) { - this.halThermoSet = halThermoSet; - } - public String[] getMqttMessage() { - return mqttMessage; - } - public void setMqttMessage(String[] mqttMessage) { - this.mqttMessage = mqttMessage; - } - public String[] getExecDevice() { - return execDevice; - } - public void setExecDevice(String[] execDevice) { - this.execDevice = execDevice; - } - public String[] getHassDevice() { - return hassDevice; - } - public void setHassDevice(String[] hassDevice) { - this.hassDevice = hassDevice; - } - public int getTypeindex() { - return typeindex; - } - public void setTypeindex(int typeindex) { - this.typeindex = typeindex; - } - public int getDisplayindex() { - return displayindex; - } - public void setDisplayindex(int displayindex) { - this.displayindex = displayindex; - } - } \ No newline at end of file diff --git a/src/main/java/com/bwssystems/HABridge/HABridge.java b/src/main/java/com/bwssystems/HABridge/HABridge.java index 897c457..1221c05 100644 --- a/src/main/java/com/bwssystems/HABridge/HABridge.java +++ b/src/main/java/com/bwssystems/HABridge/HABridge.java @@ -9,12 +9,6 @@ import com.bwssystems.HABridge.devicemanagmeent.*; import com.bwssystems.HABridge.hue.HueMulator; import com.bwssystems.HABridge.upnp.UpnpListener; import com.bwssystems.HABridge.upnp.UpnpSettingsResource; -import com.bwssystems.NestBridge.NestHome; -import com.bwssystems.hal.HalHome; -import com.bwssystems.harmony.HarmonyHome; -import com.bwssystems.hass.HassHome; -import com.bwssystems.hue.HueHome; -import com.bwssystems.mqtt.MQTTHome; import com.bwssystems.util.UDPDatagramSender; public class HABridge { @@ -37,12 +31,7 @@ public class HABridge { public static void main(String[] args) { Logger log = LoggerFactory.getLogger(HABridge.class); DeviceResource theResources; - HarmonyHome harmonyHome; - NestHome nestHome; - HueHome hueHome; - HalHome halHome; - MQTTHome mqttHome; - HassHome hassHome; + HomeManager homeManager; HueMulator theHueMulator; UDPDatagramSender udpSender; UpnpSettingsResource theSettingResponder; @@ -68,20 +57,11 @@ public class HABridge { // setup system control api first theSystem = new SystemControl(bridgeSettings, theVersion); theSystem.setupServer(); - //setup the harmony connection if available - harmonyHome = new HarmonyHome(bridgeSettings.getBridgeSettingsDescriptor()); - //setup the nest connection if available - nestHome = new NestHome(bridgeSettings.getBridgeSettingsDescriptor()); - //setup the hue passtrhu configuration if available - hueHome = new HueHome(bridgeSettings.getBridgeSettingsDescriptor()); - //setup the hal configuration if available - halHome = new HalHome(bridgeSettings.getBridgeSettingsDescriptor()); - //setup the mqtt handlers if available - mqttHome = new MQTTHome(bridgeSettings.getBridgeSettingsDescriptor()); + //Setup the device connection homes through the manager + homeManager = new HomeManager(); + homeManager.buildHomes(bridgeSettings.getBridgeSettingsDescriptor()); // setup the class to handle the resource setup rest api - //setup the HomeAssistant configuration if available - hassHome = new HassHome(bridgeSettings.getBridgeSettingsDescriptor()); - theResources = new DeviceResource(bridgeSettings.getBridgeSettingsDescriptor(), harmonyHome, nestHome, hueHome, halHome, mqttHome, hassHome); + theResources = new DeviceResource(bridgeSettings.getBridgeSettingsDescriptor(), homeManager); // setup the class to handle the upnp response rest api theSettingResponder = new UpnpSettingsResource(bridgeSettings.getBridgeSettingsDescriptor()); theSettingResponder.setupServer(); @@ -92,7 +72,7 @@ public class HABridge { } else { // setup the class to handle the hue emulator rest api - theHueMulator = new HueMulator(bridgeSettings.getBridgeSettingsDescriptor(), theResources.getDeviceRepository(), harmonyHome, nestHome, hueHome, mqttHome, hassHome, udpSender); + theHueMulator = new HueMulator(bridgeSettings.getBridgeSettingsDescriptor(), theResources.getDeviceRepository(), homeManager, udpSender); theHueMulator.setupServer(); // wait for the sparkjava initialization of the rest api classes to be complete awaitInitialization(); @@ -108,12 +88,7 @@ public class HABridge { } bridgeSettings.getBridgeControl().setReinit(false); stop(); - nestHome.closeTheNest(); - nestHome = null; - harmonyHome.shutdownHarmonyHubs(); - harmonyHome = null; - mqttHome.shutdownMQTTClients(); - mqttHome = null; + homeManager.closeHomes(); udpSender.closeResponseSocket(); } log.info("HA Bridge (v" + theVersion.getVersion() + ") exiting...."); diff --git a/src/main/java/com/bwssystems/HABridge/Home.java b/src/main/java/com/bwssystems/HABridge/Home.java index 414bca0..9df8981 100644 --- a/src/main/java/com/bwssystems/HABridge/Home.java +++ b/src/main/java/com/bwssystems/HABridge/Home.java @@ -1,7 +1,9 @@ package com.bwssystems.HABridge; +import com.bwssystems.HABridge.devicemanagmeent.ResourceHandler; import com.bwssystems.HABridge.hue.HueMulatorHandler; -public interface Home extends HueMulatorHandler { +public interface Home extends HueMulatorHandler, ResourceHandler { public Home createHome(BridgeSettingsDescriptor bridgeSettings); + public void closeHome(); } diff --git a/src/main/java/com/bwssystems/HABridge/HomeManager.java b/src/main/java/com/bwssystems/HABridge/HomeManager.java index 82ad75c..a6e103c 100644 --- a/src/main/java/com/bwssystems/HABridge/HomeManager.java +++ b/src/main/java/com/bwssystems/HABridge/HomeManager.java @@ -1,9 +1,92 @@ package com.bwssystems.HABridge; -public class HomeManager { +import java.util.HashMap; +import java.util.Map; +import com.bwssystems.HABridge.devicemanagmeent.ResourceHandler; +import com.bwssystems.NestBridge.NestHome; +import com.bwssystems.exec.CommandHome; +import com.bwssystems.hal.HalHome; +import com.bwssystems.harmony.HarmonyHome; +import com.bwssystems.hass.HassHome; +import com.bwssystems.http.HTTPHome; +import com.bwssystems.hue.HueHome; +import com.bwssystems.mqtt.MQTTHome; +import com.bwssystems.tcp.TCPHome; +import com.bwssystems.udp.UDPHome; +import com.bwssystems.vera.VeraHome; + +public class HomeManager { + Map homeList; + Map resourceList; + public HomeManager() { - // TODO Auto-generated constructor stub + homeList = new HashMap(); + resourceList = new HashMap(); } + // factory method + public void buildHomes(BridgeSettingsDescriptor bridgeSettings) { + Home aHome = null; + //setup the harmony connection if available + aHome = new HarmonyHome(bridgeSettings); + resourceList.put(DeviceMapTypes.HARMONY_ACTIVITY[DeviceMapTypes.resourceIndex], aHome); + homeList.put(DeviceMapTypes.HARMONY_ACTIVITY[DeviceMapTypes.typeIndex], aHome); + homeList.put(DeviceMapTypes.HARMONY_BUTTON[DeviceMapTypes.typeIndex], aHome); + //setup the nest connection if available + aHome = new NestHome(bridgeSettings); + resourceList.put(DeviceMapTypes.NEST_HOMEAWAY[DeviceMapTypes.resourceIndex], aHome); + homeList.put(DeviceMapTypes.NEST_HOMEAWAY[DeviceMapTypes.typeIndex], aHome); + homeList.put(DeviceMapTypes.NEST_THERMO_SET[DeviceMapTypes.typeIndex], aHome); + //setup the hue passtrhu configuration if available + aHome = new HueHome(bridgeSettings); + resourceList.put(DeviceMapTypes.HUE_DEVICE[DeviceMapTypes.resourceIndex], aHome); + homeList.put(DeviceMapTypes.HUE_DEVICE[DeviceMapTypes.typeIndex], aHome); + //setup the hal configuration if available + aHome = new HalHome(bridgeSettings); + resourceList.put(DeviceMapTypes.HAL_DEVICE[DeviceMapTypes.resourceIndex], aHome); + homeList.put(DeviceMapTypes.HAL_DEVICE[DeviceMapTypes.typeIndex], aHome); + homeList.put(DeviceMapTypes.HAL_BUTTON[DeviceMapTypes.typeIndex], aHome); + homeList.put(DeviceMapTypes.HAL_HOME[DeviceMapTypes.typeIndex], aHome); + homeList.put(DeviceMapTypes.HAL_THERMO_SET[DeviceMapTypes.typeIndex], aHome); + //setup the mqtt handlers if available + aHome = new MQTTHome(bridgeSettings); + resourceList.put(DeviceMapTypes.MQTT_MESSAGE[DeviceMapTypes.resourceIndex], aHome); + homeList.put(DeviceMapTypes.MQTT_MESSAGE[DeviceMapTypes.typeIndex], aHome); + //setup the HomeAssistant configuration if available + aHome = new HassHome(bridgeSettings); + resourceList.put(DeviceMapTypes.HASS_DEVICE[DeviceMapTypes.resourceIndex], aHome); + homeList.put(DeviceMapTypes.HASS_DEVICE[DeviceMapTypes.typeIndex], aHome); + //setup the command execution Home + aHome = new CommandHome().createHome(bridgeSettings); + homeList.put(DeviceMapTypes.EXEC_DEVICE[DeviceMapTypes.typeIndex], aHome); + homeList.put(DeviceMapTypes.CMD_DEVICE[DeviceMapTypes.typeIndex], aHome); + //setup the http handler Home + aHome = new HTTPHome().createHome(bridgeSettings); + homeList.put(DeviceMapTypes.HTTP_DEVICE[DeviceMapTypes.typeIndex], aHome); + homeList.put(DeviceMapTypes.CUSTOM_DEVICE[DeviceMapTypes.typeIndex], aHome); + homeList.put(DeviceMapTypes.VERA_DEVICE[DeviceMapTypes.typeIndex], aHome); + homeList.put(DeviceMapTypes.VERA_SCENE[DeviceMapTypes.typeIndex], aHome); + homeList.put(DeviceMapTypes.DEFAULT_DEVICE[DeviceMapTypes.typeIndex], aHome); + //setup the tcp handler Home + aHome = new TCPHome().createHome(bridgeSettings); + homeList.put(DeviceMapTypes.TCP_DEVICE[DeviceMapTypes.typeIndex], aHome); + //setup the udp handler Home + aHome = new UDPHome().createHome(bridgeSettings); + homeList.put(DeviceMapTypes.UDP_DEVICE[DeviceMapTypes.typeIndex], aHome); + + aHome = new VeraHome(bridgeSettings); + resourceList.put(DeviceMapTypes.VERA_DEVICE[DeviceMapTypes.resourceIndex], aHome); + } + + public Home findHome(String type) { + return homeList.get(type); + } + public ResourceHandler findResource(String type) { + return resourceList.get(type); + } + + public void closeHomes() { + + } } diff --git a/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java b/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java index 8c0f2ad..d7b3eac 100644 --- a/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java +++ b/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java @@ -17,20 +17,12 @@ import org.slf4j.LoggerFactory; import com.bwssystems.HABridge.BridgeSettingsDescriptor; import com.bwssystems.HABridge.DeviceMapTypes; +import com.bwssystems.HABridge.HomeManager; import com.bwssystems.HABridge.dao.BackupFilename; import com.bwssystems.HABridge.dao.DeviceDescriptor; import com.bwssystems.HABridge.dao.DeviceRepository; import com.bwssystems.HABridge.dao.ErrorMessage; -import com.bwssystems.NestBridge.NestHome; -import com.bwssystems.hal.HalHome; -import com.bwssystems.harmony.HarmonyHome; -import com.bwssystems.hass.HassHome; -import com.bwssystems.hue.HueHome; -import com.bwssystems.luupRequests.Device; -import com.bwssystems.luupRequests.Scene; -import com.bwssystems.mqtt.MQTTHome; import com.bwssystems.util.JsonTransformer; -import com.bwssystems.vera.VeraHome; import com.google.gson.Gson; /** @@ -40,53 +32,12 @@ public class DeviceResource { private static final String API_CONTEXT = "/api/devices"; private static final Logger log = LoggerFactory.getLogger(DeviceResource.class); private DeviceRepository deviceRepository; - private VeraHome veraHome; - private HarmonyHome myHarmonyHome; - private NestHome nestHome; - private HueHome hueHome; - private HalHome halHome; - private MQTTHome mqttHome; - private HassHome hassHome; + private HomeManager homeManager; private static final Set supportedVerbs = new HashSet<>(Arrays.asList("get", "put", "post")); - public DeviceResource(BridgeSettingsDescriptor theSettings, HarmonyHome theHarmonyHome, NestHome aNestHome, HueHome aHueHome, HalHome aHalHome, MQTTHome aMqttHome, HassHome aHassHome) { + public DeviceResource(BridgeSettingsDescriptor theSettings, HomeManager aHomeManager) { this.deviceRepository = new DeviceRepository(theSettings.getUpnpDeviceDb()); - - if(theSettings.isValidVera()) - this.veraHome = new VeraHome(theSettings); - else - this.veraHome = null; - - if(theSettings.isValidHarmony()) - this.myHarmonyHome = theHarmonyHome; - else - this.myHarmonyHome = null; - - if(theSettings.isValidNest()) - this.nestHome = aNestHome; - else - this.nestHome = null; - - if(theSettings.isValidHue()) - this.hueHome = aHueHome; - else - this.hueHome = null; - - if(theSettings.isValidHal()) - this.halHome = aHalHome; - else - this.halHome = null; - - if(theSettings.isValidMQTT()) - this.mqttHome = aMqttHome; - else - this.mqttHome = null; - - if(theSettings.isValidHass()) - this.hassHome = aHassHome; - else - this.hassHome = null; - + homeManager = aHomeManager; setupEndpoints(); } @@ -205,119 +156,66 @@ public class DeviceResource { get (API_CONTEXT + "/vera/devices", "application/json", (request, response) -> { log.debug("Get vera devices"); - if(veraHome == null){ - response.status(HttpStatus.SC_NOT_FOUND); - return new ErrorMessage("A Vera is not available."); - } - List theDevices = veraHome.getDevices(); - if(theDevices == null) { - response.status(HttpStatus.SC_SERVICE_UNAVAILABLE); - return new ErrorMessage("A Vera request failed to get devices. Check your Vera IP addresses."); - } - else - response.status(HttpStatus.SC_OK); - return theDevices; + response.status(HttpStatus.SC_OK); + return homeManager.findResource(DeviceMapTypes.VERA_DEVICE[DeviceMapTypes.resourceIndex]).getItems(DeviceMapTypes.VERA_DEVICE[DeviceMapTypes.typeIndex]); }, new JsonTransformer()); get (API_CONTEXT + "/vera/scenes", "application/json", (request, response) -> { log.debug("Get vera scenes"); - if(veraHome == null){ - response.status(HttpStatus.SC_NOT_FOUND); - return new ErrorMessage("A Vera is not available."); - } - List theScenes = veraHome.getScenes(); - if(theScenes == null) { - response.status(HttpStatus.SC_SERVICE_UNAVAILABLE); - return new ErrorMessage("A Vera is not available and failed to get scenes. Check your Vera IP addresses."); - } - else - response.status(HttpStatus.SC_OK); - return theScenes; + response.status(HttpStatus.SC_OK); + return homeManager.findResource(DeviceMapTypes.VERA_DEVICE[DeviceMapTypes.resourceIndex]).getItems(DeviceMapTypes.VERA_SCENE[DeviceMapTypes.typeIndex]); }, new JsonTransformer()); get (API_CONTEXT + "/harmony/activities", "application/json", (request, response) -> { log.debug("Get harmony activities"); - if(myHarmonyHome == null) { - response.status(HttpStatus.SC_NOT_FOUND); - return new ErrorMessage("A Harmony is not available."); - } response.status(HttpStatus.SC_OK); - return myHarmonyHome.getActivities(); + return homeManager.findResource(DeviceMapTypes.HARMONY_ACTIVITY[DeviceMapTypes.resourceIndex]).getItems(DeviceMapTypes.HARMONY_ACTIVITY[DeviceMapTypes.typeIndex]); }, new JsonTransformer()); get (API_CONTEXT + "/harmony/show", "application/json", (request, response) -> { log.debug("Get harmony current activity"); - if(myHarmonyHome == null) { - response.status(HttpStatus.SC_NOT_FOUND); - return new ErrorMessage("A Harmony is not available."); - } - response.status(HttpStatus.SC_OK); - return myHarmonyHome.getCurrentActivities(); + return homeManager.findResource(DeviceMapTypes.HARMONY_ACTIVITY[DeviceMapTypes.resourceIndex]).getItems("current_activity"); }, new JsonTransformer()); get (API_CONTEXT + "/harmony/devices", "application/json", (request, response) -> { log.debug("Get harmony devices"); - if(myHarmonyHome == null) { - response.status(HttpStatus.SC_NOT_FOUND); - return new ErrorMessage("A Harmony is not available."); - } response.status(HttpStatus.SC_OK); - return myHarmonyHome.getDevices(); + return homeManager.findResource(DeviceMapTypes.HARMONY_BUTTON[DeviceMapTypes.resourceIndex]).getItems(DeviceMapTypes.HARMONY_BUTTON[DeviceMapTypes.typeIndex]); }, new JsonTransformer()); get (API_CONTEXT + "/nest/items", "application/json", (request, response) -> { log.debug("Get nest items"); - if(nestHome == null) { - response.status(HttpStatus.SC_NOT_FOUND); - return new ErrorMessage("A Nest is not available."); - } response.status(HttpStatus.SC_OK); - return nestHome.getItems(); + return homeManager.findResource(DeviceMapTypes.NEST_HOMEAWAY[DeviceMapTypes.resourceIndex]).getItems(DeviceMapTypes.NEST_HOMEAWAY[DeviceMapTypes.typeIndex]); }, new JsonTransformer()); get (API_CONTEXT + "/hue/devices", "application/json", (request, response) -> { log.debug("Get hue items"); - if(hueHome == null) { - response.status(HttpStatus.SC_NOT_FOUND); - return new ErrorMessage("A Hue is not available."); - } response.status(HttpStatus.SC_OK); - return hueHome.getDevices(); + return homeManager.findResource(DeviceMapTypes.HUE_DEVICE[DeviceMapTypes.resourceIndex]).getItems(DeviceMapTypes.HUE_DEVICE[DeviceMapTypes.typeIndex]); }, new JsonTransformer()); get (API_CONTEXT + "/hal/devices", "application/json", (request, response) -> { log.debug("Get hal items"); - if(halHome == null) { - response.status(HttpStatus.SC_NOT_FOUND); - return new ErrorMessage("A Hal is not available."); - } response.status(HttpStatus.SC_OK); - return halHome.getDevices(); + return homeManager.findResource(DeviceMapTypes.HAL_DEVICE[DeviceMapTypes.resourceIndex]).getItems(DeviceMapTypes.HAL_DEVICE[DeviceMapTypes.typeIndex]); }, new JsonTransformer()); get (API_CONTEXT + "/mqtt/devices", "application/json", (request, response) -> { log.debug("Get MQTT brokers"); - if(mqttHome == null) { - response.status(HttpStatus.SC_NOT_FOUND); - return new ErrorMessage("A MQTT config is not available."); - } response.status(HttpStatus.SC_OK); - return mqttHome.getBrokers(); + return homeManager.findResource(DeviceMapTypes.MQTT_MESSAGE[DeviceMapTypes.resourceIndex]).getItems(DeviceMapTypes.MQTT_MESSAGE[DeviceMapTypes.typeIndex]); }, new JsonTransformer()); get (API_CONTEXT + "/hass/devices", "application/json", (request, response) -> { log.debug("Get HomeAssistant Clients"); - if(hassHome == null) { - response.status(HttpStatus.SC_NOT_FOUND); - return new ErrorMessage("A HomeAssistant config is not available."); - } response.status(HttpStatus.SC_OK); - return hassHome.getDevices(); + return homeManager.findResource(DeviceMapTypes.HASS_DEVICE[DeviceMapTypes.resourceIndex]).getItems(DeviceMapTypes.HASS_DEVICE[DeviceMapTypes.typeIndex]); }, new JsonTransformer()); get (API_CONTEXT + "/map/types", "application/json", (request, response) -> { log.debug("Get map types"); - return new DeviceMapTypes(); + return new DeviceMapTypes().getDeviceMapTypes(); }, new JsonTransformer()); // http://ip_address:port/api/devices/exec/renumber CORS request diff --git a/src/main/java/com/bwssystems/HABridge/devicemanagmeent/ResourceHandler.java b/src/main/java/com/bwssystems/HABridge/devicemanagmeent/ResourceHandler.java new file mode 100644 index 0000000..68a7bdb --- /dev/null +++ b/src/main/java/com/bwssystems/HABridge/devicemanagmeent/ResourceHandler.java @@ -0,0 +1,5 @@ +package com.bwssystems.HABridge.devicemanagmeent; + +public interface ResourceHandler { + public Object getItems(String type); +} diff --git a/src/main/java/com/bwssystems/HABridge/hue/BrightnessDecode.java b/src/main/java/com/bwssystems/HABridge/hue/BrightnessDecode.java index 8f2aee5..201098f 100644 --- a/src/main/java/com/bwssystems/HABridge/hue/BrightnessDecode.java +++ b/src/main/java/com/bwssystems/HABridge/hue/BrightnessDecode.java @@ -100,4 +100,8 @@ public class BrightnessDecode { return request; } + // Helper Method + public static String calculateReplaceIntensityValue(String request, DeviceState state, StateChangeBody theChanges, boolean hasBri, boolean hasBriInc, boolean isHex) { + return replaceIntensityValue(request, calculateIntensity(state, theChanges, hasBri, hasBriInc), isHex); + } } diff --git a/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java b/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java index 200a46b..cedb6dc 100644 --- a/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java +++ b/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java @@ -2,6 +2,7 @@ package com.bwssystems.HABridge.hue; import com.bwssystems.HABridge.BridgeSettingsDescriptor; import com.bwssystems.HABridge.DeviceMapTypes; +import com.bwssystems.HABridge.HomeManager; import com.bwssystems.HABridge.api.CallItem; import com.bwssystems.HABridge.api.NameValue; import com.bwssystems.HABridge.api.UserCreateRequest; @@ -15,29 +16,21 @@ import com.bwssystems.HABridge.api.hue.HuePublicConfig; import com.bwssystems.HABridge.api.hue.StateChangeBody; import com.bwssystems.HABridge.api.hue.WhitelistEntry; import com.bwssystems.HABridge.dao.*; -import com.bwssystems.NestBridge.NestInstruction; -import com.bwssystems.NestBridge.NestHome; import com.bwssystems.harmony.ButtonPress; import com.bwssystems.harmony.HarmonyHandler; import com.bwssystems.harmony.HarmonyHome; import com.bwssystems.harmony.RunActivity; -import com.bwssystems.hass.HassCommand; -import com.bwssystems.hass.HassHome; -import com.bwssystems.hass.HomeAssistant; import com.bwssystems.hue.HueDeviceIdentifier; import com.bwssystems.hue.HueHome; import com.bwssystems.hue.HueUtil; import com.bwssystems.mqtt.MQTTHandler; import com.bwssystems.mqtt.MQTTHome; import com.bwssystems.mqtt.MQTTMessage; -import com.bwssystems.nest.controller.Nest; import com.bwssystems.util.JsonTransformer; import com.bwssystems.util.UDPDatagramSender; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import net.java.dev.eval.Expression; - import static spark.Spark.get; import static spark.Spark.options; import static spark.Spark.post; @@ -65,8 +58,6 @@ import org.slf4j.LoggerFactory; import java.io.DataOutputStream; import java.io.IOException; -import java.math.BigDecimal; -import java.math.BigInteger; import java.net.InetAddress; import java.net.Socket; import java.net.URI; @@ -89,19 +80,13 @@ import javax.xml.bind.DatatypeConverter; public class HueMulator { private static final Logger log = LoggerFactory.getLogger(HueMulator.class); - private static final String INTENSITY_PERCENT = "${intensity.percent}"; - private static final String INTENSITY_BYTE = "${intensity.byte}"; - private static final String INTENSITY_MATH = "${intensity.math("; - private static final String INTENSITY_MATH_VALUE = "X"; - private static final String INTENSITY_MATH_CLOSE = ")}"; private static final String HUE_CONTEXT = "/api"; private DeviceRepository repository; - private HarmonyHome myHarmonyHome; - private Nest theNest; + private HomeManager homeManager; private HueHome myHueHome; + private HarmonyHome myHarmonyHome; private MQTTHome mqttHome; - private HassHome hassHome; private HttpClient httpClient; private CloseableHttpClient httpclientSSL; private SSLContext sslcontext; @@ -112,13 +97,9 @@ public class HueMulator { private byte[] sendData; private String hueUser; private String errorString; - private Integer setCount; - private Integer theDelay; private Gson aGsonHandler; - public HueMulator(BridgeSettingsDescriptor theBridgeSettings, DeviceRepository aDeviceRepository, - HarmonyHome theHarmonyHome, NestHome aNestHome, HueHome aHueHome, MQTTHome aMqttHome, HassHome aHassHome, - UDPDatagramSender aUdpDatagramSender) { + public HueMulator(BridgeSettingsDescriptor theBridgeSettings, DeviceRepository aDeviceRepository, HomeManager aHomeManager, UDPDatagramSender aUdpDatagramSender) { httpClient = HttpClients.createDefault(); // Trust own CA and all self-signed certs sslcontext = SSLContexts.createDefault(); @@ -129,28 +110,12 @@ public class HueMulator { httpclientSSL = HttpClients.custom().setSSLSocketFactory(sslsf).setDefaultRequestConfig(globalConfig).build(); repository = aDeviceRepository; - if (theBridgeSettings.isValidHarmony()) - this.myHarmonyHome = theHarmonyHome; - else - this.myHarmonyHome = null; - if (theBridgeSettings.isValidNest()) - this.theNest = aNestHome.getTheNest(); - else - this.theNest = null; - if (theBridgeSettings.isValidHue()) - this.myHueHome = aHueHome; - else - this.myHueHome = null; - if (theBridgeSettings.isValidMQTT()) - this.mqttHome = aMqttHome; - else - this.mqttHome = null; - if (theBridgeSettings.isValidHass()) - this.hassHome = aHassHome; - else - this.hassHome = null; bridgeSettings = theBridgeSettings; theUDPDatagramSender = aUdpDatagramSender; + homeManager= aHomeManager; + myHueHome = (HueHome) homeManager.findHome(DeviceMapTypes.HUE_DEVICE[DeviceMapTypes.typeIndex]); + myHarmonyHome = (HarmonyHome) homeManager.findHome(DeviceMapTypes.HARMONY_ACTIVITY[DeviceMapTypes.typeIndex]); + mqttHome = (MQTTHome) homeManager.findHome(DeviceMapTypes.MQTT_MESSAGE[DeviceMapTypes.typeIndex]); hueUser = null; errorString = null; aGsonHandler = @@ -358,83 +323,6 @@ public class HueMulator { }); } - private int calculateIntensity(DeviceState state, StateChangeBody theChanges, boolean hasBri, boolean hasBriInc) { - int setIntensity = state.getBri(); - if (hasBri) { - setIntensity = theChanges.getBri(); - } else if (hasBriInc) { - if ((setIntensity + theChanges.getBri_inc()) <= 0) - setIntensity = theChanges.getBri_inc(); - else if ((setIntensity + theChanges.getBri_inc()) > 255) - setIntensity = theChanges.getBri_inc(); - else - setIntensity = setIntensity + theChanges.getBri_inc(); - } - return setIntensity; - } - - /* - * light weight templating here, was going to use free marker but it was a - * bit too heavy for what we were trying to do. - * - * currently provides: intensity.byte : 0-255 brightness. this is raw from - * the echo intensity.percent : 0-100, adjusted for the vera - * intensity.math(X*1) : where X is the value from the interface call and - * can use net.java.dev.eval math - */ - protected String replaceIntensityValue(String request, int intensity, boolean isHex) { - if (request == null) { - return null; - } - if (request.contains(INTENSITY_BYTE)) { - if (isHex) { - BigInteger bigInt = BigInteger.valueOf(intensity); - byte[] theBytes = bigInt.toByteArray(); - String hexValue = DatatypeConverter.printHexBinary(theBytes); - request = request.replace(INTENSITY_BYTE, hexValue); - } else { - String intensityByte = String.valueOf(intensity); - request = request.replace(INTENSITY_BYTE, intensityByte); - } - } else if (request.contains(INTENSITY_PERCENT)) { - int percentBrightness = (int) Math.round(intensity / 255.0 * 100); - if (isHex) { - BigInteger bigInt = BigInteger.valueOf(percentBrightness); - byte[] theBytes = bigInt.toByteArray(); - String hexValue = DatatypeConverter.printHexBinary(theBytes); - request = request.replace(INTENSITY_PERCENT, hexValue); - } else { - String intensityPercent = String.valueOf(percentBrightness); - request = request.replace(INTENSITY_PERCENT, intensityPercent); - } - } else if (request.contains(INTENSITY_MATH)) { - Map variables = new HashMap(); - String mathDescriptor = request.substring(request.indexOf(INTENSITY_MATH) + INTENSITY_MATH.length(), - request.indexOf(INTENSITY_MATH_CLOSE)); - variables.put(INTENSITY_MATH_VALUE, new BigDecimal(intensity)); - - try { - log.debug("Math eval is: " + mathDescriptor + ", Where " + INTENSITY_MATH_VALUE + " is: " - + String.valueOf(intensity)); - Expression exp = new Expression(mathDescriptor); - BigDecimal result = exp.eval(variables); - Integer endResult = Math.round(result.floatValue()); - if (isHex) { - BigInteger bigInt = BigInteger.valueOf(endResult); - byte[] theBytes = bigInt.toByteArray(); - String hexValue = DatatypeConverter.printHexBinary(theBytes); - request = request.replace(INTENSITY_MATH + mathDescriptor + INTENSITY_MATH_CLOSE, hexValue); - } else { - request = request.replace(INTENSITY_MATH + mathDescriptor + INTENSITY_MATH_CLOSE, - endResult.toString()); - } - } catch (Exception e) { - log.warn("Could not execute Math: " + mathDescriptor, e); - } - } - return request; - } - // This function executes the url from the device repository against the // target as http or https as defined protected String doHttpRequest(String url, String httpVerb, String contentType, String body, NameValue[] headers) { @@ -518,7 +406,7 @@ public class HueMulator { String responseString = null; if (anItem != null && !anItem.equalsIgnoreCase("")) { try { - Process p = Runtime.getRuntime().exec(replaceIntensityValue(anItem, intensity, false)); + Process p = Runtime.getRuntime().exec(BrightnessDecode.replaceIntensityValue(anItem, intensity, false)); log.debug("Process running: " + p.isAlive()); } catch (IOException e) { log.warn("Could not execute request: " + anItem, e); @@ -750,21 +638,6 @@ public class HueMulator { return false; } - private Integer getSetCount() { - return setCount; - } - - private void setSetCount(Integer setCount) { - this.setCount = setCount; - } - - private Integer getTheDelay() { - return theDelay; - } - - private void setTheDelay(Integer theDelay) { - this.theDelay = theDelay; - } private String basicListHandler(String type, String userId, String requestIp) { log.debug("hue " + type + " list requested: " + userId + " from " + requestIp); HueError[] theErrors = validateWhitelistUser(userId, false); @@ -1010,28 +883,12 @@ public class HueMulator { } responseString = this.formatSuccessHueResponse(theStateChanges, body, lightId, device.getDeviceState()); - device.getDeviceState().setBri(calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc)); + device.getDeviceState().setBri(BrightnessDecode.calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc)); return responseString; } - private String hassDeviceHandler(CallItem anItem, String lightId, int iterationCount, DeviceState state, StateChangeBody theStateChanges, boolean stateHasBri, boolean stateHasBriInc) { - String theReturn = null; - MultiCommandUtil aMultiCmdUtil = new MultiCommandUtil(); - // TODO set multi ommmand util here - log.debug("executing HUE api request to send message to HomeAssistant: " + anItem.getItem().toString()); - if (hassHome != null) { - hassHome.deviceHandler(anItem, aMultiCmdUtil, lightId, iterationCount, state, theStateChanges, stateHasBri, stateHasBriInc); - } else { - log.warn("Should not get here, no HomeAssistant clients configured"); - theReturn = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId - + "\",\"description\": \"Should not get here, no HomeAssistants configured\", \"parameter\": \"/lights/" - + lightId + "state\"}}]"; - } - return theReturn; - } - private HueError[] validateHueUser(String userId, String ipAddress, String aName) { String hueUser; HueErrorResponse theErrorResp = null; @@ -1056,10 +913,12 @@ public class HueMulator { NameValue[] theHeaders = null; StateChangeBody theStateChanges = null; DeviceState state = null; + MultiCommandUtil aMultiUtil = new MultiCommandUtil(); boolean stateHasBri = false; boolean stateHasBriInc = false; - this.setTheDelay(bridgeSettings.getButtonsleep()); - this.setSetCount(1); + aMultiUtil.setTheDelay(bridgeSettings.getButtonsleep()); + aMultiUtil.setDelayDefault(bridgeSettings.getButtonsleep()); + aMultiUtil.setSetCount(1); log.debug("hue state change requested: " + userId + " from " + ipAddress + " body: " + body); HueError[] theErrors = validateWhitelistUser(userId, false); if (theErrors != null) @@ -1156,9 +1015,9 @@ public class HueMulator { continue; } if (callItems[i].getCount() != null && callItems[i].getCount() > 0) - setCount = callItems[i].getCount(); + aMultiUtil.setSetCount(callItems[i].getCount()); else - setCount = 1; + aMultiUtil.setSetCount(1); // code for backwards compatibility if((callItems[i].getType() == null || callItems[i].getType().trim().length() == 0)) { if(device.getMapType() != null && device.getMapType().length() > 0) @@ -1183,24 +1042,24 @@ public class HueMulator { } // make call - for (int x = 0; x < setCount; x++) { + for (int x = 0; x < aMultiUtil.getSetCount(); x++) { if (x > 0 || i > 0) { try { - Thread.sleep(this.getTheDelay()); + Thread.sleep(aMultiUtil.getTheDelay()); } catch (InterruptedException e) { // ignore } } if (callItems[i].getDelay() != null && callItems[i].getDelay() > 0) - this.setTheDelay(callItems[i].getDelay()); + aMultiUtil.setTheDelay(callItems[i].getDelay()); else - this.setTheDelay(bridgeSettings.getButtonsleep()); + aMultiUtil.setTheDelay(bridgeSettings.getButtonsleep()); responseString = doHttpRequest( "http://" + deviceId.getIpAddress() + "/api/" + myHueHome.getTheHUERegisteredUser() + "/lights/" + deviceId.getDeviceId() + "/state", HttpPut.METHOD_NAME, device.getContentType(), body, null); if (responseString.contains("[{\"error\":")) - x = setCount; + x = aMultiUtil.getSetCount(); } if (responseString == null) { log.warn("Error on calling url to change device state: " + url); @@ -1237,18 +1096,18 @@ public class HueMulator { + "\",\"description\": \"Should not get here, no harmony hub available\", \"parameter\": \"/lights/" + lightId + "state\"}}]"; } else { - for (int x = 0; x < setCount; x++) { + for (int x = 0; x < aMultiUtil.getSetCount(); x++) { if (x > 0 || i > 0) { try { - Thread.sleep(this.getTheDelay()); + Thread.sleep(aMultiUtil.getTheDelay()); } catch (InterruptedException e) { // ignore } } if (callItems[i].getDelay() != null && callItems[i].getDelay() > 0) - this.setTheDelay(callItems[i].getDelay()); + aMultiUtil.setTheDelay(callItems[i].getDelay()); else - this.setTheDelay(bridgeSettings.getButtonsleep()); + aMultiUtil.setTheDelay(bridgeSettings.getButtonsleep()); myHarmony.startActivity(anActivity); } } @@ -1282,33 +1141,33 @@ public class HueMulator { for(int y = 0; y < theCount; y++) { if( y > 0 || z > 0) { try { - Thread.sleep(this.getTheDelay()); + Thread.sleep(aMultiUtil.getTheDelay()); } catch (InterruptedException e) { // ignore } } if (callItems[i].getDelay() != null && callItems[i].getDelay() > 0) - this.setTheDelay(callItems[i].getDelay()); + aMultiUtil.setTheDelay(callItems[i].getDelay()); else - this.setTheDelay(bridgeSettings.getButtonsleep()); + aMultiUtil.setTheDelay(bridgeSettings.getButtonsleep()); log.debug("pressing button: " + deviceButtons[z].getDevice() + " - " + deviceButtons[z].getButton() + " - iteration: " + String.valueOf(z) + " - count: " + String.valueOf(y)); myHarmony.pressButton(deviceButtons[z]); } } } else { - for (int x = 0; x < setCount; x++) { + for (int x = 0; x < aMultiUtil.getSetCount(); x++) { if (x > 0 || i > 0) { try { - Thread.sleep(this.getTheDelay()); + Thread.sleep(aMultiUtil.getTheDelay()); } catch (InterruptedException e) { // ignore } } if (callItems[i].getDelay() != null && callItems[i].getDelay() > 0) - this.setTheDelay(callItems[i].getDelay()); + aMultiUtil.setTheDelay(callItems[i].getDelay()); else - this.setTheDelay(bridgeSettings.getButtonsleep()); + aMultiUtil.setTheDelay(bridgeSettings.getButtonsleep()); log.debug("pressing button: " + deviceButtons[i].getDevice() + " - " + deviceButtons[i].getButton() + " - iteration: " + String.valueOf(i) + " - count: " + String.valueOf(x)); @@ -1324,72 +1183,14 @@ public class HueMulator { } } else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase(DeviceMapTypes.NEST_HOMEAWAY[DeviceMapTypes.typeIndex])) { - log.debug("executing HUE api request to set away for nest home: " + url); - if (theNest == null) { - log.warn("Should not get here, no Nest available"); - responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId - + "\",\"description\": \"Should not get here, no Nest available\", \"parameter\": \"/lights/" - + lightId + "state\"}}]"; - } else { - NestInstruction homeAway = aGsonHandler.fromJson(url, NestInstruction.class); - theNest.getHome(homeAway.getName()).setAway(homeAway.getAway()); - } + return homeManager.findHome(DeviceMapTypes.NEST_HOMEAWAY[DeviceMapTypes.typeIndex]).deviceHandler(callItems[i], aMultiUtil, lightId, i, state, theStateChanges, stateHasBri, stateHasBriInc); } else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase(DeviceMapTypes.NEST_THERMO_SET[DeviceMapTypes.typeIndex])) { - log.debug("executing HUE api request to set thermostat for nest: " + url); - if (theNest == null) { - log.warn("Should not get here, no Nest available"); - responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId - + "\",\"description\": \"Should not get here, no Nest available\", \"parameter\": \"/lights/" - + lightId + "state\"}}]"; - } else { - NestInstruction thermoSetting = aGsonHandler.fromJson(url, NestInstruction.class); - if (thermoSetting.getControl().equalsIgnoreCase("temp")) { - if (body.contains("bri")) { - if (bridgeSettings.isFarenheit()) - thermoSetting - .setTemp( - String.valueOf((Double - .parseDouble(replaceIntensityValue(thermoSetting.getTemp(), - calculateIntensity(state, theStateChanges, - stateHasBri, stateHasBriInc), - false)) - - 32.0) / 1.8)); - else - thermoSetting - .setTemp( - String.valueOf(Double.parseDouble(replaceIntensityValue( - thermoSetting.getTemp(), calculateIntensity(state, - theStateChanges, stateHasBri, stateHasBriInc), - false)))); - log.debug("Setting thermostat: " + thermoSetting.getName() + " to " - + thermoSetting.getTemp() + "C"); - theNest.getThermostat(thermoSetting.getName()) - .setTargetTemperature(Float.parseFloat(thermoSetting.getTemp())); - } - } else if (thermoSetting.getControl().contains("range") - || thermoSetting.getControl().contains("heat") - || thermoSetting.getControl().contains("cool") - || thermoSetting.getControl().contains("off")) { - log.debug("Setting thermostat target type: " + thermoSetting.getName() + " to " - + thermoSetting.getControl()); - theNest.getThermostat(thermoSetting.getName()).setTargetType(thermoSetting.getControl()); - } else if (thermoSetting.getControl().contains("fan")) { - log.debug("Setting thermostat fan mode: " + thermoSetting.getName() + " to " - + thermoSetting.getControl().substring(4)); - theNest.getThermostat(thermoSetting.getName()) - .setFanMode(thermoSetting.getControl().substring(4)); - } else { - log.warn("no valid Nest control info: " + thermoSetting.getControl()); - responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId - + "\",\"description\": \"no valid Nest control info\", \"parameter\": \"/lights/" - + lightId + "state\"}}]"; - } - } + return homeManager.findHome(DeviceMapTypes.NEST_THERMO_SET[DeviceMapTypes.typeIndex]).deviceHandler(callItems[i], aMultiUtil, lightId, i, state, theStateChanges, stateHasBri, stateHasBriInc); } else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase(DeviceMapTypes.MQTT_MESSAGE[DeviceMapTypes.typeIndex])) { log.debug("executing HUE api request to send message to MQTT broker: " + url); if (mqttHome != null) { - MQTTMessage[] mqttMessages = aGsonHandler.fromJson(replaceIntensityValue(url, - calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc), false), MQTTMessage[].class); + MQTTMessage[] mqttMessages = aGsonHandler.fromJson(BrightnessDecode.replaceIntensityValue(url, + BrightnessDecode.calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc), false), MQTTMessage[].class); MQTTHandler mqttHandler = mqttHome.getMQTTHandler(mqttMessages[i].getClientId()); if (mqttHandler == null) { log.warn("Should not get here, no mqtt hanlder available"); @@ -1397,18 +1198,18 @@ public class HueMulator { + "\",\"description\": \"Should not get here, no mqtt handler available\", \"parameter\": \"/lights/" + lightId + "state\"}}]"; } - for (int x = 0; x < setCount; x++) { + for (int x = 0; x < aMultiUtil.getSetCount(); x++) { if (x > 0 || i > 0) { try { - Thread.sleep(this.getTheDelay()); + Thread.sleep(aMultiUtil.getTheDelay()); } catch (InterruptedException e) { // ignore } } if (callItems[i].getDelay() != null && callItems[i].getDelay() > 0) - this.setTheDelay(callItems[i].getDelay()); + aMultiUtil.setTheDelay(callItems[i].getDelay()); else - this.setTheDelay(bridgeSettings.getButtonsleep()); + aMultiUtil.setTheDelay(bridgeSettings.getButtonsleep()); log.debug("publishing message: " + mqttMessages[i].getClientId() + " - " + mqttMessages[i].getTopic() + " - " + mqttMessages[i].getMessage() + " - iteration: " + String.valueOf(i) + " - count: " + String.valueOf(x)); @@ -1422,7 +1223,7 @@ public class HueMulator { } } else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase(DeviceMapTypes.HASS_DEVICE[DeviceMapTypes.typeIndex])) { - responseString = hassDeviceHandler(callItems[i], lightId, i, state, theStateChanges, stateHasBri, stateHasBriInc); + responseString = homeManager.findHome(DeviceMapTypes.HASS_DEVICE[DeviceMapTypes.typeIndex]).deviceHandler(callItems[i], aMultiUtil, lightId, i, state, theStateChanges, stateHasBri, stateHasBriInc); } else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase(DeviceMapTypes.EXEC_DEVICE[DeviceMapTypes.typeIndex])) { log.debug("Exec Request called with url: " + url); String intermediate; @@ -1430,41 +1231,41 @@ public class HueMulator { intermediate = callItems[i].getItem().getAsString().substring(callItems[i].getItem().getAsString().indexOf("://") + 3); else intermediate = callItems[i].getItem().getAsString(); - for (int x = 0; x < setCount; x++) { + for (int x = 0; x < aMultiUtil.getSetCount(); x++) { if (x > 0 || i > 0) { try { - Thread.sleep(this.getTheDelay()); + Thread.sleep(aMultiUtil.getTheDelay()); } catch (InterruptedException e) { // ignore } } if (callItems[i].getDelay() != null && callItems[i].getDelay() > 0) - this.setTheDelay(callItems[i].getDelay()); + aMultiUtil.setTheDelay(callItems[i].getDelay()); else - this.setTheDelay(bridgeSettings.getButtonsleep()); + aMultiUtil.setTheDelay(bridgeSettings.getButtonsleep()); String anError = doExecRequest(intermediate, - calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc), lightId); + BrightnessDecode.calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc), lightId); if (anError != null) { responseString = anError; - x = setCount; + x = aMultiUtil.getSetCount(); } } } else // This section allows the usage of http/tcp/udp/exec // calls in a given set of items { log.debug("executing HUE api request for network call: " + url); - for (int x = 0; x < setCount; x++) { + for (int x = 0; x < aMultiUtil.getSetCount(); x++) { if (x > 0 || i > 0) { try { - Thread.sleep(this.getTheDelay()); + Thread.sleep(aMultiUtil.getTheDelay()); } catch (InterruptedException e) { // ignore } } if (callItems[i].getDelay() != null && callItems[i].getDelay() > 0) - this.setTheDelay(callItems[i].getDelay()); + aMultiUtil.setTheDelay(callItems[i].getDelay()); else - this.setTheDelay(bridgeSettings.getButtonsleep()); + aMultiUtil.setTheDelay(bridgeSettings.getButtonsleep()); try { if (callItems[i].getItem().getAsString().contains("udp://") || callItems[i].getItem().getAsString().contains("tcp://")) { @@ -1482,13 +1283,13 @@ public class HueMulator { InetAddress IPAddress = InetAddress.getByName(hostAddr); if (theUrlBody.startsWith("0x")) { - theUrlBody = replaceIntensityValue(theUrlBody, - calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc), + theUrlBody = BrightnessDecode.calculateReplaceIntensityValue(theUrlBody, + state, theStateChanges, stateHasBri, stateHasBriInc, true); sendData = DatatypeConverter.parseHexBinary(theUrlBody.substring(2)); } else { - theUrlBody = replaceIntensityValue(theUrlBody, - calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc), + theUrlBody = BrightnessDecode.calculateReplaceIntensityValue(theUrlBody, + state, theStateChanges, stateHasBri, stateHasBriInc, false); sendData = theUrlBody.getBytes(); } @@ -1509,31 +1310,31 @@ public class HueMulator { String intermediate = callItems[i].getItem().getAsString() .substring(callItems[i].getItem().getAsString().indexOf("://") + 3); String anError = doExecRequest(intermediate, - calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc), + BrightnessDecode.calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc), lightId); if (anError != null) { responseString = anError; - x = setCount; + x = aMultiUtil.getSetCount(); } } else { log.debug("executing HUE api request to Http " + (device.getHttpVerb() == null ? "GET" : device.getHttpVerb()) + ": " + callItems[i].getItem().getAsString()); - String anUrl = replaceIntensityValue(callItems[i].getItem().getAsString(), - calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc), false); + String anUrl = BrightnessDecode.calculateReplaceIntensityValue(callItems[i].getItem().getAsString(), + state, theStateChanges, stateHasBri, stateHasBriInc, false); String aBody; if (stateHasBri || stateHasBriInc) - aBody = replaceIntensityValue(device.getContentBodyDim(), - calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc), + aBody = BrightnessDecode.calculateReplaceIntensityValue(device.getContentBodyDim(), + state, theStateChanges, stateHasBri, stateHasBriInc, false); else if (state.isOn()) - aBody = replaceIntensityValue(device.getContentBody(), - calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc), + aBody = BrightnessDecode.calculateReplaceIntensityValue(device.getContentBody(), + state, theStateChanges, stateHasBri, stateHasBriInc, false); else - aBody = replaceIntensityValue(device.getContentBodyOff(), - calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc), + aBody = BrightnessDecode.calculateReplaceIntensityValue(device.getContentBodyOff(), + state, theStateChanges, stateHasBri, stateHasBriInc, false); // make call if (doHttpRequest(anUrl, device.getHttpVerb(), device.getContentType(), aBody, @@ -1542,7 +1343,7 @@ public class HueMulator { responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + "\",\"description\": \"Error on calling url to change device state\", \"parameter\": \"/lights/" + lightId + "state\"}}]"; - x = setCount; + x = aMultiUtil.getSetCount(); } } } catch (Exception e) { @@ -1551,7 +1352,7 @@ public class HueMulator { responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + "\",\"description\": \"Error on calling out to device\", \"parameter\": \"/lights/" + lightId + "state\"}}]"; - x = setCount; + x = aMultiUtil.getSetCount(); } } } @@ -1559,7 +1360,7 @@ public class HueMulator { if (responseString == null || !responseString.contains("[{\"error\":")) { responseString = this.formatSuccessHueResponse(theStateChanges, body, lightId, state); - state.setBri(calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc)); + state.setBri(BrightnessDecode.calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc)); device.setDeviceState(state); } return responseString; diff --git a/src/main/java/com/bwssystems/HABridge/hue/HueMulatorHandler.java b/src/main/java/com/bwssystems/HABridge/hue/HueMulatorHandler.java index c822227..714686c 100644 --- a/src/main/java/com/bwssystems/HABridge/hue/HueMulatorHandler.java +++ b/src/main/java/com/bwssystems/HABridge/hue/HueMulatorHandler.java @@ -5,5 +5,5 @@ import com.bwssystems.HABridge.api.hue.DeviceState; import com.bwssystems.HABridge.api.hue.StateChangeBody; public interface HueMulatorHandler { - public String deviceHandler(CallItem anItem, MultiCommandUtil multiComand, String lightId, int iterationCount, DeviceState state, StateChangeBody theStateChanges, boolean stateHasBri, boolean stateHasBriInc); + public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int iterationCount, DeviceState state, StateChangeBody theStateChanges, boolean stateHasBri, boolean stateHasBriInc); } diff --git a/src/main/java/com/bwssystems/HABridge/hue/MultiCommandUtil.java b/src/main/java/com/bwssystems/HABridge/hue/MultiCommandUtil.java index ea96da1..095c92e 100644 --- a/src/main/java/com/bwssystems/HABridge/hue/MultiCommandUtil.java +++ b/src/main/java/com/bwssystems/HABridge/hue/MultiCommandUtil.java @@ -3,6 +3,7 @@ package com.bwssystems.HABridge.hue; public class MultiCommandUtil { private Integer setCount; private Integer theDelay; + private Integer delayDefault; public Integer getSetCount() { return setCount; @@ -19,4 +20,12 @@ public class MultiCommandUtil { public void setTheDelay(Integer theDelay) { this.theDelay = theDelay; } + + public Integer getDelayDefault() { + return delayDefault; + } + + public void setDelayDefault(Integer delayDefault) { + this.delayDefault = delayDefault; + } } diff --git a/src/main/java/com/bwssystems/NestBridge/NestHome.java b/src/main/java/com/bwssystems/NestBridge/NestHome.java index 12c83db..70aab30 100644 --- a/src/main/java/com/bwssystems/NestBridge/NestHome.java +++ b/src/main/java/com/bwssystems/NestBridge/NestHome.java @@ -1,7 +1,6 @@ package com.bwssystems.NestBridge; import java.util.ArrayList; -import java.util.List; import java.util.ListIterator; import java.util.Set; @@ -9,6 +8,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.bwssystems.HABridge.BridgeSettingsDescriptor; +import com.bwssystems.HABridge.DeviceMapTypes; +import com.bwssystems.HABridge.api.CallItem; +import com.bwssystems.HABridge.api.hue.DeviceState; +import com.bwssystems.HABridge.api.hue.StateChangeBody; +import com.bwssystems.HABridge.hue.BrightnessDecode; +import com.bwssystems.HABridge.hue.MultiCommandUtil; import com.bwssystems.nest.controller.Home; import com.bwssystems.nest.controller.Nest; import com.bwssystems.nest.controller.NestSession; @@ -16,34 +21,26 @@ import com.bwssystems.nest.controller.Thermostat; import com.bwssystems.nest.protocol.error.LoginException; import com.bwssystems.nest.protocol.status.WhereDetail; import com.bwssystems.nest.protocol.status.WhereItem; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; -public class NestHome { +public class NestHome implements com.bwssystems.HABridge.Home { private static final Logger log = LoggerFactory.getLogger(NestHome.class); private NestSession theSession; private Nest theNest; private ArrayList nestItems; + private Gson aGsonHandler; + private Boolean isFarenheit; + private Boolean validNest; public NestHome(BridgeSettingsDescriptor bridgeSettings) { - theSession = null; - theNest = null; - nestItems = null; - - if(!bridgeSettings.isValidNest()) { - log.debug("not a valid nest"); - return; - } - - try { - theSession = new NestSession(bridgeSettings.getNestuser(), bridgeSettings.getNestpwd()); - theNest = new Nest(theSession); - } catch (LoginException e) { - log.error("Caught Login Exception, exiting...."); - theSession = null; - } + super(); + createHome(bridgeSettings); } - public List getItems() { - if(theNest == null) + @Override + public Object getItems(String type) { + if(!validNest) return null; if(nestItems == null) { @@ -94,11 +91,8 @@ public class NestHome { return nestItems; } - public Nest getTheNest() { - return theNest; - } - - public void closeTheNest() { + @Override + public void closeHome() { if(theSession != null) { theNest.endNestSession(); theNest = null; @@ -106,5 +100,87 @@ public class NestHome { nestItems = null; } } + + @Override + public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int iterationCount, + DeviceState state, StateChangeBody theStateChanges, boolean stateHasBri, boolean stateHasBriInc) { + String responseString = null; + log.debug("executing HUE api request to set away for nest " + anItem.getType() + ": " + anItem.getItem().toString()); + if(!validNest) { + log.warn("Should not get here, no Nest available"); + responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + + "\",\"description\": \"Should not get here, no Nest available\", \"parameter\": \"/lights/" + + lightId + "state\"}}]"; + } else if (anItem.getType() != null && anItem.getType().trim().equalsIgnoreCase(DeviceMapTypes.NEST_HOMEAWAY[DeviceMapTypes.typeIndex])) { + NestInstruction homeAway = aGsonHandler.fromJson(anItem.getItem().toString(), NestInstruction.class); + theNest.getHome(homeAway.getName()).setAway(homeAway.getAway()); + } else if (anItem.getType() != null && anItem.getType().trim().equalsIgnoreCase(DeviceMapTypes.NEST_THERMO_SET[DeviceMapTypes.typeIndex])) { + NestInstruction thermoSetting = aGsonHandler.fromJson(anItem.getItem().toString(), NestInstruction.class); + if (thermoSetting.getControl().equalsIgnoreCase("temp")) { + if (stateHasBri) { + if (isFarenheit) + thermoSetting + .setTemp( + String.valueOf((Double + .parseDouble(BrightnessDecode.calculateReplaceIntensityValue(thermoSetting.getTemp(), + state, theStateChanges, stateHasBri, stateHasBriInc, false)) - 32.0) / 1.8)); + else + thermoSetting + .setTemp( + String.valueOf(Double.parseDouble(BrightnessDecode.calculateReplaceIntensityValue(thermoSetting.getTemp(), + state, theStateChanges, stateHasBri, stateHasBriInc, false)))); + log.debug("Setting thermostat: " + thermoSetting.getName() + " to " + + thermoSetting.getTemp() + "C"); + theNest.getThermostat(thermoSetting.getName()) + .setTargetTemperature(Float.parseFloat(thermoSetting.getTemp())); + } + } else if (thermoSetting.getControl().contains("range") + || thermoSetting.getControl().contains("heat") + || thermoSetting.getControl().contains("cool") + || thermoSetting.getControl().contains("off")) { + log.debug("Setting thermostat target type: " + thermoSetting.getName() + " to " + + thermoSetting.getControl()); + theNest.getThermostat(thermoSetting.getName()).setTargetType(thermoSetting.getControl()); + } else if (thermoSetting.getControl().contains("fan")) { + log.debug("Setting thermostat fan mode: " + thermoSetting.getName() + " to " + + thermoSetting.getControl().substring(4)); + theNest.getThermostat(thermoSetting.getName()) + .setFanMode(thermoSetting.getControl().substring(4)); + } else { + log.warn("no valid Nest control info: " + thermoSetting.getControl()); + responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + + "\",\"description\": \"no valid Nest control info\", \"parameter\": \"/lights/" + + lightId + "state\"}}]"; + } + } + log.info("device handler not implemented"); + return responseString; + } + + @Override + public com.bwssystems.HABridge.Home createHome(BridgeSettingsDescriptor bridgeSettings) { + theSession = null; + theNest = null; + nestItems = null; + validNest = bridgeSettings.isValidNest(); + aGsonHandler = null; + + if(!validNest) { + log.debug("not a valid nest"); + } else { + aGsonHandler = new GsonBuilder().create(); + + isFarenheit = bridgeSettings.isFarenheit(); + try { + theSession = new NestSession(bridgeSettings.getNestuser(), bridgeSettings.getNestpwd()); + theNest = new Nest(theSession); + } catch (LoginException e) { + log.error("Caught Login Exception, setting Nest to invalid...."); + validNest = false; + theSession = null; + } + } + return this; + } } diff --git a/src/main/java/com/bwssystems/exec/CommandHome.java b/src/main/java/com/bwssystems/exec/CommandHome.java new file mode 100644 index 0000000..b3bdf80 --- /dev/null +++ b/src/main/java/com/bwssystems/exec/CommandHome.java @@ -0,0 +1,41 @@ +package com.bwssystems.exec; + +import com.bwssystems.HABridge.BridgeSettingsDescriptor; +import com.bwssystems.HABridge.Home; +import com.bwssystems.HABridge.api.CallItem; +import com.bwssystems.HABridge.api.hue.DeviceState; +import com.bwssystems.HABridge.api.hue.StateChangeBody; +import com.bwssystems.HABridge.hue.MultiCommandUtil; + +public class CommandHome implements Home { + + public CommandHome() { + // TODO Auto-generated constructor stub + } + + @Override + public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int iterationCount, + DeviceState state, StateChangeBody theStateChanges, boolean stateHasBri, boolean stateHasBriInc) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Home createHome(BridgeSettingsDescriptor bridgeSettings) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object getItems(String type) { + // Not a resource + return null; + } + + @Override + public void closeHome() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/main/java/com/bwssystems/hal/HalHome.java b/src/main/java/com/bwssystems/hal/HalHome.java index 2f60abf..a8c72ad 100644 --- a/src/main/java/com/bwssystems/hal/HalHome.java +++ b/src/main/java/com/bwssystems/hal/HalHome.java @@ -10,30 +10,24 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.bwssystems.HABridge.BridgeSettingsDescriptor; +import com.bwssystems.HABridge.Home; import com.bwssystems.HABridge.NamedIP; +import com.bwssystems.HABridge.api.CallItem; +import com.bwssystems.HABridge.api.hue.DeviceState; +import com.bwssystems.HABridge.api.hue.StateChangeBody; +import com.bwssystems.HABridge.hue.MultiCommandUtil; -public class HalHome { +public class HalHome implements Home { private static final Logger log = LoggerFactory.getLogger(HalHome.class); private Map hals; public HalHome(BridgeSettingsDescriptor bridgeSettings) { super(); - hals = new HashMap(); - if(!bridgeSettings.isValidHal()) - return; - Iterator theList = bridgeSettings.getHaladdress().getDevices().iterator(); - while(theList.hasNext()) { - NamedIP aHal = theList.next(); - try { - hals.put(aHal.getName(), new HalInfo(aHal, bridgeSettings.getHaltoken())); - } catch (Exception e) { - log.error("Cannot get hal client (" + aHal.getName() + ") setup, Exiting with message: " + e.getMessage(), e); - return; - } - } + createHome(bridgeSettings); } - public List getDevices() { + @Override + public Object getItems(String type) { log.debug("consolidating devices for hues"); List theResponse = null; Iterator keys = hals.keySet().iterator(); @@ -110,4 +104,35 @@ public class HalHome { } return true; } + + @Override + public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int iterationCount, + DeviceState state, StateChangeBody theStateChanges, boolean stateHasBri, boolean stateHasBriInc) { + log.info("device handler not implemented"); + return null; + } + + @Override + public Home createHome(BridgeSettingsDescriptor bridgeSettings) { + hals = new HashMap(); + if(!bridgeSettings.isValidHal()) + return null; + Iterator theList = bridgeSettings.getHaladdress().getDevices().iterator(); + while(theList.hasNext()) { + NamedIP aHal = theList.next(); + try { + hals.put(aHal.getName(), new HalInfo(aHal, bridgeSettings.getHaltoken())); + } catch (Exception e) { + log.error("Cannot get hal client (" + aHal.getName() + ") setup, Exiting with message: " + e.getMessage(), e); + return null; + } + } + return this; + } + + @Override + public void closeHome() { + // noop + + } } diff --git a/src/main/java/com/bwssystems/harmony/HarmonyHome.java b/src/main/java/com/bwssystems/harmony/HarmonyHome.java index 29db597..8c1cd45 100644 --- a/src/main/java/com/bwssystems/harmony/HarmonyHome.java +++ b/src/main/java/com/bwssystems/harmony/HarmonyHome.java @@ -11,53 +11,40 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.bwssystems.HABridge.BridgeSettingsDescriptor; +import com.bwssystems.HABridge.DeviceMapTypes; +import com.bwssystems.HABridge.Home; import com.bwssystems.HABridge.IpList; import com.bwssystems.HABridge.NamedIP; +import com.bwssystems.HABridge.api.CallItem; +import com.bwssystems.HABridge.api.hue.DeviceState; +import com.bwssystems.HABridge.api.hue.StateChangeBody; +import com.bwssystems.HABridge.hue.MultiCommandUtil; import net.whistlingfish.harmony.config.Activity; import net.whistlingfish.harmony.config.Device; -public class HarmonyHome { +public class HarmonyHome implements Home { private static final Logger log = LoggerFactory.getLogger(HarmonyHome.class); private Map hubs; private Boolean isDevMode; + private Boolean validHarmony; public HarmonyHome(BridgeSettingsDescriptor bridgeSettings) { super(); - isDevMode = Boolean.parseBoolean(System.getProperty("dev.mode", "false")); - hubs = new HashMap(); - if(!bridgeSettings.isValidHarmony() && !isDevMode) - return; - if(isDevMode) { - NamedIP devModeIp = new NamedIP(); - devModeIp.setIp("10.10.10.10"); - devModeIp.setName("devMode"); - List theList = new ArrayList(); - theList.add(devModeIp); - IpList thedevList = new IpList(); - thedevList.setDevices(theList); - bridgeSettings.setHarmonyAddress(thedevList); - } - Iterator theList = bridgeSettings.getHarmonyAddress().getDevices().iterator(); - while(theList.hasNext()) { - NamedIP aHub = theList.next(); - try { - hubs.put(aHub.getName(), HarmonyServer.setup(bridgeSettings, isDevMode, aHub)); - } catch (Exception e) { - log.error("Cannot get harmony client (" + aHub.getName() + ") setup, Exiting with message: " + e.getMessage(), e); - return; - } - } + createHome(bridgeSettings); } - public void shutdownHarmonyHubs() { - if(isDevMode) + @Override + public void closeHome() { + if(isDevMode || hubs == null) return; Iterator keys = hubs.keySet().iterator(); while(keys.hasNext()) { String key = keys.next(); hubs.get(key).getMyHarmony().shutdown(); } + + hubs = null; } public HarmonyHandler getHarmonyHandler(String aName) { @@ -124,4 +111,55 @@ public class HarmonyHome { } return deviceList; } + + @Override + public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int iterationCount, + DeviceState state, StateChangeBody theStateChanges, boolean stateHasBri, boolean stateHasBriInc) { + // TODO Auto-generated method stub + log.info("device handler not implemented"); + return null; + } + + @Override + public Home createHome(BridgeSettingsDescriptor bridgeSettings) { + isDevMode = Boolean.parseBoolean(System.getProperty("dev.mode", "false")); + validHarmony = bridgeSettings.isValidHarmony(); + if(!validHarmony && !isDevMode) { + log.debug("No valid Harmony config"); + } else { + hubs = new HashMap(); + if(isDevMode) { + NamedIP devModeIp = new NamedIP(); + devModeIp.setIp("10.10.10.10"); + devModeIp.setName("devMode"); + List theList = new ArrayList(); + theList.add(devModeIp); + IpList thedevList = new IpList(); + thedevList.setDevices(theList); + bridgeSettings.setHarmonyAddress(thedevList); + } + Iterator theList = bridgeSettings.getHarmonyAddress().getDevices().iterator(); + while(theList.hasNext() && validHarmony) { + NamedIP aHub = theList.next(); + try { + hubs.put(aHub.getName(), HarmonyServer.setup(bridgeSettings, isDevMode, aHub)); + } catch (Exception e) { + log.error("Cannot get harmony client (" + aHub.getName() + ") setup, Exiting with message: " + e.getMessage(), e); + validHarmony = false; + } + } + } + return this; + } + + @Override + public Object getItems(String type) { + if(type.equalsIgnoreCase(DeviceMapTypes.HARMONY_ACTIVITY[DeviceMapTypes.resourceIndex])) + return getActivities(); + if(type.equalsIgnoreCase(DeviceMapTypes.HARMONY_BUTTON[DeviceMapTypes.resourceIndex])) + return getDevices(); + if(type.equalsIgnoreCase("current_activity")) + return getCurrentActivities(); + return null; + } } diff --git a/src/main/java/com/bwssystems/hass/HassHome.java b/src/main/java/com/bwssystems/hass/HassHome.java index 2a014e9..3569753 100644 --- a/src/main/java/com/bwssystems/hass/HassHome.java +++ b/src/main/java/com/bwssystems/hass/HassHome.java @@ -16,7 +16,6 @@ import com.bwssystems.HABridge.api.CallItem; import com.bwssystems.HABridge.api.hue.DeviceState; import com.bwssystems.HABridge.api.hue.StateChangeBody; import com.bwssystems.HABridge.hue.BrightnessDecode; -import com.bwssystems.HABridge.hue.HueMulatorHandler; import com.bwssystems.HABridge.hue.MultiCommandUtil; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -34,23 +33,27 @@ public class HassHome implements Home { @Override public Home createHome(BridgeSettingsDescriptor bridgeSettings) { + hassMap = null; + aGsonHandler = null; validHass = bridgeSettings.isValidHass(); - if(!validHass) - return null; - hassMap = new HashMap(); - Iterator theList = bridgeSettings.getHassaddress().getDevices().iterator(); - while(theList.hasNext()) { - NamedIP aHass = theList.next(); - try { - hassMap.put(aHass.getName(), new HomeAssistant(aHass)); - } catch (Exception e) { - log.error("Cannot get hass (" + aHass.getName() + ") setup, Exiting with message: " + e.getMessage(), e); - return null; + if(!validHass){ + log.debug("not a valid hass"); + } else { + hassMap = new HashMap(); + aGsonHandler = + new GsonBuilder() + .create(); + Iterator theList = bridgeSettings.getHassaddress().getDevices().iterator(); + while(theList.hasNext() && validHass) { + NamedIP aHass = theList.next(); + try { + hassMap.put(aHass.getName(), new HomeAssistant(aHass)); + } catch (Exception e) { + log.error("Cannot get hass (" + aHass.getName() + ") setup, Exiting with message: " + e.getMessage(), e); + validHass = false; + } } - } - aGsonHandler = - new GsonBuilder() - .create(); + } return this; } @@ -69,7 +72,8 @@ public class HassHome implements Home { return aHomeAssistant; } - public List getDevices() { + @Override + public Object getItems(String type) { log.debug("consolidating devices for hass"); if(!validHass) return null; @@ -105,10 +109,17 @@ public class HassHome implements Home { } @Override - public String deviceHandler(CallItem anItem, MultiCommandUtil multiComand, String lightId, int iterationCount, DeviceState state, + public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int iterationCount, DeviceState state, StateChangeBody theStateChanges, boolean stateHasBri, boolean stateHasBriInc) { String theReturn = null; log.debug("executing HUE api request to send message to HomeAssistant: " + anItem.getItem().toString()); + if(!validHass) { + log.warn("Should not get here, no HomeAssistant clients configured"); + theReturn = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + + "\",\"description\": \"Should not get here, no HomeAssistants configured\", \"parameter\": \"/lights/" + + lightId + "state\"}}]"; + + } else { HassCommand hassCommand = aGsonHandler.fromJson(anItem.getItem(), HassCommand.class); hassCommand.setBri(BrightnessDecode.replaceIntensityValue(hassCommand.getBri(), BrightnessDecode.calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc), false)); @@ -119,24 +130,34 @@ public class HassHome implements Home { + "\",\"description\": \"Should not get here, no HiomeAssistant clients available\", \"parameter\": \"/lights/" + lightId + "state\"}}]"; } else { - for (int x = 0; x < multiComand.getSetCount(); x++) { - if (x > 0 || iterationCount > 0) { - try { - Thread.sleep(multiComand.getTheDelay()); - } catch (InterruptedException e) { - // ignore + for (int x = 0; x < aMultiUtil.getSetCount(); x++) { + if (x > 0 || iterationCount > 0) { + try { + Thread.sleep(aMultiUtil.getTheDelay()); + } catch (InterruptedException e) { + // ignore + } } + if (anItem.getDelay() != null && anItem.getDelay() > 0) + aMultiUtil.setTheDelay(anItem.getDelay()); + else + aMultiUtil.setTheDelay(aMultiUtil.getDelayDefault()); + log.debug("calling HomeAssistant: " + hassCommand.getHassName() + " - " + + hassCommand.getEntityId() + " - " + hassCommand.getState() + " - " + hassCommand.getBri() + + " - iteration: " + String.valueOf(iterationCount) + " - count: " + String.valueOf(x)); + homeAssistant.callCommand(hassCommand); } - if (anItem.getDelay() != null && anItem.getDelay() > 0) - multiComand.setTheDelay(anItem.getDelay()); -// else -// this.setTheDelay(bridgeSettings.getButtonsleep()); - log.debug("calling HomeAssistant: " + hassCommand.getHassName() + " - " - + hassCommand.getEntityId() + " - " + hassCommand.getState() + " - " + hassCommand.getBri() - + " - iteration: " + String.valueOf(iterationCount) + " - count: " + String.valueOf(x)); - homeAssistant.callCommand(hassCommand); - } } + } return theReturn; } + + @Override + public void closeHome() { + Iterator keys = hassMap.keySet().iterator(); + while(keys.hasNext()) { + String key = keys.next(); + hassMap.get(key).closeClient(); + } + } } diff --git a/src/main/java/com/bwssystems/hass/HomeAssistant.java b/src/main/java/com/bwssystems/hass/HomeAssistant.java index f765a89..47e4144 100644 --- a/src/main/java/com/bwssystems/hass/HomeAssistant.java +++ b/src/main/java/com/bwssystems/hass/HomeAssistant.java @@ -193,4 +193,14 @@ public class HomeAssistant { } return theContent; } + + protected void closeClient() { + httpClient = null; + try { + httpclientSSL.close(); + } catch (IOException e) { + // noop + } + httpclientSSL = null; + } } diff --git a/src/main/java/com/bwssystems/http/HTTPHome.java b/src/main/java/com/bwssystems/http/HTTPHome.java new file mode 100644 index 0000000..6d892f2 --- /dev/null +++ b/src/main/java/com/bwssystems/http/HTTPHome.java @@ -0,0 +1,41 @@ +package com.bwssystems.http; + +import com.bwssystems.HABridge.BridgeSettingsDescriptor; +import com.bwssystems.HABridge.Home; +import com.bwssystems.HABridge.api.CallItem; +import com.bwssystems.HABridge.api.hue.DeviceState; +import com.bwssystems.HABridge.api.hue.StateChangeBody; +import com.bwssystems.HABridge.hue.MultiCommandUtil; + +public class HTTPHome implements Home { + + public HTTPHome() { + // TODO Auto-generated constructor stub + } + + @Override + public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int iterationCount, + DeviceState state, StateChangeBody theStateChanges, boolean stateHasBri, boolean stateHasBriInc) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Home createHome(BridgeSettingsDescriptor bridgeSettings) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object getItems(String type) { + // Not a resource + return null; + } + + @Override + public void closeHome() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/main/java/com/bwssystems/hue/HueHome.java b/src/main/java/com/bwssystems/hue/HueHome.java index 32af368..419c0ed 100644 --- a/src/main/java/com/bwssystems/hue/HueHome.java +++ b/src/main/java/com/bwssystems/hue/HueHome.java @@ -3,35 +3,34 @@ package com.bwssystems.hue; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; -import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.bwssystems.HABridge.BridgeSettingsDescriptor; +import com.bwssystems.HABridge.Home; import com.bwssystems.HABridge.NamedIP; +import com.bwssystems.HABridge.api.CallItem; import com.bwssystems.HABridge.api.hue.DeviceResponse; +import com.bwssystems.HABridge.api.hue.DeviceState; import com.bwssystems.HABridge.api.hue.HueApiResponse; +import com.bwssystems.HABridge.api.hue.StateChangeBody; +import com.bwssystems.HABridge.hue.MultiCommandUtil; -public class HueHome { +public class HueHome implements Home { private static final Logger log = LoggerFactory.getLogger(HueHome.class); private Map hues; private String theHUERegisteredUser; + private Boolean validHue; public HueHome(BridgeSettingsDescriptor bridgeSettings) { - hues = new HashMap(); - if(!bridgeSettings.isValidHue()) - return; - Iterator theList = bridgeSettings.getHueaddress().getDevices().iterator(); - while(theList.hasNext()) { - NamedIP aHue = theList.next(); - hues.put(aHue.getName(), new HueInfo(aHue, this)); - } - theHUERegisteredUser = null; + super(); + createHome(bridgeSettings); } - public List getDevices() { + @Override + public Object getItems(String type) { log.debug("consolidating devices for hues"); Iterator keys = hues.keySet().iterator(); ArrayList deviceList = new ArrayList(); @@ -70,4 +69,35 @@ public class HueHome { public void setTheHUERegisteredUser(String theHUERegisteredUser) { this.theHUERegisteredUser = theHUERegisteredUser; } + + @Override + public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int iterationCount, + DeviceState state, StateChangeBody theStateChanges, boolean stateHasBri, boolean stateHasBriInc) { + // TODO Auto-generated method stub + log.info("device handler not implemented"); + return null; + } + + @Override + public Home createHome(BridgeSettingsDescriptor bridgeSettings) { + validHue = bridgeSettings.isValidHue(); + if(!validHue) { + log.debug("No Hue Configuration"); + } else { + hues = new HashMap(); + Iterator theList = bridgeSettings.getHueaddress().getDevices().iterator(); + while(theList.hasNext()) { + NamedIP aHue = theList.next(); + hues.put(aHue.getName(), new HueInfo(aHue, this)); + } + theHUERegisteredUser = null; + } + return this; + } + + @Override + public void closeHome() { + // TODO Auto-generated method stub + + } } diff --git a/src/main/java/com/bwssystems/mqtt/MQTTHome.java b/src/main/java/com/bwssystems/mqtt/MQTTHome.java index c5a57ae..8cc448b 100644 --- a/src/main/java/com/bwssystems/mqtt/MQTTHome.java +++ b/src/main/java/com/bwssystems/mqtt/MQTTHome.java @@ -3,37 +3,31 @@ package com.bwssystems.mqtt; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; -import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.bwssystems.HABridge.BridgeSettingsDescriptor; +import com.bwssystems.HABridge.Home; import com.bwssystems.HABridge.NamedIP; +import com.bwssystems.HABridge.api.CallItem; +import com.bwssystems.HABridge.api.hue.DeviceState; +import com.bwssystems.HABridge.api.hue.StateChangeBody; +import com.bwssystems.HABridge.hue.MultiCommandUtil; -public class MQTTHome { +public class MQTTHome implements Home { private static final Logger log = LoggerFactory.getLogger(MQTTHome.class); private Map handlers; private Boolean validMqtt; public MQTTHome(BridgeSettingsDescriptor bridgeSettings) { super(); - validMqtt = bridgeSettings.isValidMQTT(); - if(!validMqtt) - return; - - handlers = new HashMap(); - Iterator theList = bridgeSettings.getMqttaddress().getDevices().iterator(); - while(theList.hasNext()) { - NamedIP aClientConfig = theList.next(); - MQTTHandler aHandler = new MQTTHandler(aClientConfig); - if(aHandler != null) - handlers.put(aClientConfig.getName(), aHandler); - } + createHome(bridgeSettings); } - public void shutdownMQTTClients() { + @Override + public void closeHome() { if(!validMqtt) return; log.debug("Shutting down MQTT handlers."); @@ -61,7 +55,8 @@ public class MQTTHome { return aHandler; } - public List getBrokers() { + @Override + public Object getItems(String type) { if(!validMqtt) return null; Iterator keys = handlers.keySet().iterator(); @@ -74,4 +69,30 @@ public class MQTTHome { } return deviceList; } + + @Override + public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int iterationCount, + DeviceState state, StateChangeBody theStateChanges, boolean stateHasBri, boolean stateHasBriInc) { + // TODO Auto-generated method stub + log.info("device handler not implemented"); + return null; + } + + @Override + public Home createHome(BridgeSettingsDescriptor bridgeSettings) { + validMqtt = bridgeSettings.isValidMQTT(); + if(!validMqtt) { + log.debug("No MQTT configuration"); + } else { + handlers = new HashMap(); + Iterator theList = bridgeSettings.getMqttaddress().getDevices().iterator(); + while(theList.hasNext()) { + NamedIP aClientConfig = theList.next(); + MQTTHandler aHandler = new MQTTHandler(aClientConfig); + if(aHandler != null) + handlers.put(aClientConfig.getName(), aHandler); + } + } + return this; + } } diff --git a/src/main/java/com/bwssystems/tcp/TCPHome.java b/src/main/java/com/bwssystems/tcp/TCPHome.java new file mode 100644 index 0000000..0c0ce99 --- /dev/null +++ b/src/main/java/com/bwssystems/tcp/TCPHome.java @@ -0,0 +1,41 @@ +package com.bwssystems.tcp; + +import com.bwssystems.HABridge.BridgeSettingsDescriptor; +import com.bwssystems.HABridge.Home; +import com.bwssystems.HABridge.api.CallItem; +import com.bwssystems.HABridge.api.hue.DeviceState; +import com.bwssystems.HABridge.api.hue.StateChangeBody; +import com.bwssystems.HABridge.hue.MultiCommandUtil; + +public class TCPHome implements Home { + + public TCPHome() { + // TODO Auto-generated constructor stub + } + + @Override + public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int iterationCount, + DeviceState state, StateChangeBody theStateChanges, boolean stateHasBri, boolean stateHasBriInc) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Home createHome(BridgeSettingsDescriptor bridgeSettings) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object getItems(String type) { + // Not a resource + return null; + } + + @Override + public void closeHome() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/main/java/com/bwssystems/udp/UDPHome.java b/src/main/java/com/bwssystems/udp/UDPHome.java new file mode 100644 index 0000000..27ed023 --- /dev/null +++ b/src/main/java/com/bwssystems/udp/UDPHome.java @@ -0,0 +1,41 @@ +package com.bwssystems.udp; + +import com.bwssystems.HABridge.BridgeSettingsDescriptor; +import com.bwssystems.HABridge.Home; +import com.bwssystems.HABridge.api.CallItem; +import com.bwssystems.HABridge.api.hue.DeviceState; +import com.bwssystems.HABridge.api.hue.StateChangeBody; +import com.bwssystems.HABridge.hue.MultiCommandUtil; + +public class UDPHome implements Home { + + public UDPHome() { + // TODO Auto-generated constructor stub + } + + @Override + public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int iterationCount, + DeviceState state, StateChangeBody theStateChanges, boolean stateHasBri, boolean stateHasBriInc) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Home createHome(BridgeSettingsDescriptor bridgeSettings) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object getItems(String type) { + // Not a resource + return null; + } + + @Override + public void closeHome() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/main/java/com/bwssystems/vera/VeraHome.java b/src/main/java/com/bwssystems/vera/VeraHome.java index d390c48..2236c1b 100644 --- a/src/main/java/com/bwssystems/vera/VeraHome.java +++ b/src/main/java/com/bwssystems/vera/VeraHome.java @@ -10,24 +10,25 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.bwssystems.HABridge.BridgeSettingsDescriptor; +import com.bwssystems.HABridge.DeviceMapTypes; +import com.bwssystems.HABridge.Home; import com.bwssystems.HABridge.NamedIP; +import com.bwssystems.HABridge.api.CallItem; +import com.bwssystems.HABridge.api.hue.DeviceState; +import com.bwssystems.HABridge.api.hue.StateChangeBody; +import com.bwssystems.HABridge.hue.MultiCommandUtil; import com.bwssystems.luupRequests.Device; import com.bwssystems.luupRequests.Scene; import com.bwssystems.luupRequests.Sdata; -public class VeraHome { +public class VeraHome implements Home { private static final Logger log = LoggerFactory.getLogger(VeraHome.class); private Map veras; + private Boolean validVera; public VeraHome(BridgeSettingsDescriptor bridgeSettings) { - veras = new HashMap(); - if(!bridgeSettings.isValidVera()) - return; - Iterator theList = bridgeSettings.getVeraAddress().getDevices().iterator(); - while(theList.hasNext()) { - NamedIP aVera = theList.next(); - veras.put(aVera.getName(), new VeraInfo(aVera)); - } + super(); + createHome(bridgeSettings); } public List getDevices() { @@ -70,4 +71,44 @@ public class VeraHome { } return sceneList; } + + @Override + public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int iterationCount, + DeviceState state, StateChangeBody theStateChanges, boolean stateHasBri, boolean stateHasBriInc) { + // Not a device handler + return null; + } + + @Override + public Object getItems(String type) { + if(validVera) { + if(type.equalsIgnoreCase(DeviceMapTypes.VERA_DEVICE[DeviceMapTypes.typeIndex])) + return getDevices(); + if(type.equalsIgnoreCase(DeviceMapTypes.VERA_SCENE[DeviceMapTypes.typeIndex])) + return getScenes(); + } + return null; + } + + @Override + public Home createHome(BridgeSettingsDescriptor bridgeSettings) { + validVera = bridgeSettings.isValidVera(); + if(!validVera) { + log.debug("No valid veras"); + } else { + veras = new HashMap(); + Iterator theList = bridgeSettings.getVeraAddress().getDevices().iterator(); + while(theList.hasNext()) { + NamedIP aVera = theList.next(); + veras.put(aVera.getName(), new VeraInfo(aVera)); + } + } + return this; + } + + @Override + public void closeHome() { + // TODO Auto-generated method stub + + } }