1 contributor
module.exports = function(RED) {
function MsgStatusNode(config) {
RED.nodes.createNode(this, config);
var node = this;
// Configuration
node.msgPath = (config.msgPath || "").trim();
node.prefix = (config.prefix || "").trim();
node.suffix = (config.suffix || "").trim();
node.shape = config.shape || "dot";
node.fill = config.fill || "blue";
node.showTime = config.showTime !== false;
if (!node.msgPath) {
node.status({fill: "red", shape: "ring", text: "error: no path configured"});
return;
}
function formatTime(date) {
function pad(value) {
return String(value).padStart(2, "0");
}
return [
pad(date.getHours()),
pad(date.getMinutes()),
pad(date.getSeconds())
].join(":");
}
node.on("input", function(msg) {
try {
// Helper: get nested value from object using dot notation
var value = RED.util.getMessageProperty(msg, node.msgPath);
// Format status text
var statusText = node.showTime ? formatTime(new Date()) + " " : "";
if (node.prefix) statusText += node.prefix + " ";
statusText += (value !== null && value !== undefined) ? String(value) : "null";
if (node.suffix) statusText += " " + node.suffix;
node.status({
fill: node.fill,
shape: node.shape,
text: statusText
});
} catch (e) {
node.status({fill: "red", shape: "ring", text: "error: " + e.message});
}
// Pass through the original message
node.send(msg);
});
// On first deploy or config change, show initial status
node.status({fill: node.fill, shape: node.shape, text: "waiting..."});
}
RED.nodes.registerType("msg-status", MsgStatusNode);
};