UNPKG

list-gateway

Version:
374 lines (291 loc) 10.7 kB
//############ 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(); }); }