diff --git a/.gitignore b/.gitignore index 3c3629e..9933453 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ node_modules +package-lock.json diff --git a/index.js b/index.js index 3857d07..bdc3daa 100755 --- a/index.js +++ b/index.js @@ -85,7 +85,7 @@ var queue2 = { var HOST = settings.cbusip; var COMPORT = 20023; var EVENTPORT = 20025; -var KEEPALIVE = 30; +var KEEPALIVE = 10000; var logging = settings.logging; @@ -98,21 +98,21 @@ event.connect(EVENTPORT, HOST); function started(){ if(commandConnected && eventConnected && client.connected){ - console.log('ALL CONNECTED'); + console.log('cgateweb: ALL CONNECTED'); if(settings.getallnetapp && settings.getallonstart) { - console.log('Getting all values'); + console.log('cgateweb: Getting all values'); queue2.write('GET //'+settings.cbusname+'/'+settings.getallnetapp+'/* level\n'); } if(settings.getallnetapp && settings.getallperiod) { clearInterval(interval); setInterval(function(){ - console.log('Getting all values'); + console.log('cgateweb: Getting all values'); queue2.write('GET //'+settings.cbusname+'/'+settings.getallnetapp+'/* level\n'); },settings.getallperiod*1000); } // Send a NOOP to the Cgate server to keep the connection open and detect if the connection was closed setInterval(function(){ - console.log('NOOP'); + if (logging > 0) {console.log('cgateweb: NOOP')}; command.write('NOOP\n'); },KEEPALIVE); } @@ -125,7 +125,7 @@ client.on('disconnect',function(){ client.on('connect', function() { // When connected clientConnected = true; - console.log('CONNECTED TO MQTT: ' + settings.mqtt); + console.log('cgateweb: CONNECTED TO MQTT: ' + settings.mqtt); started() // Subscribe to MQTT @@ -133,7 +133,7 @@ client.on('connect', function() { // When connected // when a message arrives, do something with it client.on('message', function(topic, message, packet) { - if (logging == true) {console.log('Message received on ' + topic + ' : ' + message);} + if (logging > 0) {console.log('cgateweb: Message received on ' + topic + ' : ' + message);} parts = topic.split("/"); if (parts.length > 5) @@ -171,7 +171,6 @@ client.on('connect', function() { // When connected } }); queue2.write('GET //'+settings.cbusname+'/'+parts[2]+'/'+parts[3]+'/'+parts[4]+' level\n'); - break; case "DECREASE": @@ -182,15 +181,26 @@ client.on('connect', function() { // When connected } }); queue2.write('GET //'+settings.cbusname+'/'+parts[2]+'/'+parts[3]+'/'+parts[4]+' level\n'); - break; + case "TERMINATERAMP": + eventEmitter.on('level',function terminateRamp(address) { + if (address == parts[2]+'/'+parts[3]+'/'+parts[4]) { + queue2.write('TERMINATERAMP //'+settings.cbusname+'/'+parts[2]+'/'+parts[3]+'/'+parts[4]+'\n'); + eventEmitter.removeListener('level',terminateRamp); + } + }); + queue2.write('GET //'+settings.cbusname+'/'+parts[2]+'/'+parts[3]+'/'+parts[4]+' level\n'); + break; + case "ON": queue2.write('ON //'+settings.cbusname+'/'+parts[2]+'/'+parts[3]+'/'+parts[4]+'\n'); break; + case "OFF": queue2.write('OFF //'+settings.cbusname+'/'+parts[2]+'/'+parts[3]+'/'+parts[4]+'\n'); break; + default: var ramp = message.split(","); var num = Math.round(parseInt(ramp[0])*255/100) @@ -215,16 +225,16 @@ client.on('connect', function() { // When connected }); command.on('error',function(err){ - console.log('COMMAND ERROR:'+JSON.stringify(err)) + console.log('cgateweb: COMMAND ERROR:'+JSON.stringify(err)) }) event.on('error',function(err){ - console.log('EVENT ERROR:'+JSON.stringify(err)) + console.log('cgateweb: EVENT ERROR:'+JSON.stringify(err)) }) command.on('connect',function(err){ commandConnected = true; - console.log('CONNECTED TO C-GATE COMMAND PORT: ' + HOST + ':' + COMPORT); + console.log('cgateweb: CONNECTED TO C-GATE COMMAND PORT: ' + HOST + ':' + COMPORT); queue2.write('EVENT ON\n'); started() clearInterval(commandInterval); @@ -232,7 +242,7 @@ command.on('connect',function(err){ event.on('connect',function(err){ eventConnected = true; - console.log('CONNECTED TO C-GATE EVENT PORT: ' + HOST + ':' + EVENTPORT); + console.log('cgateweb: CONNECTED TO C-GATE EVENT PORT: ' + HOST + ':' + EVENTPORT); started() clearInterval(eventInterval); }) @@ -240,24 +250,24 @@ event.on('connect',function(err){ command.on('close',function(){ commandConnected = false; - console.log('COMMAND PORT DISCONNECTED') + console.log('cgateweb: COMMAND PORT DISCONNECTED') commandInterval = setTimeout(function(){ - console.log('COMMAND PORT RECONNECTING...') + console.log('cgateweb: COMMAND PORT RECONNECTING...') command.connect(COMPORT, HOST) },10000) }) event.on('close',function(){ eventConnected = false; - console.log('EVENT PORT DISCONNECTED') + console.log('cgateweb: EVENT PORT DISCONNECTED') eventInterval = setTimeout(function(){ - console.log('EVENT PORT RECONNECTING...') + console.log('cgateweb: EVENT PORT RECONNECTING...') event.connect(EVENTPORT, HOST) },10000) }) command.on('data',function(data) { - // if (logging == true) {console.log('Command data: ' + data);} + if (logging > 0) {console.log('cgateweb: Command data: ' + data);} // Was commented out. var lines = (buffer+data.toString()).split("\n"); buffer = lines[lines.length-1]; if (lines.length > 1) { @@ -269,14 +279,14 @@ command.on('data',function(data) { address = (parts2[0].substring(0,parts2[0].length-1)).split("/"); var level = parts2[1].split("="); if (parseInt(level[1]) == 0) { - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' OFF');} - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' 0%');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' OFF');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' 0%');} queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/state' , 'OFF',options, function() {}); queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/level' , '0',options, function() {}); eventEmitter.emit('level',address[3]+'/'+address[4]+'/'+address[5],0); } else { - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' ON');} - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' '+Math.round(parseInt(level[1])*100/255).toString()+'%');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' ON');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' '+Math.round(parseInt(level[1])*100/255).toString()+'%');} queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/state' , 'ON',options, function() {}); queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/level' , Math.round(parseInt(level[1])*100/255).toString(),options, function() {}); eventEmitter.emit('level',address[3]+'/'+address[4]+'/'+address[5],Math.round(parseInt(level[1]))); @@ -289,7 +299,7 @@ command.on('data',function(data) { } else if(parts1[0].split(" ")[0] == "344"){ parseString(tree, function (err, result) { try{ - if(logging === true) {console.log("C-Bus tree received:"+JSON.stringify(result))} + if(logging > 0) {console.log("C-Bus tree received:"+JSON.stringify(result))} queue.publish('cbus/read/'+treenet+'///tree',JSON.stringify(result)) }catch(err){ console.log(err) @@ -302,14 +312,14 @@ command.on('data',function(data) { address = (parts2[1].substring(0,parts2[1].length-1)).split("/"); var level = parts2[2].split("="); if (parseInt(level[1]) == 0) { - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' OFF');} - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' 0%');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' OFF');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' 0%');} queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/state' , 'OFF',options, function() {}); queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/level' , '0',options, function() {}); eventEmitter.emit('level',address[3]+'/'+address[4]+'/'+address[5],0); } else { - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' ON');} - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' '+Math.round(parseInt(level[1])*100/255).toString()+'%');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' ON');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' '+Math.round(parseInt(level[1])*100/255).toString()+'%');} queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/state' , 'ON',options, function() {}); queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/level' , Math.round(parseInt(level[1])*100/255).toString(),options, function() {}); eventEmitter.emit('level',address[3]+'/'+address[4]+'/'+address[5],Math.round(parseInt(level[1]))); @@ -326,34 +336,34 @@ command.on('data',function(data) { // Add a 'data' event handler for the client socket // data is what the server sent to this socket event.on('data', function(data) { - if (logging == true) {console.log('Event data: ' + data);} + if (logging > 0) {console.log('cgateweb: Event data: ' + data);} data.toString().split(/\r?\n/).forEach(line => { - if (logging == true) {console.log('Event line: ' + line);} + if (logging > 0) {console.log('cgateweb: Event line: ' + line);} var parts = line.split(" "); if(parts[0] == "lighting") { address = parts[2].split("/"); switch(parts[1]) { case "on": - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' ON');} - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' 100%');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' ON');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' 100%');} queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/state' , 'ON',options, function() {}); queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/level' , '100',options, function() {}); break; case "off": - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' OFF');} - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' 0%');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' OFF');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' 0%');} queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/state' , 'OFF',options, function() {}); queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/level' , '0',options, function() {}); break; case "ramp": if(parseInt(parts[3]) > 0) { - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' ON');} - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' '+Math.round(parseInt(parts[3])*100/255).toString()+'%');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' ON');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' '+Math.round(parseInt(parts[3])*100/255).toString()+'%');} queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/state' , 'ON',options, function() {}); queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/level' , Math.round(parseInt(parts[3])*100/255).toString(),options, function() {}); } else { - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' OFF');} - if (logging == true) {console.log('C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' 0%');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' OFF');} + if (logging > 0) {console.log('cgateweb: C-Bus status received: '+address[3] +'/'+address[4]+'/'+address[5]+' 0%');} queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/state' , 'OFF',options, function() {}); queue.publish('cbus/read/'+address[3]+'/'+address[4]+'/'+address[5]+'/level' , '0',options, function() {}); } diff --git a/package.json b/package.json index 63bb844..96f7af7 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "private": true, "dependencies": { - "mqtt": "^0.3.12", + "mqtt": "^4.3.7", "xml2js": "^0.4.19" } } diff --git a/settings.js b/settings.js index 3484639..6adfeb1 100644 --- a/settings.js +++ b/settings.js @@ -4,28 +4,28 @@ exports.cbusip = '127.0.0.1'; //cbus project name -exports.cbusname = "HOME"; +exports.cbusname = "BURS1303"; //mqtt server ip:port exports.mqtt = '127.0.0.1:1883'; //username and password (unncomment to use) -//exports.mqttusername = 'user1'; -//exports.mqttpassword = 'password1'; +exports.mqttusername = 'user'; +exports.mqttpassword = 'pass'; // net and app for automatically requesting values -// exports.getallnetapp = '254/56'; +exports.getallnetapp = '254/56'; // whether to request on start (requires getallnetapp set as well) -// exports.getallonstart = true; +exports.getallonstart = true; // how often to request after start (in seconds), (requires getallnetapp set as well) -// exports.getallperiod = 60*60; +exports.getallperiod = 60*60; // Sets MQTT retain flag for values coming from cgate -// exports.retainreads = true; +exports.retainreads = true; exports.messageinterval = 0; -//logging -exports.logging = false; +//logging > 0 writes logs except NOOP. logging = 9 includes NOOP logging. +exports.logging = 0; \ No newline at end of file