From 907531eee95504c4a7b96173e7655aec0ee9bb83 Mon Sep 17 00:00:00 2001 From: Dobromir Popov ONE Date: Sat, 16 Apr 2022 14:00:10 +0300 Subject: [PATCH] formatting js; removed GARDEN_IP config --- dht.js | 200 ++++++++++++++++++++++++++++----------------- docker-compose.yml | 3 +- index.js | 2 +- src/mqtt.js | 53 ++++++------ 4 files changed, 155 insertions(+), 103 deletions(-) diff --git a/dht.js b/dht.js index 5bcbae1..a924c9b 100644 --- a/dht.js +++ b/dht.js @@ -4,11 +4,11 @@ const env = process.env.NODE_ENV || 'development'; console.log("ENV: %s", env); const config = require(__dirname + '/config/config.json')[env]; -(function() { +(function () { var exLog = console.log; - console.log = function(msg) { - exLog.apply(this, arguments); - fs.appendFileSync(config.logFile, msg +"\r\n"); + console.log = function (msg) { + exLog.apply(this, arguments); + fs.appendFileSync(config.logFile, msg + "\r\n"); } })(); @@ -31,26 +31,34 @@ const cron = require('node-cron'); var fs = require("fs"); var http = require('http'); var https = require('https'); -try{ +try { var CERT_ROOT = "/etc/letsencrypt/live/iot.d-popov.com-0003"; - var SECURE_KEY = CERT_ROOT+ "/privkey.pem"; //__dirname + '/../../test/secure/tls-key.pem'; - var SECURE_CERT = CERT_ROOT+ "/cert.pem"; - var _privateKey = fs.readFileSync(SECURE_KEY, 'utf8'); + var SECURE_KEY = CERT_ROOT + "/privkey.pem"; //__dirname + '/../../test/secure/tls-key.pem'; + var SECURE_CERT = CERT_ROOT + "/cert.pem"; + var _privateKey = fs.readFileSync(SECURE_KEY, 'utf8'); var _certificate = fs.readFileSync(SECURE_CERT, 'utf8'); - var _ca = fs.readFileSync(CERT_ROOT+ "/chain.pem", 'utf8'); - var credentials = {key: _privateKey, cert: _certificate, ca:_ca}; -}catch(ex){console.log("can't load certificates.");} + var _ca = fs.readFileSync(CERT_ROOT + "/chain.pem", 'utf8'); + var credentials = { + key: _privateKey, + cert: _certificate, + ca: _ca + }; +} catch (ex) { + console.log("can't load certificates."); +} // defining the Express app const app = express(); app.use(helmet()); -app.use(bodyParser.urlencoded({ extended: true })); +app.use(bodyParser.urlencoded({ + extended: true +})); app.use(bodyParser.json()); app.use(express.static('public')); app.use(cors()); app.set('view engine', 'ejs'); -app.use(require('express-ejs-layouts'));//https://www.npmjs.com/package/express-ejs-layouts +app.use(require('express-ejs-layouts')); //https://www.npmjs.com/package/express-ejs-layouts // adding morgan to log HTTP requests app.use(morgan('combined')); @@ -65,38 +73,57 @@ var u = require('./src/utils'); app.use(auth.init()); -app.get('/', function(req, res){ res.redirect('/login');}); - -app.get('/accontrol', auth.ensureLoggedIn_Orig, - function(req, res){ - res.render('accontrol',{model:{data:req.body, user:req.user, command:"", info:""}}); +app.get('/', function (req, res) { + res.redirect('/login'); }); +app.get('/accontrol', auth.ensureLoggedIn_Orig, + function (req, res) { + res.render('accontrol', { + model: { + data: req.body, + user: req.user, + command: "", + info: "" + } + }); + }); -app.post('/accontrol', + +app.post('/accontrol', //ensureLoggedIn, - function(req, res){ + function (req, res) { console.log("POST accontrol"); - var sess=req.session; - var model = { model: {user: req.user, data: req.body} }; - console.log("power:" + req.body.power); console.log("heat:" + req.body.heat); console.log("temp:" + req.body.temp); - if(!req.body.temp){req.body.temp = 23;} - console.log("temp:" + req.body.temp); console.log("econo:" + req.body.econo); console.log("swing:" + req.body.swing); + var sess = req.session; + var model = { + model: { + user: req.user, + data: req.body + } + }; + console.log("power:" + req.body.power); + console.log("heat:" + req.body.heat); + console.log("temp:" + req.body.temp); + if (!req.body.temp) { + req.body.temp = 23; + } + console.log("temp:" + req.body.temp); + console.log("econo:" + req.body.econo); + console.log("swing:" + req.body.swing); ac.Tlc112.Init(); ac.Tlc112.SetPower(req.body.power); - ac.Tlc112.SetMode(req.body.heat? ac.Mode.Heat:ac.Mode.Cool); + ac.Tlc112.SetMode(req.body.heat ? ac.Mode.Heat : ac.Mode.Cool); ac.Tlc112.SetTemp(req.body.temp); - ac.Tlc112.SetSwingVertical( req.body.swing); + ac.Tlc112.SetSwingVertical(req.body.swing); ac.Tlc112.SetFan(ac.FanSpeed.Med); - + var code = ac.Tlc112.GetCommand(); - + //!mqtt_client.publish('cmnd/', 'controller') //break it //code = code.substring(150); //console.log("RAW: " + code); - if(ir.SendCmd("http://"+config.AcIP, code)) - { + if (ir.SendCmd("http://" + config.AcIP, code)) { console.log("OK. Temp: " + req.body.temp); BroadcastWS(ac.Tlc112.GetState()); } else { @@ -108,95 +135,118 @@ app.post('/accontrol', // res.render('accontrol',{model: {data: req.body, user: req.user, command: "", info: model.info}}); }); - app.get('/chart', auth.ensureLoggedIn_Orig, - function(req, res){ - res.render('chart', { user: req.user }); +app.get('/chart', auth.ensureLoggedIn_Orig, + function (req, res) { + res.render('chart', { + user: req.user + }); }); - app.get('/garden/:days?', function(req, res){ - res.render('chartGarden', {model:req.params}); +app.get('/garden/:days?', function (req, res) { + res.render('chartGarden', { + model: req.params }); +}); //Authentication -- //! ESP HANDLERS -const { parse } = require('querystring'); +const { + parse +} = require('querystring'); var moment = require('moment'); // var Sync = require('sync'); app.use('/dht', ir.html_handle_dht); -app.use('/waterTest',function(req, res){ +app.use('/waterTest', function (req, res) { console.log("Watering TEST for: " + req.params); }); -config.gardenIP = process.env.GARDEN_IP || config.gardenIP +config.gardenIP = process.env.GARDEN_IP || config.gardenIP || ""; -app.use('/water',function(req, res){ +app.use('/water', function (req, res) { var time = req.query.t; console.log("Watering cmd for: " + time); - if(config.gardenIP !="" && config.gardenIP !="0.0.0.0"){ - request('http://'+config.gardenIP+'/tools?cmd=event,manualwatering='+ time, { json: true }, (err, res, body) => { - if (err) { return console.log("Problem watering: " + err); } - console.log("Watering cmd successfully sent over HTTP!"); + if (config.gardenIP != "" && config.gardenIP != "0.0.0.0") { + console.log("DHT> sending cmd over HTTP"); + request('http://' + config.gardenIP + '/tools?cmd=event,manualwatering=' + time, { + json: true + }, (err, res, body) => { + if (err) { + return console.log("Problem watering: " + err); + } + console.log("Watering cmd successfully sent over HTTP!"); }); } - mqtt.Send("event,manualwatering="+ time,""); + mqtt.SendCmd("event,manualwatering=" + time); }); -app.use('/waterStop',function(req, res){ - if(config.gardenIP !="" && config.gardenIP !="0.0.0.0"){ - request('http://'+config.gardenIP+'/tools?cmd=event,stopwatering', { json: true }, (err, res, body) => { - if (err) { return console.log("Problem watering: " + err); } - console.log("STOP watering cmd sent!"); +app.use('/waterStop', function (req, res) { + if (config.gardenIP != "" && config.gardenIP != "0.0.0.0") { + console.log("DHT> sending cmd over HTTP"); + request('http://' + config.gardenIP + '/tools?cmd=event,stopwatering', { + json: true + }, (err, res, body) => { + if (err) { + return console.log("Problem watering: " + err); + } + console.log("STOP watering cmd sent!"); }); } - mqtt.Send("event,stopwatering","Garden/cmd"); + mqtt.SendCmd("event,stopwatering"); }); -function BroadcastWS(msg){ +function BroadcastWS(msg) { wss.clients.forEach(function each(client) { if (client.readyState === WebSocket.OPEN) { - client.send(moment().format() +" : "+ msg); + client.send(moment().format() + " : " + msg); } }); } - app.get("/device/:field_name/:days?", function (req, res) { db.devicemessages.findByName(req.params.field_name, req.params.days, function (err, data) { - if (!err) { res.send(data); } - else { console.log("error: ", err); } + if (!err) { + res.send(data); + } else { + console.log("error: ", err); + } }); }); app.put('/device/:device_id/:field_name/:field_value', (req, res) => { - db.devicemessages.insert( req.params.device_id, req.params.field_name, req.params.field_value, + db.devicemessages.insert(req.params.device_id, req.params.field_name, req.params.field_value, function (err, data) { - if (!err) { res.send(data); } - else { console.log("error: ", err); } + if (!err) { + res.send(data); + } else { + console.log("error: ", err); + } }); }); -//!Startup +//!Startup var wws; -if(credentials){ +if (credentials) { var httpsServer = https.createServer(credentials, app); httpsServer.listen(2443, () => { console.log('\r\n\r\nHTTPS server listening on port 2443'); }); - wss = new WebSocket.Server({ server: httpsServer }); -} -else -{ + wss = new WebSocket.Server({ + server: httpsServer + }); +} else { var httpServer = http.createServer(app); httpServer.listen(2080, () => { console.log('HTTP server listening on port 2080'); }); - wss = new WebSocket.Server({ port: 2081 });//not secure + wss = new WebSocket.Server({ + port: 2081 + }); //not secure console.log('WebSocket server listening on port 2081'); } @@ -279,19 +329,19 @@ wss.on('connection', wss => { // console.log("Console MSG"); -function formatDate (date) { +function formatDate(date) { var hour = date.getHours(); var minutes = date.getMinutes(); var seconds = date.getSeconds(); var milliseconds = date.getMilliseconds(); return '[' + - ((hour < 10) ? '0' + hour: hour) + - ':' + - ((minutes < 10) ? '0' + minutes: minutes) + - ':' + - ((seconds < 10) ? '0' + seconds: seconds) + - '.' + - ('00' + milliseconds).slice(-3) + - '] '; + ((hour < 10) ? '0' + hour : hour) + + ':' + + ((minutes < 10) ? '0' + minutes : minutes) + + ':' + + ((seconds < 10) ? '0' + seconds : seconds) + + '.' + + ('00' + milliseconds).slice(-3) + + '] '; } \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 9de92c3..3f20685 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,7 +8,8 @@ services: - DATABASE_NAME=iot - DATABASE_USER=iot - DATABASE_PASS=mitko2021 - - GARDEN_IP=192.168.0.100 + - GARDEN_IP=0.0.0.0 + # - GARDEN_IP=192.168.0.100 - MQTT_HOST=node-mqtt - MQTT_PORT_HTTP=1883 - MQTT_PORT_HTTPS=8444 diff --git a/index.js b/index.js index 1d84934..3491714 100644 --- a/index.js +++ b/index.js @@ -59,7 +59,7 @@ app.get("/device/:field_name/:days?", function (req, res) { }); - +//ToDo: do also MQTT app.use('/water',function(req, res){ var time = req.query.t; console.log("Watering cmd for: " + time); diff --git a/src/mqtt.js b/src/mqtt.js index 9dbaa27..c752677 100644 --- a/src/mqtt.js +++ b/src/mqtt.js @@ -148,34 +148,26 @@ mqtt_client.on("message", function (topic, message) { handled = true; } if (topic === EspDeviceName + "/Water/start") { - var j = JSON.parse(message); - dht.Soil = j.soil; - SaveDhtIf(); - handled = true; - console.log( - formatDate(new Date()) + - EspDeviceName + - " > Started watering at " + - j.time + - "(GMT) with " + - j.soil + - "% soil RH" - ); + try { + var j = JSON.parse(message); + dht.Soil = j.soil; + SaveDhtIf(); + handled = true; + console.log(formatDate(new Date()) + EspDeviceName + " > Started watering at " + j.time + "(GMT) with " + j.soil + "% soil RH"); + } catch (e) { + console.log("MQTT> unexpected json payload at /Water/start:" + message); + } } if (topic === EspDeviceName + "/Water/stop") { - var j = JSON.parse(message); - dht.Soil = j.soil; - SaveDhtIf(); - handled = true; - console.log( - formatDate(new Date()) + - EspDeviceName + - " > Finished watering at " + - j.time + - "(GMT) with " + - j.soil + - "% soil RH" - ); + try { + var j = JSON.parse(message); + dht.Soil = j.soil; + SaveDhtIf(); + handled = true; + console.log(formatDate(new Date()) + EspDeviceName + " > Finished watering at " + j.time + "(GMT) with " + j.soil + "% soil RH"); + } catch (e) { + console.log("MQTT> unexpected json payload at /Water/stop:" + message); + } } if (!handled) { @@ -221,4 +213,13 @@ exports.Send = function (topic = "", message = "") { console.log("MQTT> Published to '" + topic + "'>'" + message + "'"); console.log(r); }); +}; +exports.SendCmd = function (message = "") { + topic = EspDeviceName + "/cmd"; + console.log("MQTT> command topic is:" + topic); + console.log("MQTT> message:" + message); + mqtt_client.publish(topic, message, (r) => { + console.log("MQTT> Published to '" + topic + "'>'" + message + "'"); + console.log(r); + }); }; \ No newline at end of file