UNPKG

smart-nodes

Version:

Controls light, shutters and more. Includes common used logic and statistic nodes to control your home.

170 lines (135 loc) 5.33 kB
module.exports = function (RED) { "use strict"; function ForwarderNode(config) { const node = this; RED.nodes.createNode(node, config); // ################### // # Class constants # // ################### // ####################### // # Global help objects # // ####################### const smart_context = require("../persistence.js")(RED); const helper = require("../smart_helper.js"); // ##################### // # persistent values # // ##################### var node_settings = { enabled: config.enabled, last_message: null, last_msg_was_sended: true }; // load or delete saved values if (config.save_state) node_settings = Object.assign(node_settings, smart_context.get(node.id)); else smart_context.del(node.id); // ################## // # Dynamic config # // ################## let forward_true = config.always_forward_true; let forward_false = config.always_forward_false; let forward_last_on_enable = config.forward_last_on_enable; // ################## // # Runtime values # // ################## // ############### // # Node events # // ############### node.on("input", function (msg) { handleTopic(msg); setStatus(); if (config.save_state) smart_context.set(node.id, node_settings); }); node.on("close", function () { if (timeout != null) { clearTimeout(timeout); timeout = null; } }); // ##################### // # Private functions # // ##################### // This is the main function which handles all topics that was received. let handleTopic = msg => { let real_topic = helper.getTopicName(msg.topic); if (real_topic.startsWith("set_state")) real_topic = real_topic.replace("set_state", "set"); if (real_topic == "set_inverted") { real_topic = "set"; msg.payload = !msg.payload; } let new_state = null; if (real_topic == "enable" || (real_topic == "set" && msg.payload)) new_state = true; else if (real_topic == "disable" || (real_topic == "set" && !msg.payload)) new_state = false; switch (real_topic) { case "debug": helper.nodeDebug(node, { node_settings, forward_true, forward_false, forward_last_on_enable, }); break; default: // Already the correct state if (new_state != null && node_settings.enabled == new_state) return; switch (new_state) { case true: case false: node_settings.enabled = new_state; if (node_settings.enabled && forward_last_on_enable && node_settings.last_message != null && !node_settings.last_msg_was_sended) { node.send(helper.cloneObject(node_settings.last_message)); node_settings.last_msg_was_sended = true; } setStatus(); break; default: // Forward if enabled or forced if (node_settings.enabled || (forward_true && msg.payload) || (forward_false && !msg.payload)) { node.send(helper.cloneObject(msg)); node_settings.last_msg_was_sended = true; } else { node_settings.last_msg_was_sended = false; } node_settings.last_message = helper.cloneObject(msg); break; } break; } } let setStatus = () => { if (node_settings.enabled) node.status({ fill: "green", shape: "dot", text: helper.getCurrentTimeForStatus() + ": Forwarding enabled" }); else node.status({ fill: "red", shape: "dot", text: helper.getCurrentTimeForStatus() + ": Forwarding disabled" }); } if (config.save_state && config.resend_on_start && node_settings.last_message != null) { setTimeout(() => { node.send(helper.cloneObject(node_settings.last_message)); }, 10000); } setStatus(); } RED.nodes.registerType("smart_forwarder", ForwarderNode); }