//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 !"); } }