Files
iot/src/mqtt.js
Dobromir Popov ONE a701761510 setup docker with variables;
debug logging for configuration variables;
2022-03-29 23:38:42 +03:00

192 lines
6.2 KiB
JavaScript

//dependencies
var db = require('./db');
const env = process.env.NODE_ENV || 'development';
console.log("ENV: %s", 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 );
var mosca = require('mosca');
var mqtt_settings = {
host:process.env.MQTT_HOST || config.mqttIP,
port:process.env.MQTT_PORT_HTTP || config.mqttPortHttp || 1884
}
if(typeof credentials!=='undefined')
{
mqtt_settings.secure = {
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 );
//MQTT SERVER!!!
//var mqttServer = new mosca.Server(mqtt_settings);
// mqttServer.on('ready', function(){
// console.log("MQTT ready on port " + mqtt_settings.port);
// })
// mqttServer.on('clientConnected', function(){
// console.log("MQTT client connected !");
// });
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');
// mqtt_client.subscribe('tele/tasmota/SENSOR');//DHT
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');
});
var dht = {};
// 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) {
var context = message.toString();
console.log("MQTT> " + topic + " : " + context);
var handled = false;
if(topic === "tele/tasmota/SENSOR")
{
var j = JSON.parse(message);
//console.log("JSON> " + util.inspect(j));
if(j.DHT11 && j.DHT11.Humidity !== null)
{
var msg = {
dht:{
hum: j.DHT11.Humidity,
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 );
}
handled = true;
}
if(topic === "Garden/status/LWT")
{
//!console.log("Garden >'" + message + "'");
var stat = {};
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() || '';
//console.log( "'"+pair[0] +"' >'" + pair[1] + "'");
}
}
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")
{
//console.log("Garden > soil " + message + "% moisture");
dht.Soil = message.toString();
if(dht.Soil > 10){
SaveDhtIf();
} else {
console.log("Got suspicious soil RH value:" + dht.Soil);
//dht.Soil = 0;
}
SaveDhtIf();
handled = true;
}
if(topic === "Garden/bmp/Temperature")
{
dht.Temp = message.toString();
console.log("Garden > air " + dht.Temp + " C");
SaveDhtIf();
handled = true;
}
if(topic === "Garden/bmp/Humidity")
{
dht.Hum = message.toString();
console.log("Garden > air " + dht.Hum + "% RH");
SaveDhtIf();
handled = true;
}
if(topic === "Garden/bmp/Pressure")
{
dht.Pres = message.toString();
console.log("Garden > air " + dht.Pres + " hPa");
SaveDhtIf();
handled = true;
}
if(topic === "Garden/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");
}
if(topic === "Garden/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");
}
if(!handled){
console.log(topic + " > " + message );
}
});
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" );
// dht = {};
// return;
// }
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");
}
else { console.log("error: " + err); }
});
dht = {};
}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 !");
}
}