Testing nest functionality

This commit is contained in:
Admin
2016-01-20 16:46:21 -06:00
parent 87073435fc
commit ac59398aa0
8 changed files with 170 additions and 46 deletions

View File

@@ -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>

View File

@@ -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;
} }

View File

@@ -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;
}
}

View 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;
}
}

View File

@@ -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]);
} }
} }

View File

@@ -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>

View File

@@ -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">

View File

@@ -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">