UNPKG

ttb-zwave3

Version:

ZWave support for the Thingbox (http://TheThingbox.io) and TimeSquAir (http://TimeSquAir.io)

177 lines (147 loc) 4.98 kB
'use strict'; module.exports = function (RED) { var homeDir = process.env.NODE_RED_HOME; var path = require('path'); var mqttCP = require(path.resolve(homeDir, './nodes/core/io/lib/mqttConnectionPool.js')); function main(config) { RED.nodes.createNode(this, config); this.config = config; this.brokerConn = RED.nodes.getNode(config.broker); if (this.brokerConn === undefined || this.brokerConn === null) { this.error(RED._("node-red:mqtt.errors.missing-config")); return; } this.topic = "zwave" + '/' + config.nodeid + '/' + config.commandclass + '/' + config.classindex; this.topicIn = "zwave" + '/' + config.nodeid + '/in'; // console.log("Node " + config.nodeid + " subscribed to '" + this.topic + "'"); this.mqtt = mqttCP.get( this.brokerConn.broker, this.brokerConn.port ); var zwave = require('./js/openZWave').zwave; subscription(RED, this, zwave); var node = this; this.on('input', function (msg) { SwitchFunc(node, zwave, msg); }); } RED.nodes.registerType("zwave-binary-switch", main); RED.httpAdmin.get("/zwave/nodesArray", function (req, res) { var nodes = require('./js/handler').nodes; if (!nodes) { return res.status(400).json({err: "ERROR"}); } res.status(200).json(nodes); }); }; function subscription(RED, node, zwave) { var isUtf8 = require('is-utf8'); var msg = {}; if (node.topic) { node.brokerConn.register(node); node.brokerConn.subscribe(node.topic, 2, function (topic, payload, packet) { if (isUtf8(payload)) { payload = payload.toString(); } try { msg.payload = JSON.parse(payload); } catch (e) { msg.payload = payload; console.log("#Exception '" + e + "' in zwave-binary-switch/subscription for Node " + node.config.nodeid + " received value: '" + msg.payload + "'"); } // console.log("Node " + node.config.nodeid + " received value: '" + msg.payload + "'"); if (typeof msg.payload === 'number') { msg.intensity = msg.payload; } if(msg.payload === true || msg.payload==1 || msg.payload=="1" ) { msg.payload = 1; msg.intent = 1; msg.message = "Sensor On"; } if(msg.payload === false || msg.payload==0 || msg.payload=="0") { msg.payload = 0; msg.intent = 0; msg.message = "Sensor Off"; } /* if (node.mqtt !== null) node.mqtt.publish({ 'payload': msg, 'qos': 0, 'retain': true, 'topic': "zwave" + '/' + node.config.nodeid + '/out' }); */ node.send(msg); }, node.id); } else { node.error(RED._("node-red:mqtt.errors.not-defined")); } if (node.topicIn) { node.brokerConn.register(node); node.brokerConn.subscribe(node.topicIn, 2, function (topic, payload, packet) { if (isUtf8(payload)) { payload = payload.toString(); } try { msg = JSON.parse(payload); } catch (e) { console.log("#Exception '" + e + "' in zwave-binary-switch/subscription for Node " + node.config.nodeid + " received value: '" + msg.payload + "'"); msg.payload = payload; } SwitchFunc(node, zwave, msg); }, node.id); } else { node.error(RED._("node-red:mqtt.errors.not-defined")); } node.on('close', function (done) { if (node.brokerConn) { node.brokerConn.unsubscribe(node.topic, node.id); node.brokerConn.unsubscribe(node.topicIn, node.id); node.brokerConn.deregister(node, done); } }); } function SwitchFunc(node, zwave, msg) { var handler = require('./js/handler'); if(msg.intent===undefined) { msg.intent = msg.payload; // try to use the payload if no intents } //console.log("msg.intent:"+ msg.intent); if (handler.nodes[node.config.nodeid] && handler.nodes[node.config.nodeid].ready && handler.nodes[node.config.nodeid].classes[37] !== undefined) { if (msg.status && msg.status === "toggle") { var currentValue = handler.nodes[node.config.nodeid].classes[37][0].value; if (currentValue === false) { zwave.setValue(node.config.nodeid, 37, 1, 0, true); } else if (currentValue === true) { zwave.setValue(node.config.nodeid, 37, 1, 0, false); } } else { if (msg.intent || msg.intent == 0) { switch (msg.intent) { case 0: // close case "0": zwave.setValue(node.config.nodeid, 37, 1, 0, false); break; case 1: // open case "1": zwave.setValue(node.config.nodeid, 37, 1, 0, true); break; } } } } if (handler.nodes[node.config.nodeid] && handler.nodes[node.config.nodeid].ready && handler.nodes[node.config.nodeid].classes[38] !== undefined) { if (msg.intent || msg.intent == 0) { switch (msg.intent) { case 0: // close zwave.setValue(node.config.nodeid, 38, 1, 0, false); break; case 1: // open zwave.setValue(node.config.nodeid, 38, 1, 0, true); break; } } } }