'use strict'; const mqtt = require('mqtt'); const request = require('request'); let util = require('util'); const logger = require('log4js').getLogger(); // var db = require('../server/db-connector').dbConnection; // var nano = require('nano')('http://martind2000:1V3D4m526i@localhost:5984'); // var nano = require('nano')('http://localhost:5984'); // let db_name = 'mqtt'; // var dbCouch = nano.use(db_name); let globalMode = 'FanOff'; let lastDispatch = 0; const mqttClient = function (events) { const orgId = ''; const userName = ''; const appKey = 'bob'; this.livingRoom = { temp: 0, last: 0 }; let mode = 'FanOff'; const d = new Date(); this.lastMsg = d.getTime(); events.on('sendIFTTT', function (mode) { let d; const url = ['https://maker.ifttt.com/trigger/', mode, '/with/key/cWvECkeiyAPwmiOPBkXL2D'].join(''); if (mode !== globalMode) { logger.info('Sending..'); globalMode = mode; request(url, function (error, response, body) { logger.debug(response, body); }); d = new Date(); lastDispatch = d.getTime(); } else { logger.warn('Not sent...'); } }); this.fanTimer = function () { let n; const now = new Date; const mod = 900000 - (now.getTime() % 900000); const day = now.getDay(); const daytimeLimits = {low:27900000,high:63000000}; const nowMS = (now.getHours() * 3600000) + (now.getMinutes() * 60000); if (globalMode === 'FanOff') { logger.info('Fans off, temp should be <= 19.5'); mode = (parseFloat(this.livingRoom.temp) <= 19.5) ? 'FanOn' : 'FanOff'; } else { logger.info('Fans on, temp should not be less than 22.5'); mode = (parseFloat(this.livingRoom.temp) <= 22.5) ? 'FanOn' : 'FanOff'; } if ((globalMode !== 'FanOff' || mode !== 'FanOff') && ((day >=1 && day <=5) && (nowMS >= daytimeLimits.low && nowMS <= daytimeLimits.high))) { logger.info('Week day'); mode = 'FanOff' } n = now.getTime() - this.lastMsg; logger.info('Last msg', n); if (n >= 600000) { logger.error('No message received for over 10 minutes'); mode = 'FanOff'; logger.warn('Setting quit for 15 seconds.'); setTimeout(()=>{throw new error('Ejecting for restart');}, 15000); } logger.info('LR temp:', this.livingRoom.temp); events.emit('sendIFTTT', mode); const data = {id: 'temperature', data: {mode: globalMode, temp: this.livingRoom.temp}}; events.emit('sendSocket', data); setTimeout(this.fanTimer.bind(this), mod + 10); }; this.lighting = 'lights'; this.connected = false; const options = { keepalive: 3600, clientId: 'a:' + orgId + ':' + Date.now(), username: userName, password: new Buffer(appKey) }; this.client = mqtt.connect('mqtt://' + orgId + 'silvrtree.co.uk', options); this.client.on('connect', function () { this.connected = true; logger.info('Connected to Silvr Broker'); this.fanTimer(); }.bind(this)); this.client.subscribe('livingroomTemp'); this.client.on('message', function (topic, message) { const json = JSON.parse(message.toString()); logger.debug(json); logger.debug(json.temp); this.livingRoom.temp = parseFloat(json.temp); logger.info('lr:', this.livingRoom.temp, this.livingRoom.temp >= 22.6); if (this.livingRoom.temp >= 22.7) { logger.warn('Max temp reached, turn off'); events.emit('sendIFTTT', 'FanOff'); } const d = new Date(); this.lastMsg = d.getTime(); const data = {id: 'temperature', data: {mode: globalMode, temp: this.livingRoom.temp}}; events.emit('sendSocket', data); }.bind(this)); this.isConnected = function () { return this.connected; }; }; module.exports.mqttClient = mqttClient;