node-red-contrib-vib-smart-valve
Version:
Smart Valve Managemeent
82 lines (72 loc) • 2.75 kB
JavaScript
const mqtt = require("mqtt");
module.exports = function (RED) {
function SmartValveSettings(n) {
RED.nodes.createNode(this, n)
this.name = n.name
this.mqttHost = n.mqttHost
this.mqttPort = n.mqttPort
this.mqttUser = n.mqttUser
this.mqttPassword = this.credentials.mqttPassword;
this.mqttRootPath = n.mqttRootPath
}
RED.nodes.registerType('smart-valve-settings', SmartValveSettings, {
credentials: {
mqttPassword: {type:"password"}
}
});
RED.httpAdmin.post("/smart-valve-settings/testConnection", RED.auth.needsPermission("smart-valve-settings.write"), function(req, res) {
const config = req.body;
const protocol = 'mqtt';
const host = config.mqttHost;
const port = config.mqttPort;
const rootPath = config.mqttRootPath;
const connectUrl = `${protocol}://${host}:${port}`;
let password = config.mqttPassword;
if (config.id && (!password || password === "")) {
const creds = RED.nodes.getCredentials(config.id);
if (creds && creds.mqttPassword) {
password = creds.mqttPassword;
}
}
const options = {
clientId: `test_${Math.random().toString(16).slice(3)}`,
clean: true,
connectTimeout: 4000,
username: config.mqttUser,
password: password,
reconnectPeriod: 0
};
const client = mqtt.connect(connectUrl, options);
let messageReceived = false;
client.on('connect', () => {
if (!rootPath) {
client.end();
res.json({status: "success", message: "Connected (No Root Path defined)"});
return;
}
client.subscribe(`${rootPath}/#`, (err) => {
if (err) {
client.end();
res.json({status: "error", message: "Connected but failed to subscribe: " + err.message});
} else {
// Wait a bit to see if we get a message (e.g. retained)
setTimeout(() => {
client.end();
if (messageReceived) {
res.json({status: "success", message: "Connected & Root Path Found"});
} else {
res.json({status: "warning", message: "Connected (No data on Root Path)"});
}
}, 700);
}
});
});
client.on('message', (topic, message) => {
messageReceived = true;
});
client.on('error', (err) => {
client.end();
res.json({status: "error", message: "err:"+err.message});
});
});
}