node-red-contrib-huawei-solar
Version:
Node-RED nodes for reading data from Huawei SmartLogger 3000 and SUN2000 inverters via Modbus TCP
189 lines (162 loc) • 9.43 kB
HTML
<script type="text/javascript">
RED.nodes.registerType('smartlogger', {
category: 'input',
color: '#a6bbcf',
defaults: {
name: { value: "" },
operation: { value: "readData", required: true },
dataSystem: { value: false },
dataPower: { value: true },
dataEnvironmental: { value: false },
dataAlarms: { value: false },
namingConvention: { value: "descriptive", required: true },
host: { value: "", required: true, validate: RED.validators.regex(/^[a-zA-Z0-9.-]+$/) },
port: { value: 502, required: true, validate: RED.validators.number() },
unitId: { value: 3, required: true, validate: RED.validators.number() },
timeout: { value: 5000, validate: RED.validators.number() },
retries: { value: 3, validate: RED.validators.number() },
discoveryRange: { value: "1-50" },
discoveryTimeout: { value: 2000, validate: RED.validators.number() },
parallelScans: { value: 10, validate: RED.validators.number() },
continueOnFail: { value: false }
},
inputs: 1,
outputs: 1,
icon: "icons/smartlogger.svg",
label: function() {
return this.name || "SmartLogger";
},
oneditprepare: function() {
// Set up operation change handler
$("#node-input-operation").change(function() {
const operation = $(this).val();
if (operation === 'readData') {
$(".form-row-data-categories").show();
$(".form-row-discovery").hide();
} else if (operation === 'discoverDevices') {
$(".form-row-data-categories").hide();
$(".form-row-discovery").show();
}
});
// Trigger initial operation change
$("#node-input-operation").trigger('change');
}
});
</script>
<script type="text/html" data-template-name="smartlogger">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<div class="form-row">
<label for="node-input-operation"><i class="fa fa-cog"></i> Operation</label>
<select id="node-input-operation" style="width:70%;">
<option value="readData">Read Data</option>
<option value="discoverDevices">Discover Devices</option>
</select>
</div>
<div class="form-row form-row-data-categories">
<label><i class="fa fa-list"></i> Data Categories</label>
<div style="margin-left: 20px;">
<input type="checkbox" id="node-input-dataSystem" style="display: inline-block; width: auto; vertical-align: top;">
<label for="node-input-dataSystem" style="width: auto; margin-left: 5px; margin-right: 20px;">System Information</label>
<input type="checkbox" id="node-input-dataPower" style="display: inline-block; width: auto; vertical-align: top;">
<label for="node-input-dataPower" style="width: auto; margin-left: 5px; margin-right: 20px;">Power Data</label><br style="margin-bottom: 5px;">
<input type="checkbox" id="node-input-dataEnvironmental" style="display: inline-block; width: auto; vertical-align: top;">
<label for="node-input-dataEnvironmental" style="width: auto; margin-left: 5px; margin-right: 20px;">Environmental Data</label>
<input type="checkbox" id="node-input-dataAlarms" style="display: inline-block; width: auto; vertical-align: top;">
<label for="node-input-dataAlarms" style="width: auto; margin-left: 5px;">Alarms</label>
</div>
</div>
<div class="form-row">
<label for="node-input-namingConvention"><i class="fa fa-font"></i> Field Naming</label>
<select id="node-input-namingConvention" style="width:70%;">
<option value="descriptive">Descriptive (activePower, phaseAVoltage)</option>
<option value="iec61850">IEC 61850 (P, Ua)</option>
</select>
</div>
<div class="form-row">
<label for="node-input-host"><i class="fa fa-server"></i> Host</label>
<input type="text" id="node-input-host" placeholder="SmartLogger IP address">
</div>
<div class="form-row">
<label for="node-input-port"><i class="fa fa-plug"></i> Port</label>
<input type="number" id="node-input-port" placeholder="502" min="1" max="65535">
</div>
<div class="form-row">
<label for="node-input-unitId"><i class="fa fa-hashtag"></i> Unit ID</label>
<input type="number" id="node-input-unitId" placeholder="3" min="1" max="247">
</div>
<div class="form-row">
<label for="node-input-timeout"><i class="fa fa-clock-o"></i> Timeout (ms)</label>
<input type="number" id="node-input-timeout" placeholder="5000" min="1000">
</div>
<div class="form-row">
<label for="node-input-retries"><i class="fa fa-refresh"></i> Retries</label>
<input type="number" id="node-input-retries" placeholder="3" min="0">
</div>
<div class="form-row form-row-discovery" style="display:none;">
<label for="node-input-discoveryRange"><i class="fa fa-search"></i> Discovery Range</label>
<input type="text" id="node-input-discoveryRange" placeholder="1-247">
<div class="form-tips">Examples: 1-15,21-30 or 12,13,14,15</div>
</div>
<div class="form-row form-row-discovery" style="display:none;">
<label for="node-input-discoveryTimeout"><i class="fa fa-clock-o"></i> Discovery Timeout (ms)</label>
<input type="number" id="node-input-discoveryTimeout" placeholder="2000" min="500">
</div>
<div class="form-row form-row-discovery" style="display:none;">
<label for="node-input-parallelScans"><i class="fa fa-tasks"></i> Parallel Scans</label>
<input type="number" id="node-input-parallelScans" placeholder="10" min="1" max="50">
<div class="form-tips">Higher values = faster but more network load</div>
</div>
<div class="form-row">
<input type="checkbox" id="node-input-continueOnFail" style="display: inline-block; width: auto; vertical-align: top;">
<label for="node-input-continueOnFail" style="width: 70%;"> Continue on fail</label>
<div class="form-tips">If enabled, the node will send error information as output instead of raising an error</div>
</div>
</script>
<script type="text/html" data-help-name="smartlogger">
<p>Connects to Huawei SmartLogger 3000 devices via Modbus TCP to read system data and discover connected inverters.</p>
<h3>Operations</h3>
<dl class="message-properties">
<dt>Read Data</dt>
<dd>Reads selected data categories from the SmartLogger including system status, power data, environmental sensors, and alarms.</dd>
<dt>Discover Devices</dt>
<dd>Scans for connected devices (inverters, meters, etc.) and returns their information including names, addresses, and connection status.</dd>
</dl>
<h3>Inputs</h3>
<dl class="message-properties">
<dt>msg <span class="property-type">object</span></dt>
<dd>Input message that triggers the operation. The payload is ignored.</dd>
</dl>
<h3>Outputs</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">object</span></dt>
<dd>
<p>For <strong>Read Data</strong>: Object containing the selected data categories (system, power, environmental, alarms).</p>
<p>For <strong>Discover Devices</strong>: Object with <code>allDevices</code> array containing discovered device information.</p>
<p>All outputs include <code>_metadata</code> with operation details, connection info, and timestamp.</p>
</dd>
</dl>
<h3>Configuration</h3>
<p><strong>Connection:</strong> Configure the SmartLogger IP address, port (typically 502), and unit ID (typically 3).</p>
<p><strong>Data Categories:</strong> Select which types of data to read - system info, power data, environmental sensors, or alarms.</p>
<p><strong>Field Naming:</strong> Choose between descriptive names or IEC 61850 standard naming convention.</p>
<p><strong>Discovery:</strong> Configure unit ID ranges to scan and parallel scanning options for device discovery.</p>
<h3>Error Handling</h3>
<p>Connection errors will be shown in the node status. Enable "Continue on fail" to receive error information in the output instead of stopping the flow.</p>
<h3>Usage with SUN2000 Node</h3>
<p>When using "Discover Devices", the output can be directly connected to a SUN2000 inverter node to read detailed data from discovered inverters.</p>
</script>
<style>
.form-row-discovery {
margin-left: 20px;
border-left: 3px solid #ddd;
padding-left: 10px;
}
.form-row-data-categories {
margin-left: 20px;
border-left: 3px solid #ddd;
padding-left: 10px;
}
</style>