node-opcua-aggregates
Version:
pure nodejs OPCUA SDK - module aggregates
86 lines • 3.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getCountData = getCountData;
const node_opcua_data_value_1 = require("node-opcua-data-value");
const node_opcua_status_code_1 = require("node-opcua-status-code");
const node_opcua_variant_1 = require("node-opcua-variant");
const common_1 = require("./common");
const interval_1 = require("./interval");
/**
* The Count Aggregate retrieves a count of all the raw values within an interval.
* If one or more raw values are non-Good, they are not included in the count, and the Aggregate
* StatusCode is determined using the StatusCode Calculation for non-time based Aggregates.
* If no Good data exists for an interval, the count is zero.
*/
function calculateCountValue(interval, options) {
const indexStart = interval.index;
let statusCode = node_opcua_status_code_1.StatusCodes.Good;
let isPartial = interval.isPartial;
let nbBad = 0;
let nbGood = 0;
let nbUncertain = 0;
let badDuration = 0;
let uncertainDuration = 0;
let goodDuration = 0;
for (let i = indexStart; i < indexStart + interval.count; i++) {
const dataValue = interval.dataValues[i];
if (dataValue.statusCode.equals(node_opcua_status_code_1.StatusCodes.BadNoData)) {
isPartial = true;
continue;
}
const regionDuration = interval.regionDuration(i);
if (dataValue.statusCode.isBad()) {
nbBad++;
badDuration += regionDuration;
}
else if ((0, interval_1.isUncertain)(dataValue.statusCode)) {
nbUncertain++;
uncertainDuration += regionDuration;
}
else if (dataValue.statusCode.isGoodish()) {
nbGood++;
goodDuration += regionDuration;
}
}
const partialFlag = isPartial ? node_opcua_status_code_1.extraStatusCodeBits.HistorianPartial : 0;
// debugLog(" ", goodDuration, uncertainDuration, badDuration);
if (nbBad > 0) {
const duration = interval.duration();
if (options.treatUncertainAsBad) {
badDuration += uncertainDuration;
}
const actualPercentDataBad = (badDuration / duration) * 100.0;
const percentDataBad = options.percentDataBad === undefined ? 100 : options.percentDataBad;
if (actualPercentDataBad >= percentDataBad) {
return new node_opcua_data_value_1.DataValue({
sourceTimestamp: interval.startTime,
statusCode: node_opcua_status_code_1.StatusCodes.Bad
});
}
}
if (nbUncertain > 0 || nbBad > 0) {
statusCode = node_opcua_status_code_1.StatusCode.makeStatusCode(node_opcua_status_code_1.StatusCodes.UncertainDataSubNormal, node_opcua_status_code_1.extraStatusCodeBits.HistorianCalculated | partialFlag);
}
else {
statusCode = node_opcua_status_code_1.StatusCode.makeStatusCode(node_opcua_status_code_1.StatusCodes.Good, node_opcua_status_code_1.extraStatusCodeBits.HistorianCalculated | partialFlag);
}
if (nbUncertain === 0 && nbGood === 0) {
statusCode = node_opcua_status_code_1.StatusCodes.BadNoData;
return new node_opcua_data_value_1.DataValue({
sourceTimestamp: interval.startTime,
statusCode: statusCode
});
}
return new node_opcua_data_value_1.DataValue({
sourceTimestamp: interval.startTime,
statusCode: statusCode,
value: {
dataType: node_opcua_variant_1.DataType.UInt32,
value: nbGood
}
});
}
function getCountData(node, processingInterval, startDate, endDate, callback) {
(0, common_1.getAggregateData)(node, processingInterval, startDate, endDate, calculateCountValue, callback);
}
//# sourceMappingURL=count.js.map