From c00520e67b3d3f6932c710c97868a151203634c2 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Mon, 1 Jan 2018 21:15:06 +0100 Subject: [PATCH] initial --- .gitignore | 2 ++ package.json | 23 ++++++++++++++++++ src/genericItem.js | 41 ++++++++++++++++++++++++++++++++ src/item1.js | 9 +++++++ src/log.js | 9 +++++++ src/main.js | 12 ++++++++++ src/mqttHandler.js | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 155 insertions(+) create mode 100644 .gitignore create mode 100644 package.json create mode 100644 src/genericItem.js create mode 100644 src/item1.js create mode 100644 src/log.js create mode 100644 src/main.js create mode 100644 src/mqttHandler.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fc467d1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +*.map diff --git a/package.json b/package.json new file mode 100644 index 0000000..28bc278 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "dispatcher_ng", + "version": "1.0.0", + "description": "", + "main": "main.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@gitlab.com/wolutator/dispatcher_ng.git" + }, + "author": "Wolfgang Hottgenroth ", + "license": "ISC", + "bugs": { + "url": "https://gitlab.com/wolutator/dispatcher_ng/issues" + }, + "homepage": "https://gitlab.com/wolutator/dispatcher_ng#README", + "dependencies": { + "mqtt": "^2.15.0", + "simple-node-logger": "^0.93.33" + } +} diff --git a/src/genericItem.js b/src/genericItem.js new file mode 100644 index 0000000..8015338 --- /dev/null +++ b/src/genericItem.js @@ -0,0 +1,41 @@ +let logger = require('./log'); +let mqtt = require('./mqttHandler'); + + + +class GenericItem { + constructor(itemId) { + this.itemId = itemId; + this.stateTopic = `dispatcher_ng/items/${this.itemId}/state`; + this.brightTopic = `dispatcher_ng/items/${this.itemId}/bright`; + this.stateFeedbackTopic = `dispatcher_ng/items/${this.itemId}/state/feedback`; + this.brightFeedbackTopic = `dispatcher_ng/items/${this.itemId}/bright/feedback`; + this.actionTopic = `dispatcher_ng/items/${this.itemId}/action`; + this.state = 'OFF'; + this.oldState = undefined; + this.bright = 0; + this.oldBright = undefined; + + + mqtt.register([this.stateTopic, this.brightTopic], (topic, payload) => { + logger.info(`item ${this.itemId}: ${topic}, ${payload}`) + if (topic == this.stateTopic) { + this.state = payload; + mqtt.send(this.stateFeedbackTopic, this.state); + } else if (topic == this.brightTopic) { + this.bright = payload; + mqtt.send(this.brightFeedbackTopic, this.bright); + } + logger.info(this.state != this.oldState); + logger.info(this.bright != this.oldBright); + if ((this.state != this.oldState) || (this.bright != this.oldBright)) { + mqtt.send(this.actionTopic, `${this.state} ${this.bright}`); + this.oldState = this.state; + this.oldBright = this.bright; + } + }); + } +} + +module.exports = GenericItem; + diff --git a/src/item1.js b/src/item1.js new file mode 100644 index 0000000..7448255 --- /dev/null +++ b/src/item1.js @@ -0,0 +1,9 @@ +let logger = require('./log'); +let mqtt = require('./mqttHandler'); + + +mqtt.register(['dispatcher_ng/items/1/set', 'dispatcher_ng/items/1/bright'], (topic, payload) => { + logger.info(`item 1: ${topic}, ${payload}`) + mqtt.send('dispatcher_ng/items/1/feedback', 'bla'); +}); + diff --git a/src/log.js b/src/log.js new file mode 100644 index 0000000..dc3869a --- /dev/null +++ b/src/log.js @@ -0,0 +1,9 @@ +const SimpleNodeLogger = require('simple-node-logger'); +let opts = { + logFilePath:'mylogfile.log', + timestampFormat:'YYYY-MM-DD HH:mm:ss.SSS' +}; +let log = SimpleNodeLogger.createSimpleLogger(opts); + + +module.exports = log diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..489486b --- /dev/null +++ b/src/main.js @@ -0,0 +1,12 @@ +let logger = require('./log'); +let mqtt = require('./mqttHandler'); + + +logger.info("Hello world!"); + +require('./item1'); + +let genericItemClass = require('./genericItem'); +let item2 = new genericItemClass(2); + +mqtt.start(); diff --git a/src/mqttHandler.js b/src/mqttHandler.js new file mode 100644 index 0000000..873096a --- /dev/null +++ b/src/mqttHandler.js @@ -0,0 +1,59 @@ +let logger = require('./log') + +logger.info('mqttHandler executed') + + +var mqtt = require('mqtt'); + +var client = undefined; +var topicCallbacks = {}; + + +function start() { + client = mqtt.connect('mqtt://172.16.2.16'); + + client.on('error', (err) => { + logger.error(`Error in mqttHandler: ${err}`) + }); + client.on('connect', () => { + client.publish('dispatcher_ng/status', 'dispatcher_ng running'); + client.subscribe('dispatcher_ng/cmd'); + Object.keys(topicCallbacks).forEach((topic) => { + client.subscribe(topic); + logger.info(`${topic} subscribed`); + }); + logger.info('mqtt connection established'); + }); + client.on('message', (topic, payload) => { + logger.info(`message received on topic ${topic}: ${payload}`); + if (topic in topicCallbacks) { + topicCallbacks[topic].forEach((cb) => { cb(topic, payload) }); + } + }); +} + +function send(topic, payload) { + client.publish(topic, payload); +} + +function register(topics, cb) { + if (! (topics instanceof Array)) { + topics = [ topics ]; + } + topics.forEach((topic) => { + if (topic in topicCallbacks) { + topicCallbacks[topic].push(cb); + logger.info(`additional callback registered for ${topic}`); + } else { + topicCallbacks[topic] = [ cb ]; + logger.info(`first callback registered for ${topic}`); + } + }) +} + +module.exports = { + start, + send, + register +}; +