mqtt_server/lib/mqtt/mqttClient.js

145 lines
3.7 KiB
JavaScript
Raw Normal View History

'use strict';
2016-11-23 19:19:03 +00:00
const mqtt = require('mqtt');
const request = require('request');
let util = require('util');
const logger = require('log4js').getLogger();
2016-06-28 14:02:11 +00:00
2016-11-13 22:21:18 +00:00
// 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);
2016-06-28 14:02:11 +00:00
let globalMode = 'FanOff';
2016-06-28 14:02:11 +00:00
let lastDispatch = 0;
2016-06-28 14:02:11 +00:00
2016-11-23 19:19:03 +00:00
const mqttClient = function (events) {
const orgId = '';
const userName = '';
const appKey = 'bob';
2016-06-22 15:07:56 +00:00
2016-11-13 22:21:18 +00:00
this.livingRoom = {
temp: 0,
last: 0
};
2016-11-23 19:19:03 +00:00
let mode = 'FanOff';
2016-11-13 21:21:11 +00:00
2016-11-23 19:19:03 +00:00
const d = new Date();
2016-11-13 22:21:18 +00:00
this.lastMsg = d.getTime();
2016-11-13 21:21:11 +00:00
2016-11-23 19:19:03 +00:00
events.on('sendIFTTT', function (mode) {
let d;
2016-11-23 19:19:03 +00:00
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();
2016-11-23 19:19:03 +00:00
lastDispatch = d.getTime();
} else {
logger.warn('Not sent...');
2016-11-23 19:19:03 +00:00
}
});
2016-11-23 19:19:03 +00:00
2016-11-13 22:21:18 +00:00
this.fanTimer = function () {
let n;
2016-11-23 19:19:03 +00:00
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);
2016-06-24 13:44:21 +00:00
2016-11-15 07:56:41 +00:00
if (globalMode === 'FanOff') {
logger.info('Fans off, temp should be <= 19.5');
2016-11-13 22:21:18 +00:00
mode = (parseFloat(this.livingRoom.temp) <= 19.5) ? 'FanOn' : 'FanOff';
} else {
logger.info('Fans on, temp should not be less than 22.5');
2016-11-13 22:21:18 +00:00
mode = (parseFloat(this.livingRoom.temp) <= 22.5) ? 'FanOn' : 'FanOff';
}
2016-06-24 13:44:21 +00:00
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);
2016-06-24 13:44:21 +00:00
2016-11-13 22:21:18 +00:00
if (n >= 600000) {
logger.error('No message received for over 10 minutes');
2016-11-13 22:21:18 +00:00
mode = 'FanOff';
logger.warn('Setting quit for 15 seconds.');
setTimeout(()=>{throw new error('Ejecting for restart');}, 15000);
2016-11-13 22:21:18 +00:00
}
2016-06-24 13:44:21 +00:00
2016-11-13 22:21:18 +00:00
logger.info('LR temp:', this.livingRoom.temp);
2016-06-24 13:44:21 +00:00
2016-11-23 19:19:03 +00:00
events.emit('sendIFTTT', mode);
const data = {id: 'temperature', data: {mode: globalMode, temp: this.livingRoom.temp}};
2016-11-23 19:19:03 +00:00
events.emit('sendSocket', data);
2016-06-24 13:44:21 +00:00
2016-11-13 22:21:18 +00:00
setTimeout(this.fanTimer.bind(this), mod + 10);
};
2016-06-24 13:44:21 +00:00
2016-11-13 22:21:18 +00:00
this.lighting = 'lights';
2016-06-22 15:07:56 +00:00
2016-11-13 22:21:18 +00:00
this.connected = false;
2016-06-22 15:07:56 +00:00
2016-11-23 19:19:03 +00:00
const options = {
2016-11-13 22:21:18 +00:00
keepalive: 3600,
clientId: 'a:' + orgId + ':' + Date.now(),
username: userName,
password: new Buffer(appKey)
2016-06-22 15:07:56 +00:00
2016-11-13 22:21:18 +00:00
};
2016-06-22 15:07:56 +00:00
2016-11-13 22:21:18 +00:00
this.client = mqtt.connect('mqtt://' + orgId + 'silvrtree.co.uk', options);
2016-06-22 15:07:56 +00:00
2016-11-13 22:21:18 +00:00
this.client.on('connect', function () {
this.connected = true;
logger.info('Connected to Silvr Broker');
2016-11-13 22:21:18 +00:00
this.fanTimer();
}.bind(this));
2016-06-22 15:07:56 +00:00
2016-11-13 22:21:18 +00:00
this.client.subscribe('livingroomTemp');
2016-06-24 13:44:21 +00:00
2016-11-13 22:21:18 +00:00
this.client.on('message', function (topic, message) {
2016-06-24 13:44:21 +00:00
2016-11-23 19:19:03 +00:00
const json = JSON.parse(message.toString());
2016-11-13 22:21:18 +00:00
logger.debug(json);
logger.debug(json.temp);
2016-06-24 13:44:21 +00:00
2016-11-13 22:21:18 +00:00
this.livingRoom.temp = parseFloat(json.temp);
logger.info('lr:', this.livingRoom.temp, this.livingRoom.temp >= 22.6);
2016-11-23 19:05:21 +00:00
if (this.livingRoom.temp >= 22.7) {
logger.warn('Max temp reached, turn off');
2016-11-23 19:19:03 +00:00
events.emit('sendIFTTT', 'FanOff');
2016-11-13 22:21:18 +00:00
}
2016-11-23 19:19:03 +00:00
const d = new Date();
2016-11-13 22:21:18 +00:00
this.lastMsg = d.getTime();
2016-06-24 13:44:21 +00:00
const data = {id: 'temperature', data: {mode: globalMode, temp: this.livingRoom.temp}};
2016-11-23 19:19:03 +00:00
events.emit('sendSocket', data);
2016-11-13 22:21:18 +00:00
}.bind(this));
2016-06-24 13:44:21 +00:00
2016-11-13 22:21:18 +00:00
this.isConnected = function () {
return this.connected;
};
2016-06-28 14:02:11 +00:00
2016-11-13 22:21:18 +00:00
};
2016-06-22 15:07:56 +00:00
module.exports.mqttClient = mqttClient;