Working with SampleData.py and SSL. Issues still exist with tag graphs

This commit is contained in:
Patrick McDonagh
2016-10-28 18:22:23 -05:00
parent 611502c74a
commit 72f1cb6684
19 changed files with 348 additions and 91 deletions

View File

@@ -1,7 +1,8 @@
# project/__init__.py
from flask import Flask, render_template, request, session, send_from_directory
from flask.ext.sqlalchemy import SQLAlchemy
from flask import Flask, render_template, request, session, send_from_directory, jsonify
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import and_
app = Flask('app', static_url_path='')
@@ -11,12 +12,31 @@ app.config.update(
)
db = SQLAlchemy(app)
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def catch_all(path):
return app.send_static_file('index.html')
from datalogger import datalogger
from .datalogger import datalogger
from .datalogger.models import *
@app.route('/api/latest')
def get_latest_tag_vals():
res = db.engine.execute('SELECT v1.id as id, v1.created_on as dtime, t.id as t_id, t.name as name, t.tag as tag, v1.value as value, t.units as units, t.description as description, t.min_expected as min_expected, t.max_expected as max_expected FROM tag_vals v1 INNER JOIN tags t ON t.id = v1.tag_id WHERE v1.id = (SELECT v2.id FROM tag_vals v2 WHERE v2.tag_id = v1.tag_id ORDER BY v2.id DESC LIMIT 1) ORDER BY t.id')
lat = res.fetchall()
latest_tags = list(map(latest_to_obj, lat))
return jsonify(latest_tags)
@app.route('/api/valuesbetween/<string:ids>/<string:start>/<string:end>')
def get_tag_vals_between(ids, start, end):
ids = ids.split(',')
res = Tag_val.query.filter(and_(Tag_val.tag_id.in_(ids), Tag_val.created_on > start, Tag_val.created_on <= end)).all()
return jsonify([i.serialize for i in res])
@app.route('/api/multipletags/<string:ids>')
def get_multiple_tags(ids):
ids = ids.split(',')
res = Tag.query.filter(Tag.id.in_(ids)).all()
return jsonify([i.serialize for i in res])

View File

@@ -1 +1 @@
from datalogger import *
pass

View File

@@ -1,15 +1,15 @@
from flask.ext.restless import APIManager
from flask_restless import APIManager
from .models import *
from .. import app
manager = APIManager(app, flask_sqlalchemy_db=db)
manager.create_api(Config, methods=['GET', 'POST', 'DELETE'])
manager.create_api(Data_type, methods=['GET', 'POST', 'DELETE'])
manager.create_api(Device_type, methods=['GET', 'POST', 'DELETE'])
manager.create_api(Device, methods=['GET', 'POST', 'DELETE'])
manager.create_api(Doc, methods=['GET', 'POST', 'DELETE'])
manager.create_api(Tag_class, methods=['GET', 'POST', 'DELETE'])
manager.create_api(Tag, methods=['GET', 'POST', 'DELETE'])
manager.create_api(Tag_val, methods=['GET', 'POST', 'DELETE'])
manager.create_api(Config, methods=['GET', 'POST', 'DELETE', 'PUT'])
manager.create_api(Data_type, methods=['GET', 'POST', 'DELETE', 'PUT'])
manager.create_api(Device_type, methods=['GET', 'POST', 'DELETE', 'PUT'])
manager.create_api(Device, methods=['GET', 'POST', 'DELETE', 'PUT'])
manager.create_api(Doc, methods=['GET', 'POST', 'DELETE', 'PUT'])
manager.create_api(Tag_class, methods=['GET', 'POST', 'DELETE', 'PUT'])
manager.create_api(Tag, methods=['GET', 'POST', 'DELETE', 'PUT'])
manager.create_api(Tag_val, methods=['GET', 'POST', 'DELETE'], allow_delete_many=True)

View File

@@ -12,6 +12,16 @@ class Config(db.Model):
created_on = db.Column(db.DateTime(), default=datetime.utcnow)
updated_on = db.Column(db.DateTime(), default=datetime.utcnow, onupdate=datetime.utcnow)
@property
def serialize(self):
return {
"id": self.id,
"parameter": self.parameter,
"val": self.val,
"created_on": self.created_on,
"updated_on": self.updated_on,
}
class Data_type(db.Model):
__tablename__ = "data_types"
@@ -21,6 +31,16 @@ class Data_type(db.Model):
created_on = db.Column(db.DateTime(), default=datetime.utcnow)
updated_on = db.Column(db.DateTime(), default=datetime.utcnow, onupdate=datetime.utcnow)
@property
def serialize(self):
return {
"id": self.id,
"data_type": self.data_type,
"plc_type": self.plc_type,
"created_on": self.created_on,
"updated_on": self.updated_on,
}
class Device_type(db.Model):
__tablename__ = "device_types"
id = db.Column(db.Integer, primary_key=True)
@@ -28,6 +48,15 @@ class Device_type(db.Model):
created_on = db.Column(db.DateTime(), default=datetime.utcnow)
updated_on = db.Column(db.DateTime(), default=datetime.utcnow, onupdate=datetime.utcnow)
@property
def serialize(self):
return {
"id": self.id,
"device_type": self.device_type,
"created_on": self.created_on,
"updated_on": self.updated_on,
}
class Device(db.Model):
__tablename__ = "devices"
@@ -38,6 +67,17 @@ class Device(db.Model):
created_on = db.Column(db.DateTime(), default=datetime.utcnow)
updated_on = db.Column(db.DateTime(), default=datetime.utcnow, onupdate=datetime.utcnow)
@property
def serialize(self):
return {
"id": self.id,
"device_type_id": self.device_type_id,
"device_type": self.device_type.serialize,
"address": self.address,
"created_on": self.created_on,
"updated_on": self.updated_on,
}
class Doc(db.Model):
__tablename__ = "docs"
@@ -48,6 +88,17 @@ class Doc(db.Model):
created_on = db.Column(db.DateTime(), default=datetime.utcnow)
updated_on = db.Column(db.DateTime(), default=datetime.utcnow, onupdate=datetime.utcnow)
@property
def serialize(self):
return {
"id": self.id,
"name": self.name,
"location": self.location,
"description": self.description,
"created_on": self.created_on,
"updated_on": self.updated_on,
}
class Tag_class(db.Model):
__tablename__ = "tag_classes"
id = db.Column(db.Integer, primary_key=True)
@@ -59,6 +110,17 @@ class Tag_class(db.Model):
def toJSON(self):
return json.dumps({'id': self.id, 'class_type': self.class_type, 'description': self.description, 'created_on': self.created_on, 'updated_on': self.updated_on})
@property
def serialize(self):
return {
"id": self.id,
"class_type": self.class_type,
"description": self.description,
"created_on": self.created_on,
"updated_on": self.updated_on,
}
class Tag(db.Model):
__tablename__ = "tags"
id = db.Column(db.Integer, primary_key=True)
@@ -67,7 +129,7 @@ class Tag(db.Model):
tag_class = db.relationship(Tag_class)
tag = db.Column(db.String(128))
device_id = db.Column(db.Integer, db.ForeignKey('devices.id'))
device_ = db.relationship(Device)
device = db.relationship(Device)
description = db.Column(db.String(64))
data_type_id = db.Column(db.Integer, db.ForeignKey('data_types.id'))
data_type = db.relationship(Data_type)
@@ -81,7 +143,42 @@ class Tag(db.Model):
updated_on = db.Column(db.DateTime(), default=datetime.utcnow, onupdate=datetime.utcnow)
@property
def serialize(self):
return {
"id": self.id,
"name": self.name,
"tag_class_id": self.tag_class_id,
"tag_class": self.tag_class.serialize,
"tag": self.tag,
"device_id": self.device_id,
"device": self.device.serialize,
"description": self.description,
"data_type_id": self.data_type_id,
"data_type": self.data_type.serialize,
"change_threshold": self.change_threshold,
"guarantee_sec": self.guarantee_sec,
"map_function": self.map_function,
"units": self.units,
"min_expected": self.min_expected,
"max_expected": self.max_expected,
"created_on": self.created_on,
"updated_on": self.updated_on
}
def latest_to_obj(tup):
ob = {}
ob['id'] = tup[0]
ob['datetime'] = str(tup[1])
ob['tag_id'] = str(tup[2])
ob['tag_name'] = str(tup[3])
ob['tag'] = str(tup[4])
ob['value'] = tup[5]
ob['units'] = tup[6]
ob['tag_description'] = str(tup[7])
ob['min_expected'] = tup[8]
ob['max_expected'] = tup[9]
return ob
class Tag_val(db.Model):
@@ -89,7 +186,20 @@ class Tag_val(db.Model):
id = db.Column(db.Integer, primary_key=True)
tag_id = db.Column(db.Integer, db.ForeignKey('tags.id'))
tag = db.relationship(Tag)
val = db.Column(db.Float)
value = db.Column(db.Float)
created_on = db.Column(db.DateTime(), default=datetime.utcnow)
updated_on = db.Column(db.DateTime(), default=datetime.utcnow, onupdate=datetime.utcnow)
@property
def serialize(self):
return {
"id": self.id,
"tag_id": self.tag_id,
"tag": self.tag.serialize,
"value": self.value,
"created_on": self.created_on,
"updated_on": self.updated_on
}

View File

@@ -0,0 +1,35 @@
-----BEGIN CERTIFICATE-----
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
BW67nK0NQS6BaT45qVap
-----END CERTIFICATE-----

View File

@@ -0,0 +1,51 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

View File

@@ -52,7 +52,7 @@ poconsole.controller('configCtrl', function($scope, Page, $log, config, devices,
$scope.loggerRunning = data.status;
});
};
$scope.checkLogger();
// $scope.checkLogger();
$scope.restartLogger = function(){
var restartLogger = config.restartLogger();
@@ -74,7 +74,7 @@ poconsole.controller('configCtrl', function($scope, Page, $log, config, devices,
var addDevice = devices.addDevice(dev);
addDevice.then(function(d){
$scope.getDevices();
$scope.newDevice.address = "";
dev.address = "";
});
};

View File

@@ -2,9 +2,9 @@ poconsole.factory('config',function($q, $http, $log){
var getConfig = function(){
var deferred = $q.defer();
$http.get('/config').success(function(data) {
$http.get('/api/configs').success(function(data) {
deferred.resolve({
config:data
config:data.objects
});
});
return deferred.promise;
@@ -12,7 +12,7 @@ poconsole.factory('config',function($q, $http, $log){
var submitParameter = function(entry){
var deferred = $q.defer();
$http.post('/config', {
$http.post('/api/configs', {
parameter: entry.parameter,
val: entry.val
}).success(function(data){
@@ -25,7 +25,7 @@ poconsole.factory('config',function($q, $http, $log){
var updateParameter = function(entry){
var deferred = $q.defer();
$http.post('/config/update/' + entry.id, {
$http.put('/api/configs/' + entry.id, {
parameter: entry.parameter,
val: entry.val
}).success(function(data){
@@ -38,7 +38,7 @@ poconsole.factory('config',function($q, $http, $log){
var deleteParameter = function(id){
var deferred = $q.defer();
$http.delete('/config/' + id).success(function(data){
$http.delete('/api/configs/' + id).success(function(data){
deferred.resolve({
data:data
});

View File

@@ -24,8 +24,19 @@ poconsole.factory('dateConversion', function(){
var sec = d.getSeconds().pad(2);
return "".concat(year, "-", month, "-", day, " ", hour, ":", min, ":", sec);
};
var pythonDate = 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, ".000");
};
return {
mysqlDate: mysqlDate,
sqliteDate: sqliteDate
sqliteDate: sqliteDate,
pythonDate: pythonDate
};
});

View File

@@ -1,9 +1,10 @@
poconsole.factory('devices', function($q, $http, $log){
var getAllDevices = function(){
var deferred = $q.defer();
$http.get('/device').success(function(data) {
$http.get('/api/devices').success(function(data) {
console.log({device:data.objects});
deferred.resolve({
devices:data
devices:data.objects
});
});
return deferred.promise;
@@ -11,7 +12,7 @@ poconsole.factory('devices', function($q, $http, $log){
var getDevice = function(id){
var deferred = $q.defer();
$http.get('/device/'+ id).success(function(data) {
$http.get('/api/devices/'+ id).success(function(data) {
deferred.resolve({
devices:data
});
@@ -22,9 +23,9 @@ poconsole.factory('devices', function($q, $http, $log){
var addDevice = function(d){
$log.info(d);
var deferred = $q.defer();
$http.post('/device/create', {
$http.post('/api/devices', {
address: d.address,
device_type: d.device_type.id
device_type_id: d.device_type.id
}).success(function(data){
deferred.resolve({
data:data
@@ -35,7 +36,7 @@ poconsole.factory('devices', function($q, $http, $log){
var updateDevice = function(d){
var deferred = $q.defer();
$http.post('/device/update/' + d.id, {
$http.put('/api/devices/' + d.id, {
address: d.address,
device_type: d.device_type.id
}).success(function(data){
@@ -48,7 +49,7 @@ poconsole.factory('devices', function($q, $http, $log){
var deleteDevice = function(id){
var deferred = $q.defer();
var url = '/device/' + id;
var url = '/api/devices/' + id;
$http.delete(url).success(function(data) {
deferred.resolve({
data:data
@@ -59,9 +60,9 @@ poconsole.factory('devices', function($q, $http, $log){
var getDeviceTypes = function(){
var deferred = $q.defer();
$http.get('/device_type').success(function(data) {
$http.get('/api/device_types').success(function(data) {
deferred.resolve({
device_types:data
device_types:data.objects
});
});
return deferred.promise;

View File

@@ -24,19 +24,20 @@ poconsole.controller('tagValsCtrl', function($scope, $route, $http, $routeParams
$log.info({start: sDTime, end:eDTime});
$scope.loading = true;
var tags_to_get = $routeParams.tagID.split(",");
var getTag = tags.getTag(tags_to_get);
var getMultipleTags = tags.getMultipleTags(tags_to_get);
$scope.tags_to_get = tags_to_get.toString();
getTag.then(function(tagData){
getMultipleTags.then(function(tagData){
$scope.tag = tagData.tag;
var getTagHistoryBetween = tags.getTagHistoryBetween(tags_to_get, sDTime, eDTime);
console.log($scope.tag);
var getTagHistoryBetween = tags.getTagHistoryBetween(tags_to_get, dateConversion.pythonDate(sDTime), dateConversion.pythonDate(eDTime));
getTagHistoryBetween.then(function(data) {
$scope.loading = false;
$scope.data = data;
$scope.table_vals = $scope.data.vals.map(function(x){
var ob = {id: x.id, tagID: x.tagID, dtime: new Date(x.createdAt)};
var ob = {id: x.id, tag: x.tag, dtime: new Date(x.created_on)};
for(var t = 0; t< $scope.tag.length; t++){
if ($scope.tag[t].name === x.tagID.name){
ob[$scope.tag[t].name] = x.val;
if ($scope.tag[t].name === x.tag.name){
ob[$scope.tag[t].name] = x.value;
} else {
ob[$scope.tag[t].name] = null;
}
@@ -47,17 +48,18 @@ poconsole.controller('tagValsCtrl', function($scope, $route, $http, $routeParams
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);
split_vals[data.vals[i].tag.name].ob[data.vals[i].created_on]= data.vals[i].val;
split_vals[data.vals[i].tag.name].dtimes.push(data.vals[i].created_on);
split_vals[data.vals[i].tag.name].vals.push(data.vals[i].value);
if (all_datetimes.indexOf(data.vals[i].created_on) == -1){
all_datetimes.push(data.vals[i].created_on);
}
}
$scope.data.vals = [{dtime:new Date(all_datetimes[0])}];
@@ -76,7 +78,7 @@ poconsole.controller('tagValsCtrl', function($scope, $route, $http, $routeParams
}
$scope.data.vals.push(newOb);
}
console.log($scope.data);
$scope.error = false;
$scope.options = {
series: [
@@ -101,6 +103,7 @@ poconsole.controller('tagValsCtrl', function($scope, $route, $http, $routeParams
drawDots:false
});
}
console.log($scope.options);
});
});
};

View File

@@ -31,7 +31,7 @@ poconsole.controller('tagsCtrl', function($scope, $route, $http, $routeParams, P
var getTag = tags.getTag(id);
getTag.then(function(data){
$scope.error = false;
$scope.dTag = data.tag[0];
$scope.dTag = data.tag;
$log.info("Thinking about deleting tag with parameters: "+ JSON.stringify($scope.dTag));
});
};
@@ -49,7 +49,7 @@ poconsole.controller('tagsCtrl', function($scope, $route, $http, $routeParams, P
var getTag = tags.getTag(id);
getTag.then(function(data){
$scope.error = false;
$scope.dTagValues = data.tag[0];
$scope.dTagValues = data.tag;
$log.info("Thinking about deleting tag data with parameters: "+ JSON.stringify($scope.dTagValues));
});
};
@@ -68,14 +68,13 @@ poconsole.controller('tagsCtrl', function($scope, $route, $http, $routeParams, P
getTag.then(function(data){
$scope.error = false;
$scope.editTag = data.tag;
console.log(typeof data.tag.device_id);
$log.info("Started editing tag with parameters: "+ JSON.stringify($scope.editTag));
});
};
$scope.submitEditTag = function(){
var editStatus = tags.updateTag($scope.editTag);
$log.info(editStatus);
$scope.editStatus = editStatus.status;
$scope.loadTagList();
};
@@ -90,7 +89,7 @@ poconsole.controller('tagsCtrl', function($scope, $route, $http, $routeParams, P
};
$scope.device_label = function(data_type_obj){
return data_type_obj.address + " - " + data_type_obj.device_type.dType;
return data_type_obj.address + " - " + data_type_obj.device_type.device_type;
};
});

View File

@@ -1,3 +1,8 @@
var makeDateinObject = function(ob){
ob.datetime= new Date(ob.datetime);
return ob
};
poconsole.factory('tags',function($q, $http, $log, dateConversion){
var getTag = function(id) {
var deferred = $q.defer();
@@ -10,6 +15,17 @@ poconsole.factory('tags',function($q, $http, $log, dateConversion){
return deferred.promise;
};
var getMultipleTags = function(ids){
var deferred = $q.defer();
$http.get('/api/multipletags/' + ids).success(function(data) {
console.log(data);
deferred.resolve({
tag:data
});
});
return deferred.promise;
};
var getTagList = function() {
var deferred = $q.defer();
$http.get('/api/tags').success(function(data) {
@@ -24,7 +40,7 @@ poconsole.factory('tags',function($q, $http, $log, dateConversion){
var deferred = $q.defer();
$http.get('/api/data_types').success(function(data) {
deferred.resolve({
data_types:data
data_types:data.objects
});
});
return deferred.promise;
@@ -32,8 +48,10 @@ poconsole.factory('tags',function($q, $http, $log, dateConversion){
var getTagHistoryBetween = function(id, start, end){
var deferred = $q.defer();
var w = {'where':{'tagID': id, 'createdAt': {">":dateConversion.mysqlDate(start), "<": dateConversion.mysqlDate(end)}}};
$http.get("/tag_val", {params:w}).success(function(data) {
var url = "/api/valuesbetween/" + id + "/" + start + "/" + end;
console.log({url:url});
$http.get(url).success(function(data) {
console.log(data);
deferred.resolve({
vals:data
});
@@ -43,7 +61,8 @@ poconsole.factory('tags',function($q, $http, $log, dateConversion){
var getCurrentValues = function(){
var deferred = $q.defer();
$http.get('/tag_val/latest').success(function(data) {
$http.get('/api/latest').success(function(data) {
data = data.map(makeDateinObject);
deferred.resolve({
vals:data
});
@@ -52,18 +71,18 @@ poconsole.factory('tags',function($q, $http, $log, dateConversion){
};
var createTag = function(tag){
$http.post('/tag/create', {
$http.post('/api/tags', {
tag: tag.tag,
name: tag.name,
tag_class:tag.tag_class,
deviceID: tag.deviceID,
tag_class_id:tag.tag_class_id,
device_id: tag.device_id,
units: tag.units,
minExpected: tag.minExpected,
maxExpected: tag.maxExpected,
guarantee_sec: tag.guarantee_sec,
change_threshold: tag.change_threshold,
description: tag.description,
data_type: tag.data_type
data_type_id: tag.data_type_id
}).success(function(data){
return data;
});
@@ -71,19 +90,21 @@ poconsole.factory('tags',function($q, $http, $log, dateConversion){
var updateTag = function(tag){
$log.info("updateTag called with "+ JSON.stringify(tag));
$http.post('/tag/update/'+ tag.id, {
var put_obj = {
tag: tag.tag,
name: tag.name,
tag_class:tag.tag_class,
deviceID: tag.deviceID,
tag_class_id: parseInt(tag.tag_class_id),
device_id: parseInt(tag.device_id),
units: tag.units,
minExpected: tag.minExpected,
maxExpected: tag.maxExpected,
min_expected: tag.min_expected,
max_expected: tag.max_expected,
guarantee_sec: tag.guarantee_sec,
change_threshold: tag.change_threshold,
description: tag.description,
data_type: tag.data_type
}).success(function(data){
data_type_id: parseInt(tag.data_type_id)
};
console.log({id: tag.id, put_obj: put_obj});
$http.put('/api/tags/'+ tag.id, data=put_obj).success(function(data){
return data;
}).error(function(err){
$log.warn("updateTag Error: " + err);
@@ -92,7 +113,7 @@ poconsole.factory('tags',function($q, $http, $log, dateConversion){
var deleteTag = function(id){
var deferred = $q.defer();
var url = '/tag/' + id;
var url = '/api/tags/' + id;
$http.delete(url).success(function(data) {
deferred.resolve({
data: data
@@ -103,8 +124,11 @@ poconsole.factory('tags',function($q, $http, $log, dateConversion){
var clearSingleTagData = function(id){
var deferred = $q.defer();
var url = '/tag_val/clear/' + id;
$http.get(url).success(function(data) {
var url = '/api/tag_vals';
var filters = [{"name": "id", "op": "==", "val": "%" + id.toString() + "%"}];
var req_data = {"q": JSON.stringify({"filters": filters})}
console.log(req_data);
$http.delete(url, data=req_data).success(function(data) {
deferred.resolve({
status: data.status
});
@@ -114,8 +138,8 @@ poconsole.factory('tags',function($q, $http, $log, dateConversion){
var clearAllTagData = function(){
var deferred = $q.defer();
var url = '/tag_val/clear/all';
$http.get(url).success(function(data) {
var url = '/api/tag_vals';
$http.delete(url).success(function(data) {
deferred.resolve({
status: data.status
});
@@ -125,6 +149,7 @@ poconsole.factory('tags',function($q, $http, $log, dateConversion){
return {
getTag: getTag,
getMultipleTags, getMultipleTags,
getTagList: getTagList,
getDataTypes: getDataTypes,
getTagHistoryBetween: getTagHistoryBetween,

View File

@@ -78,7 +78,7 @@
<tr ng-repeat="device in devices">
<!-- <td>{{device.id}}</td> -->
<td>{{device.address}}</td>
<td>{{device.device_type.dType}}</td>
<td>{{device.device_type.device_type}}</td>
<!-- <td><i class="fa fa-pencil"></i></td> -->
<td><i class="fa fa-times" ng-click="deleteDevice(device.id)"></i></td>
</tr>
@@ -121,7 +121,7 @@
<div class="form-group">
<label for="device_type">Device Type</label>
<select ng-model="newDevice.device_type" ng-options="t as t.dType for t in device_types track by t.id" class="form-control" id="device_type"></select>
<select ng-model="newDevice.device_type" ng-options="t as t.device_type for t in device_types track by t.id" class="form-control" id="device_type"></select>
</div>
<button class="btn btn-primary" ng-click="addDevice(newDevice)">Add Device</button>

View File

@@ -24,10 +24,10 @@
<a href="/csv/all" class="btn btn-large btn-primary"><i class="fa fa-download"></i> Download All Data</a>
<div ng-repeat="val in vals">
<div class="col-md-4" style="height:200px; margin-bottom:40px;">
<just-gage id="{{val.name}}" min='val.minExpected' max='val.maxExpected' value='val.val' options="{label:val.units,title:val.name, decimals:2, refreshAnimationType:'bounce', startAnimationType:'bounce'}"></just-gage>
<just-gage id="{{val.tag_name}}" min='val.min_expected' max='val.max_expected' value='val.value' options="{label:val.units,title:val.tag_name, decimals:2, refreshAnimationType:'bounce', startAnimationType:'bounce'}"></just-gage>
<div style="text-align:center">
<h5>{{ val.dtime | date: 'medium'}}</h5>
<a href="/#/tag/{{val.t_id}}" class="btn btn-large btn-primary"><i class="fa fa-line-chart"></i> View Data</a>
<h5>{{ val.datetime | date: 'medium'}}</h5>
<a href="/#/tag/{{val.tag_id}}" class="btn btn-large btn-primary"><i class="fa fa-line-chart"></i> View Data</a>
</div>
</div>
</div>

View File

@@ -10,7 +10,7 @@
<form>
<div class="form-group">
<label for="data_source">Data Source</label>
<select ng-model="newTag.deviceID" ng-options="d as device_label(d) for d in devices track by d.id" class="form-control" id="data_source"></select>
<select ng-model="newTag.device_id" ng-options="d as device_label(d) for d in devices track" class="form-control" id="data_source"></select>
</div>
<div class="form-group">
<label for="tag">Tag</label>
@@ -26,11 +26,11 @@
</div>
<div class="form-group">
<label for="data_type">Data Type</label>
<select ng-model="newTag.data_type_id" ng-options="t as t.data_type_id for t in data_types track by t.id" class="form-control" id="data_type"></select>
<select ng-model="newTag.data_type_id" ng-options="t as t.data_type.id for t in data_types" class="form-control" id="data_type"></select>
</div>
<div class="form-group">
<label for="tag_type">Tag Type</label>
<select ng-model="newTag.tag_class" class="form-control" id="tag_type">
<select ng-model="newTag.tag_class_id" class="form-control" id="tag_type">
<option value=5>Normal</option>
<option value=6>PLC Handshake</option>
</select>
@@ -87,8 +87,8 @@
<div class="well" ng-if="message"><h3 class="text-danger">{{message}}</h3></div>
<form>
<div class="form-group">
<label for="data_source">Data Source</label>
<select ng-model="editTag.deviceID" ng-options="d as device_label(d) for d in devices track by d.id" class="form-control" id="data_source"></select>
<label for="data_source">Data Source {{editTag.device_id}}</label>
<select ng-model="editTag.device_id" ng-options="d.id as device_label(d) for d in devices" class="form-control" id="data_source"></select>
</div>
<div class="form-group">
<label for="tag">Tag Name</label>
@@ -104,11 +104,11 @@
</div>
<div class="form-group">
<label for="data_type">Data Type</label>
<select ng-model="editTag.data_type_id" ng-options="t as t.data_type_id for t in data_types track by t.id" class="form-control" id="data_type"></select>
<select ng-model="editTag.data_type_id" ng-options="t.id as t.data_type for t in data_types" class="form-control" id="data_type"></select>
</div>
<div class="form-group">
<label for="tag_type">Tag Type</label>
<select ng-model="editTag.tag_class" class="form-control" id="tag_type">
<select ng-model="editTag.tag_class_id" class="form-control" id="tag_type">
<option value=5>Normal</option>
<option value=6>PLC Handshake</option>
</select>

Binary file not shown.

View File

@@ -1,4 +1,8 @@
from app import app
import ssl
# context = ssl.SSLContext(protocol=ssl.PROTOCOL_TLSv1_2)
# context.load_cert_chain('/Users/patrickjmcd/Henry_Pump/tagserver/web_db/flask/app/hplumberjack.crt', '/Users/patrickjmcd/Henry_Pump/tagserver/web_db/flask/app/hplumberjack.key')
if __name__ == '__main__':
app.run(debug=True)
app.run(debug=True, ssl_context='adhoc')