node-red-contrib-iiot-opcua
Version:
An Industrial IoT OPC UA toolbox contribution package for Node-RED based on node-opcua.
108 lines (103 loc) • 6.57 kB
HTML
<!--
The BSD 3-Clause License
Copyright 2022 - DATATRONiQ GmbH (https://datatroniq.com)
Copyright (c) 2018-2022 Klaus Landsdorf (http://node-red.plus/)
Copyright 2015,2016 - Mika Karaila, Valmet Automation Inc. (node-red-contrib-opcua)
All rights reserved.
node-red-contrib-iiot-opcua
--> <script type='text/javascript'> RED.nodes.registerType('OPCUA-IIoT-Read', {
category: 'IIoT',
color: '#ABCDEF',
defaults: {
attributeId: {value: 0, required: true, validate: RED.validators.number()},
maxAge: {value: 1, validate: RED.validators.number()},
depth: {value: 1, validate: RED.validators.number()},
connector: {type: 'OPCUA-IIoT-Connector', required: true},
name: {value: ''},
justValue: {value: true},
showStatusActivities: {value: false},
showErrors: {value: false},
parseStrings: {value: false},
historyDays: {value: 1}
},
inputs: 1,
outputs: 1,
align: 'left',
icon: 'icon.png',
label: function () {
return this.name || 'Read'
},
labelStyle: function () {
return this.name ? 'node_label_italic' : ''
},
oneditprepare: function () {
try {
let depthRow = $("#node-input-depth-row")
let historyRow = $("#node-input-history-row")
if (parseInt(this.attributeId) === 99) {
depthRow.show();
} else {
depthRow.hide();
}
let attributeIdCheckbox = $("#node-input-attributeId")
attributeIdCheckbox.change(function () {
if ($(this).val() === "99") {
depthRow.show()
} else {
depthRow.hide()
}
if ($(this).val() === "130") {
historyRow.show()
} else {
historyRow.hide()
}
})
} catch
(err) {
this.error(err);
}
}
}) </script> <script type='text/x-red' data-template-name='OPCUA-IIoT-Read'>
<div class='form-row' style='min-width:640px'> <label for='node-input-connector'><i class='icon-globe'></i> <span
data-i18n='opcua-iiot-contrib.label.connector'></span></label> <input type='text' id='node-input-connector'> </div> <div
class='form-row'> <!-- AttributeId via REST --> <label for='node-input-attributeId'><i class='fa fa-tasks'></i> <span
data-i18n='opcua-iiot-contrib.label.attributeId'></span></label> <select type='text' id='node-input-attributeId'>
<option value='0'>All</option> <option value='1'>Node-ID</option> <option value='2'>Node-Class</option> <option
value='3'>Browse-Name</option> <option value='4'>Display-Name</option> <option value='13'>Value</option> <option
value='130'>History</option> </select> </div> <div id='node-input-history-row'> <div class='form-row'> <label
for='node-input-historyDays'><i class='icon-calendar'></i> <span data-i18n='opcua-iiot-contrib.label.historyDays'>
</span></label> <input type='text' id='node-input-historyDays' placeholder='1'> </div> </div> <div class='form-row'>
<label for='node-input-maxAge'><i class='fa fa-clock-o'></i> <span data-i18n='opcua-iiot-contrib.label.maxAge'></span>
</label> <input type='text' id='node-input-maxAge' placeholder='1'> </div> <div class='form-row'
id='node-input-depth-row'> <label for='node-input-depth'><i class='icon-random'></i> <span
data-i18n='opcua-iiot-contrib.label.depth'></span></label> <input type='text' id='node-input-depth' placeholder='1'>
</div> <div class='form-row'> <label for='node-input-name'><i class='fa fa-tag'></i> <span
data-i18n='node-red:common.label.name'></span></label> <input type='text' id='node-input-name' placeholder='Name'>
</div> <hr> <div class='form-row'> <label style='min-width:160px' for='node-input-parseStrings'><i class='fa fa-th'></i>
<span data-i18n='opcua-iiot-contrib.label.parseStrings'></span></label> <input type='checkbox'
id='node-input-parseStrings' style='max-width:30px'> </div> <div class='form-row'> <label style='min-width:160px'
for='node-input-justValue'><i class='fa fa-simplybuilt'></i> <span data-i18n='opcua-iiot-contrib.label.justValue'>
</span></label> <input type='checkbox' id='node-input-justValue' style='max-width:30px'> </div> <hr> <div
class='form-row'> <label style='min-width:160px' for='node-input-showStatusActivities'><i class='fa fa-bolt'></i> <span
data-i18n='opcua-iiot-contrib.label.showActivities'></span></label> <input type='checkbox'
id='node-input-showStatusActivities' style='max-width:30px'> </div> <div class='form-row'> <label
style='min-width:160px' for='node-input-showErrors'><i class='fa fa-exclamation-circle'></i> <span
data-i18n='opcua-iiot-contrib.label.showErrors'></span></label> <input type='checkbox' id='node-input-showErrors'
style='max-width:30px'> </div> </script> <script type='text/x-red' data-help-name='OPCUA-IIoT-Read'>
<h2>OPC UA IIoT Read</h2> <p>
The Read node is for polling data from the OPC UA server. It handles a single data request and multiple data requests. The multiple Node-Id inject will request and produce an array of address space data. An individual Node-Id inject reads just a value and sends it via payload.
</p> <h3>Input read</h3> <div> <ul> <li>nodesToRead or addressSpaceItems (Array of Objects with property nodeId) </li>
<li>payload (optional) <ul> <li>maxAge (number) </li><li>historyStart (date) </li><li>historyEnd (date) </li></ul> </li>
</ul> </div> <p>OPC UA results containing nodesToRead and Injects sending addressSpaceItems.</p> <h3>Output</h3> <p>
Please use the Result Filter node to handle the output of the Read node.</p> <div> <p>Results of request in message:</p>
<ul> <li>payload (Array/Object or String if not to parse) <ul> <li>results </li><li>nodesToRead </li></ul> </li><li>
topic </li><li>nodetype </li><li>readtype </li><li>attributeId </li><li>
resultsConverted (Array/Object of results or null if not to parse) </li></ul> </div> <strong> <span
data-i18n='opcua-iiot-contrib.label.maxAge'></span> </strong> <p>
Maximum age of the value to be read in milliseconds. (see <a
href='http://node-opcua.github.io/api_doc/classes/ReadRequest.html' target='_blank'>node-opcua API</a>) </p> <strong>
<span data-i18n='opcua-iiot-contrib.label.depth'></span> </strong> <p>
The depth to read for example components. (see node-opcua API)</p> <strong>Name</strong> <p>
Name in the flow of Node-RED.</p> <strong> <span data-i18n='opcua-iiot-contrib.label.justValue'></span> </strong> <p>
With that option, the node does not send an object on out two for less CPU load.</p> <p>
Set showErrors to get errors from node-opcua on browse.</p> </script>