Multiple tag comparison working

This commit is contained in:
Patrick McDonagh
2016-04-28 14:26:04 -05:00
parent 1e5bf85b87
commit 66043c3429
10 changed files with 179 additions and 34 deletions

View File

@@ -8,4 +8,3 @@
module.exports = {
};

View File

@@ -8,7 +8,6 @@
module.exports = {
latest: function(req, res){
var query = "SELECT v1.id as id, v1.createdAt as dtime, t.id as t_id, t.name as name, t.tag as tag, v1.val as val, t.units as units, t.description as description, t.minExpected as minExpected, t.maxExpected as maxExpected FROM tag_vals v1 LEFT JOIN tags t ON t.id = v1.tagID WHERE v1.id = (SELECT v2.id FROM tag_vals v2 WHERE v2.tagID = v1.tagID ORDER BY v2.id DESC LIMIT 1)";
console.log(query);
Tag_val.query(query, function(err, results){
if (err) return res.serverError(err);
return res.ok(results);

View File

@@ -1,4 +1,4 @@
var tsCtrlrs = angular.module('tsCtrlrs', ['ngJustGage', 'n3-line-chart', "ngQuickDate"]);
var tsCtrlrs = angular.module('tsCtrlrs', ['ngJustGage', 'n3-line-chart', "ngQuickDate", "ngSails"]);
function isValidDate(d) {
if ( Object.prototype.toString.call(d) !== "[object Date]" )
@@ -63,6 +63,16 @@ var date_to_dString = function(inpDate){
return "".concat(year, month, day, "_", hour, min, sec);
};
var mysqlDate = function(d){
var year = d.getFullYear().pad(4);
var month = (d.getMonth() + 1).pad(2);
var day = d.getDate().pad(2);
var hour = d.getHours().pad(2);
var min = d.getMinutes().pad(2);
var sec = d.getSeconds().pad(2);
return "".concat(year, "-", month, "-", day, " ", hour, ":", min, ":", sec);
};
tsCtrlrs.factory('Page', function($log) {
var title = 'default';
var page = 'default';
@@ -103,7 +113,8 @@ tsCtrlrs.factory('Alerts', function($log) {
tsCtrlrs.factory('tags',function($q, $http, $log){
var getTag = function(id) {
var deferred = $q.defer();
$http.get('/tag/' + id).success(function(data) {
var w ={"where":{"id":id}};
$http.get('/tag', {params:w}).success(function(data) {
deferred.resolve({
tag:data
});
@@ -123,7 +134,7 @@ tsCtrlrs.factory('tags',function($q, $http, $log){
var getTagHistoryBetween = function(id, start, end){
var deferred = $q.defer();
var w = {'where':{'tagID': id, 'createdAt': {">=":0, "<=":end}}};
var w = {'where':{'tagID': id, 'createdAt': {">":mysqlDate(start), "<": mysqlDate(end)}}};
$http.get("/tag_val", {params:w}).success(function(data) {
deferred.resolve({
vals:data
@@ -143,7 +154,7 @@ tsCtrlrs.factory('tags',function($q, $http, $log){
};
var createTag = function(tag){
$http.post('/json/tag/add', {
$http.post('/tag/create', {
tag: tag.tag,
name: tag.name,
units: tag.units,
@@ -160,7 +171,7 @@ tsCtrlrs.factory('tags',function($q, $http, $log){
var updateTag = function(tag){
$log.info("updateTag called with "+ JSON.stringify(tag));
$http.post('/json/tag/update', {
$http.post('/tag/update/1', {
id: tag.id,
tag: tag.tag,
name: tag.name,
@@ -180,7 +191,7 @@ tsCtrlrs.factory('tags',function($q, $http, $log){
var deleteTag = function(id){
var deferred = $q.defer();
var url = '/json/tag/delete/' + id;
var url = '/tag/delete/' + id;
$http.get(url).success(function(data) {
deferred.resolve({
status: data.status
@@ -305,7 +316,7 @@ tsCtrlrs.controller('mainCtrl', function($scope, Page, Alerts) {
$scope.Alerts = Alerts;
});
tsCtrlrs.controller('dashboardCtrl', function($scope, $route, $http, $routeParams, Page, Alerts, $log, tags) {
tsCtrlrs.controller('dashboardCtrl', function($scope, $route, $http, $sails, Page, $log, tags) {
Page.setTitle('Dashboard');
Page.setPage('dashboard');
$scope.loadDashboard = function(){
@@ -314,9 +325,32 @@ tsCtrlrs.controller('dashboardCtrl', function($scope, $route, $http, $routeParam
getCurrentValues.then(function(data) {
$scope.loading = false;
$scope.vals = data.vals;
$log.info($scope.vals);
});
};
$scope.loadDashboard();
$sails.get("/tag_val").success(function(data, status, headers, jwr){
$log.info(data);
});
var valHandler = $sails.on('tag_val', function(message){
if (message.verb === "created"){
$log.info(message.data);
for(var i = 0; i < $scope.vals.length; i++){
if(message.data.tagID == $scope.vals[i].t_id){
$scope.vals[i].val = message.data.val;
$scope.vals[i].dtime = message.data.createdAt;
}
}
}
});
$scope.$on('$destroy', function() {
$sails.off('tag_val', valHandler);
});
});
tsCtrlrs.controller('tagsCtrl', function($scope, $route, $http, $routeParams, Page, Alerts, $log, tags) {
@@ -390,6 +424,16 @@ tsCtrlrs.controller('tagsCtrl', function($scope, $route, $http, $routeParams, Pa
$scope.loadTagList();
};
$scope.getPlotTags = function(){
var tags_to_plot = [];
for(var i =0; i<$scope.tags.length; i ++){
if ($scope.tags[i].selectedForPlot){
tags_to_plot.push($scope.tags[i].id);
}
}
$scope.tags_to_plot = tags_to_plot.join();
};
});
tsCtrlrs.controller('tagValsCtrl', function($scope, $route, $http, $routeParams, Page, Alerts, $log, tags) {
@@ -408,34 +452,79 @@ tsCtrlrs.controller('tagValsCtrl', function($scope, $route, $http, $routeParams,
$scope.startDatetime = new Date();
$scope.startDatetime.setHours($scope.endDatetime.getHours() - 2);
}
$log.info({start: $scope.startDatetime, end:$scope.endDatetime});
$scope.loadTagVals = function(sDTime, eDTime){
$scope.loading = true;
var getTag = tags.getTag($routeParams.tagID);
var tags_to_get = $routeParams.tagID.split(",");
var getTag = tags.getTag(tags_to_get);
getTag.then(function(tagData){
$scope.tag = tagData.tag;
Page.setTitle('Tag Series: '+ tagData.tag.tagName);
var getTagHistoryBetween = tags.getTagHistoryBetween($routeParams.tagID, sDTime, eDTime);
var getTagHistoryBetween = tags.getTagHistoryBetween(tags_to_get, sDTime, eDTime);
getTagHistoryBetween.then(function(data) {
$log.info(data);
$scope.loading = false;
$scope.data = data;
$scope.data.vals = $scope.data.vals.map(function(x){
return {id: x.id, tagID: x.tagID, val: x.val, dtime: new Date(x.createdAt)};
$scope.table_vals = $scope.data.vals.map(function(x){
var ob = {id: x.id, tagID: x.tagID, dtime: new Date(x.createdAt)};
for(var t = 0; t< $scope.tag.length; t++){
if ($scope.tag[t].name === x.tagID.name){
ob[$scope.tag[t].name] = x.val;
} else {
ob[$scope.tag[t].name] = null;
}
}
return ob;
});
var split_vals = {};
var all_datetimes = [];
for(var t=0; t< $scope.tag.length; t++){
split_vals[$scope.tag[t].name] = {};
split_vals[$scope.tag[t].name].dtimes = [];
split_vals[$scope.tag[t].name].vals = [];
split_vals[$scope.tag[t].name].ob = {};
}
for (var i = 0; i< data.vals.length; i++){
split_vals[data.vals[i].tagID.name].ob[data.vals[i].createdAt]= data.vals[i].val;
split_vals[data.vals[i].tagID.name].dtimes.push(data.vals[i].createdAt);
split_vals[data.vals[i].tagID.name].vals.push(data.vals[i].val);
if (all_datetimes.indexOf(data.vals[i].createdAt) == -1){
all_datetimes.push(data.vals[i].createdAt);
}
}
$scope.data.vals = [{dtime:new Date(all_datetimes[0])}]
for (var ta in split_vals){
$scope.data.vals[0][ta] = split_vals[ta].vals[0];
}
for (var j = 0; j < all_datetimes.length; j++){
var newOb = {dtime: new Date(all_datetimes[j])};
for(var tag in split_vals){
if(split_vals[tag].ob[all_datetimes[j]] === undefined){
newOb[tag] = $scope.data.vals[j][tag]
} else {
newOb[tag] = split_vals[tag].ob[all_datetimes[j]];
}
}
$scope.data.vals.push(newOb);
}
// $scope.data.gVals = data.vals.map(function(x){
// var ob = {id: x.id, tagID: x.tagID.id, dtime: new Date(x.createdAt)};
// ob[x.tagID.name] = x.val;
// return ob;
// });
$log.info(data);
$log.info(split_vals);
$scope.error = false;
$scope.options = {
series: [
{
axis: "y",
dataset: "vals",
key: "val",
label: "Tag Value",
color: "#1f77b4",
type: ['line'],
id: 'tagChart'
}
],
axes: {
x: {
@@ -444,6 +533,19 @@ tsCtrlrs.controller('tagValsCtrl', function($scope, $route, $http, $routeParams,
}
}
};
for(var i2 = 0; i2< $scope.tag.length; i2++){
$scope.options.series.push({
axis: "y",
dataset: "vals",
key: $scope.tag[i2].name,
label: $scope.tag[i2].name,
// color: "#1f77b4",
color: '#'+Math.floor(Math.random()*16777215).toString(16),
type: ['line'],
drawDots:false
});
}
$log.info({options: $scope.options});
});
});
};
@@ -518,8 +620,6 @@ tsCtrlrs.controller('configCtrl', function($scope, Page, Alerts, $log, config) {
}
});
};
});

View File

@@ -55,9 +55,15 @@
</div>
<div class="row topMargin40">
<div class="col-md-6">
<div class="col-md-12">
<a href="/json/CSV/{{tag.id}}/{{startDatetime | dString}}/{{endDatetime | dString }}" class="btn btn-large btn-primary padMe"><i class="fa fa-download"></i> Download Data</a>
<table class="table">
<button class="btn btn-warning" type="button" data-toggle="collapse" data-target="#collapseJSON" aria-expanded="false" aria-controls="collapseJSON">
Show Source Data
</button>
<div class="collapse" id="collapseJSON">
<pre>{{table_vals | json}}</pre>
</div>
<!-- <table class="table">
<thead>
<tr>
<td>ID</td>
@@ -72,7 +78,7 @@
<td>{{val.dtime | date:'short'}}</td>
</tr>
</tbody>
</table>
</table> -->
</div>
</div>
</div>

View File

@@ -204,9 +204,13 @@
<div ng-if="!error" class="container">
<div class="row">
<div class="col-md-12">
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addModal">
Add Tag
</button>
<table class="table">
<thead>
<tr>
<td></td>
<td>ID</td>
<td>Name</td>
<td>Min Expected Value</td>
@@ -219,6 +223,7 @@
</thead>
<tbody>
<tr ng-repeat="tag in tags">
<td><input type="checkbox" ng-model="tag.selectedForPlot" ng-change="getPlotTags()"></input></td>
<td>{{tag.id}}</td>
<td><a href="/#/tag/{{tag.id}}">{{tag.name}}</a> <i class="fa fa-info-circle" data-toggle="popover" title="{{tag.name}}" data-content="Tag Name: {{tag.tag}} </br>Details: {{tag.description}}<br/>Type: {{tag.data_type}}"></i></td>
<td>{{tag.minExpected}}</td>
@@ -235,9 +240,9 @@
</tr>
</tbody>
</table>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addModal">
Add Tag
</button>
<a ng-if="tags_to_plot" class="btn btn-success" href="/#/tag/{{tags_to_plot}}">
Compare Tags
</a>
</div>
</div>
</div>

View File

@@ -22,7 +22,8 @@
"bootstrap": "~3.3.6",
"angular-route": "~1.4.9",
"font-awesome": "~4.5.0",
"ngQuickDate": "^1.3.4"
"ngQuickDate": "^1.3.4",
"angular-sails": "^1.1.4"
},
"resolutions": {
"angular": "~1.4.9"

View File

@@ -35,7 +35,6 @@ module.exports.routes = {
'/': {
view: 'homepage'
},
/***************************************************************************
* *
* Custom routes here... *

View File

@@ -44,6 +44,8 @@ var jsFilesToInject = [
'js/ng-justgage.js',
'js/d3.min.js',
'js/LineChart.js',
'js/dist/sails.io.js',
'js/dist/angular-sails.js',
'js/router.js',
'js/controller.js',
'js/**/*.js'

View File

@@ -0,0 +1,32 @@
<div class="container">
<div class="row">
<%# <button ng-click="loadDashboard()" class="btn btn-large btn-success"><i class="fa fa-refresh"></i> Reload Dashboard</button>%>
<a href="/json/csv/all" class="btn btn-large btn-primary"><i class="fa fa-download"></i> Download All Data</a>
<% for (var i = 0; i < vals.length; i++){ var val = vals[i]; %>
<div class="col-md-4" style="height:200px; margin-bottom:40px;">
<div id="<%= val.name %>"></div>
<div style="text-align:center">
<h5><%= val.dtime %></h5>
<a href="/#/tag/<%= val.t_id %>" class="btn btn-large btn-primary"><i class="fa fa-line-chart"></i> View Data</a>
</div>
</div>
<% } %>
</div>
</div>
<script>
<% for (var x = 0; x < vals.length; x++){ var val = vals[i]; %>
var g = new JustGage({
id: "<%= val.name %>",
value: <%= val.val %>,
min: <%= val.minExpected %>,
max: <%= val.maxExpected %>,
title: <%= val.name %>,
label:<%= val.units %>,
decimals:2,
refreshAnimationType:'bounce',
startAnimationType:'bounce'}
});
<% } >
</script>

View File

@@ -108,6 +108,8 @@
<script src="/js/ng-justgage.js"></script>
<script src="/js/d3.min.js"></script>
<script src="/js/LineChart.js"></script>
<script src="/js/dist/sails.io.js"></script>
<script src="/js/dist/angular-sails.js"></script>
<script src="/js/router.js"></script>
<script src="/js/controller.js"></script>
<!--SCRIPTS END-->