UNPKG

@metz-connect/node-red-ewio2

Version:

Provides nodes to access EWIO2 interfaces like IOs and metering - from Node-RED

207 lines (200 loc) 11.1 kB
<script type="text/javascript"> /** * Stores IO information of connected EWIO2, that the current value and manual mode is available if IO port in config menu is changed. * Object is deleted when EWIO2 is changed (changed by selecting another element in dropdown or opening configuration menu). * @memberof digitalOutNode */ var digitalOuts = {}; /** * Receives an object with all values of an digital OUT pin. If it is the currently selected digital OUT pin, the settings in digital OUT configuration menu are updated. * @memberof digitalOutNode */ RED.comms.subscribe("publish/ewio2/config/do/#", function (topic, msg) { const recvPrevIoPort = topic.split("/")[5]; const recvNodeId = topic.split("/")[4]; const ioType = topic.split("/")[3]; // get ewio2 id of disabled select var ewio2Id =$("#node-input-ewio2 option").eq($("#node-input-ewio2").prop("selectedIndex")).val(); // message was received for the currently selected EWIO2 if(ewio2Id == recvNodeId) { // only add options for the choosen type if(msg.ioType == ioType) { // the msg must contain at least 7 elemtens (7 for e.g. setValue response; 8 for livedata (contains also moduleName)) if(Object.keys(msg).length >= 7) { const dropdownValue = JSON.stringify({"nodeId": recvNodeId, "host": msg.host, "addr": msg.address}); if(!optionExists(dropdownValue, "#node-input-ioportDo")) { const moduleName = ((msg.moduleName) && (msg.moduleName != "")) ? " @ " + msg.moduleName : ""; $("#node-input-ioportDo").append($('<option>', { value: dropdownValue, text: msg.name + moduleName })); } // temporarilly store received msgs (only for this EWIO2), to have the current value and manual-mode flag digitalOuts[dropdownValue] = msg; // set value and manual mode radio button (true / false) of the choosen and received IO port let selectedIoPort = $('#node-input-ioportDo').val(); log("selected: " + selectedIoPort + "; recvPrevIoPort: " + recvPrevIoPort); if(recvPrevIoPort != "undefined") { const recvPrevIoPortObj = JSON.parse(recvPrevIoPort); const configNode = RED.nodes.node(ewio2Id); if (configNode && recvPrevIoPortObj.nodeId === ewio2Id && recvPrevIoPortObj.host == configNode.host) { selectedIoPort = recvPrevIoPort; } } // set "last" value as selected value in dropdown $('#node-input-ioportDo').val(selectedIoPort); // trigger ioport change, to set correct prevIoPort $('#node-input-ioportDo').trigger("change"); // enable all html elements on valid digital OUT values enableHtmlElements(true, "ioportDo"); // enable topic html element enableTopicElement(true); } } } }); /** * Frontend part of digital OUT node. * @memberof digitalOutNode */ RED.nodes.registerType('EWIO2 - Digital OUT', { align: 'right', category: 'METZ CONNECT', color: '#4682B4', defaults: { ewio2: { value: "", type: "EWIO2" }, name: { value: "" }, ioportDo: { value: "", required: true }, value: { value: "" }, manualMode: { value: "" }, outputTopic: { value: "" } }, inputs:1, outputs:1, icon: "ewio2-digital-output.svg", label: function() { return this.name||"EWIO2 - Digital OUT"; }, oneditprepare: function() { let prevIoPort = this.ioportDo; const nodeId = this.id; let prevEwio2Data = getConfigNodeDataStructure(this.ewio2, nodeId); // save the current selected EWIO2, when configuration menu item "ewio2" gets focus. Forward to Node-RED runtime, to be able to publish value again to Node-RED editor. $("#node-input-ewio2").focus(function () { prevEwio2Data = getConfigNodeDataStructure(this.value, nodeId); }) // whenever EWIO2 configuration is changed, async function is called (to "await" for connection) $("#node-input-ewio2").change(async function () { log("onchange ewio2: prev: " + prevEwio2Data.data.configNodeId + "; current: " + this.value); // clear IO-Port dropdown and locally stored data $("#node-input-ioportDo option").remove(); digitalOuts = {}; // clear value $("#node-input-value").prop("checked", false); // clear manual mode $("#node-input-manualMode").prop("checked", false); // clear and hide error msg $('#label-error-status').text(""); $('#section-error-status').hide(); // disable IO port for every selected EWIO2 configuration node enableIoPortElement("ioportDo", false); // disable topic html element enableTopicElement(false); let configNodeId = this.value; if (!configNodeId || configNodeId == "_ADD_") { return; } // disable all html elements only when a valid EWIO2 configuration node is available enableHtmlElements(false, "ioportDo"); try { // one EWIO2 is selected in configuration menu and customer changes to another EWIO2 --> close websocket connection of "unselected" EWIO2 if (prevEwio2Data.data.configNodeId != "" && prevEwio2Data.data.configNodeId != "_ADD_") { const selectedEwio2Data = getConfigNodeDataStructure(this.value, nodeId); if (JSON.stringify(prevEwio2Data.data) !== JSON.stringify(selectedEwio2Data.data)) { log(prevEwio2Data.data.configNodeId + " deselected -> close websocket connection"); await closeDeleteWebsocket(prevEwio2Data.data, nodeId); log("close websocket done"); } } // reset prevIoPort, if another EWIO2 is choosen log(prevIoPort + " typeof: " + typeof prevIoPort); if (prevIoPort) { log("prevIoPort-nodeId: " + JSON.parse(prevIoPort).nodeId + "; current EWIO2 id: " + this.value); if (JSON.parse(prevIoPort).nodeId != this.value) { prevIoPort = ""; log("reset prevIoPort to ''"); } } log("prevIoPort to send: " + prevIoPort); await getEwio2ConfigData(getConfigNodeDataStructure(configNodeId, nodeId), "do", prevIoPort, nodeId, undefined); prevEwio2Data = getConfigNodeDataStructure(this.value, nodeId); } catch (error) { log("digital out onchange EWIO2 error"); log(error); } }); $("#node-input-ioportDo").change(async function () { prevIoPort = this.value; log("onchange ioport: " + prevIoPort); // only save value, if a value is choosen. Nothing choosen not possible, due to dropdown if(this.value != "") { // set value and manual mode radio button (true / false) of the newly choosen IO port const receivedValue = digitalOuts[this.value].value; $("#node-input-value").prop("checked", (receivedValue === "1") ? true : false ); const receivedManualMode = digitalOuts[this.value].manualMode; $("#node-input-manualMode").prop("checked", (receivedManualMode === "1") ? true : false ); } }); }, oneditsave: async function() { log("digital OUT: oneditsave"); let configNodeId = $("#node-input-ewio2").val() || this.ewio2; await prepareCloseWebsocket(configNodeId, this.id) }, oneditcancel: async function() { log("digital OUT: oneditcancel"); let configNodeId = $("#node-input-ewio2").val() || this.ewio2; await prepareCloseWebsocket(configNodeId, this.id) }, oneditdelete: async function() { log("digital OUT: oneditdelete; node-ID: " + this.id); let configNodeId = $("#node-input-ewio2").val() || this.ewio2; await prepareCloseWebsocket(configNodeId, this.id) } }); </script> <script type="text/html" data-template-name="EWIO2 - Digital OUT"> <div id="section-error-status" class="form-row" hidden> <label id="label-error-status" style="color:red; width:inherit"><i class="fa fa-warning"></i> Error</label> </div> <div class="form-row"> <label for="node-input-ewio2"><i class="fa fa-microchip"></i> EWIO2</label> <input type="text" id="node-input-ewio2"> </div> <div class="form-row"> <label for="node-input-ioportDo"><i class="fa fa-wrench"></i> <span data-i18n="@metz-connect/node-red-ewio2/ewio2:label.port"></label> <select id="node-input-ioportDo" style="width:70%"></select> </div> <div class="form-row"> <label for="node-input-value"><i class="fa fa-bullseye"></i> <span data-i18n="@metz-connect/node-red-ewio2/ewio2:label.status"></label> <input type="radio" id="node-input-value" disabled style="display: inline-block; width: auto; vertical-align: top;"> </div> <div class="form-row"> <label for="node-input-manualMode"><i class="fa fa-hand-o-up"></i> <span data-i18n="@metz-connect/node-red-ewio2/ewio2:label.manualMode"></label> <input type="radio" id="node-input-manualMode" disabled style="display: inline-block; width: auto; vertical-align: top;"> </div> <hr> <div class="form-row"> <h4><span data-i18n="@metz-connect/node-red-ewio2/ewio2:label.nodeOutput"></h4> </div> <div class="form-row"> <label for="node-input-outputTopic"><i class="fa fa-map-signs"></i> Topic</label> <input type="text" id="node-input-outputTopic"> </div> <hr> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="@metz-connect/node-red-ewio2/ewio2:label.name"></label> <input type="text" id="node-input-name"/> </div> </script>