node-opcua-aggregates 2.98.0 → 2.98.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aggregates.d.ts +22 -0
- package/dist/aggregates.js +276 -0
- package/dist/aggregates.js.map +1 -0
- package/dist/average.d.ts +3 -0
- package/dist/average.js +61 -0
- package/dist/average.js.map +1 -0
- package/dist/calculate_bad_good.d.ts +10 -0
- package/dist/calculate_bad_good.js +118 -0
- package/dist/calculate_bad_good.js.map +1 -0
- package/dist/common.d.ts +8 -0
- package/dist/common.js +94 -0
- package/dist/common.js.map +1 -0
- package/dist/count.d.ts +3 -0
- package/dist/count.js +87 -0
- package/dist/count.js.map +1 -0
- package/dist/duration_bad.d.ts +4 -0
- package/dist/duration_bad.js +32 -0
- package/dist/duration_bad.js.map +1 -0
- package/dist/duration_good.d.ts +4 -0
- package/dist/duration_good.js +32 -0
- package/dist/duration_good.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/interpolate.d.ts +16 -0
- package/dist/interpolate.js +131 -0
- package/dist/interpolate.js.map +1 -0
- package/dist/interval.d.ts +62 -0
- package/dist/interval.js +200 -0
- package/dist/interval.js.map +1 -0
- package/dist/minmax.d.ts +18 -0
- package/dist/minmax.js +149 -0
- package/dist/minmax.js.map +1 -0
- package/dist/percent_bad.d.ts +4 -0
- package/dist/percent_bad.js +25 -0
- package/dist/percent_bad.js.map +1 -0
- package/dist/percent_good.d.ts +7 -0
- package/dist/percent_good.js +49 -0
- package/dist/percent_good.js.map +1 -0
- package/dist/read_processed_details.d.ts +6 -0
- package/dist/read_processed_details.js +144 -0
- package/dist/read_processed_details.js.map +1 -0
- package/package.json +22 -18
- package/.mocharc.yml +0 -7
- package/bin/sample_aggregate_server.js +0 -15
- package/nyc.config.js +0 -16
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module node-opcua-aggregates
|
|
3
|
+
*/
|
|
4
|
+
import { AggregateFunction } from "node-opcua-constants";
|
|
5
|
+
import { NodeId, NodeIdLike } from "node-opcua-nodeid";
|
|
6
|
+
import { AddressSpace, BaseNode, IAddressSpace, UAObject, UAServerCapabilities, UAVariable } from "node-opcua-address-space";
|
|
7
|
+
import { AggregateConfigurationOptionsEx } from "./interval";
|
|
8
|
+
export declare function createHistoryServerCapabilities(addressSpace: AddressSpace, serverCapabilities: UAServerCapabilities): UAObject;
|
|
9
|
+
export declare function addAggregateFunctionSupport(addressSpace: AddressSpace, aggregateFunctionNodeId: NodeIdLike): void;
|
|
10
|
+
export declare function addAggregateStandardFunctionSupport(addressSpace: AddressSpace, functionName: AggregateFunction): void;
|
|
11
|
+
export declare function addAggregateSupport(addressSpace: AddressSpace, aggregatedFunctions?: AggregateFunction[]): void;
|
|
12
|
+
export declare function getAggregateFunctions(addressSpace: IAddressSpace): NodeId[];
|
|
13
|
+
/**
|
|
14
|
+
* Install aggregateConfiguration on an historizing variable
|
|
15
|
+
*
|
|
16
|
+
* @param node the variable on which to add the aggregateConfiguration.
|
|
17
|
+
* @param options the default AggregateConfigurationOptions.
|
|
18
|
+
* @param aggregateFunctions the aggregatedFunctions, if not specified the aggregatedFunction of ServerCapabilities.AggregatedFunction will be used.
|
|
19
|
+
|
|
20
|
+
*/
|
|
21
|
+
export declare function installAggregateConfigurationOptions(node: UAVariable, options: AggregateConfigurationOptionsEx, aggregateFunctions?: NodeIdLike[]): void;
|
|
22
|
+
export declare function getAggregateConfiguration(node: BaseNode): AggregateConfigurationOptionsEx;
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAggregateConfiguration = exports.installAggregateConfigurationOptions = exports.getAggregateFunctions = exports.addAggregateSupport = exports.addAggregateStandardFunctionSupport = exports.addAggregateFunctionSupport = exports.createHistoryServerCapabilities = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @module node-opcua-aggregates
|
|
6
|
+
*/
|
|
7
|
+
const node_opcua_constants_1 = require("node-opcua-constants");
|
|
8
|
+
const node_opcua_nodeid_1 = require("node-opcua-nodeid");
|
|
9
|
+
const utils = require("node-opcua-utils");
|
|
10
|
+
const node_opcua_variant_1 = require("node-opcua-variant");
|
|
11
|
+
const node_opcua_data_model_1 = require("node-opcua-data-model");
|
|
12
|
+
const read_processed_details_1 = require("./read_processed_details");
|
|
13
|
+
// import { HistoryServerCapabilities } from "node-opcua-server";
|
|
14
|
+
/*
|
|
15
|
+
HasProperty Variable AccessHistoryDataCapability Boolean PropertyType Mandatory
|
|
16
|
+
HasProperty Variable AccessHistoryEventsCapability Boolean PropertyType Mandatory
|
|
17
|
+
HasProperty Variable MaxReturnDataValues UInt32 PropertyType Mandatory
|
|
18
|
+
HasProperty Variable MaxReturnEventValues UInt32 PropertyType Mandatory
|
|
19
|
+
HasProperty Variable InsertDataCapability Boolean PropertyType Mandatory
|
|
20
|
+
HasProperty Variable ReplaceDataCapability Boolean PropertyType Mandatory
|
|
21
|
+
HasProperty Variable UpdateDataCapability Boolean PropertyType Mandatory
|
|
22
|
+
HasProperty Variable DeleteRawCapability Boolean PropertyType Mandatory
|
|
23
|
+
HasProperty Variable DeleteAtTimeCapability Boolean PropertyType Mandatory
|
|
24
|
+
HasProperty Variable InsertEventCapability Boolean PropertyType Mandatory
|
|
25
|
+
HasProperty Variable ReplaceEventCapability Boolean PropertyType Mandatory
|
|
26
|
+
HasProperty Variable UpdateEventCapability Boolean PropertyType Mandatory
|
|
27
|
+
HasProperty Variable DeleteEventCapability Boolean PropertyType Mandatory
|
|
28
|
+
HasProperty Variable InsertAnnotationsCapability Boolean PropertyType Mandatory
|
|
29
|
+
*/
|
|
30
|
+
const historicalCapabilitiesDefaultProperties /*: HistoryServerCapabilities */ = {
|
|
31
|
+
accessHistoryDataCapability: true,
|
|
32
|
+
accessHistoryEventsCapability: true,
|
|
33
|
+
deleteAtTimeCapability: false,
|
|
34
|
+
deleteEventCapability: false,
|
|
35
|
+
deleteRawCapability: false,
|
|
36
|
+
insertAnnotationCapability: false,
|
|
37
|
+
insertDataCapability: false,
|
|
38
|
+
insertEventCapability: false,
|
|
39
|
+
maxReturnDataValues: 0,
|
|
40
|
+
maxReturnEventValues: 0,
|
|
41
|
+
replaceDataCapability: false,
|
|
42
|
+
replaceEventCapability: false,
|
|
43
|
+
updateDataCapability: false,
|
|
44
|
+
updateEventCapability: false // Boolean PropertyType Mandatory
|
|
45
|
+
};
|
|
46
|
+
function createHistoryServerCapabilities(addressSpace, serverCapabilities) {
|
|
47
|
+
/* istanbul ignore next */
|
|
48
|
+
if (serverCapabilities.browseName.toString() !== "ServerCapabilities") {
|
|
49
|
+
throw new Error("Expecting server Capabilities");
|
|
50
|
+
}
|
|
51
|
+
const historyServerCapabilitiesType = addressSpace.getNamespace(0).findObjectType("HistoryServerCapabilitiesType");
|
|
52
|
+
/* istanbul ignore next */
|
|
53
|
+
if (!historyServerCapabilitiesType) {
|
|
54
|
+
throw new Error("Cannot find HistoryServerCapabilitiesType");
|
|
55
|
+
}
|
|
56
|
+
return historyServerCapabilitiesType.instantiate({
|
|
57
|
+
browseName: "HistoryServerCapabilities",
|
|
58
|
+
componentOf: serverCapabilities
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
exports.createHistoryServerCapabilities = createHistoryServerCapabilities;
|
|
62
|
+
function setHistoricalServerCapabilities(historyServerCapabilities, defaultProperties) {
|
|
63
|
+
function setBoolean(propName) {
|
|
64
|
+
const lowerCase = utils.lowerFirstLetter(propName);
|
|
65
|
+
/* istanbul ignore next */
|
|
66
|
+
if (!Object.prototype.hasOwnProperty.call(defaultProperties, lowerCase)) {
|
|
67
|
+
throw new Error("cannot find " + lowerCase);
|
|
68
|
+
}
|
|
69
|
+
const value = defaultProperties[lowerCase];
|
|
70
|
+
const prop = historyServerCapabilities.getChildByName(propName);
|
|
71
|
+
/* istanbul ignore next */
|
|
72
|
+
if (!prop) {
|
|
73
|
+
throw new Error(" Cannot find property " + propName);
|
|
74
|
+
}
|
|
75
|
+
prop.setValueFromSource({ dataType: node_opcua_variant_1.DataType.Boolean, value });
|
|
76
|
+
}
|
|
77
|
+
function setUInt32(propName) {
|
|
78
|
+
const lowerCase = utils.lowerFirstLetter(propName);
|
|
79
|
+
/* istanbul ignore next */
|
|
80
|
+
if (!Object.prototype.hasOwnProperty.call(historyServerCapabilities, lowerCase)) {
|
|
81
|
+
throw new Error("cannot find " + lowerCase);
|
|
82
|
+
}
|
|
83
|
+
const value = defaultProperties[lowerCase];
|
|
84
|
+
const prop = historyServerCapabilities.getChildByName(propName);
|
|
85
|
+
prop.setValueFromSource({ dataType: node_opcua_variant_1.DataType.UInt32, value });
|
|
86
|
+
}
|
|
87
|
+
setBoolean("AccessHistoryDataCapability");
|
|
88
|
+
setBoolean("AccessHistoryEventsCapability");
|
|
89
|
+
setUInt32("MaxReturnDataValues");
|
|
90
|
+
setUInt32("MaxReturnEventValues");
|
|
91
|
+
setBoolean("InsertDataCapability");
|
|
92
|
+
setBoolean("ReplaceDataCapability");
|
|
93
|
+
setBoolean("UpdateDataCapability");
|
|
94
|
+
setBoolean("DeleteRawCapability");
|
|
95
|
+
setBoolean("DeleteAtTimeCapability");
|
|
96
|
+
setBoolean("InsertEventCapability");
|
|
97
|
+
setBoolean("ReplaceEventCapability");
|
|
98
|
+
setBoolean("UpdateEventCapability");
|
|
99
|
+
setBoolean("DeleteEventCapability");
|
|
100
|
+
/// FOUND A BUG HERE spec says InsertAnnotationsCapability
|
|
101
|
+
/// Standard nodeset2 says InsertAnnotationCapability ( without s )
|
|
102
|
+
// xx setBoolean("InsertAnnotationsCapability");
|
|
103
|
+
}
|
|
104
|
+
function addAggregateFunctionSupport(addressSpace, aggregateFunctionNodeId) {
|
|
105
|
+
const serverCapabilities = addressSpace.rootFolder.objects.server.serverCapabilities;
|
|
106
|
+
/* istanbul ignore next */
|
|
107
|
+
if (!serverCapabilities.historyServerCapabilities) {
|
|
108
|
+
throw new Error("missing serverCapabilities.historyServerCapabilities");
|
|
109
|
+
}
|
|
110
|
+
const aggregateFunctions = serverCapabilities.aggregateFunctions;
|
|
111
|
+
const aggregateFunctionsInHist = serverCapabilities.historyServerCapabilities.aggregateFunctions;
|
|
112
|
+
const functionNode = addressSpace.findNode(aggregateFunctionNodeId);
|
|
113
|
+
/* istanbul ignore next */
|
|
114
|
+
if (!functionNode) {
|
|
115
|
+
throw new Error("Cannot find node " + aggregateFunctionNodeId.toString() + " in addressSpace");
|
|
116
|
+
}
|
|
117
|
+
/* istanbul ignore next */
|
|
118
|
+
if (functionNode.nodeClass !== node_opcua_data_model_1.NodeClass.Object) {
|
|
119
|
+
throw new Error("Expecting an object Node");
|
|
120
|
+
}
|
|
121
|
+
/* istanbul ignore next */
|
|
122
|
+
if (!(0, node_opcua_nodeid_1.sameNodeId)(functionNode.typeDefinition, (0, node_opcua_nodeid_1.coerceNodeId)(node_opcua_constants_1.ObjectTypeIds.AggregateFunctionType))) {
|
|
123
|
+
throw new Error("Expecting an object with TypeDefinition AggregateFunctionType");
|
|
124
|
+
}
|
|
125
|
+
aggregateFunctions.addReference({
|
|
126
|
+
nodeId: functionNode.nodeId,
|
|
127
|
+
referenceType: "Organizes"
|
|
128
|
+
});
|
|
129
|
+
aggregateFunctionsInHist.addReference({
|
|
130
|
+
nodeId: functionNode.nodeId,
|
|
131
|
+
referenceType: "Organizes"
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
exports.addAggregateFunctionSupport = addAggregateFunctionSupport;
|
|
135
|
+
function addAggregateStandardFunctionSupport(addressSpace, functionName) {
|
|
136
|
+
/* istanbul ignore next */
|
|
137
|
+
if (!functionName) {
|
|
138
|
+
throw new Error("Invalid function name");
|
|
139
|
+
}
|
|
140
|
+
const functionNodeId = (0, node_opcua_nodeid_1.makeNodeId)(functionName);
|
|
141
|
+
addAggregateFunctionSupport(addressSpace, functionNodeId);
|
|
142
|
+
}
|
|
143
|
+
exports.addAggregateStandardFunctionSupport = addAggregateStandardFunctionSupport;
|
|
144
|
+
function addAggregateSupport(addressSpace, aggregatedFunctions) {
|
|
145
|
+
aggregatedFunctions = aggregatedFunctions || [
|
|
146
|
+
node_opcua_constants_1.AggregateFunction.Interpolative,
|
|
147
|
+
node_opcua_constants_1.AggregateFunction.Minimum,
|
|
148
|
+
node_opcua_constants_1.AggregateFunction.Maximum,
|
|
149
|
+
node_opcua_constants_1.AggregateFunction.Average
|
|
150
|
+
];
|
|
151
|
+
const aggregateConfigurationType = addressSpace.getNamespace(0).findObjectType("AggregateConfigurationType");
|
|
152
|
+
/* istanbul ignore next */
|
|
153
|
+
if (!aggregateConfigurationType) {
|
|
154
|
+
throw new Error("addressSpace do not expose AggregateConfigurationType");
|
|
155
|
+
}
|
|
156
|
+
const aggregateFunctionType = addressSpace.getNamespace(0).findObjectType("AggregateFunctionType");
|
|
157
|
+
/* istanbul ignore next */
|
|
158
|
+
if (!aggregateFunctionType) {
|
|
159
|
+
throw new Error("addressSpace do not expose AggregateFunctionType");
|
|
160
|
+
}
|
|
161
|
+
const serverObject = addressSpace.rootFolder.objects.getFolderElementByName("Server");
|
|
162
|
+
/* istanbul ignore next */
|
|
163
|
+
if (!serverObject) {
|
|
164
|
+
throw new Error("addressSpace do not expose a ServerObject");
|
|
165
|
+
}
|
|
166
|
+
// xx serverObject.
|
|
167
|
+
const serverCapabilities = serverObject.getChildByName("ServerCapabilities");
|
|
168
|
+
// Let see if HistoryServer Capabilities object exists
|
|
169
|
+
let historyServerCapabilities = serverCapabilities.getChildByName("HistoryServerCapabilities");
|
|
170
|
+
/* istanbul ignore next */
|
|
171
|
+
if (!historyServerCapabilities) {
|
|
172
|
+
historyServerCapabilities = createHistoryServerCapabilities(addressSpace, serverCapabilities);
|
|
173
|
+
}
|
|
174
|
+
setHistoricalServerCapabilities(historyServerCapabilities, historicalCapabilitiesDefaultProperties);
|
|
175
|
+
for (const f of aggregatedFunctions) {
|
|
176
|
+
addAggregateStandardFunctionSupport(addressSpace, f);
|
|
177
|
+
}
|
|
178
|
+
const addressSpaceInternal = addressSpace;
|
|
179
|
+
addressSpaceInternal._readProcessedDetails = read_processed_details_1.readProcessedDetails;
|
|
180
|
+
}
|
|
181
|
+
exports.addAggregateSupport = addAggregateSupport;
|
|
182
|
+
function getAggregateFunctions(addressSpace) {
|
|
183
|
+
const aggregateFunctionTypeNodeId = (0, node_opcua_nodeid_1.resolveNodeId)(node_opcua_constants_1.ObjectTypeIds.AggregateFunctionType);
|
|
184
|
+
const aggregateFunctions = addressSpace.findNode(node_opcua_constants_1.ObjectIds.Server_ServerCapabilities_AggregateFunctions);
|
|
185
|
+
if (!aggregateFunctions) {
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
const referenceDescripitions = aggregateFunctions.browseNode({
|
|
189
|
+
referenceTypeId: node_opcua_constants_1.ReferenceTypeIds.HierarchicalReferences,
|
|
190
|
+
resultMask: 63,
|
|
191
|
+
nodeClassMask: node_opcua_data_model_1.NodeClassMask.Object,
|
|
192
|
+
browseDirection: node_opcua_data_model_1.BrowseDirection.Forward,
|
|
193
|
+
includeSubtypes: true
|
|
194
|
+
});
|
|
195
|
+
const aggregateFunctionsNodeIds = referenceDescripitions
|
|
196
|
+
.filter((a) => (0, node_opcua_nodeid_1.sameNodeId)(a.typeDefinition, aggregateFunctionTypeNodeId))
|
|
197
|
+
.map((a) => a.nodeId);
|
|
198
|
+
return aggregateFunctionsNodeIds;
|
|
199
|
+
}
|
|
200
|
+
exports.getAggregateFunctions = getAggregateFunctions;
|
|
201
|
+
/**
|
|
202
|
+
* Install aggregateConfiguration on an historizing variable
|
|
203
|
+
*
|
|
204
|
+
* @param node the variable on which to add the aggregateConfiguration.
|
|
205
|
+
* @param options the default AggregateConfigurationOptions.
|
|
206
|
+
* @param aggregateFunctions the aggregatedFunctions, if not specified the aggregatedFunction of ServerCapabilities.AggregatedFunction will be used.
|
|
207
|
+
|
|
208
|
+
*/
|
|
209
|
+
function installAggregateConfigurationOptions(node, options, aggregateFunctions) {
|
|
210
|
+
const nodePriv = node;
|
|
211
|
+
// istanbul ignore next
|
|
212
|
+
if (!nodePriv.historizing) {
|
|
213
|
+
throw new Error("variable.historizing is not set\n make sure addressSpace.installHistoricalDataNode(variable) has been called");
|
|
214
|
+
}
|
|
215
|
+
const aggregateConfiguration = nodePriv.$historicalDataConfiguration.aggregateConfiguration;
|
|
216
|
+
const f = (a, defaultValue) => a === undefined ? defaultValue : a;
|
|
217
|
+
aggregateConfiguration.percentDataBad.setValueFromSource({ dataType: "Byte", value: f(options.percentDataBad, 100) });
|
|
218
|
+
aggregateConfiguration.percentDataGood.setValueFromSource({ dataType: "Byte", value: f(options.percentDataGood, 100) });
|
|
219
|
+
aggregateConfiguration.treatUncertainAsBad.setValueFromSource({
|
|
220
|
+
dataType: "Boolean",
|
|
221
|
+
value: f(options.treatUncertainAsBad, false)
|
|
222
|
+
});
|
|
223
|
+
aggregateConfiguration.useSlopedExtrapolation.setValueFromSource({
|
|
224
|
+
dataType: "Boolean",
|
|
225
|
+
value: f(options.useSlopedExtrapolation, false)
|
|
226
|
+
});
|
|
227
|
+
nodePriv.$historicalDataConfiguration.stepped.setValueFromSource({
|
|
228
|
+
dataType: "Boolean",
|
|
229
|
+
value: f(options.stepped, false)
|
|
230
|
+
});
|
|
231
|
+
// https://reference.opcfoundation.org/v104/Core/docs/Part13/4.4/
|
|
232
|
+
// Exposing Supported Functions and Capabilities
|
|
233
|
+
if (!aggregateFunctions) {
|
|
234
|
+
aggregateFunctions = getAggregateFunctions(node.addressSpace);
|
|
235
|
+
}
|
|
236
|
+
let uaAggregateFunctions = nodePriv.$historicalDataConfiguration.aggregateFunctions;
|
|
237
|
+
if (!uaAggregateFunctions) {
|
|
238
|
+
const namespace = nodePriv.namespace;
|
|
239
|
+
uaAggregateFunctions = namespace.addObject({
|
|
240
|
+
browseName: (0, node_opcua_data_model_1.coerceQualifiedName)({ name: "AggregateFunctions", namespaceIndex: 0 }),
|
|
241
|
+
componentOf: nodePriv.$historicalDataConfiguration
|
|
242
|
+
});
|
|
243
|
+
uaAggregateFunctions = nodePriv.$historicalDataConfiguration.aggregateFunctions;
|
|
244
|
+
}
|
|
245
|
+
// verify that all aggregateFunctions are of type AggregateFunctionType
|
|
246
|
+
// ... to do
|
|
247
|
+
const referenceType = (0, node_opcua_nodeid_1.resolveNodeId)(node_opcua_constants_1.ReferenceTypeIds.Organizes);
|
|
248
|
+
for (const nodeId of aggregateFunctions) {
|
|
249
|
+
uaAggregateFunctions.addReference({
|
|
250
|
+
nodeId,
|
|
251
|
+
referenceType,
|
|
252
|
+
isForward: true
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
exports.installAggregateConfigurationOptions = installAggregateConfigurationOptions;
|
|
257
|
+
function getAggregateConfiguration(node) {
|
|
258
|
+
const nodePriv = node;
|
|
259
|
+
/* istanbul ignore next */
|
|
260
|
+
if (!nodePriv.$historicalDataConfiguration) {
|
|
261
|
+
throw new Error("internal error");
|
|
262
|
+
}
|
|
263
|
+
const aggregateConfiguration = nodePriv.$historicalDataConfiguration.aggregateConfiguration;
|
|
264
|
+
// Beware ! Stepped value comes from Historical Configuration !
|
|
265
|
+
const stepped = nodePriv.$historicalDataConfiguration.stepped.readValue().value.value;
|
|
266
|
+
return {
|
|
267
|
+
percentDataBad: aggregateConfiguration.percentDataBad.readValue().value.value,
|
|
268
|
+
percentDataGood: aggregateConfiguration.percentDataGood.readValue().value.value,
|
|
269
|
+
stepped,
|
|
270
|
+
treatUncertainAsBad: aggregateConfiguration.treatUncertainAsBad.readValue().value.value,
|
|
271
|
+
// xx stepped: aggregateConfiguration.stepped.readValue().value,
|
|
272
|
+
useSlopedExtrapolation: aggregateConfiguration.useSlopedExtrapolation.readValue().value.value
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
exports.getAggregateConfiguration = getAggregateConfiguration;
|
|
276
|
+
//# sourceMappingURL=aggregates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregates.js","sourceRoot":"","sources":["../source/aggregates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { UAVariable } from "node-opcua-address-space";
|
|
2
|
+
import { DataValue } from "node-opcua-data-value";
|
|
3
|
+
export declare function getAverageData(node: UAVariable, processingInterval: number, startDate: Date, endDate: Date, callback: (err: Error | null, dataValues?: DataValue[]) => void): void;
|
package/dist/average.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAverageData = void 0;
|
|
4
|
+
const node_opcua_data_value_1 = require("node-opcua-data-value");
|
|
5
|
+
const node_opcua_variant_1 = require("node-opcua-variant");
|
|
6
|
+
const node_opcua_status_code_1 = require("node-opcua-status-code");
|
|
7
|
+
const common_1 = require("./common");
|
|
8
|
+
function calculateIntervalAverageValue(interval, options) {
|
|
9
|
+
const indexStart = interval.index;
|
|
10
|
+
let statusCode;
|
|
11
|
+
let isPartial = interval.isPartial;
|
|
12
|
+
const isRaw = false;
|
|
13
|
+
let hasBad = false;
|
|
14
|
+
const values = [];
|
|
15
|
+
for (let i = indexStart; i < indexStart + interval.count; i++) {
|
|
16
|
+
const dataValue = interval.dataValues[i];
|
|
17
|
+
if (dataValue.statusCode.equals(node_opcua_status_code_1.StatusCodes.BadNoData)) {
|
|
18
|
+
isPartial = true;
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (dataValue.statusCode.isNotGood()) {
|
|
22
|
+
hasBad = true;
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
values.push(dataValue.value.value);
|
|
26
|
+
}
|
|
27
|
+
if (isRaw) {
|
|
28
|
+
if (hasBad) {
|
|
29
|
+
statusCode = node_opcua_status_code_1.StatusCodes.UncertainDataSubNormal;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
statusCode = node_opcua_status_code_1.StatusCodes.Good;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else if (hasBad) {
|
|
36
|
+
statusCode = node_opcua_status_code_1.StatusCode.makeStatusCode(node_opcua_status_code_1.StatusCodes.UncertainDataSubNormal, "HistorianCalculated");
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
statusCode = node_opcua_status_code_1.StatusCode.makeStatusCode(node_opcua_status_code_1.StatusCodes.Good, "HistorianCalculated");
|
|
40
|
+
}
|
|
41
|
+
if (values.length === 0) {
|
|
42
|
+
return new node_opcua_data_value_1.DataValue({
|
|
43
|
+
sourceTimestamp: interval.startTime,
|
|
44
|
+
statusCode: node_opcua_status_code_1.StatusCodes.BadNoData
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const mean = values.reduce((p, c) => p + c, 0) / values.length;
|
|
48
|
+
return new node_opcua_data_value_1.DataValue({
|
|
49
|
+
sourceTimestamp: interval.startTime,
|
|
50
|
+
statusCode: statusCode,
|
|
51
|
+
value: {
|
|
52
|
+
dataType: node_opcua_variant_1.DataType.Double,
|
|
53
|
+
value: mean
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function getAverageData(node, processingInterval, startDate, endDate, callback) {
|
|
58
|
+
(0, common_1.getAggregateData)(node, processingInterval, startDate, endDate, calculateIntervalAverageValue, callback);
|
|
59
|
+
}
|
|
60
|
+
exports.getAverageData = getAverageData;
|
|
61
|
+
//# sourceMappingURL=average.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"average.js","sourceRoot":"","sources":["../source/average.ts"],"names":[],"mappings":";;;AACA,iEAAkD;AAClD,2DAA8C;AAC9C,mEAAiE;AAEjE,qCAA4C;AAG5C,SAAS,6BAA6B,CAAC,QAAkB,EAAE,OAAsC;IAC7F,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC;IAClC,IAAI,UAAsB,CAAC;IAC3B,IAAI,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IAEnC,MAAM,KAAK,GAAG,KAAK,CAAC;IACpB,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,UAAU,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3D,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAEzC,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,oCAAW,CAAC,SAAS,CAAC,EAAE;YACpD,SAAS,GAAG,IAAI,CAAC;YACjB,SAAS;SACZ;QAED,IAAI,SAAS,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE;YAClC,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;SACZ;QACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;KACtC;IAED,IAAI,KAAK,EAAE;QACP,IAAI,MAAM,EAAE;YACR,UAAU,GAAG,oCAAW,CAAC,sBAAsB,CAAC;SACnD;aAAM;YACH,UAAU,GAAG,oCAAW,CAAC,IAAI,CAAC;SACjC;KACJ;SAAM,IAAI,MAAM,EAAE;QACf,UAAU,GAAG,mCAAU,CAAC,cAAc,CAAC,oCAAW,CAAC,sBAAsB,EAAE,qBAAqB,CAAC,CAAC;KACrG;SAAM;QACH,UAAU,GAAG,mCAAU,CAAC,cAAc,CAAC,oCAAW,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;KACnF;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QACrB,OAAO,IAAI,iCAAS,CAAC;YACjB,eAAe,EAAE,QAAQ,CAAC,SAAS;YACnC,UAAU,EAAE,oCAAW,CAAC,SAAS;SACpC,CAAC,CAAC;KACN;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IAE/D,OAAO,IAAI,iCAAS,CAAC;QACjB,eAAe,EAAE,QAAQ,CAAC,SAAS;QACnC,UAAU,EAAE,UAAwB;QACpC,KAAK,EAAE;YACH,QAAQ,EAAE,6BAAQ,CAAC,MAAM;YACzB,KAAK,EAAE,IAAI;SACd;KACJ,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,cAAc,CAC1B,IAAgB,EAChB,kBAA0B,EAC1B,SAAe,EACf,OAAa,EACb,QAA+D;IAE/D,IAAA,yBAAgB,EAAC,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,OAAO,EAAE,6BAA6B,EAAE,QAAQ,CAAC,CAAC;AAC5G,CAAC;AARD,wCAQC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { StatusCode } from "node-opcua-status-code";
|
|
2
|
+
import { Interval, AggregateConfigurationOptions } from "./interval";
|
|
3
|
+
export declare function calculateBadAndGood(interval: Interval, options: AggregateConfigurationOptions): {
|
|
4
|
+
durationGood: number;
|
|
5
|
+
durationBad: number;
|
|
6
|
+
durationUnknown: number;
|
|
7
|
+
percentBad: number;
|
|
8
|
+
percentGood: number;
|
|
9
|
+
statusCode: StatusCode;
|
|
10
|
+
};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateBadAndGood = void 0;
|
|
4
|
+
const node_opcua_status_code_1 = require("node-opcua-status-code");
|
|
5
|
+
const interval_1 = require("./interval");
|
|
6
|
+
const a = (s, options) => !s || s === node_opcua_status_code_1.StatusCodes.BadNoData
|
|
7
|
+
? node_opcua_status_code_1.StatusCodes.BadNoData
|
|
8
|
+
: s.isBad() || (options.treatUncertainAsBad && (0, interval_1.isUncertain)(s))
|
|
9
|
+
? node_opcua_status_code_1.StatusCodes.Bad
|
|
10
|
+
: node_opcua_status_code_1.StatusCodes.Good;
|
|
11
|
+
function findLowBound(interval, options) {
|
|
12
|
+
const indexStart = interval.index;
|
|
13
|
+
const initialValue = interval.dataValues[indexStart];
|
|
14
|
+
if (initialValue.sourceTimestamp.getTime() === interval.startTime.getTime()) {
|
|
15
|
+
return { previousStatus: initialValue.statusCode, previousTime: interval.startTime.getTime(), indexStart: indexStart + 1 };
|
|
16
|
+
}
|
|
17
|
+
const previousStatus = indexStart === 0 || !interval.dataValues[indexStart - 1]
|
|
18
|
+
? node_opcua_status_code_1.StatusCodes.BadNoData
|
|
19
|
+
: a(interval.dataValues[indexStart - 1].statusCode, options);
|
|
20
|
+
const previousTime = interval.startTime.getTime();
|
|
21
|
+
return { previousStatus, previousTime, indexStart };
|
|
22
|
+
}
|
|
23
|
+
// eslint-disable-next-line max-statements, complexity
|
|
24
|
+
function calculateBadAndGood(interval, options) {
|
|
25
|
+
if (interval.count === 0) {
|
|
26
|
+
return {
|
|
27
|
+
durationGood: 0,
|
|
28
|
+
durationBad: 0,
|
|
29
|
+
durationUnknown: 0,
|
|
30
|
+
percentBad: 0,
|
|
31
|
+
percentGood: 0,
|
|
32
|
+
statusCode: node_opcua_status_code_1.StatusCodes.BadNoData
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
let durationGood = 0;
|
|
36
|
+
let durationBad = 0;
|
|
37
|
+
let durationUnknown = 0;
|
|
38
|
+
let partialFlag = interval.isPartial ? node_opcua_status_code_1.extraStatusCodeBits.HistorianPartial : 0;
|
|
39
|
+
let { previousStatus, previousTime, indexStart } = findLowBound(interval, options);
|
|
40
|
+
if (previousStatus === node_opcua_status_code_1.StatusCodes.BadNoData) {
|
|
41
|
+
partialFlag = node_opcua_status_code_1.extraStatusCodeBits.HistorianPartial;
|
|
42
|
+
previousStatus = node_opcua_status_code_1.StatusCodes.Bad;
|
|
43
|
+
}
|
|
44
|
+
let nbGood = 0;
|
|
45
|
+
let nbBad = 0;
|
|
46
|
+
let nbUncertain = 0;
|
|
47
|
+
indexStart += 0;
|
|
48
|
+
for (let i = indexStart; i < interval.index + interval.count; i++) {
|
|
49
|
+
const dataValue = interval.dataValues[i];
|
|
50
|
+
if (dataValue.statusCode.isGoodish()) {
|
|
51
|
+
nbGood++;
|
|
52
|
+
}
|
|
53
|
+
if ((0, interval_1.isUncertain)(dataValue.statusCode)) {
|
|
54
|
+
nbUncertain++;
|
|
55
|
+
}
|
|
56
|
+
if (dataValue.statusCode.isBad()) {
|
|
57
|
+
nbBad++;
|
|
58
|
+
}
|
|
59
|
+
const currentStatus = a(dataValue.statusCode, options);
|
|
60
|
+
if (currentStatus === node_opcua_status_code_1.StatusCodes.BadNoData) {
|
|
61
|
+
partialFlag = node_opcua_status_code_1.extraStatusCodeBits.HistorianPartial;
|
|
62
|
+
}
|
|
63
|
+
const currentTime = dataValue.sourceTimestamp.getTime();
|
|
64
|
+
// console.log(" ", dataValue.sourceTimestamp?.toISOString(), dataValue.statusCode.toString(), dataValue.value.value);
|
|
65
|
+
if (currentStatus === previousStatus)
|
|
66
|
+
continue;
|
|
67
|
+
if (previousStatus === node_opcua_status_code_1.StatusCodes.Good) {
|
|
68
|
+
// if (isBadWithUncertain(currentStatus, options.treatUncertainAsBad)) {
|
|
69
|
+
// durationBad += currentTime - previousTime;
|
|
70
|
+
// } else {
|
|
71
|
+
durationGood += currentTime - previousTime;
|
|
72
|
+
// }
|
|
73
|
+
}
|
|
74
|
+
else if (previousStatus === node_opcua_status_code_1.StatusCodes.BadNoData) {
|
|
75
|
+
durationUnknown += currentTime - previousTime;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
durationBad += currentTime - previousTime;
|
|
79
|
+
}
|
|
80
|
+
previousStatus = currentStatus;
|
|
81
|
+
previousTime = currentTime;
|
|
82
|
+
}
|
|
83
|
+
// final step
|
|
84
|
+
const currentTime = interval.getEffectiveEndTime();
|
|
85
|
+
if (previousStatus === node_opcua_status_code_1.StatusCodes.Good) {
|
|
86
|
+
durationGood += currentTime - previousTime;
|
|
87
|
+
}
|
|
88
|
+
else if (previousStatus === node_opcua_status_code_1.StatusCodes.BadNoData) {
|
|
89
|
+
durationUnknown += currentTime - previousTime;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
durationBad += currentTime - previousTime;
|
|
93
|
+
}
|
|
94
|
+
if (nbGood === 0) {
|
|
95
|
+
if (nbBad > 0) {
|
|
96
|
+
// we need at lest a Good Status in the intervale to be good & no bad !
|
|
97
|
+
durationGood = -1;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
durationGood = 0;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const effectiveProcessingInterval = currentTime - interval.startTime.getTime();
|
|
104
|
+
const percentGood = (durationGood / effectiveProcessingInterval) * 100;
|
|
105
|
+
const percentBad = (durationBad / effectiveProcessingInterval) * 100;
|
|
106
|
+
let percentDataGood = options.percentDataGood === undefined ? 100 : options.percentDataGood;
|
|
107
|
+
const percentDataBad = options.percentDataBad === undefined ? 100 : options.percentDataBad;
|
|
108
|
+
if (percentBad >= percentDataBad || (nbGood === 0 && nbUncertain === 0)) {
|
|
109
|
+
durationGood = 0; // BAD
|
|
110
|
+
percentDataGood = -1;
|
|
111
|
+
// const statusCode = StatusCodes.Bad;
|
|
112
|
+
//return { durationGood, durationBad, durationUnknown, percentBad, percentGood, statusCode };
|
|
113
|
+
}
|
|
114
|
+
const statusCode = node_opcua_status_code_1.StatusCode.makeStatusCode(node_opcua_status_code_1.StatusCodes.Good, node_opcua_status_code_1.extraStatusCodeBits.HistorianCalculated | partialFlag);
|
|
115
|
+
return { durationGood, durationBad, durationUnknown, percentBad, percentGood, statusCode };
|
|
116
|
+
}
|
|
117
|
+
exports.calculateBadAndGood = calculateBadAndGood;
|
|
118
|
+
//# sourceMappingURL=calculate_bad_good.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calculate_bad_good.js","sourceRoot":"","sources":["../source/calculate_bad_good.ts"],"names":[],"mappings":"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"}
|
package/dist/common.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module node-opca-aggregates
|
|
3
|
+
*/
|
|
4
|
+
import { UAVariable } from "node-opcua-address-space";
|
|
5
|
+
import { DataValue } from "node-opcua-data-value";
|
|
6
|
+
import { Interval, AggregateConfigurationOptionsEx } from "./interval";
|
|
7
|
+
export declare function getAggregateData(node: UAVariable, processingInterval: number, startDate: Date, endDate: Date, lambda: (interval: Interval, aggregateConfiguration: AggregateConfigurationOptionsEx) => DataValue, callback: (err: Error | null, dataValues?: DataValue[]) => void): void;
|
|
8
|
+
export declare function interpolateValue(dataValue1: DataValue, dataValue2: DataValue, date: Date): DataValue;
|
package/dist/common.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.interpolateValue = exports.getAggregateData = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @module node-opca-aggregates
|
|
6
|
+
*/
|
|
7
|
+
const node_opcua_address_space_1 = require("node-opcua-address-space");
|
|
8
|
+
const node_opcua_data_model_1 = require("node-opcua-data-model");
|
|
9
|
+
const node_opcua_data_value_1 = require("node-opcua-data-value");
|
|
10
|
+
const node_opcua_service_history_1 = require("node-opcua-service-history");
|
|
11
|
+
const node_opcua_status_code_1 = require("node-opcua-status-code");
|
|
12
|
+
const node_opcua_nodeid_1 = require("node-opcua-nodeid");
|
|
13
|
+
const aggregates_1 = require("./aggregates");
|
|
14
|
+
const interval_1 = require("./interval");
|
|
15
|
+
/**
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
function processAggregateData(node, processingInterval, startDate, endDate, dataValues, lambda, callback) {
|
|
19
|
+
const aggregateConfiguration = (0, aggregates_1.getAggregateConfiguration)(node);
|
|
20
|
+
const results = [];
|
|
21
|
+
const tstart = startDate.getTime();
|
|
22
|
+
const tend = endDate.getTime();
|
|
23
|
+
const indexHint = 0;
|
|
24
|
+
for (let t = tstart; t < tend; t += processingInterval) {
|
|
25
|
+
const sourceTimestamp = new Date();
|
|
26
|
+
sourceTimestamp.setTime(t);
|
|
27
|
+
const interval = (0, interval_1.getInterval)(sourceTimestamp, processingInterval, indexHint, dataValues);
|
|
28
|
+
const dataValue = lambda(interval, aggregateConfiguration);
|
|
29
|
+
/* istanbul ignore next */
|
|
30
|
+
if (!dataValue || !dataValue.sourceTimestamp) {
|
|
31
|
+
// const dataValue = interval.interpolatedValue(aggregateConfiguration);
|
|
32
|
+
throw Error("invalid DataValue");
|
|
33
|
+
}
|
|
34
|
+
results.push(dataValue);
|
|
35
|
+
// console.log(" => ", dataValue.sourceTimestamp.toISOString(), dataValue.statusCode.toString(), dataValue.value.value);
|
|
36
|
+
}
|
|
37
|
+
setImmediate(() => {
|
|
38
|
+
callback(null, results);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function getAggregateData(node, processingInterval, startDate, endDate, lambda, callback) {
|
|
42
|
+
/* istanbul ignore next */
|
|
43
|
+
if (node.nodeClass !== node_opcua_data_model_1.NodeClass.Variable) {
|
|
44
|
+
throw new Error("node must be UAVariable");
|
|
45
|
+
}
|
|
46
|
+
/* istanbul ignore next */
|
|
47
|
+
if (processingInterval <= 0) {
|
|
48
|
+
throw new Error("Invalid processing interval, shall be greater than 0");
|
|
49
|
+
}
|
|
50
|
+
const continuationPointManager = new node_opcua_address_space_1.ContinuationPointManager();
|
|
51
|
+
const context = new node_opcua_address_space_1.SessionContext({
|
|
52
|
+
session: {
|
|
53
|
+
continuationPointManager,
|
|
54
|
+
getSessionId: () => (0, node_opcua_nodeid_1.coerceNodeId)("i=0")
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
const historyReadDetails = new node_opcua_service_history_1.ReadRawModifiedDetails({
|
|
58
|
+
endTime: endDate,
|
|
59
|
+
startTime: startDate,
|
|
60
|
+
isReadModified: false,
|
|
61
|
+
numValuesPerNode: 0
|
|
62
|
+
// returnBounds: true,
|
|
63
|
+
});
|
|
64
|
+
const indexRange = null;
|
|
65
|
+
const dataEncoding = null;
|
|
66
|
+
const continuationPoint = null;
|
|
67
|
+
node.historyRead(context, historyReadDetails, indexRange, dataEncoding, { continuationPoint }, (err, result) => {
|
|
68
|
+
/* istanbul ignore next */
|
|
69
|
+
if (err) {
|
|
70
|
+
return callback(err);
|
|
71
|
+
}
|
|
72
|
+
const historyData = result.historyData;
|
|
73
|
+
const dataValues = historyData.dataValues || [];
|
|
74
|
+
processAggregateData(node, processingInterval, startDate, endDate, dataValues, lambda, callback);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
exports.getAggregateData = getAggregateData;
|
|
78
|
+
function interpolateValue(dataValue1, dataValue2, date) {
|
|
79
|
+
const t0 = dataValue1.sourceTimestamp.getTime();
|
|
80
|
+
const t = date.getTime();
|
|
81
|
+
const t1 = dataValue2.sourceTimestamp.getTime();
|
|
82
|
+
const coef1 = (t - t0) / (t1 - t0);
|
|
83
|
+
const coef2 = (t1 - t) / (t1 - t0);
|
|
84
|
+
const value = dataValue1.value.clone();
|
|
85
|
+
value.value = coef2 * dataValue1.value.value + coef1 * dataValue2.value.value;
|
|
86
|
+
const statusCode = node_opcua_status_code_1.StatusCode.makeStatusCode(dataValue1.statusCode, "HistorianInterpolated");
|
|
87
|
+
return new node_opcua_data_value_1.DataValue({
|
|
88
|
+
sourceTimestamp: date,
|
|
89
|
+
statusCode,
|
|
90
|
+
value
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
exports.interpolateValue = interpolateValue;
|
|
94
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../source/common.ts"],"names":[],"mappings":"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"}
|
package/dist/count.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { UAVariable } from "node-opcua-address-space";
|
|
2
|
+
import { DataValue } from "node-opcua-data-value";
|
|
3
|
+
export declare function getCountData(node: UAVariable, processingInterval: number, startDate: Date, endDate: Date, callback: (err: Error | null, dataValues?: DataValue[]) => void): void;
|