diff --git a/src/main/java/com/bwssystems/HABridge/BridgeSettings.java b/src/main/java/com/bwssystems/HABridge/BridgeSettings.java index 78e96c2..ee06829 100644 --- a/src/main/java/com/bwssystems/HABridge/BridgeSettings.java +++ b/src/main/java/com/bwssystems/HABridge/BridgeSettings.java @@ -65,6 +65,7 @@ public class BridgeSettings extends BackupHandler { public void buildSettings() { String addressString = null; String theVeraAddress = null; + String theFibaroAddress = null; String theSomfyAddress = null; String theHarmonyAddress = null; String configFileProperty = System.getProperty("config.file"); @@ -108,6 +109,22 @@ public class BridgeSettings extends BackupHandler { } } theBridgeSettings.setVeraAddress(theVeraList); + + theFibaroAddress = System.getProperty("fibaro.address"); + IpList theFibaroList = null; + if(theFibaroAddress != null) { + try { + theFibaroList = new Gson().fromJson(theFibaroAddress, IpList.class); + } catch (Exception e) { + try { + theFibaroList = new Gson().fromJson("{devices:[{name:default,ip:" + theFibaroAddress + "}]}", IpList.class); + } catch (Exception et) { + log.error("Cannot parse fibaro.address, not set with message: " + e.getMessage(), e); + theFibaroList = null; + } + } + } + theBridgeSettings.setFibaroAddress(theFibaroList); theHarmonyAddress = System.getProperty("harmony.address"); IpList theHarmonyList = null; @@ -182,6 +199,7 @@ public class BridgeSettings extends BackupHandler { theBridgeSettings.setButtonsleep(Integer.parseInt(Configuration.DEFAULT_BUTTON_SLEEP)); theBridgeSettings.setVeraconfigured(theBridgeSettings.isValidVera()); + theBridgeSettings.setFibaroconfigured(theBridgeSettings.isValidFibaro()); theBridgeSettings.setHarmonyconfigured(theBridgeSettings.isValidHarmony()); theBridgeSettings.setNestConfigured(theBridgeSettings.isValidNest()); theBridgeSettings.setHueconfigured(theBridgeSettings.isValidHue()); diff --git a/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java b/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java index 0968b7a..aadf4d0 100644 --- a/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java +++ b/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java @@ -30,6 +30,9 @@ public class BridgeSettingsDescriptor { @SerializedName("veraaddress") @Expose private IpList veraaddress; + @SerializedName("fibaroaddress") + @Expose + private IpList fibaroaddress; @SerializedName("harmonyaddress") @Expose private IpList harmonyaddress; @@ -97,6 +100,7 @@ public class BridgeSettingsDescriptor { private boolean settingsChanged; private boolean veraconfigured; + private boolean fibaroconfigured; private boolean harmonyconfigured; private boolean hueconfigured; private boolean nestconfigured; @@ -114,6 +118,7 @@ public class BridgeSettingsDescriptor { this.traceupnp = false; this.nestconfigured = false; this.veraconfigured = false; + this.fibaroconfigured = false; this.somfyconfigured = false; this.harmonyconfigured = false; this.hueconfigured = false; @@ -175,12 +180,18 @@ public class BridgeSettingsDescriptor { public IpList getVeraAddress() { return veraaddress; } + public IpList getFibaroAddress() { + return fibaroaddress; + } public IpList getSomfyAddress() { return somfyaddress; } public void setVeraAddress(IpList veraAddress) { this.veraaddress = veraAddress; } + public void setFibaroAddress(IpList fibaroAddress) { + this.fibaroaddress = fibaroAddress; + } public void setSomfyAddress(IpList somfyAddress) { this.somfyaddress = somfyAddress; } @@ -217,12 +228,18 @@ public class BridgeSettingsDescriptor { public boolean isVeraconfigured() { return veraconfigured; } + public boolean isFibaroconfigured() { + return fibaroconfigured; + } public boolean isSomfyconfigured() { return somfyconfigured; } public void setVeraconfigured(boolean veraconfigured) { this.veraconfigured = veraconfigured; } + public void setFibaroconfigured(boolean fibaroconfigured) { + this.fibaroconfigured = fibaroconfigured; + } public void setSomfyconfigured(boolean somfyconfigured) { this.somfyconfigured = somfyconfigured; } @@ -378,6 +395,14 @@ public class BridgeSettingsDescriptor { return false; return true; } + public Boolean isValidFibaro() { + if(this.getFibaroAddress() == null || this.getFibaroAddress().getDevices().size() <= 0) + return false; + List devicesList = this.getFibaroAddress().getDevices(); + if(devicesList.get(0).getIp().contains(Configuration.DEFAULT_ADDRESS)) + return false; + return true; + } public Boolean isValidHarmony() { if(this.getHarmonyAddress() == null || this.getHarmonyAddress().getDevices().size() <= 0) return false; diff --git a/src/main/java/com/bwssystems/HABridge/DeviceMapTypes.java b/src/main/java/com/bwssystems/HABridge/DeviceMapTypes.java index f8fae87..9c13d71 100644 --- a/src/main/java/com/bwssystems/HABridge/DeviceMapTypes.java +++ b/src/main/java/com/bwssystems/HABridge/DeviceMapTypes.java @@ -7,6 +7,8 @@ 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[] FIBARO_DEVICE = { "fibaroDevice", "Fibaro Device"}; + public final static String[] FIBARO_SCENE = { "fibaroScene", "Fibaro 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"}; @@ -57,6 +59,8 @@ public class DeviceMapTypes { deviceMapTypes.add(UDP_DEVICE); deviceMapTypes.add(VERA_DEVICE); deviceMapTypes.add(VERA_SCENE); + deviceMapTypes.add(FIBARO_DEVICE); + deviceMapTypes.add(FIBARO_SCENE); deviceMapTypes.add(SOMFY_DEVICE); } public static int getTypeIndex() { diff --git a/src/main/java/com/bwssystems/HABridge/HomeManager.java b/src/main/java/com/bwssystems/HABridge/HomeManager.java index 4bc8276..60b3bcc 100644 --- a/src/main/java/com/bwssystems/HABridge/HomeManager.java +++ b/src/main/java/com/bwssystems/HABridge/HomeManager.java @@ -19,6 +19,7 @@ import com.bwssystems.HABridge.plugins.somfy.SomfyHome; import com.bwssystems.HABridge.plugins.tcp.TCPHome; import com.bwssystems.HABridge.plugins.udp.UDPHome; import com.bwssystems.HABridge.plugins.vera.VeraHome; +import com.bwssystems.HABridge.plugins.fibaro.FibaroHome; import com.bwssystems.HABridge.util.UDPDatagramSender; public class HomeManager { @@ -73,6 +74,8 @@ public class HomeManager { 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.FIBARO_DEVICE[DeviceMapTypes.typeIndex], aHome); + homeList.put(DeviceMapTypes.FIBARO_SCENE[DeviceMapTypes.typeIndex], aHome); //setup the tcp handler Home aHome = new TCPHome(bridgeSettings); homeList.put(DeviceMapTypes.TCP_DEVICE[DeviceMapTypes.typeIndex], aHome); @@ -85,7 +88,11 @@ public class HomeManager { aHome = new VeraHome(bridgeSettings); resourceList.put(DeviceMapTypes.VERA_DEVICE[DeviceMapTypes.typeIndex], aHome); resourceList.put(DeviceMapTypes.VERA_SCENE[DeviceMapTypes.typeIndex], aHome); - //setup the Domoticz configuration if available + // Setup Fibaro Home if available + aHome = new FibaroHome(bridgeSettings); + resourceList.put(DeviceMapTypes.FIBARO_DEVICE[DeviceMapTypes.typeIndex], aHome); + resourceList.put(DeviceMapTypes.FIBARO_SCENE[DeviceMapTypes.typeIndex], aHome); + //setup the Domoticz configuration if available aHome = new DomoticzHome(bridgeSettings); homeList.put(DeviceMapTypes.DOMOTICZ_DEVICE[DeviceMapTypes.typeIndex], aHome); resourceList.put(DeviceMapTypes.DOMOTICZ_DEVICE[DeviceMapTypes.typeIndex], aHome); diff --git a/src/main/java/com/bwssystems/HABridge/NamedIP.java b/src/main/java/com/bwssystems/HABridge/NamedIP.java index b7162a2..fe8552b 100644 --- a/src/main/java/com/bwssystems/HABridge/NamedIP.java +++ b/src/main/java/com/bwssystems/HABridge/NamedIP.java @@ -2,8 +2,8 @@ package com.bwssystems.HABridge; public class NamedIP { private String name; - private String ip; - private String webhook; + private String ip; + private String webhook; private String port; private String username; private String password; diff --git a/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java b/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java index 7c2b2ac..c3067b1 100644 --- a/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java +++ b/src/main/java/com/bwssystems/HABridge/devicemanagmeent/DeviceResource.java @@ -231,6 +231,18 @@ public class DeviceResource { response.status(HttpStatus.SC_OK); return homeManager.findResource(DeviceMapTypes.VERA_DEVICE[DeviceMapTypes.typeIndex]).getItems(DeviceMapTypes.VERA_SCENE[DeviceMapTypes.typeIndex]); }, new JsonTransformer()); + + get (API_CONTEXT + "/fibaro/devices", "application/json", (request, response) -> { + log.debug("Get fibaro devices"); + response.status(HttpStatus.SC_OK); + return homeManager.findResource(DeviceMapTypes.FIBARO_DEVICE[DeviceMapTypes.typeIndex]).getItems(DeviceMapTypes.FIBARO_DEVICE[DeviceMapTypes.typeIndex]); + }, new JsonTransformer()); + + get (API_CONTEXT + "/fibaro/scenes", "application/json", (request, response) -> { + log.debug("Get fibaro scenes"); + response.status(HttpStatus.SC_OK); + return homeManager.findResource(DeviceMapTypes.FIBARO_DEVICE[DeviceMapTypes.typeIndex]).getItems(DeviceMapTypes.FIBARO_SCENE[DeviceMapTypes.typeIndex]); + }, new JsonTransformer()); get (API_CONTEXT + "/harmony/activities", "application/json", (request, response) -> { log.debug("Get harmony activities"); diff --git a/src/main/java/com/bwssystems/HABridge/plugins/fibaro/FibaroHome.java b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/FibaroHome.java new file mode 100644 index 0000000..20a7ec5 --- /dev/null +++ b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/FibaroHome.java @@ -0,0 +1,105 @@ +package com.bwssystems.HABridge.plugins.fibaro; + +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.BridgeSettings; +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.dao.DeviceDescriptor; +import com.bwssystems.HABridge.hue.MultiCommandUtil; +import com.bwssystems.HABridge.plugins.fibaro.json.Device; +import com.bwssystems.HABridge.plugins.fibaro.json.Scene; + +public class FibaroHome implements Home +{ + private static final Logger log = LoggerFactory.getLogger(FibaroHome.class); + private Map fibaros; + private Boolean validFibaro; + + public FibaroHome(BridgeSettings bridgeSettings) + { + super(); + createHome(bridgeSettings); + } + + public List getDevices() + { + log.debug("consolidating devices for fibaros"); + Iterator keys = fibaros.keySet().iterator(); + ArrayList deviceList = new ArrayList<>(); + while(keys.hasNext()) + { + String key = keys.next(); + for(Device device : fibaros.get(key).getDevices()) + deviceList.add(device); + } + return deviceList; + } + + public List getScenes() + { + log.debug("consolidating scenes for fibaros"); + Iterator keys = fibaros.keySet().iterator(); + ArrayList sceneList = new ArrayList<>(); + while(keys.hasNext()) + { + String key = keys.next(); + for(Scene scene : fibaros.get(key).getScenes()) + sceneList.add(scene); + } + return sceneList; + } + + @Override + public String deviceHandler(CallItem anItem, MultiCommandUtil aMultiUtil, String lightId, int intensity, Integer targetBri, Integer targetBriInc, DeviceDescriptor device, String body) + { + // Not a device handler + return null; + } + + @Override + public Object getItems(String type) + { + if(validFibaro) + { + if(type.equalsIgnoreCase(DeviceMapTypes.FIBARO_DEVICE[DeviceMapTypes.typeIndex])) + return getDevices(); + if(type.equalsIgnoreCase(DeviceMapTypes.FIBARO_SCENE[DeviceMapTypes.typeIndex])) + return getScenes(); + } + return null; + } + + @Override + public Home createHome(BridgeSettings bridgeSettings) + { + validFibaro = bridgeSettings.getBridgeSettingsDescriptor().isValidFibaro(); + log.info("Fibaro Home created." + (validFibaro ? "" : " No Fibaros configured.")); + if(validFibaro) + { + fibaros = new HashMap(); + Iterator theList = bridgeSettings.getBridgeSettingsDescriptor().getFibaroAddress().getDevices().iterator(); + while(theList.hasNext()) + { + NamedIP aFibaro = theList.next(); + fibaros.put(aFibaro.getName(), new FibaroInfo(aFibaro)); + } + } + return this; + } + + @Override + public void closeHome() + { + fibaros = null; + } +} \ No newline at end of file diff --git a/src/main/java/com/bwssystems/HABridge/plugins/fibaro/FibaroInfo.java b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/FibaroInfo.java new file mode 100644 index 0000000..73201a9 --- /dev/null +++ b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/FibaroInfo.java @@ -0,0 +1,178 @@ +package com.bwssystems.HABridge.plugins.fibaro; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +import org.apache.commons.codec.binary.Base64; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.bwssystems.HABridge.NamedIP; +import com.bwssystems.HABridge.plugins.fibaro.json.Device; +import com.bwssystems.HABridge.plugins.fibaro.json.Room; +import com.bwssystems.HABridge.plugins.fibaro.json.Scene; +import com.google.gson.Gson; + +public class FibaroInfo +{ + private static final Logger log = LoggerFactory.getLogger(FibaroInfo.class); + + private final NamedIP fibaroAddress; + private final String fibaroAuth; + private final Gson gson; + + // You can disable it if you want TODO config + boolean useSaveLogs = true; // This can be used to exclude some devices from list + boolean useUserDescription = true; + boolean replaceTrash = true; + boolean scenesWithLiliCommandOnly = true; + + public FibaroInfo(NamedIP addressName) + { + super(); + fibaroAddress = addressName; + fibaroAuth = "Basic " + new String(Base64.encodeBase64((addressName.getUsername() + ":" + addressName.getPassword()).getBytes())); + gson = new Gson(); + } + + private String request(String request) + { + String result = null; + try + { + URL url = new URL("http://" + fibaroAddress.getIp() + ":" + fibaroAddress.getPort() + request); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setRequestProperty("Authorization", fibaroAuth); + connection.setRequestProperty("Content-Type", "application/json;charset=utf-8"); + connection.connect(); + BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); + StringBuilder buffer = new StringBuilder(); + String line; + while((line = br.readLine()) != null) + { + buffer.append(line).append("\n"); + } + br.close(); + result = buffer.toString(); + } + catch(IOException e) + { + log.warn("Error while get getJson: {} ", request, e); + } + return result; + } + + private boolean sendCommand(String request) + { + try + { + URL url = new URL("http://" + fibaroAddress.getIp() + ":" + fibaroAddress.getPort() + request); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setRequestProperty("Authorization", fibaroAuth); + connection.getResponseMessage(); + } + catch(IOException e) + { + log.warn("Error while get getJson: {} ", request, e); + return false; + } + return true; + } + + private String replaceTrash(String name) + { + String sanitizedName = name.replaceAll("[0-9:/-]", ""); + sanitizedName = name.replaceAll("\\s+", " "); + return sanitizedName.trim(); + } + + private Room[] getRooms() + { + String result = request("/api/rooms"); + Room[] rooms = result == null ? new Room[0] : gson.fromJson(result, Room[].class); + if(replaceTrash) + for(Room r : rooms) + r.setName(replaceTrash(r.getName())); + return rooms; + } + + public Device[] getDevices() + { + Room[] rooms = getRooms(); + + log.info("Found: " + rooms.length + " rooms"); + + String result = request("/api/devices?enabled=true&visible=true"); + Device[] all_devices = result == null ? new Device[0] : gson.fromJson(result, Device[].class); + + int count = 0; + for(Device d : all_devices) + if(d.getRoomID() > 0 && (useSaveLogs ? "true".equals(d.getProperties().getSaveLogs()) : true)) + count++; + + Device[] devices = new Device[count]; + int i = 0; + for(Device d : all_devices) + if(d.getRoomID() > 0 && (useSaveLogs ? "true".equals(d.getProperties().getSaveLogs()) : true)) + { + if(useUserDescription && d.getProperties().getUserDescription() != null && !d.getProperties().getUserDescription().isEmpty()) + d.setName(d.getProperties().getUserDescription()); + if(replaceTrash) + d.setName(replaceTrash(d.getName())); + + devices[i++] = d; + + for(Room room : rooms) + if(d.getRoomID() == room.getId()) + d.setRoomName(room.getName()); + + d.fibaroaddress = fibaroAddress.getIp(); + d.fibaroport = fibaroAddress.getPort(); + d.fibaroAuth = fibaroAuth; + d.fibaroname = fibaroAddress.getName(); + } + + log.info("Found: " + devices.length + " devices"); + + return devices; + } + + public Scene[] getScenes() + { + Room[] rooms = getRooms(); + + String result = request("/api/scenes?enabled=true&visible=true"); + Scene[] all_scenes = result == null ? new Scene[0] : gson.fromJson(result, Scene[].class); + + int count = 0; + for(Scene s : all_scenes) + if(!scenesWithLiliCommandOnly || s.getLiliStartCommand() != null && !s.getLiliStartCommand().isEmpty()) + count++; + Scene[] scenes = new Scene[count]; + int i = 0; + for(Scene s : all_scenes) + if(!scenesWithLiliCommandOnly || s.getLiliStartCommand() != null && !s.getLiliStartCommand().isEmpty()) + { + if(replaceTrash) + s.setName(replaceTrash(s.getName())); + + scenes[i++] = s; + + for(Room room : rooms) + if(s.getRoomID() == room.getId()) + s.setRoomName(room.getName()); + + s.fibaroaddress = fibaroAddress.getIp(); + s.fibaroport = fibaroAddress.getPort(); + s.fibaroAuth = fibaroAuth; + s.fibaroname = fibaroAddress.getName(); + } + log.info("Found: " + count + " scenes"); + return scenes; + } +} diff --git a/src/main/java/com/bwssystems/HABridge/plugins/fibaro/ModeType.java b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/ModeType.java new file mode 100644 index 0000000..6732724 --- /dev/null +++ b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/ModeType.java @@ -0,0 +1,35 @@ +package com.bwssystems.HABridge.plugins.fibaro; + +public enum ModeType { + OFF(0, "Off"), + HEAT(1, "Heat"), + COOL(2, "Cool"), + AUTO(3, "Auto"), + AUX_HEAT(4, "Aux Heat"), + RESUME(5, "Resume"), + FAN_ONLY(6, "Fan Only"), + FURNANCE(7, "Furnace"), + DRY_AIR(8, "Dry Air"), + MOIST_AIR(9, "Moist Air"), + AUTO_CHANGEOVER(10, "Auto Changeover"), + HEAT_ECON(11, "Heat Econ"), + COOL_ECON(12, "Cool Econ"), + AWAY(13, "Away"), + MANUAL(31, "Manual"); + + private int key; + private String label; + + private ModeType(int key, String label) { + this.key = key; + this.label = label; + } + + public int getKey() { + return key; + } + + public String getLabel() { + return label; + } +} diff --git a/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/Device.java b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/Device.java new file mode 100644 index 0000000..cd12201 --- /dev/null +++ b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/Device.java @@ -0,0 +1,108 @@ +package com.bwssystems.HABridge.plugins.fibaro.json; + +import com.google.gson.annotations.SerializedName; + +public class Device { + private String roomName; + + @SerializedName("id") + private String id; + + @SerializedName("name") + private String name; + + @SerializedName("roomID") + private int roomID; + + @SerializedName("type") + private String type; + + @SerializedName("baseType") + private String baseType; + + @SerializedName("enabled") + private boolean enabled; + + @SerializedName("visible") + private boolean visible; + + @SerializedName("isPlugin") + private boolean isPlugin; + + @SerializedName("parentId") + private int parentId; + + @SerializedName("remoteGatewayId") + private int remoteGatewayId; + + @SerializedName("viewXml") + private boolean viewXml; + + @SerializedName("configXml") + private boolean configXml; + + @SerializedName("interfaces") + private Object interfaces; + + @SerializedName("properties") + private DeviceProperties properties; + + @SerializedName("actions") + private Object actions; + + @SerializedName("created") + private int created; + + @SerializedName("modified") + private int modified; + + @SerializedName("sortOrder") + private int sortOrder; + + public String getRoomName() { + return roomName; + } + + public void setRoomName(String roomName) { + this.roomName = roomName; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomID() { + return roomID; + } + + public String getType() { + return type; + } + + public DeviceProperties getProperties() { + return properties; + } + + public boolean isThermostat() { + return type.equals("com.fibaro.setPoint") || type.equals("com.fibaro.thermostatDanfoss") + || type.equals("com.fibaro.thermostatHorstmann"); + } + + @Override + public String toString() { + return "{" + id + ", " + name + "}"; + } + + public String fibaroaddress; + public String fibaroport; + public String fibaroAuth; + public String fibaroname; +} diff --git a/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/DeviceProperties.java b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/DeviceProperties.java new file mode 100644 index 0000000..9e68c48 --- /dev/null +++ b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/DeviceProperties.java @@ -0,0 +1,244 @@ +package com.bwssystems.HABridge.plugins.fibaro.json; + +import com.google.gson.annotations.SerializedName; + +public class DeviceProperties { + @SerializedName("batteryLevel") + private String batteryLevel; + + @SerializedName("UIMessageSendTime") + private String UIMessageSendTime; + + @SerializedName("autoConfig") + private String autoConfig; + + @SerializedName("color") + private String color; + + @SerializedName("date") + private String date; + + @SerializedName("dead") + private String dead; + + @SerializedName("deviceControlType") + private String deviceControlType; + + @SerializedName("deviceIcon") + private String deviceIcon; + + @SerializedName("disabled") + private String disabled; + + @SerializedName("emailNotificationID") + private String emailNotificationID; + + @SerializedName("emailNotificationType") + private String emailNotificationType; + + @SerializedName("endPoint") + private String endPoint; + + @SerializedName("energy") + private String energy; + + @SerializedName("liliOffCommand") + private String liliOffCommand; + + @SerializedName("liliOnCommand") + private String liliOnCommand; + + @SerializedName("log") + private String log; + + @SerializedName("logTemp") + private String logTemp; + + @SerializedName("manufacturer") + private String manufacturer; + + @SerializedName("markAsDead") + private String markAsDead; + + @SerializedName("mode") + private String mode; + + @SerializedName("model") + private String model; + + @SerializedName("nodeID") + private String nodeID; + + @SerializedName("pollingDeadDevice") + private String pollingDeadDevice; + + @SerializedName("pollingTime") + private String pollingTime; + + @SerializedName("pollingTimeNext") + private String pollingTimeNext; + + @SerializedName("pollingTimeSec") + private int pollingTimeSec; + + @SerializedName("power") + private String power; + + @SerializedName("productInfo") + private String productInfo; + + @SerializedName("pushNotificationID") + private String pushNotificationID; + + @SerializedName("pushNotificationType") + private String pushNotificationType; + + @SerializedName("remoteGatewayId") + private String remoteGatewayId; + + @SerializedName("requestNodeNeighborStat") + private String requestNodeNeighborStat; + + @SerializedName("requestNodeNeighborStatTimeStemp") + private String requestNodeNeighborStatTimeStemp; + + @SerializedName("requestNodeNeighborState") + private String requestNodeNeighborState; + + @SerializedName("requestNodeNeighborStateTimeStemp") + private String requestNodeNeighborStateTimeStemp; + + @SerializedName("saveLogs") + private String saveLogs; + + @SerializedName("showChildren") + private String showChildren; + + @SerializedName("smsNotificationID") + private String smsNotificationID; + + @SerializedName("smsNotificationType") + private String smsNotificationType; + + @SerializedName("supportedModes") + private String supportedModes; + + @SerializedName("targetLevel") + private String targetLevel; + + @SerializedName("unit") + private String unit; + + @SerializedName("useTemplate") + private String useTemplate; + + @SerializedName("status") + private String status; + + @SerializedName("sunriseHour") + private String sunriseHour; + + @SerializedName("sunsetHour") + private String sunsetHour; + + @SerializedName("userDescription") + private String userDescription; + + @SerializedName("value") + private String value; + + @SerializedName("zwaveBuildVersion") + private String zwaveBuildVersion; + + @SerializedName("zwaveCompany") + private String zwaveCompany; + + @SerializedName("zwaveInfo") + private String zwaveInfo; + + @SerializedName("zwaveRegion") + private String zwaveRegion; + + @SerializedName("zwaveVersion") + private double zwaveVersion; + + public String getBatteryLevel() { + return batteryLevel; + } + + public String getColor() { + return color; + } + + public String getDeviceControlType() { + return deviceControlType; + } + + public String getEnergy() { + return energy; + } + + public String getPower() { + return power; + } + + public String getTargetLevel() { + return targetLevel; + } + + public String getValue() { + return value; + } + + // --- begin yrWeather plugin --- + @SerializedName("Humidity") + private String Humidity; + + @SerializedName("Pressure") + private String Pressure; + + @SerializedName("Temperature") + private String Temperature; + + @SerializedName("WeatherCondition") + private String WeatherCondition; + + @SerializedName("Wind") + private String Wind; + + public String getHumidity() { + return Humidity; + } + + public String getPressure() { + return Pressure; + } + + public String getSaveLogs() + { + return saveLogs; + } + + public String getTemperature() { + return Temperature; + } + + public String getWeatherCondition() { + return WeatherCondition; + } + + public String getWind() { + return Wind; + } + // --- end yrWeather plugin --- + + public String getUserDescription() + { + return userDescription; + } + + public void setUserDescription(String userDescription) + { + this.userDescription = userDescription; + } +} diff --git a/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/Room.java b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/Room.java new file mode 100644 index 0000000..5aed4d3 --- /dev/null +++ b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/Room.java @@ -0,0 +1,43 @@ +package com.bwssystems.HABridge.plugins.fibaro.json; + +import com.google.gson.annotations.SerializedName; + +public class Room { + @SerializedName("id") + private int id; + + @SerializedName("name") + private String name; + + @SerializedName("sectionID") + private int sectionID; + + @SerializedName("icon") + private String icon; + + @SerializedName("defaultSensors") + private Sensor defaultSensors; + + @SerializedName("defaultThermostat") + private int defaultThermostat; + + @SerializedName("sortOrder") + private int sortOrder; + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getSectionID() + { + return sectionID; + } +} \ No newline at end of file diff --git a/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/Scene.java b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/Scene.java new file mode 100644 index 0000000..bf8c430 --- /dev/null +++ b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/Scene.java @@ -0,0 +1,100 @@ +package com.bwssystems.HABridge.plugins.fibaro.json; + +import com.google.gson.annotations.SerializedName; + +public class Scene { + private String roomName; + + @SerializedName("id") + private String id; + + @SerializedName("name") + private String name; + + @SerializedName("type") + private String type; + + @SerializedName("properties") + private String properties; + + @SerializedName("roomID") + private int roomID; + + @SerializedName("iconID") + private int iconID; + + @SerializedName("runConfig") + private String runConfig; + + @SerializedName("autostart") + private boolean autostart; + + @SerializedName("protectedByPIN") + private boolean protectedByPIN; + + @SerializedName("killable") + private boolean killable; + + @SerializedName("maxRunningInstances") + private int maxRunningInstances; + + @SerializedName("runningInstances") + private int runningInstances; + + @SerializedName("visible") + private boolean visible; + + @SerializedName("isLua") + private boolean isLua; + + @SerializedName("triggers") + private SceneTriggers triggers; + + @SerializedName("liliStartCommand") + private String liliStartCommand; + + @SerializedName("liliStopCommand") + private String liliStopCommand; + + @SerializedName("sortOrder") + private int sortOrder; + + public String getRoomName() { + return roomName; + } + + public void setRoomName(String roomName) { + this.roomName = roomName; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomID() { + return roomID; + } + + public String getLiliStartCommand() + { + return liliStartCommand; + } + + @Override + public String toString() { + return "{" + id + ", " + name + "}"; + } + + public String fibaroaddress; + public String fibaroport; + public String fibaroAuth; + public String fibaroname; +} \ No newline at end of file diff --git a/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/SceneProperties.java b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/SceneProperties.java new file mode 100644 index 0000000..99ece4e --- /dev/null +++ b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/SceneProperties.java @@ -0,0 +1,11 @@ +package com.bwssystems.HABridge.plugins.fibaro.json; + +import com.google.gson.annotations.SerializedName; + +public class SceneProperties { + @SerializedName("id") + private String id; + + @SerializedName("name") + private String name; +} diff --git a/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/SceneTriggers.java b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/SceneTriggers.java new file mode 100644 index 0000000..9b0f761 --- /dev/null +++ b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/SceneTriggers.java @@ -0,0 +1,14 @@ +package com.bwssystems.HABridge.plugins.fibaro.json; + +import com.google.gson.annotations.SerializedName; + +public class SceneTriggers { + @SerializedName("properties") + private SceneProperties[] properties; + + @SerializedName("globals") + private String[] globals; + + @SerializedName("events") + private String[] events; +} diff --git a/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/Sensor.java b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/Sensor.java new file mode 100644 index 0000000..8875995 --- /dev/null +++ b/src/main/java/com/bwssystems/HABridge/plugins/fibaro/json/Sensor.java @@ -0,0 +1,14 @@ +package com.bwssystems.HABridge.plugins.fibaro.json; + +import com.google.gson.annotations.SerializedName; + +public class Sensor { + @SerializedName("temperature") + private int temperature; + + @SerializedName("humidity") + private int humidity; + + @SerializedName("light") + private int light; +} diff --git a/src/main/resources/public/scripts/app.js b/src/main/resources/public/scripts/app.js index e1a8839..9c59d11 100644 --- a/src/main/resources/public/scripts/app.js +++ b/src/main/resources/public/scripts/app.js @@ -26,7 +26,15 @@ app.config (function ($locationProvider, $routeProvider) { }).when ('/verascenes', { templateUrl: 'views/verascene.html', controller: 'VeraController', + requiresAuthentication: true + }).when ('/fibarodevices', { + templateUrl: 'views/fibarodevice.html', + controller: 'FibaroController', requiresAuthentication: true + }).when ('/fibaroscenes', { + templateUrl: 'views/fibaroscene.html', + controller: 'FibaroController', + requiresAuthentication: true }).when ('/harmonydevices', { templateUrl: 'views/harmonydevice.html', controller: 'HarmonyController', @@ -133,7 +141,7 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n var self = this; this.state = {base: "./api/devices", bridgelocation: ".", systemsbase: "./system", huebase: "./api", configs: [], backups: [], devices: [], device: {}, mapandid: [], type: "", settings: [], myToastMsg: [], logMsgs: [], loggerInfo: [], mapTypes: [], olddevicename: "", logShowAll: false, - isInControl: false, showVera: false, showHarmony: false, showNest: false, showHue: false, showHal: false, showMqtt: false, showHass: false, + isInControl: false, showVera: false, showFibaro: false, showHarmony: false, showNest: false, showHue: false, showHal: false, showMqtt: false, showHass: false, showDomoticz: false, showSomfy: false, showLifx: false, habridgeversion: {}, viewDevId: "", queueDevId: "", securityInfo: {}, filterDevicesByIpAddress: null, filterDevicesOnlyFiltered: false, filterDeviceType: null}; @@ -459,6 +467,11 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n this.state.showVera = self.state.settings.veraconfigured; return; } + + this.updateShowFibaro = function () { + this.state.showFibaro = self.state.settings.fibaroconfigured; + return; + } this.updateShowNest = function () { this.state.showNest = self.state.settings.nestconfigured; @@ -510,6 +523,7 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n function (response) { self.state.settings = response.data; self.updateShowVera(); + self.updateShowFibaro(); self.updateShowHarmony(); self.updateShowNest(); self.updateShowHue(); @@ -648,6 +662,38 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n } ); }; + + this.viewFibaroDevices = function () { + if(!this.state.showFibaro) + return; + return $http.get(this.state.base + "/fibaro/devices").then( + function (response) { + self.state.fibarodevices = response.data; + }, + function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else + self.displayWarn("Get Fibaro Devices Error: ", error); + } + ); + }; + + this.viewFibaroScenes = function () { + if(!this.state.showFibaro) + return; + return $http.get(this.state.base + "/fibaro/scenes").then( + function (response) { + self.state.fibaroscenes = response.data; + }, + function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else + self.displayWarn("Get Fibaro Scenes Error: ", error); + } + ); + }; this.viewHarmonyActivities = function () { if (!this.state.showHarmony) @@ -1313,6 +1359,25 @@ app.controller ('SystemController', function ($scope, $location, bridgeService, } } }; + $scope.addFibarotoSettings = function (newfibaroname, newfibaroip, newfibaroport, newfibarousername, newfibaropassword) { + if($scope.bridge.settings.fibaroaddress === undefined || $scope.bridge.settings.fibaroaddress === null) { + $scope.bridge.settings.fibaroaddress = { devices: [] }; + } + var newFibaro = {name: newfibaroname, ip: newfibaroip, port: newfibaroport, username: newfibarousername, password: newfibaropassword } + $scope.bridge.settings.fibaroaddress.devices.push(newFibaro); + $scope.newfibaroname = null; + $scope.newfibaroip = null; + $scope.newfibaroport = null; + $scope.newfibarousername = null; + $scope.newfibaropassword = null; + }; + $scope.removeFibarotoSettings = function (fibaroname, fibaroip, fibaroport) { + for(var i = $scope.bridge.settings.fibaroaddress.devices.length - 1; i >= 0; i--) { + if($scope.bridge.settings.fibaroaddress.devices[i].name === fibaroname && $scope.bridge.settings.fibaroaddress.devices[i].ip === fibaroip && $scope.bridge.settings.fibaroaddress.devices[i].port === fibaroport) { + $scope.bridge.settings.fibaroaddress.devices.splice(i, 1); + } + } + }; $scope.addHarmonytoSettings = function (newharmonyname, newharmonyip, newharmonywebhook) { if($scope.bridge.settings.harmonyaddress === undefined || $scope.bridge.settings.harmonyaddress === null) { $scope.bridge.settings.harmonyaddress = { devices: [] }; @@ -1927,6 +1992,148 @@ app.controller('VeraController', function ($scope, $location, bridgeService, ngD }; }); +app.controller('FibaroController', function ($scope, $location, bridgeService, ngDialog) { + $scope.bridge = bridgeService.state; + $scope.device = bridgeService.state.device; + $scope.device_dim_control = ""; + $scope.bulk = { devices: [] }; + $scope.selectAll = false; + $scope.fibaro = {base: "http://", port: "80", id: ""}; + bridgeService.viewFibaroDevices(); + bridgeService.viewFibaroScenes(); + $scope.imgButtonsUrl = "glyphicon glyphicon-plus"; + $scope.buttonsVisible = false; + $scope.comparatorUniqueId = bridgeService.compareUniqueId; + + $scope.clearDevice = function () { + bridgeService.clearDevice(); + $scope.device = bridgeService.state.device; + }; + + $scope.buildDeviceUrls = function (fibarodevice, dim_control, buildonly) { + if(dim_control.indexOf("byte") >= 0 || dim_control.indexOf("percent") >= 0 || dim_control.indexOf("math") >= 0) + dimpayload = "http://" + fibarodevice.fibaroaddress + ":" + fibarodevice.fibaroport + "/api/callAction?deviceID=" + fibarodevice.id + "&name=setValue&arg1=" + dim_control; + + onpayload = "http://" + fibarodevice.fibaroaddress + ":" + fibarodevice.fibaroport + "/api/callAction?deviceID=" + fibarodevice.id + "&name=turnOn"; + offpayload = "http://" + fibarodevice.fibaroaddress + ":" + fibarodevice.fibaroport + "/api/callAction?deviceID=" + fibarodevice.id + "&name=turnOff"; + + bridgeService.buildUrls(onpayload, dimpayload, offpayload, false, fibarodevice.id, fibarodevice.name, fibarodevice.fibaroname, "switch", "fibaroDevice", null, null); + bridgeService.state.device.headers = "[{\"name\":\"Authorization\",\"value\":\"" + fibarodevice.fibaroAuth + "\"}]"; + $scope.device = bridgeService.state.device; + if (!buildonly) { + bridgeService.editNewDevice($scope.device); + $location.path('/editdevice'); + } + }; + + $scope.buildSceneUrls = function (fibaroscene) { + onpayload = "http://" + fibaroscene.fibaroaddress + ":" + fibaroscene.fibaroport + "/api/sceneControl?id=" + fibaroscene.id + "&action=start"; + offpayload = "http://" + fibaroscene.fibaroaddress + ":" + fibaroscene.fibaroport + "/api/sceneControl?id=" + fibaroscene.id + "&action=stop"; + + bridgeService.buildUrls(onpayload, null, offpayload, false, fibaroscene.id, fibaroscene.name, fibaroscene.fibaroname, "scene", "fibaroScene", null, null); + bridgeService.state.device.headers = "[{\"name\":\"Authorization\",\"value\":\"" + fibaroscene.fibaroAuth + "\"}]"; + $scope.device = bridgeService.state.device; + bridgeService.editNewDevice($scope.device); + $location.path('/editdevice'); + }; + + $scope.bulkAddDevices = function(dim_control) { + var devicesList = []; + $scope.clearDevice(); + for(var i = 0; i < $scope.bulk.devices.length; i++) { + for(var x = 0; x < bridgeService.state.fibarodevices.length; x++) { + if(bridgeService.state.fibarodevices[x].id === $scope.bulk.devices[i]) { + $scope.buildDeviceUrls(bridgeService.state.fibarodevices[x],dim_control,true); + devicesList[i] = { + name: $scope.device.name, + mapId: $scope.device.mapId, + mapType: $scope.device.mapType, + deviceType: $scope.device.deviceType, + targetDevice: $scope.device.targetDevice, + onUrl: $scope.device.onUrl, + dimUrl: $scope.device.dimUrl, + offUrl: $scope.device.offUrl, + headers: $scope.device.headers, + httpVerb: $scope.device.httpVerb, + contentType: $scope.device.contentType, + contentBody: $scope.device.contentBody, + contentBodyDim: $scope.device.contentBodyDim, + contentBodyOff: $scope.device.contentBodyOff + }; + $scope.clearDevice(); + } + } + } + bridgeService.bulkAddDevice(devicesList).then( + function () { + $scope.clearDevice(); + bridgeService.viewDevices(); + bridgeService.viewfibaroDevices(); + bridgeService.viewfibaroScenes(); + }, + function (error) { + bridgeService.displayWarn("Error adding fibaro devices in bulk.", error) + } + ); + $scope.bulk = { devices: [] }; + $scope.selectAll = false; + }; + + $scope.toggleSelection = function toggleSelection(deviceId) { + var idx = $scope.bulk.devices.indexOf(deviceId); + + // is currently selected + if (idx > -1) { + $scope.bulk.devices.splice(idx, 1); + if($scope.bulk.devices.length === 0 && $scope.selectAll) + $scope.selectAll = false; + } + + // is newly selected + else { + $scope.bulk.devices.push(deviceId); + $scope.selectAll = true; + } + }; + + $scope.toggleSelectAll = function toggleSelectAll() { + if($scope.selectAll) { + $scope.selectAll = false; + $scope.bulk = { devices: [] }; + } + else { + $scope.selectAll = true; + for(var x = 0; x < bridgeService.state.fibarodevices.length; x++) { + if($scope.bulk.devices.indexOf(bridgeService.state.fibarodevices[x]) < 0) + $scope.bulk.devices.push(bridgeService.state.fibarodevices[x].id); + } + } + }; + + $scope.toggleButtons = function () { + $scope.buttonsVisible = !$scope.buttonsVisible; + if($scope.buttonsVisible) + $scope.imgButtonsUrl = "glyphicon glyphicon-minus"; + else + $scope.imgButtonsUrl = "glyphicon glyphicon-plus"; + }; + + $scope.deleteDevice = function (device) { + $scope.bridge.device = device; + ngDialog.open({ + template: 'deleteDialog', + controller: 'DeleteDialogCtrl', + className: 'ngdialog-theme-default' + }); + }; + + $scope.editDevice = function (device) { + bridgeService.editDevice(device); + $location.path('/editdevice'); + }; +}); + + app.controller('HarmonyController', function ($scope, $location, bridgeService, ngDialog) { $scope.bridge = bridgeService.state; $scope.device = bridgeService.state.device; @@ -3323,6 +3530,34 @@ app.filter('configuredVeraScenes', function (bridgeService) { } }); +app.filter('configuredFibaroDevices', function (bridgeService) { + return function(input) { + var out = []; + if(input === undefined || input === null || input.length === undefined) + return out; + for (var i = 0; i < input.length; i++) { + if(bridgeService.deviceContainsType(input[i], "fibaroDevice")){ + out.push(input[i]); + } + } + return out; + } +}); + +app.filter('configuredFibaroScenes', function (bridgeService) { + return function(input) { + var out = []; + if(input === undefined || input === null || input.length === undefined) + return out; + for (var i = 0; i < input.length; i++) { + if(bridgeService.deviceContainsType(input[i], "fibaroScene")){ + out.push(input[i]); + } + } + return out; + } +}); + app.filter('configuredNestItems', function (bridgeService) { return function(input) { var out = []; diff --git a/src/main/resources/public/views/configuration.html b/src/main/resources/public/views/configuration.html index 7f54f7a..eebbbdd 100644 --- a/src/main/resources/public/views/configuration.html +++ b/src/main/resources/public/views/configuration.html @@ -8,6 +8,10 @@ href="#!/veradevices">Vera Devices
  • Vera Scenes
  • +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony Activities
  • Vera Devices
  • Vera Scenes
  • +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony Activities
  • Vera Devices
  • Vera Scenes
  • +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony Activities
  • +
  • Bridge Devices
  • +
  • Bridge Control
  • +
  • Logs
  • +
  • Vera Devices
  • +
  • Vera Scenes
  • + +
  • Fibaro Scenes
  • +
  • Harmony Activities
  • +
  • Harmony Devices
  • +
  • Nest
  • +
  • Hue Devices
  • +
  • HAL Devices
  • +
  • MQTT Messages
  • +
  • HomeAssistant Devices
  • +
  • Domoticz Devices
  • +
  • Somfy Devices
  • +
  • LIFX Devices
  • +
  • Add/Edit
  • + + +
    +
    +

    Fibaro Device List + ({{bridge.fibarodevices.length}})

    +
    +
    +

    For any Fibaro Device, use the build action buttons + to generate the item addition information into the ha-bridge device + and this will put you into the edit screen. Then + you can modify the name to anything you want that will be the keyword + for the Echo or Google Home. Also, you can go back to any helper tab and click a build + action button to add another item for a multi-command. After you are + done in the edit tab, click the 'Add Bridge Device' to finish that selection + setup. The 'Already Configured Fibaro Devices' list below will show + what is already setup for your Fibaro.

    +

    + Also, use this select menu for which type of dim control you would + like to be generated: +

    +

    Use the check boxes by the names to use the bulk addition + feature. Select your items and dim control type if wanted, then click + bulk add below. Your items will be added with on and off or dim and + off if selected with the name of the device from the Fibaro.

    + + + + + + + + + + + + + + + + + + + + + + +
    Row NameIdRoomFibaroValueBuild Actions
    {{$index+1}} + {{fibarodevice.name}}{{fibarodevice.id}}{{fibarodevice.roomName}}{{fibarodevice.fibaroname}}{{fibarodevice.properties.value}} + +
    +
    + +
    +
    +
    +
    +

    + Already Configured Fibaro Devices +

    +
    +
    + + + + + + + + + + + + + + + + + + +
    RowNameFibaroMap IdActions
    {{$index+1}}{{device.name}}{{device.targetDevice}}{{device.mapId}} +

    + + +

    +
    +
    +
    +
    + \ No newline at end of file diff --git a/src/main/resources/public/views/fibaroscene.html b/src/main/resources/public/views/fibaroscene.html new file mode 100644 index 0000000..c5c35fa --- /dev/null +++ b/src/main/resources/public/views/fibaroscene.html @@ -0,0 +1,114 @@ + + +
    +
    +

    Fibaro Scene List

    +
    +
    +

    For any Fibaro Scene, use the build action buttons + to generate the item addition information into the ha-bridge device and this will put you into the edit screen. Then + you can modify the name to anything you want that will be the keyword + for the Echo or Google Home. Also, you can go back to any helper tab and click a build + action button to add another item for a multi-command. After you are + done in the edit tab, click the 'Add Bridge Device' to finish that selection + setup. The 'Already Configured Fibaro Scenes' list below will show what + is already setup for your Fibaro.

    + + + + + + + + + + + + + + + + + + + + + +
    RowNameIdRoomFibaroBuild Actions
    {{$index+1}}{{fibaroscene.name}}{{fibaroscene.id}}{{fibaroscene.roomName}}{{fibaroscene.fibaroname}} + +
    +
    +
    +
    +
    +
    +

    + Already Configured Fibaro Scenes +

    +
    +
    + + + + + + + + + + + + + + + + + + +
    RowNameFibaroMap IdActions
    {{$index+1}}{{device.name}}{{device.targetDevice}}{{device.mapId}} +

    + + +

    +
    +
    +
    +
    + \ No newline at end of file diff --git a/src/main/resources/public/views/haldevice.html b/src/main/resources/public/views/haldevice.html index ad0fbd6..37f6bc7 100644 --- a/src/main/resources/public/views/haldevice.html +++ b/src/main/resources/public/views/haldevice.html @@ -6,6 +6,10 @@ href="#!/veradevices">Vera Devices
  • Vera Scenes
  • +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony Activities
  • Vera Devices
  • Vera Scenes
  • +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony diff --git a/src/main/resources/public/views/harmonydevice.html b/src/main/resources/public/views/harmonydevice.html index 5fbb3d3..a62adf0 100644 --- a/src/main/resources/public/views/harmonydevice.html +++ b/src/main/resources/public/views/harmonydevice.html @@ -6,6 +6,10 @@ href="#!/veradevices">Vera Devices
  • Vera Scenes
  • +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony Activities
  • Vera Scenes
  • +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony Activities
  • Vera Devices
  • Vera Scenes
  • +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony Activities
  • Logs
  • Vera Devices
  • Vera Scenes
  • +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony Activities
  • Harmony Devices
  • Nest
  • diff --git a/src/main/resources/public/views/logs.html b/src/main/resources/public/views/logs.html index c1d853c..fca1aee 100644 --- a/src/main/resources/public/views/logs.html +++ b/src/main/resources/public/views/logs.html @@ -6,6 +6,10 @@ href="#!/veradevices">Vera Devices
  • Vera Scenes
  • +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony Activities
  • Logs
  • Vera Devices
  • Vera Scenes
  • +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony Activities
  • Harmony Devices
  • Nest
  • diff --git a/src/main/resources/public/views/nestactions.html b/src/main/resources/public/views/nestactions.html index c91cff6..34875b9 100644 --- a/src/main/resources/public/views/nestactions.html +++ b/src/main/resources/public/views/nestactions.html @@ -6,6 +6,10 @@ href="#!/veradevices">Vera Devices
  • Vera Scenes
  • +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony Activities
  • Bridge Devices
  • Bridge Control
  • Logs
  • -
  • Vera - Devices
  • +
  • Vera Devices
  • Vera Scenes
  • +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony Activities
  • Vera Devices
  • Vera Scenes
  • +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony Activities
  • + + Fibaro Names and IP Addresses + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameIPPortUsernamePassword Manage
    {{fibaro.name}}{{fibaro.ip}}{{fibaro.port}}{{fibaro.username}}*******
    + Harmony Names and IP Addresses Bridge Devices
  • Bridge Control
  • Logs
  • - +
  • Vera Scenes
  • +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony Activities
  • Bridge Control
  • Logs
  • Vera Devices
  • - + +
  • Fibaro Devices
  • +
  • Fibaro Scenes
  • Harmony Activities