From d9b2af2511e86207ffc9dd47ab4e4f8d12c20c08 Mon Sep 17 00:00:00 2001 From: Dobromir Popov ONE Date: Sat, 16 Apr 2022 12:57:47 +0300 Subject: [PATCH] commands to DHT send also over MQTT; Removes the need to have direct access over TCP/IP --- dht.js | 24 +++--- src/mqtt.js | 210 ++++++++++++++++++++++++++++++---------------------- 2 files changed, 136 insertions(+), 98 deletions(-) diff --git a/dht.js b/dht.js index 4aae62f..5bcbae1 100644 --- a/dht.js +++ b/dht.js @@ -91,7 +91,7 @@ app.post('/accontrol', var code = ac.Tlc112.GetCommand(); - mqtt_client.publish('cmnd/', 'controller') + //!mqtt_client.publish('cmnd/', 'controller') //break it //code = code.substring(150); //console.log("RAW: " + code); @@ -138,16 +138,22 @@ config.gardenIP = process.env.GARDEN_IP || config.gardenIP app.use('/water',function(req, res){ var time = req.query.t; console.log("Watering cmd for: " + time); - 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!"); - }); + 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!"); + }); + } + mqtt.Send("event,manualwatering="+ time,""); }); app.use('/waterStop',function(req, res){ - 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!"); - }); + 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!"); + }); + } + mqtt.Send("event,stopwatering","Garden/cmd"); }); function BroadcastWS(msg){ diff --git a/src/mqtt.js b/src/mqtt.js index 8f783df..9dbaa27 100644 --- a/src/mqtt.js +++ b/src/mqtt.js @@ -1,35 +1,35 @@ //dependencies -var db = require('./db'); -const env = process.env.NODE_ENV || 'development'; +var db = require("./db"); +const env = process.env.NODE_ENV || "development"; console.log("ENV: %s", env); -const config = require(__dirname + '/../config/config.json')[env]; +const config = require(__dirname + "/../config/config.json")[env]; -console.log('MQTT: Checking config sources: process.env.MQTT_HOST: %s', process.env.MQTT_HOST); -console.log('MQTT: Checking config sources: process.env.MQTT_PORT_HTTP: %s', process.env.MQTT_PORT_HTTP); -console.log('MQTT: Checking config sources: process.env.MQTT_PORT_HTTPS: %s', process.env.MQTT_PORT_HTTPS); -console.log('MQTT: Checking config sources: config.mqttIP : %s', config.mqttIP ); -console.log('MQTT: Checking config sources: config.mqttPortHttp : %s', config.mqttPortHttp ); -console.log('MQTT: Checking config sources: config.mqttPortHttps : %s', config.mqttPortHttps ); +console.log("MQTT: Checking config sources: process.env.MQTT_HOST: %s", process.env.MQTT_HOST); +console.log("MQTT: Checking config sources: process.env.MQTT_PORT_HTTP: %s", process.env.MQTT_PORT_HTTP); +console.log("MQTT: Checking config sources: process.env.MQTT_PORT_HTTPS: %s", process.env.MQTT_PORT_HTTPS); +console.log("MQTT: Checking config sources: config.mqttIP : %s", config.mqttIP); +console.log("MQTT: Checking config sources: config.mqttPortHttp : %s", config.mqttPortHttp); +console.log("MQTT: Checking config sources: config.mqttPortHttps : %s", config.mqttPortHttps); +console.log("MQTT: Checking config sources: process.env.MQTT_ESP_NAME : %s", process.env.MQTT_ESP_NAME); -var mosca = require('mosca'); +var mosca = require("mosca"); var mqtt_settings = { - host:process.env.MQTT_HOST || config.mqttIP, - port:process.env.MQTT_PORT_HTTP || config.mqttPortHttp || 1884 -} + host: process.env.MQTT_HOST || config.mqttIP, + port: process.env.MQTT_PORT_HTTP || config.mqttPortHttp || 1884, +}; -if(typeof credentials!=='undefined') -{ +if (typeof credentials !== "undefined") { mqtt_settings.secure = { - host:process.env.MQTT_HOST || config.mqttIP, + host: process.env.MQTT_HOST || config.mqttIP, port: process.env.MQTT_PORT_HTTPS || config.mqttPortHttps || 8444, keyPath: SECURE_KEY, certPath: SECURE_CERT, - } + }; } mqtt_settings.port = parseInt(mqtt_settings.port); -console.log('MQTT: mqtt_settings.host : %s', mqtt_settings.host ); -console.log('MQTT: mqtt_settings.port : %s', mqtt_settings.port ); +console.log("MQTT: mqtt_settings.host : %s", mqtt_settings.host); +console.log("MQTT: mqtt_settings.port : %s", mqtt_settings.port); //MQTT SERVER!!! //var mqttServer = new mosca.Server(mqtt_settings); @@ -39,82 +39,88 @@ console.log('MQTT: mqtt_settings.port : %s', mqtt_settings.port ); // mqttServer.on('clientConnected', function(){ // console.log("MQTT client connected !"); // }); +var EspDeviceName = process.env.MQTT_ESP_NAME; -var mqtt = require('mqtt'); -var mqtt_client = mqtt.connect('mqtt://'+ mqtt_settings.host); -mqtt_client.on('connect', function () { - console.log("MQTT connected. subscribing to topics"); - mqtt_client.subscribe('tele/tasmota/STATE'); - mqtt_client.subscribe('tele/tasmota/RESULT');//IR - mqtt_client.subscribe('tele/tasmota/INFO2'); +var mqtt = require("mqtt"); +var mqtt_client = mqtt.connect("mqtt://" + mqtt_settings.host); +mqtt_client.on("connect", function () { + console.log("MQTT connected to " + mqtt_settings.host + ". subscribing to topics"); + mqtt_client.subscribe("tele/tasmota/STATE"); + mqtt_client.subscribe("tele/tasmota/RESULT"); //IR + mqtt_client.subscribe("tele/tasmota/INFO2"); // mqtt_client.subscribe('tele/tasmota/SENSOR');//DHT - mqtt_client.subscribe('tele/+/SENSOR');//DHT - mqtt_client.subscribe('tasmota_3FD92D'); + mqtt_client.subscribe("tele/+/SENSOR"); //DHT + mqtt_client.subscribe("tasmota_3FD92D"); // mqtt_client.subscribe('tele'); // mqtt_client.subscribe('dht'); // mqtt_client.subscribe('ir'); - + // ESP_Easy_0 = garden - mqtt_client.subscribe('Garden/+'); - mqtt_client.subscribe('Garden/+/+'); - mqtt_client.publish('tasmota', 'controller connected'); + mqtt_client.subscribe(EspDeviceName + "/+"); + mqtt_client.subscribe(EspDeviceName + "/+/+"); + mqtt_client.publish("tasmota", "controller connected"); }); var dht = {}; -// https://github.com/pauloromeira/Sonoff-Tasmota/wiki/Commands +//https://www.letscontrolit.com/wiki/index.php/ESPEasy_Command_Reference + +//https://github.com/pauloromeira/Sonoff-Tasmota/wiki/Commands //https://stevessmarthomeguide.com/setting-up-the-sonoff-tasmota-mqtt-switch/ -mqtt_client.on('message', function (topic, message) { +mqtt_client.on("message", function (topic, message) { var context = message.toString(); - console.log("MQTT> " + topic + " : " + context); + console.log("MQTT> " + topic + " : " + context); var handled = false; - if(topic === "tele/tasmota/SENSOR") - { + if (topic === "tele/tasmota/SENSOR") { var j = JSON.parse(message); //console.log("JSON> " + util.inspect(j)); - if(j.DHT11 && j.DHT11.Humidity !== null) - { + if (j.DHT11 && j.DHT11.Humidity !== null) { var msg = { - dht:{ + dht: { hum: j.DHT11.Humidity, - temp: j.DHT11.Temperature, - dew: j.DHT11.DewPoint - } + temp: j.DHT11.Temperature, + dew: j.DHT11.DewPoint, + }, }; - db.devicemessages.insert( 0, "A23_DHT", JSON.stringify(msg), function (err, data) { - if (!err) { console.log("success: "+ data);} - else { console.log("error: " + err); } - }); - }else { - console.log("Got wrong DHT data: " + message ); + db.devicemessages.insert( + 0, + "A23_DHT", + JSON.stringify(msg), + function (err, data) { + if (!err) { + console.log("success: " + data); + } else { + console.log("error: " + err); + } + } + ); + } else { + console.log("Got wrong DHT data: " + message); } handled = true; } - if(topic === "Garden/status/LWT") - { + if (topic === EspDeviceName + "/status/LWT") { //!console.log("Garden >'" + message + "'"); var stat = {}; - var pairs = message.toString().split(';'); + var pairs = message.toString().split(";"); stat.event = pairs[0]; - for (var i = 0; i < pairs.length; i++) - { - var pair = pairs[i].split(':'); - if(pair.length == 2){ - stat[pair[0].trim()] = pair[1].trim() || ''; + for (var i = 0; i < pairs.length; i++) { + var pair = pairs[i].split(":"); + if (pair.length == 2) { + stat[pair[0].trim()] = pair[1].trim() || ""; //console.log( "'"+pair[0] +"' >'" + pair[1] + "'"); } } - dht.ssid=stat["SSID"]; - dht.rssi=stat["RSSI"]; + dht.ssid = stat["SSID"]; + dht.rssi = stat["RSSI"]; //if(stat.event ==='ON'){console.log(formatDate(new Date()) + "Device is ONLINE! <" + dht.ssid + "> " + dht.rssi + "dB" );} //if(stat.event ==='OFF'){console.log(formatDate(new Date()) + "Device went ofline!");} handled = true; } - if(topic === "Garden/Soil/RH") - { + if (topic === EspDeviceName + "/Soil/RH") { //console.log("Garden > soil " + message + "% moisture"); dht.Soil = message.toString(); - if(dht.Soil > 10){ + if (dht.Soil > 10) { SaveDhtIf(); } else { console.log("Got suspicious soil RH value:" + dht.Soil); @@ -123,51 +129,63 @@ mqtt_client.on('message', function (topic, message) { SaveDhtIf(); handled = true; } - if(topic === "Garden/bmp/Temperature") - { + if (topic === EspDeviceName + "/bmp/Temperature") { dht.Temp = message.toString(); console.log("Garden > air " + dht.Temp + " C"); SaveDhtIf(); handled = true; } - if(topic === "Garden/bmp/Humidity") - { + if (topic === EspDeviceName + "/bmp/Humidity") { dht.Hum = message.toString(); - console.log("Garden > air " + dht.Hum + "% RH"); + console.log(EspDeviceName + " > air " + dht.Hum + "% RH"); SaveDhtIf(); handled = true; } - if(topic === "Garden/bmp/Pressure") - { + if (topic === EspDeviceName + "/bmp/Pressure") { dht.Pres = message.toString(); - console.log("Garden > air " + dht.Pres + " hPa"); + console.log(EspDeviceName + " > air " + dht.Pres + " hPa"); SaveDhtIf(); handled = true; } - if(topic === "Garden/Water/start") - { + if (topic === EspDeviceName + "/Water/start") { var j = JSON.parse(message); dht.Soil = j.soil; SaveDhtIf(); handled = true; - console.log(formatDate(new Date()) + "Garden > Started watering at "+j.time+"(GMT) with " + j.soil + "% soil RH"); + console.log( + formatDate(new Date()) + + EspDeviceName + + " > Started watering at " + + j.time + + "(GMT) with " + + j.soil + + "% soil RH" + ); } - if(topic === "Garden/Water/stop") - { + if (topic === EspDeviceName + "/Water/stop") { var j = JSON.parse(message); dht.Soil = j.soil; SaveDhtIf(); handled = true; - console.log(formatDate(new Date()) + "Garden > Finished watering at "+j.time+"(GMT) with " + j.soil + "% soil RH"); + console.log( + formatDate(new Date()) + + EspDeviceName + + " > Finished watering at " + + j.time + + "(GMT) with " + + j.soil + + "% soil RH" + ); } - if(!handled){ - console.log(topic + " > " + message ); + if (!handled) { + console.log(topic + " > " + message); } }); -function SaveDhtIf(){ - if(dht.Temp && dht.Hum && dht.Pres)// && dht.Soil - { + +function SaveDhtIf() { + if (dht.Temp && dht.Hum && dht.Pres) { + // && dht.Soil // if(dht.Soil && dht.Soil < 5) // { // console.log("Soil reported below 5%! Probable loose sensor wire. Record discarded" ); @@ -177,16 +195,30 @@ function SaveDhtIf(){ var msg = JSON.stringify(dht); db.devicemessages.insert(1, "A23_Garden_dht", msg, function (err, data) { if (!err) { - console.log("Saved to DB > ["+ data.id +"]:" + msg);//+"; SSID: '"+dht.ssid+"' RSSI:"+ dht.rssi + "dB"); + console.log("Saved to DB > [" + data.id + "]:" + msg); //+"; SSID: '"+dht.ssid+"' RSSI:"+ dht.rssi + "dB"); + } else { + console.log("error: " + err); } - else { console.log("error: " + err); } }); dht = {}; - }else{ + } else { console.log("T: %s; H: %s; P: $s", dht.Temp, dht.Hum, dht.Pres); - // if(dht.Temp ){console.log("have Temp");} - // if(dht.Hum ){console.log("have Hum");} - // if(dht.Pres ){console.log("have Pres");} - console.log("Missing all data to write to DB !"); + // if(dht.Temp ){console.log("have Temp");} + // if(dht.Hum ){console.log("have Hum");} + // if(dht.Pres ){console.log("have Pres");} + console.log("Missing all data to write to DB !"); } -} \ No newline at end of file +} + +exports.Send = function (topic = "", message = "") { + if (topic == "") { + topic = EspDeviceName + "/cmd"; + console.log("MQTT> command topic set to default:" + topic); + } + 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