mirror of
https://github.com/bwssytems/ha-bridge.git
synced 2025-12-18 16:17:30 +00:00
Testing nest functionality
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
<groupId>com.bwssystems.HABridge</groupId>
|
<groupId>com.bwssystems.HABridge</groupId>
|
||||||
<artifactId>ha-bridge</artifactId>
|
<artifactId>ha-bridge</artifactId>
|
||||||
<version>1.2.3e</version>
|
<version>1.2.3f</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>HA Bridge</name>
|
<name>HA Bridge</name>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import com.bwssystems.HABridge.api.hue.DeviceResponse;
|
|||||||
import com.bwssystems.HABridge.api.hue.DeviceState;
|
import com.bwssystems.HABridge.api.hue.DeviceState;
|
||||||
import com.bwssystems.HABridge.api.hue.HueApiResponse;
|
import com.bwssystems.HABridge.api.hue.HueApiResponse;
|
||||||
import com.bwssystems.HABridge.dao.*;
|
import com.bwssystems.HABridge.dao.*;
|
||||||
import com.bwssystems.NestBridge.HomeAway;
|
import com.bwssystems.NestBridge.NestInstruction;
|
||||||
import com.bwssystems.NestBridge.NestHome;
|
import com.bwssystems.NestBridge.NestHome;
|
||||||
import com.bwssystems.harmony.ButtonPress;
|
import com.bwssystems.harmony.ButtonPress;
|
||||||
import com.bwssystems.harmony.HarmonyHandler;
|
import com.bwssystems.harmony.HarmonyHandler;
|
||||||
@@ -348,15 +348,36 @@ public class HueMulator {
|
|||||||
else if(device.getDeviceType().toLowerCase().contains("home") || (device.getMapType() != null && device.getMapType().equalsIgnoreCase("nestHomeAway")))
|
else if(device.getDeviceType().toLowerCase().contains("home") || (device.getMapType() != null && device.getMapType().equalsIgnoreCase("nestHomeAway")))
|
||||||
{
|
{
|
||||||
log.debug("executing set away for nest home: " + url);
|
log.debug("executing set away for nest home: " + url);
|
||||||
HomeAway homeAway = new Gson().fromJson(url, HomeAway.class);
|
NestInstruction homeAway = new Gson().fromJson(url, NestInstruction.class);
|
||||||
if(theNest == null)
|
if(theNest == null)
|
||||||
{
|
{
|
||||||
log.warn("Should not get here, no NEst available");
|
log.warn("Should not get here, no Nest available");
|
||||||
responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + ",\"description\": \"Should not get here, no Nest available\", \"parameter\": \"/lights/" + lightId + "state\"}}]";
|
responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + ",\"description\": \"Should not get here, no Nest available\", \"parameter\": \"/lights/" + lightId + "state\"}}]";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
theNest.getHome(homeAway.getName()).setAway(homeAway.getAway());
|
theNest.getHome(homeAway.getName()).setAway(homeAway.getAway());
|
||||||
}
|
}
|
||||||
|
else if(device.getDeviceType().toLowerCase().contains("thermo") || (device.getMapType() != null && device.getMapType().equalsIgnoreCase("nestThermoSet")))
|
||||||
|
{
|
||||||
|
log.debug("executing set thermostat for nest: " + url);
|
||||||
|
NestInstruction thermoSetting = new Gson().fromJson(url, NestInstruction.class);
|
||||||
|
if(theNest == null)
|
||||||
|
{
|
||||||
|
log.warn("Should not get here, no Nest available");
|
||||||
|
responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId + ",\"description\": \"Should not get here, no Nest available\", \"parameter\": \"/lights/" + lightId + "state\"}}]";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(thermoSetting.getControl().equalsIgnoreCase("temp")) {
|
||||||
|
if(request.body().contains("bri")) {
|
||||||
|
thermoSetting.setTemp(replaceIntensityValue(thermoSetting.getTemp(), state.getBri()));
|
||||||
|
theNest.getThermostat(thermoSetting.getName()).setTargetTemperature(Float.parseFloat(thermoSetting.getTemp()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!thermoSetting.getControl().equalsIgnoreCase("status")) {
|
||||||
|
theNest.getThermostat(thermoSetting.getName()).setTargetType(thermoSetting.getControl());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else if(url.startsWith("udp://"))
|
else if(url.startsWith("udp://"))
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
@@ -432,7 +453,8 @@ public class HueMulator {
|
|||||||
request = request.replace(INTENSITY_MATH + mathDescriptor + INTENSITY_MATH_CLOSE, endResult.toString());
|
request = request.replace(INTENSITY_MATH + mathDescriptor + INTENSITY_MATH_CLOSE, endResult.toString());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.warn("Could not execute Math: " + mathDescriptor, e);
|
log.warn("Could not execute Math: " + mathDescriptor, e);
|
||||||
} }
|
}
|
||||||
|
}
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
package com.bwssystems.NestBridge;
|
|
||||||
|
|
||||||
public class HomeAway {
|
|
||||||
private String name;
|
|
||||||
private Boolean away;
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
public Boolean getAway() {
|
|
||||||
return away;
|
|
||||||
}
|
|
||||||
public void setAway(Boolean away) {
|
|
||||||
this.away = away;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
33
src/main/java/com/bwssystems/NestBridge/NestInstruction.java
Normal file
33
src/main/java/com/bwssystems/NestBridge/NestInstruction.java
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package com.bwssystems.NestBridge;
|
||||||
|
|
||||||
|
public class NestInstruction {
|
||||||
|
private String name;
|
||||||
|
private Boolean away;
|
||||||
|
private String control;
|
||||||
|
private String temp;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
public Boolean getAway() {
|
||||||
|
return away;
|
||||||
|
}
|
||||||
|
public void setAway(Boolean away) {
|
||||||
|
this.away = away;
|
||||||
|
}
|
||||||
|
public String getControl() {
|
||||||
|
return control;
|
||||||
|
}
|
||||||
|
public void setControl(String control) {
|
||||||
|
this.control = control;
|
||||||
|
}
|
||||||
|
public String getTemp() {
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
public void setTemp(String temp) {
|
||||||
|
this.temp = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -292,6 +292,14 @@ app.service('bridgeService', function ($http, $window, BridgeSettings) {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.findNestItemByMapId = function(id, type) {
|
||||||
|
for(var i = 0; i < this.state.devices.length; i++) {
|
||||||
|
if(this.state.devices[i].mapId == id && this.aContainsB(this.state.devices[i].mapType, type))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
this.addDevice = function (device) {
|
this.addDevice = function (device) {
|
||||||
this.state.error = "";
|
this.state.error = "";
|
||||||
if(device.httpVerb != null && device.httpVerb != "")
|
if(device.httpVerb != null && device.httpVerb != "")
|
||||||
@@ -370,7 +378,7 @@ app.service('bridgeService', function ($http, $window, BridgeSettings) {
|
|||||||
|
|
||||||
this.deleteDeviceByMapId = function (id, type) {
|
this.deleteDeviceByMapId = function (id, type) {
|
||||||
for(var i = 0; i < this.state.devices.length; i++) {
|
for(var i = 0; i < this.state.devices.length; i++) {
|
||||||
if(this.state.devices[i].mapId == id && this.state.devices[i].mapType == type)
|
if(this.state.devices[i].mapId == id && this.aContainsB(this.state.devices[i].mapType, type))
|
||||||
return self.deleteDevice(this.state.devices[i].id);
|
return self.deleteDevice(this.state.devices[i].id);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -575,13 +583,67 @@ app.controller('AddingController', function ($scope, $location, $http, bridgeSer
|
|||||||
$scope.device.offUrl = "{\"device\":\"" + harmonydevice.device.id + "\",\"button\":\"" + offbutton + "\"}";
|
$scope.device.offUrl = "{\"device\":\"" + harmonydevice.device.id + "\",\"button\":\"" + offbutton + "\"}";
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.buildNestHomeUrls = function (nestitem, onbutton, offbutton) {
|
$scope.buildNestHomeUrls = function (nestitem) {
|
||||||
$scope.device.deviceType = "home";
|
$scope.device.deviceType = "home";
|
||||||
$scope.device.name = nestitem.name;
|
$scope.device.name = nestitem.name;
|
||||||
$scope.device.mapType = "nestHomeAway";
|
$scope.device.mapType = "nestHomeAway";
|
||||||
$scope.device.mapId = nestitem.Id;
|
$scope.device.mapId = nestitem.Id;
|
||||||
$scope.device.onUrl = "{\"name\":\"" + nestitem.Id + "\",\"away\":false}";
|
$scope.device.onUrl = "{\"name\":\"" + nestitem.Id + "\",\"away\":false,\"control\":\"status\"}";
|
||||||
$scope.device.offUrl = "{\"name\":\"" + nestitem.Id + "\",\"away\":true}";
|
$scope.device.offUrl = "{\"name\":\"" + nestitem.Id + "\",\"away\":true,\"control\":\"status\"}";
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.buildNestTempUrls = function (nestitem) {
|
||||||
|
$scope.device.deviceType = "thermo";
|
||||||
|
$scope.device.name = nestitem.name.substr(0, nestitem.name.indexOf("(")) + " Temperature";
|
||||||
|
$scope.device.mapType = "nestThermoSet";
|
||||||
|
$scope.device.mapId = nestitem.Id + "-SetTemp";
|
||||||
|
$scope.device.onUrl = "{\"name\":\"" + nestitem.Id + "\",\"control\":\"temp\",\"temp\":\"${intensity.percent}\"}";
|
||||||
|
$scope.device.offUrl = "{\"name\":\"" + nestitem.Id + "\",\"control\":\"temp\",\"temp\":\"${intensity.percent}\"}";
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.buildNestHeatUrls = function (nestitem) {
|
||||||
|
$scope.device.deviceType = "thermo";
|
||||||
|
$scope.device.name = nestitem.name.substr(0, nestitem.name.indexOf("(")) + " Heat";
|
||||||
|
$scope.device.mapType = "nestThermoSet";
|
||||||
|
$scope.device.mapId = nestitem.Id + "-SetHeat";
|
||||||
|
$scope.device.onUrl = "{\"name\":\"" + nestitem.Id + "\",\"control\":\"heat\"}";
|
||||||
|
$scope.device.offUrl = "{\"name\":\"" + nestitem.Id + "\",\"control\":\"off\"}";
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.buildNestCoolUrls = function (nestitem) {
|
||||||
|
$scope.device.deviceType = "thermo";
|
||||||
|
$scope.device.name = nestitem.name.substr(0, nestitem.name.indexOf("(")) + " Cool";
|
||||||
|
$scope.device.mapType = "nestThermoSet";
|
||||||
|
$scope.device.mapId = nestitem.Id + "-SetCool";
|
||||||
|
$scope.device.onUrl = "{\"name\":\"" + nestitem.Id + "\",\"control\":\"cool\"}";
|
||||||
|
$scope.device.offUrl = "{\"name\":\"" + nestitem.Id + "\",\"control\":\"off\"}";
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.buildNestRangeUrls = function (nestitem) {
|
||||||
|
$scope.device.deviceType = "thermo";
|
||||||
|
$scope.device.name = nestitem.name.substr(0, nestitem.name.indexOf("(")) + " Range";
|
||||||
|
$scope.device.mapType = "nestThermoSet";
|
||||||
|
$scope.device.mapId = nestitem.Id + "-SetRange";
|
||||||
|
$scope.device.onUrl = "{\"name\":\"" + nestitem.Id + "\",\"control\":\"range\"}";
|
||||||
|
$scope.device.offUrl = "{\"name\":\"" + nestitem.Id + "\",\"control\":\"off\"}";
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.buildNestOffUrls = function (nestitem) {
|
||||||
|
$scope.device.deviceType = "thermo";
|
||||||
|
$scope.device.name = nestitem.name.substr(0, nestitem.name.indexOf("(")) + " Thermostat";
|
||||||
|
$scope.device.mapType = "nestThermoSet";
|
||||||
|
$scope.device.mapId = nestitem.Id + "-TurnOff";
|
||||||
|
$scope.device.onUrl = "{\"name\":\"" + nestitem.Id + "\",\"control\":\"range\"}";
|
||||||
|
$scope.device.offUrl = "{\"name\":\"" + nestitem.Id + "\",\"control\":\"off\"}";
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.buildNestFanUrls = function (nestitem) {
|
||||||
|
$scope.device.deviceType = "thermo";
|
||||||
|
$scope.device.name = nestitem.name.substr(0, nestitem.name.indexOf("(")) + " Fan";
|
||||||
|
$scope.device.mapType = "nestThermoSet";
|
||||||
|
$scope.device.mapId = nestitem.Id + "-SetFan";
|
||||||
|
$scope.device.onUrl = "{\"name\":\"" + nestitem.Id + "\",\"control\":\"fan-on\"}";
|
||||||
|
$scope.device.offUrl = "{\"name\":\"" + nestitem.Id + "\",\"control\":\"fan-auto\"}";
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.testUrl = function (device, type) {
|
$scope.testUrl = function (device, type) {
|
||||||
@@ -738,7 +800,7 @@ app.filter('availableNestItemId', function(bridgeService) {
|
|||||||
if(input == null)
|
if(input == null)
|
||||||
return out;
|
return out;
|
||||||
for (var i = 0; i < input.length; i++) {
|
for (var i = 0; i < input.length; i++) {
|
||||||
if(!bridgeService.findDeviceByMapId(input[i].Id, null, "nestHomeAway")){
|
if(!bridgeService.findNestItemByMapId(input[i].Id, "nestHomeAway")){
|
||||||
out.push(input[i]);
|
out.push(input[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -752,7 +814,7 @@ return function(input) {
|
|||||||
if(input == null)
|
if(input == null)
|
||||||
return out;
|
return out;
|
||||||
for (var i = 0; i < input.length; i++) {
|
for (var i = 0; i < input.length; i++) {
|
||||||
if(bridgeService.findDeviceByMapId(input[i].Id, null, "nestHomeAway")){
|
if(input[i].mapType != null && bridgeService.aContainsB(input[i].mapType, "nest")){
|
||||||
out.push(input[i]);
|
out.push(input[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,6 +49,7 @@
|
|||||||
<option value="harmonyActivity">Harmony Activity</option>
|
<option value="harmonyActivity">Harmony Activity</option>
|
||||||
<option value="harmonyButton">Harmony Button</option>
|
<option value="harmonyButton">Harmony Button</option>
|
||||||
<option value="nestHomeAway">Nest Home Status</option>
|
<option value="nestHomeAway">Nest Home Status</option>
|
||||||
|
<option value="nestThermoSet">Nest Thermostat</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -14,8 +14,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
<li class="list-group-item">
|
<li class="list-group-item">
|
||||||
<p class="text-muted">You can select a Harmony Device and Button and generate
|
<p class="text-muted">For any Harmony Device and Buttons, use the action buttons to generate the device addition information below automatically.
|
||||||
the add button box selections automatically.</p>
|
Then you can modify the name to anything you want that will be the keyword for Alexa. Click Add device to finish that type selections.
|
||||||
|
The Already configured items list below will show what is already setup for this Nest.</p>
|
||||||
|
|
||||||
<table class="table table-bordered table-striped table-hover">
|
<table class="table table-bordered table-striped table-hover">
|
||||||
<thead>
|
<thead>
|
||||||
@@ -107,7 +108,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="panel panel-default bridgeServer" ng-if="!bridge.error">
|
<div class="panel panel-default bridgeServer" ng-if="!bridge.error">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<h2 class="panel-title">Add a Harmony Button</h2>
|
<h2 class="panel-title">Add a Bridge Device for Harmony Buttons</h2>
|
||||||
</div>
|
</div>
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
<li class="list-group-item">
|
<li class="list-group-item">
|
||||||
@@ -121,7 +122,7 @@
|
|||||||
ng-model="device.name" placeholder="Device Name">
|
ng-model="device.name" placeholder="Device Name">
|
||||||
</div>
|
</div>
|
||||||
<button type="submit" class="col-xs-4 col-sm-2 btn btn-primary">
|
<button type="submit" class="col-xs-4 col-sm-2 btn btn-primary">
|
||||||
Add Button</button>
|
Add Device</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|||||||
@@ -14,8 +14,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
<li class="list-group-item">
|
<li class="list-group-item">
|
||||||
<p class="text-muted">You can select a Nest item and generate
|
<p class="text-muted">For any Nest Item, use the action buttons to generate the device addition information below automatically.
|
||||||
the add nest item box selections automatically.</p>
|
Then you can modify the name to anything you want that will be the keyword for Alexa. Click Add device to finish that type selections.
|
||||||
|
The Already configured items list below will show what is already setup for this Nest.</p>
|
||||||
|
|
||||||
<table class="table table-bordered table-striped table-hover">
|
<table class="table table-bordered table-striped table-hover">
|
||||||
<thead>
|
<thead>
|
||||||
@@ -40,8 +41,30 @@
|
|||||||
<td>{{nestitem.type}}</td>
|
<td>{{nestitem.type}}</td>
|
||||||
<td>{{nestitem.location}}</td>
|
<td>{{nestitem.location}}</td>
|
||||||
<td>
|
<td>
|
||||||
<button class="btn btn-success" type="submit"
|
<ul class="list-group">
|
||||||
ng-click="buildNestHomeUrls(nestitem)">Gen Home URLs</button>
|
<li ng-if="nestitem.type ==='Home' " class="list-group-item">
|
||||||
|
<button class="btn btn-success" type="submit"
|
||||||
|
ng-click="buildNestHomeUrls(nestitem)">Home/Away</button>
|
||||||
|
</li>
|
||||||
|
<li ng-if="nestitem.type ==='Thermostat' " class="list-group-item">
|
||||||
|
<p>
|
||||||
|
<button class="btn btn-success" type="submit"
|
||||||
|
ng-click="buildNestTempUrls(nestitem)">Temp</button>
|
||||||
|
<button class="btn btn-success" type="submit"
|
||||||
|
ng-click="buildNestHeatUrls(nestitem)">Heat</button>
|
||||||
|
<button class="btn btn-success" type="submit"
|
||||||
|
ng-click="buildNestCoolUrls(nestitem)">Cool</button>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<button class="btn btn-success" type="submit"
|
||||||
|
ng-click="buildNestRangeUrls(nestitem)">Range</button>
|
||||||
|
<button class="btn btn-success" type="submit"
|
||||||
|
ng-click="buildNestOffUrls(nestitem)">Off</button>
|
||||||
|
<button class="btn btn-success" type="submit"
|
||||||
|
ng-click="buildNestFanUrls(nestitem)">Fan</button>
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@@ -60,22 +83,22 @@
|
|||||||
<span class="sortorder" ng-show="predicate === 'name'" ng-class="{reverse:reverse}"></span>
|
<span class="sortorder" ng-show="predicate === 'name'" ng-class="{reverse:reverse}"></span>
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
<a href="" ng-click="order('type')">Type</a>
|
<a href="" ng-click="order('id')">Id</a>
|
||||||
<span class="sortorder" ng-show="predicate === 'id'" ng-class="{reverse:reverse}"></span>
|
<span class="sortorder" ng-show="predicate === 'id'" ng-class="{reverse:reverse}"></span>
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
<a href="" ng-click="order('location')">Location</a>
|
<a href="" ng-click="order('mapId')">mapId</a>
|
||||||
<span class="sortorder" ng-show="predicate === 'location'" ng-class="{reverse:reverse}"></span>
|
<span class="sortorder" ng-show="predicate === 'mapId'" ng-class="{reverse:reverse}"></span>
|
||||||
</th>
|
</th>
|
||||||
<th>Actions</th>
|
<th>Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tr ng-repeat="nestitem in bridge.nestitems | unavailableNestItemId | orderBy:predicate:reverse">
|
<tr ng-repeat="device in bridge.devices | unavailableNestItemId | orderBy:predicate:reverse">
|
||||||
<td>{{nestitem.name}}</td>
|
<td>{{device.name}}</td>
|
||||||
<td>{{nestitem.type}}</td>
|
<td>{{device.id}}</td>
|
||||||
<td>{{nestitem.location}}</td>
|
<td>{{device.mapId}}</td>
|
||||||
<td><button class="btn btn-danger" type="submit"
|
<td><button class="btn btn-danger" type="submit"
|
||||||
ng-click="deleteDeviceByMapId(nestitem.Id, 'nestHomeAway')">Delete</button></td>
|
ng-click="deleteDeviceByMapId(device.mapId, 'nest')">Delete</button></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</li>
|
</li>
|
||||||
@@ -83,7 +106,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="panel panel-default bridgeServer" ng-if="!bridge.error">
|
<div class="panel panel-default bridgeServer" ng-if="!bridge.error">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<h2 class="panel-title">Add a Nest Item</h2>
|
<h2 class="panel-title">Add a Bridge Device for a Nest Item</h2>
|
||||||
</div>
|
</div>
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
<li class="list-group-item">
|
<li class="list-group-item">
|
||||||
|
|||||||
Reference in New Issue
Block a user