@nagisa~/node-red-systemair-save
Version:
Node-RED nodes to interact with SystemAIR’s SAVE line of products
80 lines • 3.43 kB
JavaScript
;
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