list-gateway
Version:
LisT Gateway
374 lines (291 loc) • 10.7 kB
JavaScript
//############ Run Parameters ##########
var argv = require('minimist')(process.argv.slice(2));
console.dir(argv);
//##Parameter###vorhanden?#########copy###############default###
var logLevel = (argv[2].logLevel ? argv[2].logLevel : 'debug');
//######################################
var colors = require('colors');
var q = require('q');
var mqtt = require('mqtt');
var log = require('console-log-level')({level: logLevel});
var Jetty = require("jetty");
colors.setTheme({
silly: 'rainbow',
input: 'grey',
verbose: 'blue',
prompt: 'grey',
info: 'green',
data: 'cyan',
help: 'cyan',
warn: 'yellow',
debug: 'grey',
error: 'red',
serverColor: 'green'
});
/*
*
* #### Connection Config ####
*
*/
var Frontend = {
url: 'mqtt://141.22.28.86',
port: '1883',
subscribeTopic: 'set_target_values',
publishTopic: 'test',
status: 'disconnected',
connect: function () {
Frontend.client = mqtt.connect(Frontend.url, {
port: Frontend.port
});
}
};
var sensorNodeOne = {
//hostname: "fe80::68c0:6d50:52ae:432a%lowpan0",
hostname: "fe80::abc0:6e7a:7427:322%lowpan0",
temperaturePath: "/temp",
temperatureValue: "0",
lightPath: "/light",
lightValue: {
red: "0",
green: "0",
blue: "0"
},
writePath: "/cli/stats"
};
var sensorNodeTwo = {
hostname: "fe80::7b62:1b6d:89cc:89ca%lowpan0",
lampPaths: {
red: "/red",
green: "/green",
blue: "/blue"
},
lampValue: {
red: "0",
green: "0",
blue: "0"
}
};
var data = {
node_1: {
temperature: "0",
light: {
red: "0",
green: "0",
blue: "0"
},
ph: "0"
},
node_2: {
lampStatus: "0"
}
};
var communicationStatus = {
sumPackages: 0,
faildPackages: 0,
transmittedPackages: 0,
numberNodes: 0,
numberRessources: 0
};
/*
*
*
*
*/
var jetty = new Jetty(process.stdout);
Frontend.connect();
Frontend.client.on('connect', function () {
Frontend.status = 'connected';
Frontend.client.subscribe(Frontend.subscribeTopic);
log.debug(colors.info("Frontend connected and subscribed to: " + Frontend.subscribeTopic));
});
Frontend.client.on('reconnect', function () {
Frontend.status = 'reconnect';
});
Frontend.client.on('close', function () {
Frontend.status = 'disconnected';
});
Frontend.client.on('error', function (error) {
log.error('MQTT Client Errored' + error);
});
Frontend.client.on('message', function (topic, message) {
//TODO Do some sort of thing here.
console.log(message.toString());
});
/*
*
*########### START INTERVAL ###########################################################################################
*
*/
var productionInterval = setInterval(function () {
updateFromSensors()
.then(function () {
log.debug(colors.info("Sensor Update successful"));
return calculate();
})
.then(function () {
log.debug(colors.info("calculate successful"));
return forwardToFrontend();
})
.catch(function (error) {
log.debug(colors.error("INTERVAL faild with error: " + error));
});
}.bind(this), 5000);
if (logLevel === 'info') {
var displayInterval = setInterval(function () {
jetty.clear();
displayUpdate(false, false);
}, 1000);
}
/*
*
*
*
*/
function forwardToFrontend() {
return new Promise(function (resolve, reject) {
if (Frontend.status === "connected") {
Frontend.client.publish(Frontend.publishTopic, JSON.stringify(data), function (error) {
if (error) {
reject(error)
} else {
log.debug("Data: " + JSON.stringify(data), " send to " + Frontend.url + ":" + Frontend.port + " via: " + Frontend.publishTopic);
resolve()
}
});
} else {
reject(Frontend.status)
}
});
}
/*
*
*
*
*/
function calculate() {
return new Promise(function (resolve, reject) {
data.temperature = sensorNodeOne.temperatureValue;
data.light = sensorNodeOne.lightValue;
if (sensorNodeOne.lightValue.red.toString() < 600) {
sensorNodeTwo.lampValue.red = 255;
sensorNodeTwo.lampValue.green = 255;
sensorNodeTwo.lampValue.blue = 255;
} else {
sensorNodeTwo.lampValue.red = 0;
sensorNodeTwo.lampValue.green = 0;
sensorNodeTwo.lampValue.blue = 0;
}
log.info("calculate");
resolve();
});
}
/*
*
*
*
*/
function updateFromSensors() {
log.info('Initialize COAP Request');
var promise = coapRequest(sensorNodeOne.hostname, sensorNodeOne.temperaturePath, 'GET')
.then(function (value) {
sensorNodeOne.temperatureValue = value.slice(0, 2) + "." + value.slice(2, 4);
log.debug('GET on ' + sensorNodeOne.hostname + ' ' + sensorNodeOne.temperaturePath + ' ---> ' + colors.data(sensorNodeOne.temperatureValue));
return coapRequest(sensorNodeOne.hostname, sensorNodeOne.lightPath, 'GET');
})
.then(function (value) {
sensorNodeOne.lightValue = value;
log.debug('GET on ' + sensorNodeOne.hostname + ' ' + sensorNodeOne.lightPath + ' ---> ' + colors.data(sensorNodeOne.lightValue));
return coapRequest(sensorNodeTwo.hostname, sensorNodeTwo.lampPaths.red, 'PUT', sensorNodeTwo.lampValue.red);
})
.then(function (value) {
sensorNodeOne.lightValue = value;
log.debug('GET on ' + sensorNodeOne.hostname + ' ' + sensorNodeOne.lightPath + ' ---> ' + colors.data(sensorNodeOne.lightValue));
return coapRequest(sensorNodeTwo.hostname, sensorNodeTwo.lampPaths.green, 'PUT', sensorNodeTwo.lampValue.green);
})
.then(function (value) {
sensorNodeOne.lightValue = value;
log.debug('GET on ' + sensorNodeOne.hostname + ' ' + sensorNodeOne.lightPath + ' ---> ' + colors.data(sensorNodeOne.lightValue));
return coapRequest(sensorNodeTwo.hostname, sensorNodeTwo.lampPaths.blue, 'PUT', sensorNodeTwo.lampValue.blue);
})
.then(function (value) {
log.debug('Request 4 complete with return: ' + colors.data(value));
return coapRequest(sensorNodeOne.hostname, sensorNodeOne.writePath, 'GET');
})
.then(function (value) {
log.debug('Request 5 complete with return: ' + colors.data(value));
})
.catch(function (error) {
log.debug("SENSOR READ failed with error: " + error);
});
return promise;
}
/*
*
*
*
*/
function coapRequest(hostname, path, method, payload) {
return new Promise(function (resolve, reject) {
var coap = require('coap');
var servicesRequest = coap.request({
hostname: hostname,
pathname: path,
method: method,
multicast: true,
multicastTimeout: 1000
});
if (method === "PUT") {
servicesRequest.write(payload);
log.debug("Sensor " + method + " on: " + hostname, path + " ----> " + payload);
servicesRequest.on('response', function (servicesResponse) {
servicesResponse.on('error', function (error) {
log.error(error);
reject(error);
});
resolve();
});
} else if (method === "GET") {
servicesRequest.on('response', function (servicesResponse) {
servicesResponse.on('error', function (error) {
log.error(error);
reject(error);
});
let tmp = servicesResponse.payload.toString();
log.debug("Sensor " + method + " on: " + hostname, path + " ----> " + tmp);
resolve(tmp);
});
} else {
reject(Error("Invalid Method"));
}
servicesRequest.end();
});
}
/*
*
*
*
*/
function displayUpdate() {
return new Promise(function (resolve, reject) {
var date = new Date();
log.info("######################################## AQUARIUM GATEWAY ########################################");
log.info("### Node Side ######## " + colors.warn(date) + " ####### Server Side ###");
log.info("########################################### ###########################################");
log.info("### Number Nodes Number Ressources ### ###########################################");
log.info("### " + colors.data(communicationStatus.numberNodes) + " # " + colors.data(communicationStatus.numberRessources) + " ##### ###########################################");
log.info("########################################### ###########################################");
log.info("### Requests ### ###########################################");
log.info("### Succsessful Failed ### ###########################################");
log.info("### ### ###########################################");
log.info("########################################### ###########################################");
log.info("########################################### ###########################################");
log.info("########################################### ###########################################");
log.info("########################################### ###########################################");
log.info("########################################### ###########################################");
log.info("########################################### ###########################################");
log.info("########################################### ###########################################");
log.info("########################################### ###########################################");
log.info("##################################################################################################");
resolve();
});
}