Closes IPP-42. Trip and Warning History
This commit is contained in:
@@ -147,6 +147,49 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row row-flex">
|
||||
<div class='col-xs-12' style="padding-top: 1em; margin-bottom: 1em;">
|
||||
<div class="input-daterange input-group" id="datepicker">
|
||||
<input data-chartid="dynamicChart" id="fromDate" data-daysofhistory="2" type="text" class="form-control" name="start">
|
||||
<span class="input-group-addon">to</span>
|
||||
<input class="form-control" data-chartid="dynamicChart" id="toDate" type="text" name="end">
|
||||
<span class='input-group-btn'>
|
||||
<a href="#!" data-chartid="dynamicChart" data-otherchartids="statusTimeline" class="btn chart-update btn-theme" id="runButton">Run</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="col-md-6">
|
||||
<h1>TRIP HISTORY</h1>
|
||||
<table class="table table-responsive" id="triptable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Timestamp</th>
|
||||
<th>Condition</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<h1>WARNING HISTORY</h1>
|
||||
<table class="table table-responsive" id="warningtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Timestamp</th>
|
||||
<th>Condition</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<style>
|
||||
@@ -199,3 +242,163 @@
|
||||
flex-direction: column;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<script>
|
||||
var tripData = [];
|
||||
var maps = {
|
||||
current: {
|
||||
0: 'None',
|
||||
1: 'Overload',
|
||||
2: 'Phase Loss',
|
||||
4: 'Ground Fault',
|
||||
8: 'Stall',
|
||||
16: 'Jam',
|
||||
32: 'Underload',
|
||||
64: 'Current Imbalance',
|
||||
128: 'L1 Undercurrent',
|
||||
256: 'L2 Undercurrent',
|
||||
512: 'L3 Undercurrent',
|
||||
1024: 'L1 Overcurrent',
|
||||
2048: 'L2 Overcurrent',
|
||||
4096: 'L3 Overcurrent',
|
||||
8192: 'L1 Line Loss',
|
||||
16384: 'L2 Line Loss',
|
||||
32768: 'L3 Line Loss'
|
||||
},
|
||||
voltage: {
|
||||
0: 'None',
|
||||
1: 'Undervoltage',
|
||||
2: 'Overvoltage',
|
||||
4: 'Voltage Unbalance',
|
||||
8: 'Phase Rotation',
|
||||
16: 'Overfrequency'
|
||||
},
|
||||
control: {
|
||||
0: 'None',
|
||||
1: 'Test Trip',
|
||||
2: 'DLX Trip',
|
||||
4: 'PTC Trip',
|
||||
8: 'Operator Station Trip',
|
||||
16: 'Remote Trip',
|
||||
32: 'Blocked Start Trip',
|
||||
64: 'Hardware Fault Trip',
|
||||
128: 'Config Trip',
|
||||
256: 'Option Match Trip',
|
||||
512: 'DLX FB Timeout Trip',
|
||||
1024: 'Expansion Bus Trip',
|
||||
2048: 'Reserved',
|
||||
4096: 'Reserved',
|
||||
8192: 'NVS Trip',
|
||||
16384: 'Test Mode Trip'
|
||||
},
|
||||
power: {
|
||||
0: 'None',
|
||||
1: 'Under kW',
|
||||
2: 'Over kW',
|
||||
4: 'Under kVAR Consumed',
|
||||
8: 'Over kVAR Consumed',
|
||||
16: 'Under kVAR Generated',
|
||||
32: 'Over kVAR Generated',
|
||||
64: 'Under kVA',
|
||||
128: 'Over kVA',
|
||||
256: 'Under PF Lag',
|
||||
512: 'Over PF Lag',
|
||||
1024: 'Under PF Lead',
|
||||
2048: 'Over PF Lead'
|
||||
},
|
||||
|
||||
};
|
||||
var nodeID = <%= node.nodeId %>;
|
||||
var nodeType = '<%= node.nodetypeName %>';
|
||||
var channelData = {
|
||||
tripstatuscurrentint: {channelId: <%= channels['ipp.tripstatuscurrentint'].channelId %>, typ: 'current', table: 'triptable'},
|
||||
tripstatuscontrolint: {channelId: <%= channels['ipp.tripstatuscontrolint'].channelId %>, typ: 'control', table: 'triptable'},
|
||||
tripstatusvoltageint: {channelId: <%= channels['ipp.tripstatusvoltageint'].channelId %>, typ: 'voltage', table: 'triptable'},
|
||||
tripstatuspowerint: {channelId: <%= channels['ipp.tripstatuspowerint'].channelId %>, typ: 'power', table: 'triptable'},
|
||||
warningstatuscurrentint: {channelId: <%= channels['ipp.warningstatuscurrentint'].channelId %>, typ: 'current', table: 'warningtable'},
|
||||
warningstatuscontrolint: {channelId: <%= channels['ipp.warningstatuscontrolint'].channelId %>, typ: 'control', table: 'warningtable'},
|
||||
warningstatusvoltageint: {channelId: <%= channels['ipp.warningstatusvoltageint'].channelId %>, typ: 'voltage', table: 'warningtable'},
|
||||
warningstatuspowerint: {channelId: <%= channels['ipp.warningstatuspowerint'].channelId %>, typ: 'power', table: 'warningtable'}
|
||||
}
|
||||
var pad2 = function(str){
|
||||
return ("00" + str).slice(-2);
|
||||
}
|
||||
|
||||
var formatDate = function(d){
|
||||
return pad2(d.getUTCMonth() + 1) + "/" + pad2(d.getUTCDate()) + "/" + d.getUTCFullYear() + " " + pad2(d.getUTCHours()) + ":" + pad2(d.getUTCMinutes()) + ":" + pad2(d.getUTCSeconds());
|
||||
};
|
||||
|
||||
var getDate = function(str){
|
||||
var c1 = new Date(str);
|
||||
var c2 = (c1.getTime() / 1000);
|
||||
c2 = Math.floor(c2);
|
||||
return c2.toString();
|
||||
};
|
||||
|
||||
var updateTable = function(chData, chName){
|
||||
// var endDate = new Date();
|
||||
// var end = Math.floor(endDate.getTime() / 1000);
|
||||
// var start = end - 86400;
|
||||
var start = $('#datepicker').find('#fromDate');
|
||||
//console.log({start:start.val()});
|
||||
dateString = start.val().replace(/-/g, "/");
|
||||
start = getDate(dateString);
|
||||
|
||||
var end = $('#datepicker').find('#toDate');
|
||||
//console.log({end:end.val()});
|
||||
dateString = end.val().replace(/-/g, "/");
|
||||
end = parseInt(getDate(dateString)) + 86400;
|
||||
|
||||
var apiData = "&nodelist[0][nodeId]=" + nodeID.toString() + "&nodelist[0][channelId]=" + chData['channelId'].toString();
|
||||
apiData += "&start=" + start + "&end=" + end;
|
||||
console.log(apiData);
|
||||
|
||||
$.ajax({
|
||||
url: "http://www.pocloud.io/api2/Nodechannels",
|
||||
data: apiData,
|
||||
dataType: "json",
|
||||
type: "GET",
|
||||
success: function(data) {
|
||||
var dataPoints = data.listofstreams[0];
|
||||
for(var i = dataPoints.stream.length-1; i > 0; i--){
|
||||
var dpt = dataPoints.stream[i];
|
||||
var timestamp = new Date(dpt.x * 1000);
|
||||
var val = maps[chData.typ][parseInt(dpt.y)];
|
||||
if (val !== 'None'){
|
||||
// channelData[chName]['values'].push({t:timestamp, val:val});
|
||||
tripData.push({t:timestamp, val:val, table: chData.table});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
var prepTable = function(){
|
||||
// tripData = [];
|
||||
for (var channel in channelData){
|
||||
if(channelData.hasOwnProperty(channel)){
|
||||
updateTable(channelData[channel], channel);
|
||||
}
|
||||
}
|
||||
|
||||
var sortedTripData = tripData.sort(function(a,b){return b.t-a.t;});
|
||||
$('#triptable > tbody:last-child').html("");
|
||||
$('#warningtable > tbody:last-child').html("");
|
||||
for (var i = 0; i < sortedTripData.length; i++){
|
||||
// console.log(sortedTripData[i]);
|
||||
$('#'+ sortedTripData[i].table + ' > tbody:last-child').append("<tr><td>" + formatDate(sortedTripData[i].t) + '</td><td>' + sortedTripData[i].val + '</td></tr>');
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
$(document).ready(function(){
|
||||
$("#runButton").click(function(){
|
||||
// tripData = [];
|
||||
prepTable();
|
||||
});
|
||||
prepTable();
|
||||
console.log(tripData);
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
@@ -1,14 +1,8 @@
|
||||
from pycomm_micro.ab_comm.clx import Driver as u800Driver
|
||||
import logging
|
||||
import sys
|
||||
|
||||
|
||||
def readMicroTag(addr, tag):
|
||||
logging.basicConfig(
|
||||
filename="u800Driver.log",
|
||||
format="%(levelname)-10s %(asctime)s %(message)s",
|
||||
level=logging.DEBUG
|
||||
)
|
||||
c = u800Driver()
|
||||
|
||||
if c.open(addr):
|
||||
@@ -16,47 +10,38 @@ def readMicroTag(addr, tag):
|
||||
v = c.read_tag(tag)
|
||||
# print(v)
|
||||
return v
|
||||
except Exception as e:
|
||||
|
||||
except Exception:
|
||||
err = c.get_status()
|
||||
c.close()
|
||||
print err
|
||||
pass
|
||||
c.close()
|
||||
|
||||
def getTagType(addr, tag):
|
||||
logging.basicConfig(
|
||||
filename="u800Driver.log",
|
||||
format="%(levelname)-10s %(asctime)s %(message)s",
|
||||
level=logging.DEBUG
|
||||
)
|
||||
c = u800Driver()
|
||||
|
||||
def getTagType(addr, tag):
|
||||
c = u800Driver()
|
||||
if c.open(addr):
|
||||
try:
|
||||
return c.read_tag(tag)[1]
|
||||
except Exception as e:
|
||||
except Exception:
|
||||
err = c.get_status()
|
||||
c.close()
|
||||
print err
|
||||
pass
|
||||
c.close()
|
||||
|
||||
def writeMicroTag(addr, tag, val):
|
||||
logging.basicConfig(
|
||||
filename="u800Driver.log",
|
||||
format="%(levelname)-10s %(asctime)s %(message)s",
|
||||
level=logging.DEBUG
|
||||
)
|
||||
c = u800Driver()
|
||||
|
||||
def writeMicroTag(addr, tag, val):
|
||||
c = u800Driver()
|
||||
if c.open(addr):
|
||||
try:
|
||||
#typ = getTagType(addr, tag)
|
||||
# typ = getTagType(addr, tag)
|
||||
cv = c.read_tag(tag)
|
||||
wt = c.write_tag(tag, val, cv[1])
|
||||
# print(wt)
|
||||
return wt
|
||||
except Exception as e:
|
||||
except Exception:
|
||||
err = c.get_status()
|
||||
c.close()
|
||||
print err
|
||||
@@ -65,22 +50,16 @@ def writeMicroTag(addr, tag, val):
|
||||
|
||||
|
||||
def readMicroTagList(addr, tList):
|
||||
logging.basicConfig(
|
||||
filename="u800Driver.log",
|
||||
format="%(levelname)-10s %(asctime)s %(message)s",
|
||||
level=logging.DEBUG
|
||||
)
|
||||
c = u800Driver()
|
||||
|
||||
if c.open(addr):
|
||||
vals = []
|
||||
try:
|
||||
for t in tList:
|
||||
v = c.read_tag(t)
|
||||
vals.append({"tag":t,"val":v[0], "type":v[1]})
|
||||
vals.append({"tag": t, "val": v[0], "type": v[1]})
|
||||
# print(v)
|
||||
# print("{0} - {1}".format(t, v))
|
||||
except Exception as e:
|
||||
except Exception:
|
||||
err = c.get_status()
|
||||
c.close()
|
||||
print err
|
||||
|
||||
Reference in New Issue
Block a user