fibaro HC2 support

This commit is contained in:
diamond
2017-05-04 03:19:03 +03:00
parent ebeb6be7a7
commit d36769e2a0
29 changed files with 1041 additions and 8 deletions

View File

@@ -65,6 +65,7 @@ public class BridgeSettings extends BackupHandler {
public void buildSettings() { public void buildSettings() {
String addressString = null; String addressString = null;
String theVeraAddress = null; String theVeraAddress = null;
String theFibaroAddress = null;
String theSomfyAddress = null; String theSomfyAddress = null;
String theHarmonyAddress = null; String theHarmonyAddress = null;
String configFileProperty = System.getProperty("config.file"); String configFileProperty = System.getProperty("config.file");
@@ -107,6 +108,22 @@ public class BridgeSettings extends BackupHandler {
} }
} }
theBridgeSettings.setVeraAddress(theVeraList); 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"); theHarmonyAddress = System.getProperty("harmony.address");
IpList theHarmonyList = null; IpList theHarmonyList = null;
@@ -178,6 +195,7 @@ public class BridgeSettings extends BackupHandler {
theBridgeSettings.setButtonsleep(Integer.parseInt(Configuration.DEFAULT_BUTTON_SLEEP)); theBridgeSettings.setButtonsleep(Integer.parseInt(Configuration.DEFAULT_BUTTON_SLEEP));
theBridgeSettings.setVeraconfigured(theBridgeSettings.isValidVera()); theBridgeSettings.setVeraconfigured(theBridgeSettings.isValidVera());
theBridgeSettings.setFibaroconfigured(theBridgeSettings.isValidFibaro());
theBridgeSettings.setHarmonyconfigured(theBridgeSettings.isValidHarmony()); theBridgeSettings.setHarmonyconfigured(theBridgeSettings.isValidHarmony());
theBridgeSettings.setNestConfigured(theBridgeSettings.isValidNest()); theBridgeSettings.setNestConfigured(theBridgeSettings.isValidNest());
theBridgeSettings.setHueconfigured(theBridgeSettings.isValidHue()); theBridgeSettings.setHueconfigured(theBridgeSettings.isValidHue());

View File

@@ -24,6 +24,9 @@ public class BridgeSettingsDescriptor {
@SerializedName("veraaddress") @SerializedName("veraaddress")
@Expose @Expose
private IpList veraaddress; private IpList veraaddress;
@SerializedName("fibaroaddress")
@Expose
private IpList fibaroaddress;
@SerializedName("harmonyaddress") @SerializedName("harmonyaddress")
@Expose @Expose
private IpList harmonyaddress; private IpList harmonyaddress;
@@ -91,6 +94,7 @@ public class BridgeSettingsDescriptor {
private boolean settingsChanged; private boolean settingsChanged;
private boolean veraconfigured; private boolean veraconfigured;
private boolean fibaroconfigured;
private boolean harmonyconfigured; private boolean harmonyconfigured;
private boolean hueconfigured; private boolean hueconfigured;
private boolean nestconfigured; private boolean nestconfigured;
@@ -107,6 +111,7 @@ public class BridgeSettingsDescriptor {
this.traceupnp = false; this.traceupnp = false;
this.nestconfigured = false; this.nestconfigured = false;
this.veraconfigured = false; this.veraconfigured = false;
this.fibaroconfigured = false;
this.somfyconfigured = false; this.somfyconfigured = false;
this.harmonyconfigured = false; this.harmonyconfigured = false;
this.hueconfigured = false; this.hueconfigured = false;
@@ -153,12 +158,18 @@ public class BridgeSettingsDescriptor {
public IpList getVeraAddress() { public IpList getVeraAddress() {
return veraaddress; return veraaddress;
} }
public IpList getFibaroAddress() {
return fibaroaddress;
}
public IpList getSomfyAddress() { public IpList getSomfyAddress() {
return somfyaddress; return somfyaddress;
} }
public void setVeraAddress(IpList veraAddress) { public void setVeraAddress(IpList veraAddress) {
this.veraaddress = veraAddress; this.veraaddress = veraAddress;
} }
public void setFibaroAddress(IpList fibaroAddress) {
this.fibaroaddress = fibaroAddress;
}
public void setSomfyAddress(IpList somfyAddress) { public void setSomfyAddress(IpList somfyAddress) {
this.somfyaddress = somfyAddress; this.somfyaddress = somfyAddress;
} }
@@ -195,12 +206,18 @@ public class BridgeSettingsDescriptor {
public boolean isVeraconfigured() { public boolean isVeraconfigured() {
return veraconfigured; return veraconfigured;
} }
public boolean isFibaroconfigured() {
return fibaroconfigured;
}
public boolean isSomfyconfigured() { public boolean isSomfyconfigured() {
return somfyconfigured; return somfyconfigured;
} }
public void setVeraconfigured(boolean veraconfigured) { public void setVeraconfigured(boolean veraconfigured) {
this.veraconfigured = veraconfigured; this.veraconfigured = veraconfigured;
} }
public void setFibaroconfigured(boolean fibaroconfigured) {
this.fibaroconfigured = fibaroconfigured;
}
public void setSomfyconfigured(boolean somfyconfigured) { public void setSomfyconfigured(boolean somfyconfigured) {
this.somfyconfigured = somfyconfigured; this.somfyconfigured = somfyconfigured;
} }
@@ -356,6 +373,14 @@ public class BridgeSettingsDescriptor {
return false; return false;
return true; return true;
} }
public Boolean isValidFibaro() {
if(this.getFibaroAddress() == null || this.getFibaroAddress().getDevices().size() <= 0)
return false;
List<NamedIP> devicesList = this.getFibaroAddress().getDevices();
if(devicesList.get(0).getIp().contains(Configuration.DEFAULT_ADDRESS))
return false;
return true;
}
public Boolean isValidHarmony() { public Boolean isValidHarmony() {
if(this.getHarmonyAddress() == null || this.getHarmonyAddress().getDevices().size() <= 0) if(this.getHarmonyAddress() == null || this.getHarmonyAddress().getDevices().size() <= 0)
return false; return false;

View File

@@ -7,6 +7,8 @@ public class DeviceMapTypes {
public final static String[] CUSTOM_DEVICE = { "custom", "Custom"}; public final static String[] CUSTOM_DEVICE = { "custom", "Custom"};
public final static String[] VERA_DEVICE = { "veraDevice", "Vera Device"}; public final static String[] VERA_DEVICE = { "veraDevice", "Vera Device"};
public final static String[] VERA_SCENE = { "veraScene", "Vera Scene"}; 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_ACTIVITY = { "harmonyActivity", "Harmony Activity"};
public final static String[] HARMONY_BUTTON = { "harmonyButton", "Harmony Button"}; public final static String[] HARMONY_BUTTON = { "harmonyButton", "Harmony Button"};
public final static String[] NEST_HOMEAWAY = { "nestHomeAway", "Nest Home Status"}; public final static String[] NEST_HOMEAWAY = { "nestHomeAway", "Nest Home Status"};
@@ -57,6 +59,8 @@ public class DeviceMapTypes {
deviceMapTypes.add(UDP_DEVICE); deviceMapTypes.add(UDP_DEVICE);
deviceMapTypes.add(VERA_DEVICE); deviceMapTypes.add(VERA_DEVICE);
deviceMapTypes.add(VERA_SCENE); deviceMapTypes.add(VERA_SCENE);
deviceMapTypes.add(FIBARO_DEVICE);
deviceMapTypes.add(FIBARO_SCENE);
deviceMapTypes.add(SOMFY_DEVICE); deviceMapTypes.add(SOMFY_DEVICE);
} }
public static int getTypeIndex() { public static int getTypeIndex() {

View File

@@ -19,6 +19,7 @@ import com.bwssystems.HABridge.plugins.somfy.SomfyHome;
import com.bwssystems.HABridge.plugins.tcp.TCPHome; import com.bwssystems.HABridge.plugins.tcp.TCPHome;
import com.bwssystems.HABridge.plugins.udp.UDPHome; import com.bwssystems.HABridge.plugins.udp.UDPHome;
import com.bwssystems.HABridge.plugins.vera.VeraHome; import com.bwssystems.HABridge.plugins.vera.VeraHome;
import com.bwssystems.HABridge.plugins.fibaro.FibaroHome;
import com.bwssystems.HABridge.util.UDPDatagramSender; import com.bwssystems.HABridge.util.UDPDatagramSender;
public class HomeManager { public class HomeManager {
@@ -73,6 +74,8 @@ public class HomeManager {
homeList.put(DeviceMapTypes.CUSTOM_DEVICE[DeviceMapTypes.typeIndex], aHome); homeList.put(DeviceMapTypes.CUSTOM_DEVICE[DeviceMapTypes.typeIndex], aHome);
homeList.put(DeviceMapTypes.VERA_DEVICE[DeviceMapTypes.typeIndex], aHome); homeList.put(DeviceMapTypes.VERA_DEVICE[DeviceMapTypes.typeIndex], aHome);
homeList.put(DeviceMapTypes.VERA_SCENE[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 //setup the tcp handler Home
aHome = new TCPHome(bridgeSettings); aHome = new TCPHome(bridgeSettings);
homeList.put(DeviceMapTypes.TCP_DEVICE[DeviceMapTypes.typeIndex], aHome); homeList.put(DeviceMapTypes.TCP_DEVICE[DeviceMapTypes.typeIndex], aHome);
@@ -85,7 +88,11 @@ public class HomeManager {
aHome = new VeraHome(bridgeSettings); aHome = new VeraHome(bridgeSettings);
resourceList.put(DeviceMapTypes.VERA_DEVICE[DeviceMapTypes.typeIndex], aHome); resourceList.put(DeviceMapTypes.VERA_DEVICE[DeviceMapTypes.typeIndex], aHome);
resourceList.put(DeviceMapTypes.VERA_SCENE[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); aHome = new DomoticzHome(bridgeSettings);
homeList.put(DeviceMapTypes.DOMOTICZ_DEVICE[DeviceMapTypes.typeIndex], aHome); homeList.put(DeviceMapTypes.DOMOTICZ_DEVICE[DeviceMapTypes.typeIndex], aHome);
resourceList.put(DeviceMapTypes.DOMOTICZ_DEVICE[DeviceMapTypes.typeIndex], aHome); resourceList.put(DeviceMapTypes.DOMOTICZ_DEVICE[DeviceMapTypes.typeIndex], aHome);

View File

@@ -214,6 +214,18 @@ public class DeviceResource {
response.status(HttpStatus.SC_OK); response.status(HttpStatus.SC_OK);
return homeManager.findResource(DeviceMapTypes.VERA_DEVICE[DeviceMapTypes.typeIndex]).getItems(DeviceMapTypes.VERA_SCENE[DeviceMapTypes.typeIndex]); return homeManager.findResource(DeviceMapTypes.VERA_DEVICE[DeviceMapTypes.typeIndex]).getItems(DeviceMapTypes.VERA_SCENE[DeviceMapTypes.typeIndex]);
}, new JsonTransformer()); }, 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) -> { get (API_CONTEXT + "/harmony/activities", "application/json", (request, response) -> {
log.debug("Get harmony activities"); log.debug("Get harmony activities");

View File

@@ -0,0 +1,75 @@
package com.bwssystems.HABridge.plugins.fibaro;
public class Device
{
public int id;
public String name;
public int roomID;
public String type;
public String baseType;
public boolean enabled;
public boolean visible;
public boolean isPlugin;
public int parentId;
public int remoteGatewayId;
public boolean viewXml;
public boolean configXml;
public Object interfaces;
public Properties properties;
public Object actions;
public int created;
public int modified;
public int sortOrder;
public class Properties {
public String UIMessageSendTime;
public String autoConfig;
public String date;
public String dead;
public String deviceControlType;
public String deviceIcon;
public String disabled;
public String emailNotificationID;
public String emailNotificationType;
public String endPoint;
public String liliOffCommand;
public String liliOnCommand;
public String log;
public String logTemp;
public String manufacturer;
public String markAsDead;
public String model;
public String nodeID;
public String pollingDeadDevice;
public String pollingTime;
public String pollingTimeNext;
public int pollingTimeSec;
public String productInfo;
public String pushNotificationID;
public String pushNotificationType;
public String remoteGatewayId;
public String requestNodeNeighborStat;
public String requestNodeNeighborStatTimeStemp;
public String requestNodeNeighborState;
public String requestNodeNeighborStateTimeStemp;
public String saveLogs;
public String showChildren;
public String smsNotificationID;
public String smsNotificationType;
public String status;
public String sunriseHour;
public String sunsetHour;
public String userDescription;
public String value;
public String zwaveBuildVersion;
public String zwaveCompany;
public String zwaveInfo;
public String zwaveRegion;
public double zwaveVersion;
}
public String room;
public String category;
public String fibaroaddress;
public String fibaroname;
}

View File

@@ -0,0 +1,103 @@
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;
public class FibaroHome implements Home
{
private static final Logger log = LoggerFactory.getLogger(FibaroHome.class);
private Map<String, FibaroInfo> fibaros;
private Boolean validFibaro;
public FibaroHome(BridgeSettings bridgeSettings)
{
super();
createHome(bridgeSettings);
}
public List<Device> getDevices()
{
log.debug("consolidating devices for fibaros");
Iterator<String> keys = fibaros.keySet().iterator();
ArrayList<Device> deviceList = new ArrayList<>();
while(keys.hasNext())
{
String key = keys.next();
for(Device device : fibaros.get(key).getDevices())
deviceList.add(device);
}
return deviceList;
}
public List<Scene> getScenes()
{
log.debug("consolidating scenes for fibaros");
Iterator<String> keys = fibaros.keySet().iterator();
ArrayList<Scene> 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<String, FibaroInfo>();
Iterator<NamedIP> 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;
}
}

View File

@@ -0,0 +1,146 @@
package com.bwssystems.HABridge.plugins.fibaro;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.NamedIP;
import com.bwssystems.HABridge.plugins.http.HTTPHandler;
import com.google.gson.Gson;
public class FibaroInfo
{
private static final Logger log = LoggerFactory.getLogger(FibaroInfo.class);
private HTTPHandler httpClient;
private NamedIP fibaroAddress;
// You can disable it if you want
boolean useSaveLogs = true; // This can be used to exclude some devices from list
boolean useUserDescription = true;
boolean removeDigits = true;
boolean scenesWithLiliCommandOnly = true;
public FibaroInfo(NamedIP addressName)
{
super();
httpClient = new HTTPHandler();
fibaroAddress = addressName;
}
public Device[] getDevices()
{
Room[] rooms = getRooms();
log.debug("Founded: " + rooms.length + ", rooms");
Device[] all_devices = getAllDevices();
int count = 0;
for(Device d : all_devices)
{
if(d.roomID > 0 && useSaveLogs ? "true".equals(d.properties.saveLogs) : true)
count++;
}
Device[] devices = new Device[count];
int i = 0;
for(Device d : all_devices)
if(d.roomID > 0 && useSaveLogs ? "true".equals(d.properties.saveLogs) : true)
{
if(useUserDescription && d.properties.userDescription != null && !d.properties.userDescription.isEmpty())
d.name = d.properties.userDescription;
if(removeDigits)
d.name = replaceDigits(d.name);
devices[i++] = d;
for(Room room : rooms)
if(d.roomID == room.id)
{
d.room = room.name.trim();
d.category = String.valueOf(room.sectionID); // TODO load name of section
}
d.fibaroaddress = fibaroAddress.getIp();
d.fibaroname = fibaroAddress.getName();
}
log.debug("Founded: " + devices.length + " devices");
return devices;
}
public Scene[] getScenes()
{
Room[] rooms = getRooms();
int count = 0;
Scene[] scenes = getAllScenes();
for(Scene s : scenes)
if(!scenesWithLiliCommandOnly || s.liliStartCommand != null && !s.liliStartCommand.isEmpty())
count++;
Scene[] result = new Scene[count];
int i = 0;
for(Scene s : scenes)
if(!scenesWithLiliCommandOnly || s.liliStartCommand != null && !s.liliStartCommand.isEmpty())
{
result[i++] = s;
for(Room room : rooms)
if(s.roomID == room.id)
{
s.room = room.name.trim();
s.category = String.valueOf(room.sectionID); // TODO load name of section
}
s.fibaroaddress = fibaroAddress.getIp();
s.fibaroname = fibaroAddress.getName();
}
System.out.println("Founded: " + count + " scenes");
return result;
}
private Device[] getAllDevices()
{
String result = request("devices?enabled=true&visible=true");
if(result == null)
return new Device[0];
Device[] devices = new Gson().fromJson(result, Device[].class);
return devices;
}
private Scene[] getAllScenes()
{
String result = request("scenes?enabled=true&visible=true");
if(result == null)
return new Scene[0];
Scene[] scenes = new Gson().fromJson(result, Scene[].class);
return scenes;
}
private Room[] getRooms()
{
String result = request("rooms");
if(result == null)
return new Room[0];
return new Gson().fromJson(result, Room[].class);
}
private String request(String theUrl)
{
theUrl = "http://" + fibaroAddress.getIp() + "/api/" + theUrl;
return httpClient.doHttpRequest(theUrl, null, null, null, null);
}
private String replaceDigits(String name)
{
name = name.replaceAll("1", "");
name = name.replaceAll("2", "");
name = name.replaceAll("3", "");
name = name.replaceAll("4", "");
name = name.replaceAll("5", "");
name = name.replaceAll("6", "");
name = name.replaceAll("7", "");
name = name.replaceAll("8", "");
name = name.replaceAll("9", "");
name = name.replaceAll("0", "");
name = name.trim();
return name;
}
}

View File

@@ -0,0 +1,19 @@
package com.bwssystems.HABridge.plugins.fibaro;
public class Room
{
public int id;
public String name;
public int sectionID;
public String icon;
public Sensor defaultSensors;
public int defaultThermostat;
public int sortOrder;
public class Sensor
{
public int temperature;
public int humidity;
public int light;
}
}

View File

@@ -0,0 +1,39 @@
package com.bwssystems.HABridge.plugins.fibaro;
public class Scene
{
public int id;
public String name;
public String type;
public String properties;
public int roomID;
public int iconID;
public String runConfig;
public boolean autostart;
public boolean protectedByPIN;
public boolean killable;
public int maxRunningInstances;
public int runningInstances;
public boolean visible;
public boolean isLua;
public Triggers triggers;
public String liliStartCommand;
public String liliStopCommand;
public int sortOrder;
public class Triggers {
public Properties[] properties;
public String[] globals;
public String[] events;
}
public class Properties {
public String id;
public String name;
}
public String room;
public String category;
public String fibaroaddress;
public String fibaroname;
}

View File

@@ -26,7 +26,15 @@ app.config (function ($locationProvider, $routeProvider) {
}).when ('/verascenes', { }).when ('/verascenes', {
templateUrl: 'views/verascene.html', templateUrl: 'views/verascene.html',
controller: 'VeraController', controller: 'VeraController',
requiresAuthentication: true
}).when ('/fibarodevices', {
templateUrl: 'views/fibarodevice.html',
controller: 'FibaroController',
requiresAuthentication: true requiresAuthentication: true
}).when ('/fibaroscenes', {
templateUrl: 'views/fibaroscene.html',
controller: 'FibaroController',
requiresAuthentication: true
}).when ('/harmonydevices', { }).when ('/harmonydevices', {
templateUrl: 'views/harmonydevice.html', templateUrl: 'views/harmonydevice.html',
controller: 'HarmonyController', controller: 'HarmonyController',
@@ -133,7 +141,7 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n
var self = this; var self = this;
this.state = {base: "./api/devices", bridgelocation: ".", systemsbase: "./system", huebase: "./api", configs: [], backups: [], devices: [], device: {}, this.state = {base: "./api/devices", bridgelocation: ".", systemsbase: "./system", huebase: "./api", configs: [], backups: [], devices: [], device: {},
mapandid: [], type: "", settings: [], myToastMsg: [], logMsgs: [], loggerInfo: [], mapTypes: [], olddevicename: "", logShowAll: false, mapandid: [], type: "", settings: [], myToastMsg: [], logMsgs: [], loggerInfo: [], mapTypes: [], olddevicename: "", logShowAll: false,
isInControl: false, showVera: false, 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: {}}; showDomoticz: false, showSomfy: false, showLifx: false, habridgeversion: {}, viewDevId: "", queueDevId: "", securityInfo: {}};
this.displayWarn = function(errorTitle, error) { this.displayWarn = function(errorTitle, error) {
@@ -455,6 +463,11 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n
this.state.showVera = self.state.settings.veraconfigured; this.state.showVera = self.state.settings.veraconfigured;
return; return;
} }
this.updateShowFibaro = function () {
this.state.showFibaro = self.state.settings.fibaroconfigured;
return;
}
this.updateShowNest = function () { this.updateShowNest = function () {
this.state.showNest = self.state.settings.nestconfigured; this.state.showNest = self.state.settings.nestconfigured;
@@ -506,6 +519,7 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n
function (response) { function (response) {
self.state.settings = response.data; self.state.settings = response.data;
self.updateShowVera(); self.updateShowVera();
self.updateShowFibaro();
self.updateShowHarmony(); self.updateShowHarmony();
self.updateShowNest(); self.updateShowNest();
self.updateShowHue(); self.updateShowHue();
@@ -644,6 +658,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 () { this.viewHarmonyActivities = function () {
if (!this.state.showHarmony) if (!this.state.showHarmony)
@@ -1285,6 +1331,22 @@ app.controller ('SystemController', function ($scope, $location, bridgeService,
} }
} }
}; };
$scope.addFibarotoSettings = function (newfibaroname, newfibaroip) {
if($scope.bridge.settings.fibaroaddress === undefined || $scope.bridge.settings.fibaroaddress === null) {
$scope.bridge.settings.fibaroaddress = { devices: [] };
}
var newFibaro = {name: newfibaroname, ip: newfibaroip }
$scope.bridge.settings.fibaroaddress.devices.push(newFibaro);
$scope.newfibaroname = null;
$scope.newfibaroip = null;
};
$scope.removeFibarotoSettings = function (fibaroname, fibaroip) {
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.splice(i, 1);
}
}
};
$scope.addHarmonytoSettings = function (newharmonyname, newharmonyip) { $scope.addHarmonytoSettings = function (newharmonyname, newharmonyip) {
if($scope.bridge.settings.harmonyaddress === undefined || $scope.bridge.settings.harmonyaddress === null) { if($scope.bridge.settings.harmonyaddress === undefined || $scope.bridge.settings.harmonyaddress === null) {
$scope.bridge.settings.harmonyaddress = { devices: [] }; $scope.bridge.settings.harmonyaddress = { devices: [] };
@@ -1898,6 +1960,162 @@ 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 + ":" + $scope.fibaro.port
+ "/data_request?id=action&output_format=json&DeviceNum="
+ fibarodevice.id
+ "&serviceId=urn:upnp-org:serviceId:Dimming1&action=SetLoadLevelTarget&newLoadlevelTarget="
+ dim_control;
}
else
dimpayload = "http://" + fibarodevice.fibaroaddress + ":" + $scope.fibaro.port
+ "/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1&DeviceNum="
+ fibarodevice.id;
onpayload = "http://" + fibarodevice.fibaroaddress + ":" + $scope.fibaro.port
+ "/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1&DeviceNum="
+ fibarodevice.id;
offpayload = "http://" + fibarodevice.fibaroaddress + ":" + $scope.fibaro.port
+ "/data_request?id=action&output_format=json&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0&DeviceNum="
+ fibarodevice.id;
bridgeService.buildUrls(onpayload, dimpayload, offpayload, false, fibarodevice.id, fibarodevice.name, fibarodevice.fibaroname, "switch", "fibaroDevice", null, null);
$scope.device = bridgeService.state.device;
if (!buildonly) {
bridgeService.editNewDevice($scope.device);
$location.path('/editdevice');
}
};
$scope.buildSceneUrls = function (fibaroscene) {
onpayload = "http://" + fibaroscene.fibaroaddress + ":" + $scope.fibaro.port
+ "/data_request?id=action&output_format=json&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=RunScene&SceneNum="
+ fibaroscene.id;
offpayload = "http://" + fibaroscene.fibaroaddress + ":" + $scope.fibaro.port
+ "/data_request?id=action&output_format=json&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=RunScene&SceneNum="
+ fibarocene.id;
bridgeService.buildUrls(onpayload, null, offpayload, false, fibaroscene.id, fibaroscene.name, fibaroscene.fibaroname, "scene", "fibaroScene", null, null);
$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) { app.controller('HarmonyController', function ($scope, $location, bridgeService, ngDialog) {
$scope.bridge = bridgeService.state; $scope.bridge = bridgeService.state;
$scope.device = bridgeService.state.device; $scope.device = bridgeService.state.device;
@@ -3228,6 +3446,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) { app.filter('configuredNestItems', function (bridgeService) {
return function(input) { return function(input) {
var out = []; var out = [];

View File

@@ -8,6 +8,10 @@
href="#!/veradevices">Vera Devices</a></li> href="#!/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showVera" role="presentation"><a
href="#!/verascenes">Vera Scenes</a></li> href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibarodevices">Fibaro Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li> href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a

View File

@@ -6,6 +6,10 @@
href="#!/veradevices">Vera Devices</a></li> href="#!/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showVera" role="presentation"><a
href="#!/verascenes">Vera Scenes</a></li> href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibarodevices">Fibaro Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li> href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a

View File

@@ -6,6 +6,10 @@
href="#!/veradevices">Vera Devices</a></li> href="#!/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showVera" role="presentation"><a
href="#!/verascenes">Vera Scenes</a></li> href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibarodevices">Fibaro Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li> href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a

View File

@@ -0,0 +1,145 @@
<ul class="nav nav-pills" role="tablist">
<li role="presentation"><a href="#!/">Bridge Devices</a></li>
<li role="presentation"><a href="#!/system">Bridge Control</a></li>
<li role="presentation"><a href="#!/logs">Logs</a></li>
<li role="presentation"><a href="#!/veradevices">Vera Devices</a></li>
<li role="presentation"><a href="#!/verascenes">Vera Scenes</a></li>
<li role="presentation" class="active"><a href="#!/fibarodevices">Fibaro Devices</a></li>
<li role="presentation"><a href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonydevices">Harmony Devices</a></li>
<li ng-if="bridge.showNest" role="presentation"><a href="#!/nest">Nest</a></li>
<li ng-if="bridge.showHue" role="presentation"><a
href="#!/huedevices">Hue Devices</a></li>
<li ng-if="bridge.showHal" role="presentation"><a
href="#!/haldevices">HAL Devices</a></li>
<li ng-if="bridge.showMqtt" role="presentation"><a href="#!/mqttmessages">MQTT Messages</a></li>
<li ng-if="bridge.showHass" role="presentation"><a href="#!/hassdevices">HomeAssistant Devices</a></li>
<li ng-if="bridge.showDomoticz" role="presentation"><a href="#!/domoticzdevices">Domoticz Devices</a></li>
<li ng-if="bridge.showSomfy" role="presentation"><a href="#!/somfydevices">Somfy Devices</a></li>
<li ng-if="bridge.showLifx" role="presentation"><a href="#!/lifxdevices">LIFX Devices</a></li>
<li role="presentation"><a href="#!/editdevice">Add/Edit</a></li>
</ul>
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title">Fibaro Device List
({{bridge.fibarodevices.length}})</h2>
</div>
<div class="panel-body">
<p class="text-muted">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.</p>
<p class="text-muted">
Also, use this select menu for which type of dim control you would
like to be generated: <select name="device-dim-control"
id="device-dim-control" ng-model="device_dim_control">
<option value="">none</option>
<option value="${intensity.byte}">Pass-thru Value</option>
<option value="${intensity.percent}">Percentage</option>
<option value="${intensity.decimal_percent}">Decimal Percentage</option>
<option value="${intensity.math(X*1)}">Custom Math</option>
</select>
</p>
<p class="text-muted">Use the check boxes by the names to use the bulk addition
feature. Select your items and dim control type if wanted, then click
bulk add below. Your items will be added with on and off or dim and
off if selected with the name of the device from the Fibaro.</p>
<scrollable-table watch="bridge.fibarodevices">
<table class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>Row</th>
<th sortable-header col="name"><span><input type="checkbox" name="selectAll"
value="{{selectAll}}"
ng-checked="selectAll"
ng-click="toggleSelectAll()"> Name</span></th>
<th sortable-header col="id" comparator-fn="comparatorUniqueId">Id</th>
<th sortable-header col="category">Category</th>
<th sortable-header col="room">Room</th>
<th sortable-header col="fibaroname">Fibaro</th>
<th>Build Actions</th>
</tr>
</thead>
<tr
ng-repeat="fibarodevice in bridge.fibarodevices">
<td>{{$index+1}}</td>
<td><input type="checkbox" name="bulk.devices[]"
value="{{fibarodevice.id}}"
ng-checked="bulk.devices.indexOf(fibarodevice.id) > -1"
ng-click="toggleSelection(fibarodevice.id)">
{{fibarodevice.name}}</td>
<td>{{fibarodevice.id}}</td>
<td>{{fibarodevice.category}}</td>
<td>{{fibarodevice.room}}</td>
<td>{{fibarodevice.fibaroname}}</td>
<td>
<button class="btn btn-success" type="submit"
ng-click="buildDeviceUrls(fibarodevice, device_dim_control, false)">Build Item</button>
</td>
</tr>
</table>
</scrollable-table>
<div class="panel-footer">
<button class="btn btn-success" type="submit"
ng-click="bulkAddDevices(device_dim_control)">Bulk Add
({{bulk.devices.length}})</button>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title">
Already Configured Fibaro Devices <a ng-click="toggleButtons()"><span
class={{imgButtonsUrl}} aria-hidden="true"></span></a></a>
</h2>
</div>
<div ng-if="buttonsVisible" class="panel-body">
<scrollable-table watch="bridge.devices">
<table class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>Row</th>
<th sortable-header col="name">Name</th>
<th sortable-header col="targetDevice">Fibaro</th>
<th>Map Id</th>
<th>Actions</th>
</tr>
</thead>
<tr
ng-repeat="device in bridge.devices | configuredFibaroDevices">
<td>{{$index+1}}</td>
<td>{{device.name}}</td>
<td>{{device.targetDevice}}</td>
<td>{{device.mapId}}</td>
<td>
<p>
<button class="btn btn-warning" type="submit"
ng-click="editDevice(device)">Edit</button>
<button class="btn btn-danger" type="submit"
ng-click="deleteDevice(device)">Delete</button>
</p>
</td>
</tr>
</table>
</scrollable-table>
</div>
</div>
<script type="text/ng-template" id="deleteMapandIdDialog">
<div class="ngdialog-message">
<h2>Device Map and Id?</h2>
<p>{{mapandid.mapType}} with {{mapandid.id}}</p>
<p>Are you Sure?</p>
</div>
<div class="ngdialog-buttons mt">
<button type="button" class="ngdialog-button ngdialog-button-error" ng-click="deleteMapandId(mapandid)">Delete</button>
</div>
</script>

View File

@@ -0,0 +1,114 @@
<ul class="nav nav-pills" role="tablist">
<li role="presentation"><a href="#!/">Bridge Devices</a></li>
<li role="presentation"><a href="#!/system">Bridge Control</a></li>
<li role="presentation"><a href="#!/logs">Logs</a></li>
<li role="presentation"><a href="#!/veradevices">Vera Devices</a></li>
<li role="presentation"><a href="#!/verascenes">Vera Scenes</a></li>
<li role="presentation"><a href="#!/fibarodevices">Fibaro Devices</a></li>
<li role="presentation" class="active"><a href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonydevices">Harmony Devices</a></li>
<li ng-if="bridge.showNest" role="presentation"><a href="#!/nest">Nest</a></li>
<li ng-if="bridge.showHue" role="presentation"><a
href="#!/huedevices">Hue Devices</a></li>
<li ng-if="bridge.showHal" role="presentation"><a
href="#!/haldevices">HAL Devices</a></li>
<li ng-if="bridge.showMqtt" role="presentation"><a href="#!/mqttmessages">MQTT Messages</a></li>
<li ng-if="bridge.showHass" role="presentation"><a href="#!/hassdevices">HomeAssistant Devices</a></li>
<li ng-if="bridge.showDomoticz" role="presentation"><a href="#!/domoticzdevices">Domoticz Devices</a></li>
<li ng-if="bridge.showSomfy" role="presentation"><a href="#!/somfydevices">Somfy Devices</a></li>
<li ng-if="bridge.showLifx" role="presentation"><a href="#!/lifxdevices">LIFX Devices</a></li>
<li role="presentation"><a href="#!/editdevice">Add/Edit</a></li>
</ul>
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title">Fibaro Scene List</h2>
</div>
<div class="panel-body">
<p class="text-muted">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.</p>
<scrollable-table watch="bridge.fibaroscenes">
<table class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>Row</th>
<th sortable-header col="name">Name</th>
<th sortable-header col="id" comparator-fn="comparatorUniqueId">Id</th>
<th sortable-header col="room">Room</th>
<th sortable-header col="fibaroname">Fibaro</th>
<th>Build Actions</th>
</tr>
</thead>
<tr ng-repeat="fibaroscene in bridge.fibaroscenes">
<td>{{$index+1}}</td>
<td>{{fibaroscene.name}}</td>
<td>{{fibaroscene.id}}</td>
<td>{{fibaroscene.room}}</td>
<td>{{fibaroscene.fibaroname}}</td>
<td>
<button class="btn btn-success" type="submit"
ng-click="buildSceneUrls(fibaroscene)">Build Item</button>
</td>
</tr>
</table>
</scrollable-table>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title">
Already Configured Fibaro Scenes <a ng-click="toggleButtons()"><span
class={{imgButtonsUrl}} aria-hidden="true"></span></a>
</h2>
</div>
<div ng-if="buttonsVisible" class="panel-body">
<scrollable-table watch="bridge.fibaroscenes">
<table class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>Row</th>
<th sortable-header col="name">Name</th>
<th sortable-header col="targetDevice">Fibaro</th>
<th>Map Id</th>
<th>Actions</th>
</tr>
</thead>
<tr
ng-repeat="device in bridge.devices | configuredFibaroScenes">
<td>{{$index+1}}</td>
<td>{{device.name}}</td>
<td>{{device.targetDevice}}</td>
<td>{{device.mapId}}</td>
<td>
<p>
<button class="btn btn-warning" type="submit"
ng-click="editDevice(device)">Edit</button>
<button class="btn btn-danger" type="submit"
ng-click="deleteDevice(device)">Delete</button>
</p>
</td>
</tr>
</table>
</scrollable-table>
</div>
</div>
<script type="text/ng-template" id="deleteMapandIdDialog">
<div class="ngdialog-message">
<h2>Device Map and Id?</h2>
<p>{{mapandid.mapType}} with {{mapandid.id}}</p>
<p>Are you Sure?</p>
</div>
<div class="ngdialog-buttons mt">
<button type="button" class="ngdialog-button ngdialog-button-error" ng-click="deleteMapandId(mapandid)">Delete</button>
</div>
</script>

View File

@@ -6,6 +6,10 @@
href="#!/veradevices">Vera Devices</a></li> href="#!/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showVera" role="presentation"><a
href="#!/verascenes">Vera Scenes</a></li> href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibarodevices">Fibaro Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li> href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a

View File

@@ -6,6 +6,10 @@
href="#!/veradevices">Vera Devices</a></li> href="#!/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showVera" role="presentation"><a
href="#!/verascenes">Vera Scenes</a></li> href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibarodevices">Fibaro Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li role="presentation" class="active"><a <li role="presentation" class="active"><a
href="#!/harmonyactivities">Harmony Activities</a></li> href="#!/harmonyactivities">Harmony Activities</a></li>
<li role="presentation"><a href="#!/harmonydevices">Harmony <li role="presentation"><a href="#!/harmonydevices">Harmony

View File

@@ -6,6 +6,10 @@
href="#!/veradevices">Vera Devices</a></li> href="#!/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showVera" role="presentation"><a
href="#!/verascenes">Vera Scenes</a></li> href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibarodevices">Fibaro Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li role="presentation"><a href="#!/harmonyactivities">Harmony <li role="presentation"><a href="#!/harmonyactivities">Harmony
Activities</a></li> Activities</a></li>
<li role="presentation" class="active"><a href="#!/harmonydevices">Harmony <li role="presentation" class="active"><a href="#!/harmonydevices">Harmony

View File

@@ -6,6 +6,10 @@
href="#!/veradevices">Vera Devices</a></li> href="#!/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showVera" role="presentation"><a
href="#!/verascenes">Vera Scenes</a></li> href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibarodevices">Fibaro Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li> href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a

View File

@@ -6,6 +6,10 @@
href="#!/veradevices">Vera Devices</a></li> href="#!/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showVera" role="presentation"><a
href="#!/verascenes">Vera Scenes</a></li> href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibarodevices">Fibaro Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li> href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a

View File

@@ -4,6 +4,8 @@
<li role="presentation"><a href="#!/logs">Logs</a></li> <li role="presentation"><a href="#!/logs">Logs</a></li>
<li ng-if="bridge.showVera" role="presentation"><a href="#!/veradevices">Vera Devices</a></li> <li ng-if="bridge.showVera" role="presentation"><a href="#!/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a href="#!/verascenes">Vera Scenes</a></li> <li ng-if="bridge.showVera" role="presentation"><a href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a href="#!/fibarodevices">Fibaro Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonyactivities">Harmony Activities</a></li> <li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonydevices">Harmony Devices</a></li> <li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonydevices">Harmony Devices</a></li>
<li ng-if="bridge.showNest" role="presentation"><a href="#!/nest">Nest</a></li> <li ng-if="bridge.showNest" role="presentation"><a href="#!/nest">Nest</a></li>

View File

@@ -6,6 +6,10 @@
href="#!/veradevices">Vera Devices</a></li> href="#!/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showVera" role="presentation"><a
href="#!/verascenes">Vera Scenes</a></li> href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibarodevices">Fibaro Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li> href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a

View File

@@ -4,6 +4,8 @@
<li role="presentation"><a href="#!/logs">Logs</a></li> <li role="presentation"><a href="#!/logs">Logs</a></li>
<li ng-if="bridge.showVera" role="presentation"><a href="#!/veradevices">Vera Devices</a></li> <li ng-if="bridge.showVera" role="presentation"><a href="#!/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a href="#!/verascenes">Vera Scenes</a></li> <li ng-if="bridge.showVera" role="presentation"><a href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a href="#!/fibarodevices">Fibaro Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonyactivities">Harmony Activities</a></li> <li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonydevices">Harmony Devices</a></li> <li ng-if="bridge.showHarmony" role="presentation"><a href="#!/harmonydevices">Harmony Devices</a></li>
<li ng-if="bridge.showNest" role="presentation"><a href="#!/nest">Nest</a></li> <li ng-if="bridge.showNest" role="presentation"><a href="#!/nest">Nest</a></li>

View File

@@ -6,6 +6,10 @@
href="#!/veradevices">Vera Devices</a></li> href="#!/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showVera" role="presentation"><a
href="#!/verascenes">Vera Scenes</a></li> href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibarodevices">Fibaro Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li> href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a

View File

@@ -2,9 +2,10 @@
<li role="presentation"><a href="#!/">Bridge Devices</a></li> <li role="presentation"><a href="#!/">Bridge Devices</a></li>
<li role="presentation"><a href="#!/system">Bridge Control</a></li> <li role="presentation"><a href="#!/system">Bridge Control</a></li>
<li role="presentation"><a href="#!/logs">Logs</a></li> <li role="presentation"><a href="#!/logs">Logs</a></li>
<li role="presentation"><a href="#!/veradevices">Vera <li role="presentation"><a href="#!/veradevices">Vera Devices</a></li>
Devices</a></li>
<li role="presentation"><a href="#!/verascenes">Vera Scenes</a></li> <li role="presentation"><a href="#!/verascenes">Vera Scenes</a></li>
<li role="presentation"><a href="#!/fibarodevices">Fibaro Devices</a></li>
<li role="presentation"><a href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li> href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a

View File

@@ -7,6 +7,10 @@
href="#!/veradevices">Vera Devices</a></li> href="#!/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a <li ng-if="bridge.showVera" role="presentation"><a
href="#!/verascenes">Vera Scenes</a></li> href="#!/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibarodevices">Fibaro Devices</a></li>
<li ng-if="bridge.showFibaro" role="presentation"><a
href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li> href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a
@@ -130,6 +134,35 @@
</tr> </tr>
</table></td> </table></td>
</tr> </tr>
<tr>
<td>Fibaro Names and IP Addresses</td>
<td><table
class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>Name</th>
<th>IP</th>
<th>Manage</th>
</tr>
</thead>
<tr ng-repeat="fibaro in bridge.settings.fibaroaddress.devices">
<td>{{fibaro.name}}</td>
<td>{{fibaro.ip}}</td>
<td><button class="btn btn-danger" type="submit"
ng-click="removeFibarotoSettings(fibaro.name, fibaro.ip)">Del</button></td>
</tr>
<tr>
<td><input id="bridge-settings-next-fibaro-name"
class="form-control" type="text" ng-model="newfibaroname"
placeholder="A Fibaro"></td>
<td><input id="bridge-settings-next-fibaro-ip"
class="form-control" type="text" ng-model="newfibaroip"
placeholder="192.168.1.2"></td>
<td><button class="btn btn-success" type="submit"
ng-click="addFibarotoSettings(newfibaroname, newfibaroip)">Add</button></td>
</tr>
</table></td>
</tr>
<tr> <tr>
<td>Harmony Names and IP Addresses</td> <td>Harmony Names and IP Addresses</td>
<td><table <td><table

View File

@@ -2,9 +2,10 @@
<li role="presentation"><a href="#!/">Bridge Devices</a></li> <li role="presentation"><a href="#!/">Bridge Devices</a></li>
<li role="presentation"><a href="#!/system">Bridge Control</a></li> <li role="presentation"><a href="#!/system">Bridge Control</a></li>
<li role="presentation"><a href="#!/logs">Logs</a></li> <li role="presentation"><a href="#!/logs">Logs</a></li>
<li role="presentation" class="active"><a href="#!/veradevices">Vera <li role="presentation" class="active"><a href="#!/veradevices">Vera Devices</a></li>
Devices</a></li>
<li role="presentation"><a href="#!/verascenes">Vera Scenes</a></li> <li role="presentation"><a href="#!/verascenes">Vera Scenes</a></li>
<li role="presentation"><a href="#!/fibarodevices">Fibaro Devices</a></li>
<li role="presentation"><a href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li> href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a

View File

@@ -3,8 +3,9 @@
<li role="presentation"><a href="#!/system">Bridge Control</a></li> <li role="presentation"><a href="#!/system">Bridge Control</a></li>
<li role="presentation"><a href="#!/logs">Logs</a></li> <li role="presentation"><a href="#!/logs">Logs</a></li>
<li role="presentation"><a href="#!/veradevices">Vera Devices</a></li> <li role="presentation"><a href="#!/veradevices">Vera Devices</a></li>
<li role="presentation" class="active"><a href="#!/verascenes">Vera <li role="presentation" class="active"><a href="#!/verascenes">Vera Scenes</a></li>
Scenes</a></li> <li role="presentation"><a href="#!/fibarodevices">Fibaro Devices</a></li>
<li role="presentation"><a href="#!/fibaroscenes">Fibaro Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a
href="#!/harmonyactivities">Harmony Activities</a></li> href="#!/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a <li ng-if="bridge.showHarmony" role="presentation"><a