Source: plugins/outbound/mqttclient/base.js

const EventEmitter = require('events');
var mqtt = require('mqtt')

class mqttclient extends EventEmitter {
    constructor() {
        super();
        global.plgManager.logger.info('-------- PLUGIN MQTTCLIENT -----------');
        // setting defaults
        this.mqttserverDomain = null;
        this.mqttserverUsername = null;
        this.mqttserverPassword = null;
        this.mqttserverPort = 1883;
        this.mqttserverTopic = 'alarmiator/stichwort';
        // register Events
        this.registerForEvents();
        // loading configuration of plugin
        this.loadConfig((success) => {
            if (success) {
                global.plgManager.logger.info('PLUGIN | MQTTCLIENT | successfully loaded Configuration from core database');
                this.initializePlugin((successInit) => {
                    if (successInit) {
                        global.plgManager.logger.info('PLUGIN | MQTTCLIENT | successfully initialized plugin. Ready to send messages now.');
                    } else {
                        global.plgManager.logger.error('PLUGIN | MQTTCLIENT | something went wrong initializing plugin');
                    }
                });
            } else {
                global.plgManager.logger.error('PLUGIN | MQTTCLIENT | something went wrong loading configuration. Can not send mqtt messages!!');
            }
        });
        
    }




    /**
     * Registration of Events at the plugin manager (hook in to events provided by the plugin manager)
     */
    registerForEvents() {
        global.plgManager.logger.info('PLUGIN | MQTTCLIENT | Registering events')
        global.plgManager.on('event_new_alarm', (alarmInfo) => {
            global.plgManager.logger.info('PLUGIN | MQTTCLIENT | EVENT event_new_alarm recieved');
            this.sendNewAlarm(alarmInfo, (success) => {
                if (success) {
                    global.plgManager.logger.info('PLUGIN | MQTTCLIENT | sent MQTT Message successfully');
                } else {
                    global.plgManager.logger.error('PLUGIN | MQTTCLIENT | Could not send MQTT Message');
                }
            });
        })
    }



    /**
     * Plugin-specific Getters and Setters
     * 
    */
    set mqttserverDomain(mqttserverDomain) {
        this._mqttseverDomain = mqttserverDomain;
    }
    get mqttserverDomain() {
        return this._mqttseverDomain;
    }

    set mqttserverUsername(mqttserverUsername) {
        this._mqttserverUsername = mqttserverUsername;
    }
    get mqttserverUsername() {
        return this._mqttserverUsername;
    }

    set mqttserverPassword(mqttserverPassword) {
        this._mqttserverPassword = mqttserverPassword;
    }
    get mqttserverPassword() {
        return this._mqttserverPassword;
    }

    set mqttserverPort(mqttserverPort) {
        this._mqttserverPort = mqttserverPort;
    }
    get mqttserverPort() {
        return this._mqttserverPort;
    }

    set mqttserverTopic(mqttserverTopic) {
        this._mqttserverTopic = mqttserverTopic;
    }
    get mqttserverTopic() {
        return this._mqttserverTopic;
    }



    /**
     * Plugin-specific implementation
     */

    sendNewAlarm(alarmInfo, callback) {
        var message = alarmInfo.subject.value + ', Einsatzort: ' + alarmInfo.location.value;
        //console.log('Sending MQTT Alarm ... ');
        var client = mqtt.connect(this.mqttserverDomain);
        client.on('connect', (result) => {
            // console.log('connected to mqtt Server ' + this.mqttserverDomain);
            // console.log('sending message: ' + message);
            // console.log('sending to topic: ' + this.mqttserverTopic);
            client.publish(this.mqttserverTopic, message, (resultPublish) => {
                global.plgManager.logger.info('PLUGIN | MQTTCLIENT | Sent message to mqtt server');
                client.end();
            })
        })
    }


    /**
     * Loads configuration for KatSys Service
     * TBD: Needs to be pulled from plugin config store
     */
    loadConfig(callback) {
        global.plgManager.loadConfigFromStore('mqttclient', (configRows) => {
            if (configRows !== null) {
                this.config = configRows[0];
                this.config = JSON.parse(this.config.configstore);
                global.plgManager.logger.info('PLUGIN | MQTTCLIENT | Configuration reloaded from core database');
                callback(true);
            } else {
                global.plgManager.logger.info('PLUGIN | MQTTCLIENT | Found no configuration reloaded in core database');
                callback(false);
            }
        })
    }

    /**
     * returns config parameter for given fieldname
     * @param {string} fieldname 
     */
    getConfigValue(fieldname) {
        var retVal = null;
        this.config.fields.forEach((field) => {
            if (field.fieldname === fieldname) {
                retVal = field.value;
            }
        });
        return retVal;
    }

    /**
     * initializes all settings. Returns false, if a needed setting is not valid or not set
     * @param {function} callback success (true/false)
     */
    initializePlugin(callback) {
        this.mqttserverDomain = this.getConfigValue('mqttserverDomain');
        this.mqttserverUsername = this.getConfigValue('mqttserverUsername');
        this.mqttserverPassword = this.getConfigValue('mqttserverPassword');
        this.mqttserverPort = this.getConfigValue('mqttserverPort');
        this.mqttserverTopic = this.getConfigValue('mqttserverTopic');
        if (this.mqttserverDomain !== null) {
            return callback(true);
        } else {
            return callback(false);
        }

    }

}

module.exports = mqttclient;