commands to DHT send also over MQTT;

Removes the need to have direct access over TCP/IP
This commit is contained in:
Dobromir Popov ONE
2022-04-16 12:57:47 +03:00
parent 631cec9ca8
commit d9b2af2511
2 changed files with 136 additions and 98 deletions

24
dht.js
View File

@@ -91,7 +91,7 @@ app.post('/accontrol',
var code = ac.Tlc112.GetCommand(); var code = ac.Tlc112.GetCommand();
mqtt_client.publish('cmnd/', 'controller') //!mqtt_client.publish('cmnd/', 'controller')
//break it //break it
//code = code.substring(150); //code = code.substring(150);
//console.log("RAW: " + code); //console.log("RAW: " + code);
@@ -138,16 +138,22 @@ 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; var time = req.query.t;
console.log("Watering cmd for: " + time); console.log("Watering cmd for: " + time);
request('http://'+config.gardenIP+'/tools?cmd=event,manualwatering='+ time, { json: true }, (err, res, body) => { if(config.gardenIP !="" && config.gardenIP !="0.0.0.0"){
if (err) { return console.log("Problem watering: " + err); } request('http://'+config.gardenIP+'/tools?cmd=event,manualwatering='+ time, { json: true }, (err, res, body) => {
console.log("Watering cmd successfully sent!"); 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){ app.use('/waterStop',function(req, res){
request('http://'+config.gardenIP+'/tools?cmd=event,stopwatering', { json: true }, (err, res, body) => { if(config.gardenIP !="" && config.gardenIP !="0.0.0.0"){
if (err) { return console.log("Problem watering: " + err); } request('http://'+config.gardenIP+'/tools?cmd=event,stopwatering', { json: true }, (err, res, body) => {
console.log("STOP watering cmd sent!"); if (err) { return console.log("Problem watering: " + err); }
}); console.log("STOP watering cmd sent!");
});
}
mqtt.Send("event,stopwatering","Garden/cmd");
}); });
function BroadcastWS(msg){ function BroadcastWS(msg){

View File

@@ -1,35 +1,35 @@
//dependencies //dependencies
var db = require('./db'); var db = require("./db");
const env = process.env.NODE_ENV || 'development'; const env = process.env.NODE_ENV || "development";
console.log("ENV: %s", env); 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_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_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: 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.mqttIP : %s", config.mqttIP);
console.log('MQTT: Checking config sources: config.mqttPortHttp : %s', config.mqttPortHttp ); 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: 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 = { var mqtt_settings = {
host:process.env.MQTT_HOST || config.mqttIP, host: process.env.MQTT_HOST || config.mqttIP,
port:process.env.MQTT_PORT_HTTP || config.mqttPortHttp || 1884 port: process.env.MQTT_PORT_HTTP || config.mqttPortHttp || 1884,
} };
if(typeof credentials!=='undefined') if (typeof credentials !== "undefined") {
{
mqtt_settings.secure = { 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, port: process.env.MQTT_PORT_HTTPS || config.mqttPortHttps || 8444,
keyPath: SECURE_KEY, keyPath: SECURE_KEY,
certPath: SECURE_CERT, certPath: SECURE_CERT,
} };
} }
mqtt_settings.port = parseInt(mqtt_settings.port); mqtt_settings.port = parseInt(mqtt_settings.port);
console.log('MQTT: mqtt_settings.host : %s', mqtt_settings.host ); 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.port : %s", mqtt_settings.port);
//MQTT SERVER!!! //MQTT SERVER!!!
//var mqttServer = new mosca.Server(mqtt_settings); //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(){ // mqttServer.on('clientConnected', function(){
// console.log("MQTT client connected !"); // console.log("MQTT client connected !");
// }); // });
var EspDeviceName = process.env.MQTT_ESP_NAME;
var mqtt = require('mqtt'); var mqtt = require("mqtt");
var mqtt_client = mqtt.connect('mqtt://'+ mqtt_settings.host); var mqtt_client = mqtt.connect("mqtt://" + mqtt_settings.host);
mqtt_client.on('connect', function () { mqtt_client.on("connect", function () {
console.log("MQTT connected. subscribing to topics"); console.log("MQTT connected to " + mqtt_settings.host + ". subscribing to topics");
mqtt_client.subscribe('tele/tasmota/STATE'); mqtt_client.subscribe("tele/tasmota/STATE");
mqtt_client.subscribe('tele/tasmota/RESULT');//IR mqtt_client.subscribe("tele/tasmota/RESULT"); //IR
mqtt_client.subscribe('tele/tasmota/INFO2'); mqtt_client.subscribe("tele/tasmota/INFO2");
// mqtt_client.subscribe('tele/tasmota/SENSOR');//DHT // mqtt_client.subscribe('tele/tasmota/SENSOR');//DHT
mqtt_client.subscribe('tele/+/SENSOR');//DHT mqtt_client.subscribe("tele/+/SENSOR"); //DHT
mqtt_client.subscribe('tasmota_3FD92D'); mqtt_client.subscribe("tasmota_3FD92D");
// mqtt_client.subscribe('tele'); // mqtt_client.subscribe('tele');
// mqtt_client.subscribe('dht'); // mqtt_client.subscribe('dht');
// mqtt_client.subscribe('ir'); // mqtt_client.subscribe('ir');
// ESP_Easy_0 = garden // ESP_Easy_0 = garden
mqtt_client.subscribe('Garden/+'); mqtt_client.subscribe(EspDeviceName + "/+");
mqtt_client.subscribe('Garden/+/+'); mqtt_client.subscribe(EspDeviceName + "/+/+");
mqtt_client.publish('tasmota', 'controller connected'); mqtt_client.publish("tasmota", "controller connected");
}); });
var dht = {}; 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/ //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(); var context = message.toString();
console.log("MQTT> " + topic + " : " + context); console.log("MQTT> " + topic + " : " + context);
var handled = false; var handled = false;
if(topic === "tele/tasmota/SENSOR") if (topic === "tele/tasmota/SENSOR") {
{
var j = JSON.parse(message); var j = JSON.parse(message);
//console.log("JSON> " + util.inspect(j)); //console.log("JSON> " + util.inspect(j));
if(j.DHT11 && j.DHT11.Humidity !== null) if (j.DHT11 && j.DHT11.Humidity !== null) {
{
var msg = { var msg = {
dht:{ dht: {
hum: j.DHT11.Humidity, hum: j.DHT11.Humidity,
temp: j.DHT11.Temperature, temp: j.DHT11.Temperature,
dew: j.DHT11.DewPoint dew: j.DHT11.DewPoint,
} },
}; };
db.devicemessages.insert( 0, "A23_DHT", JSON.stringify(msg), function (err, data) { db.devicemessages.insert(
if (!err) { console.log("success: "+ data);} 0,
else { console.log("error: " + err); } "A23_DHT",
}); JSON.stringify(msg),
}else { function (err, data) {
console.log("Got wrong DHT data: " + message ); if (!err) {
console.log("success: " + data);
} else {
console.log("error: " + err);
}
}
);
} else {
console.log("Got wrong DHT data: " + message);
} }
handled = true; handled = true;
} }
if(topic === "Garden/status/LWT") if (topic === EspDeviceName + "/status/LWT") {
{
//!console.log("Garden >'" + message + "'"); //!console.log("Garden >'" + message + "'");
var stat = {}; var stat = {};
var pairs = message.toString().split(';'); var pairs = message.toString().split(";");
stat.event = pairs[0]; stat.event = pairs[0];
for (var i = 0; i < pairs.length; i++) for (var i = 0; i < pairs.length; i++) {
{ var pair = pairs[i].split(":");
var pair = pairs[i].split(':'); if (pair.length == 2) {
if(pair.length == 2){ stat[pair[0].trim()] = pair[1].trim() || "";
stat[pair[0].trim()] = pair[1].trim() || '';
//console.log( "'"+pair[0] +"' >'" + pair[1] + "'"); //console.log( "'"+pair[0] +"' >'" + pair[1] + "'");
} }
} }
dht.ssid=stat["SSID"]; dht.ssid = stat["SSID"];
dht.rssi=stat["RSSI"]; dht.rssi = stat["RSSI"];
//if(stat.event ==='ON'){console.log(formatDate(new Date()) + "Device is ONLINE! <" + dht.ssid + "> " + dht.rssi + "dB" );} //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!");} //if(stat.event ==='OFF'){console.log(formatDate(new Date()) + "Device went ofline!");}
handled = true; handled = true;
} }
if(topic === "Garden/Soil/RH") if (topic === EspDeviceName + "/Soil/RH") {
{
//console.log("Garden > soil " + message + "% moisture"); //console.log("Garden > soil " + message + "% moisture");
dht.Soil = message.toString(); dht.Soil = message.toString();
if(dht.Soil > 10){ if (dht.Soil > 10) {
SaveDhtIf(); SaveDhtIf();
} else { } else {
console.log("Got suspicious soil RH value:" + dht.Soil); console.log("Got suspicious soil RH value:" + dht.Soil);
@@ -123,51 +129,63 @@ mqtt_client.on('message', function (topic, message) {
SaveDhtIf(); SaveDhtIf();
handled = true; handled = true;
} }
if(topic === "Garden/bmp/Temperature") if (topic === EspDeviceName + "/bmp/Temperature") {
{
dht.Temp = message.toString(); dht.Temp = message.toString();
console.log("Garden > air " + dht.Temp + " C"); console.log("Garden > air " + dht.Temp + " C");
SaveDhtIf(); SaveDhtIf();
handled = true; handled = true;
} }
if(topic === "Garden/bmp/Humidity") if (topic === EspDeviceName + "/bmp/Humidity") {
{
dht.Hum = message.toString(); dht.Hum = message.toString();
console.log("Garden > air " + dht.Hum + "% RH"); console.log(EspDeviceName + " > air " + dht.Hum + "% RH");
SaveDhtIf(); SaveDhtIf();
handled = true; handled = true;
} }
if(topic === "Garden/bmp/Pressure") if (topic === EspDeviceName + "/bmp/Pressure") {
{
dht.Pres = message.toString(); dht.Pres = message.toString();
console.log("Garden > air " + dht.Pres + " hPa"); console.log(EspDeviceName + " > air " + dht.Pres + " hPa");
SaveDhtIf(); SaveDhtIf();
handled = true; handled = true;
} }
if(topic === "Garden/Water/start") if (topic === EspDeviceName + "/Water/start") {
{
var j = JSON.parse(message); var j = JSON.parse(message);
dht.Soil = j.soil; dht.Soil = j.soil;
SaveDhtIf(); SaveDhtIf();
handled = true; 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); var j = JSON.parse(message);
dht.Soil = j.soil; dht.Soil = j.soil;
SaveDhtIf(); SaveDhtIf();
handled = true; 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){ if (!handled) {
console.log(topic + " > " + message ); 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) // if(dht.Soil && dht.Soil < 5)
// { // {
// console.log("Soil reported below 5%! Probable loose sensor wire. Record discarded" ); // console.log("Soil reported below 5%! Probable loose sensor wire. Record discarded" );
@@ -177,16 +195,30 @@ function SaveDhtIf(){
var msg = JSON.stringify(dht); var msg = JSON.stringify(dht);
db.devicemessages.insert(1, "A23_Garden_dht", msg, function (err, data) { db.devicemessages.insert(1, "A23_Garden_dht", msg, function (err, data) {
if (!err) { 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 = {}; dht = {};
}else{ } else {
console.log("T: %s; H: %s; P: $s", dht.Temp, dht.Hum, dht.Pres); console.log("T: %s; H: %s; P: $s", dht.Temp, dht.Hum, dht.Pres);
// if(dht.Temp ){console.log("have Temp");} // if(dht.Temp ){console.log("have Temp");}
// if(dht.Hum ){console.log("have Hum");} // if(dht.Hum ){console.log("have Hum");}
// if(dht.Pres ){console.log("have Pres");} // if(dht.Pres ){console.log("have Pres");}
console.log("Missing all data to write to DB !"); console.log("Missing all data to write to DB !");
} }
} }
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);
});
};