Completes IPP-68 by mapping E300 status to a string
This commit is contained in:
@@ -4,3 +4,6 @@
|
||||
<div class='col-xs-6'>
|
||||
<h3><%= node.vanityname %></h3>
|
||||
</div>
|
||||
<div class-"col-xs-2">
|
||||
<button href="#" data-channelId="<%= channels["ipp.log"].channelId %>" class="data-table btn btn-theme" title="Device Log"><i style='margin-left: 0.5em; cursor: pointer' class="fa fa-th-list icon-theme"></i> Device Log</button>
|
||||
</div>
|
||||
|
||||
@@ -148,45 +148,12 @@
|
||||
</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>
|
||||
<button href="#" data-channelId="<%= channels["ipp.e300tripstatus"].channelId %>" class="data-table btn btn-theme" title="Trip History"><i style='margin-left: 0.5em; cursor: pointer' class="fa fa-th-list icon-theme"></i> Trip History</button>
|
||||
</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>
|
||||
<button href="#" data-channelId="<%= channels["ipp.e300warningstatus"].channelId %>" class="data-table btn btn-theme" title="Trip History"><i style='margin-left: 0.5em; cursor: pointer' class="fa fa-th-list icon-theme"></i> Warning History</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -242,163 +209,3 @@
|
||||
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>
|
||||
|
||||
@@ -9,7 +9,7 @@ addr = '10.20.4.5'
|
||||
channels = {}
|
||||
|
||||
|
||||
e300_current: {
|
||||
e300_current = {
|
||||
0: 'None',
|
||||
1: 'Overload',
|
||||
2: 'Phase Loss',
|
||||
@@ -73,6 +73,7 @@ e300_power = {
|
||||
2048: 'Over PF Lead'
|
||||
}
|
||||
|
||||
|
||||
class Channel():
|
||||
def read(self):
|
||||
valData = u800.readMicroTag(self.device_addr, self.tag)
|
||||
@@ -81,7 +82,7 @@ class Channel():
|
||||
if self.map_obj:
|
||||
nowVal = self.map_obj[nowVal]
|
||||
self.data_type = valData[1]
|
||||
if self.data_type == "BOOL":
|
||||
if (self.data_type == "BOOL") or (type(nowVal) is str) or (type(nowVal) is str):
|
||||
if self.last_value == "":
|
||||
self.sendFn(self.name, nowVal, 0)
|
||||
self.last_time_uploaded = time.time()
|
||||
@@ -90,7 +91,7 @@ class Channel():
|
||||
self.sendFn(self.name, nowVal, 0)
|
||||
self.last_time_uploaded = time.time()
|
||||
self.last_value = nowVal
|
||||
if (self.data_type == "REAL") or (self.data_type[-3:] == "INT"):
|
||||
elif (self.data_type == "REAL") or (self.data_type[-3:] == "INT"):
|
||||
if self.last_value == "":
|
||||
self.sendFn(self.name, nowVal, 0)
|
||||
self.last_time_uploaded = time.time()
|
||||
@@ -335,10 +336,10 @@ class start(threading.Thread, deviceBase):
|
||||
'tripenablevvoltageunbalance': Channel('tripenablevvoltageunbalance', 'TripEnable_V_VoltageUnbalance', 3600, self.sendtodbJSON, writeable=True, e300_param=False),
|
||||
'tripresetcmd': Channel('tripresetcmd', 'TripResetCmd', 3600, self.sendtodbJSON, writeable=True, e300_param=False),
|
||||
'tripstatus': Channel('tripstatus', 'TripStatus', 3600, self.sendtodbJSON, writeable=False, e300_param=False),
|
||||
'tripstatuscontrolint': Channel('tripstatuscontrolint', 'TripStatusControl_INT', 3600, self.sendtodbJSON, writeable=False, change_threshold=1.0, e300_param=False),
|
||||
'tripstatuscurrentint': Channel('tripstatuscurrentint', 'TripStatusCurrent_INT', 3600, self.sendtodbJSON, writeable=False, change_threshold=1.0, e300_param=False),
|
||||
'tripstatuspowerint': Channel('tripstatuspowerint', 'TripStatusPower_INT', 3600, self.sendtodbJSON, writeable=False, change_threshold=1.0, e300_param=False),
|
||||
'tripstatusvoltageint': Channel('tripstatusvoltageint', 'TripStatusVoltage_INT', 3600, self.sendtodbJSON, writeable=False, change_threshold=1.0, e300_param=False),
|
||||
'tripstatuscontrolint': Channel('tripstatuscontrolint', 'TripStatusControl_INT', 3600, self.sendtodbJSON, writeable=False, change_threshold=1.0, e300_param=False, map_obj=e300_control),
|
||||
'tripstatuscurrentint': Channel('tripstatuscurrentint', 'TripStatusCurrent_INT', 3600, self.sendtodbJSON, writeable=False, change_threshold=1.0, e300_param=False, map_obj=e300_current),
|
||||
'tripstatuspowerint': Channel('tripstatuspowerint', 'TripStatusPower_INT', 3600, self.sendtodbJSON, writeable=False, change_threshold=1.0, e300_param=False, map_obj=e300_power),
|
||||
'tripstatusvoltageint': Channel('tripstatusvoltageint', 'TripStatusVoltage_INT', 3600, self.sendtodbJSON, writeable=False, change_threshold=1.0, e300_param=False, map_obj=e300_voltage),
|
||||
'valoverloadtripcount': Channel('valoverloadtripcount', 'val_OverloadTripCount', 3600, self.sendtodbJSON, writeable=False, change_threshold=1.0, e300_param=False),
|
||||
'valtripcount': Channel('valtripcount', 'val_TripCount', 3600, self.sendtodbJSON, writeable=False, change_threshold=1.0, e300_param=False),
|
||||
'voltageok': Channel('voltageok', 'VoltageOK', 3600, self.sendtodbJSON, writeable=False, e300_param=False),
|
||||
@@ -359,13 +360,10 @@ class start(threading.Thread, deviceBase):
|
||||
'warningenablevundervoltage': Channel('warningenablevundervoltage', 'WarningEnable_V_Undervoltage', 3600, self.sendtodbJSON, writeable=True, e300_param=False),
|
||||
'warningenablevvoltageunbalance': Channel('warningenablevvoltageunbalance', 'WarningEnable_V_VoltageUnbalance', 3600, self.sendtodbJSON, writeable=True, e300_param=False),
|
||||
'warningstatus': Channel('warningstatus', 'WarningStatus', 3600, self.sendtodbJSON, writeable=True, e300_param=False),
|
||||
'warningstatuscontrolint': Channel('warningstatuscontrolint', 'WarningStatusControl_INT', 3600, self.sendtodbJSON, writeable=True, change_threshold=1.0, e300_param=False),
|
||||
'warningstatuscurrentint': Channel('warningstatuscurrentint', 'WarningStatusCurrent_INT', 3600, self.sendtodbJSON, writeable=True, change_threshold=1.0, e300_param=False),
|
||||
'warningstatuspowerint': Channel('warningstatuspowerint', 'WarningStatusPower_INT', 3600, self.sendtodbJSON, writeable=True, change_threshold=1.0, e300_param=False),
|
||||
'warningstatusvoltageint': Channel('warningstatusvoltageint', 'WarningStatusVoltage_INT', 3600, self.sendtodbJSON, writeable=True, change_threshold=1.0, e300_param=False),
|
||||
}
|
||||
trip_channels = {
|
||||
|
||||
'warningstatuscontrolint': Channel('warningstatuscontrolint', 'WarningStatusControl_INT', 3600, self.sendtodbJSON, writeable=True, change_threshold=1.0, e300_param=False, map_obj=e300_control),
|
||||
'warningstatuscurrentint': Channel('warningstatuscurrentint', 'WarningStatusCurrent_INT', 3600, self.sendtodbJSON, writeable=True, change_threshold=1.0, e300_param=False, map_obj=e300_current),
|
||||
'warningstatuspowerint': Channel('warningstatuspowerint', 'WarningStatusPower_INT', 3600, self.sendtodbJSON, writeable=True, change_threshold=1.0, e300_param=False, map_obj=e300_power),
|
||||
'warningstatusvoltageint': Channel('warningstatusvoltageint', 'WarningStatusVoltage_INT', 3600, self.sendtodbJSON, writeable=True, change_threshold=1.0, e300_param=False, map_obj=e300_voltage),
|
||||
}
|
||||
|
||||
def __init__(self, name=None, number=None, mac=None, Q=None, mcu=None, companyId=None, offset=None, mqtt=None, Nodes=None):
|
||||
@@ -380,6 +378,8 @@ class start(threading.Thread, deviceBase):
|
||||
threading.Thread.start(self)
|
||||
self.sendtodbJSON("device_address", self.device_address, 0)
|
||||
self.setupChannels()
|
||||
self.e300_warning = ""
|
||||
self.e300_trip = ""
|
||||
# self.updateGPS()
|
||||
|
||||
# this is a required function for all drivers, its goal is to upload some piece of data
|
||||
@@ -398,6 +398,50 @@ class start(threading.Thread, deviceBase):
|
||||
for i in channels:
|
||||
channels[i].read()
|
||||
runLoopStatus = i
|
||||
time.sleep(0.25)
|
||||
|
||||
if not (channels['tripstatuscurrentint'].last_value == "None"):
|
||||
if not (self.e300_trip == channels['tripstatuscurrentint'].last_value):
|
||||
self.e300_trip = channels['tripstatuscurrentint'].last_value
|
||||
self.sendtodb("e300tripstatus", self.e300_trip, time.time())
|
||||
elif not (channels['tripstatusvoltageint'].last_value == "None"):
|
||||
if not (self.e300_trip == channels['tripstatusvoltageint'].last_value):
|
||||
self.e300_trip = channels['tripstatusvoltageint'].last_value
|
||||
self.sendtodb("e300tripstatus", self.e300_trip, time.time())
|
||||
elif not (channels['tripstatuscontrolint'].last_value == "None"):
|
||||
if not (self.e300_trip == channels['tripstatuscontrolint'].last_value):
|
||||
self.e300_trip = channels['tripstatuscontrolint'].last_value
|
||||
self.sendtodb("e300tripstatus", self.e300_trip, time.time())
|
||||
elif not (channels['tripstatuspowerint'].last_value == "None"):
|
||||
if not (self.e300_trip == channels['tripstatuspowerint'].last_value):
|
||||
self.e300_trip = channels['tripstatuspowerint'].last_value
|
||||
self.sendtodb("e300tripstatus", self.e300_trip, time.time())
|
||||
else:
|
||||
if not (self.e300_trip == "None"):
|
||||
self.e300_trip = "None"
|
||||
self.sendtodb("e300tripstatus", self.e300_trip, time.time())
|
||||
|
||||
if not (channels['warningstatuscurrentint'].last_value == "None"):
|
||||
if not (self.e300_warning == channels['warningstatuscurrentint'].last_value):
|
||||
self.e300_warning = channels['warningstatuscurrentint'].last_value
|
||||
self.sendtodb("e300warningstatus", self.e300_warning, time.time())
|
||||
elif not (channels['warningstatusvoltageint'].last_value == "None"):
|
||||
if not (self.e300_warning == channels['warningstatusvoltageint'].last_value):
|
||||
self.e300_warning = channels['warningstatusvoltageint'].last_value
|
||||
self.sendtodb("e300warningstatus", self.e300_warning, time.time())
|
||||
elif not (channels['warningstatuscontrolint'].last_value == "None"):
|
||||
if not (self.e300_warning == channels['warningstatuscontrolint'].last_value):
|
||||
self.e300_warning = channels['warningstatuscontrolint'].last_value
|
||||
self.sendtodb("e300warningstatus", self.e300_warning, time.time())
|
||||
elif not (channels['warningstatuspowerint'].last_value == "None"):
|
||||
if not (self.e300_warning == channels['warningstatuspowerint'].last_value):
|
||||
self.e300_warning = channels['warningstatuspowerint'].last_value
|
||||
self.sendtodb("e300warningstatus", self.e300_warning, time.time())
|
||||
else:
|
||||
if not (self.e300_warning == "None"):
|
||||
self.e300_warning = "None"
|
||||
self.sendtodb("e300warningstatus", self.e300_warning, time.time())
|
||||
|
||||
runLoopStatus = "Complete"
|
||||
OK_state = 1
|
||||
if not OK_state == last_OK_state:
|
||||
|
||||
Reference in New Issue
Block a user