UNPKG

@nagisa~/node-red-systemair-save

Version:

Node-RED nodes to interact with SystemAIR’s SAVE line of products

80 lines 3.43 kB
"use strict"; const systemair_types_1 = require("./systemair_types"); const systemair_registers_1 = require("./systemair_registers"); const init = (RED) => { const register = function (props) { RED.nodes.createNode(this, props); const broker = RED.nodes.getNode(props.device); const set_status = (error) => { if (error) return this.status({ fill: "red", shape: "ring", text: error.message }); const pending_actions = pending_writes + pending_reads; if (pending_actions == 0) { this.status({ fill: "green", shape: "ring", text: `Idle @ ${new Date().toISOString()}` }); } else if (pending_writes == 0) { this.status({ fill: "blue", shape: "dot", text: `${pending_reads} reads…` }); } else if (pending_reads == 0) { this.status({ fill: "blue", shape: "dot", text: `${pending_writes} writes…` }); } else { this.status({ fill: "blue", shape: "dot", text: `${pending_actions} actions…` }); } }; if (broker === undefined) { return set_status(new Error("node-red:common.status.error")); } const register_map = props.register_type == "virtual" ? systemair_registers_1.virtual_registers : systemair_registers_1.registers; const description = register_map.get(~~props.register_id); if (description === undefined) { return set_status(new Error("node-red:common.status.error")); } let pending_writes = 0; let pending_reads = 0; set_status(); this.on("input", (msg, send, done) => { msg = RED.util.cloneMessage(msg); const payload = msg.payload; let error = undefined; if (payload !== undefined) { // This is a write operation: if (description.register_type != systemair_types_1.RegisterType.RW) { const e = new Error("writing a read-only register"); set_status(e); return done(e); } pending_writes += 1; set_status(); broker.write(description, payload).catch((e) => { error = e; }).finally(() => { RED.util.setMessageProperty(msg, 'error', error); send([null, msg]); pending_writes -= 1; set_status(error); return done(error); }); } else { pending_reads += 1; set_status(); broker.read(description).then((response) => { const responseMsg = { topic: description.name, payload: response }; send([responseMsg, msg]); }).catch((e) => { error = e; send([null, msg]); }).finally(() => { RED.util.setMessageProperty(msg, 'error', error); pending_reads -= 1; set_status(error); return done(error); }); } }); }; RED.nodes.registerType("systemair register", register); }; module.exports = init; //# sourceMappingURL=systemair%20register.js.map