UNPKG

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
<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>