From 67151fba04729f1cda5e145bd5c8108192572c6e Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Wed, 15 Apr 2020 20:36:40 +0200 Subject: [PATCH] Refactor bind --- lib/controller.js | 4 +- lib/extension/{deviceBind.js => bind.js} | 55 ++++++++++++++--------- test/{deviceBind.test.js => bind.test.js} | 2 +- 3 files changed, 38 insertions(+), 23 deletions(-) rename lib/extension/{deviceBind.js => bind.js} (72%) rename test/{deviceBind.test.js => bind.test.js} (99%) diff --git a/lib/controller.js b/lib/controller.js index 49645377..b12ac55d 100644 --- a/lib/controller.js +++ b/lib/controller.js @@ -18,7 +18,7 @@ const ExtensionDeviceGroupMembership = require('./extension/legacy/deviceGroupMe const ExtensionBridgeLegacy = require('./extension/legacy/bridgeLegacy'); const ExtensionGroups = require('./extension/groups'); const ExtensionAvailability = require('./extension/availability'); -const ExtensionDeviceBind = require('./extension/deviceBind'); +const ExtensionBind = require('./extension/bind'); const ExtensionReport = require('./extension/report'); const ExtensionOnEvent = require('./extension/onEvent'); const ExtensionOTAUpdate = require('./extension/otaUpdate'); @@ -42,7 +42,7 @@ class Controller { new ExtensionConfigure(...args), new ExtensionNetworkMap(...args), new ExtensionGroups(...args), - new ExtensionDeviceBind(...args), + new ExtensionBind(...args), new ExtensionOnEvent(...args), new ExtensionOTAUpdate(...args), ]; diff --git a/lib/extension/deviceBind.js b/lib/extension/bind.js similarity index 72% rename from lib/extension/deviceBind.js rename to lib/extension/bind.js index a3beb5ce..9ed55b8a 100644 --- a/lib/extension/deviceBind.js +++ b/lib/extension/bind.js @@ -1,7 +1,7 @@ const settings = require('../util/settings'); const logger = require('../util/logger'); const assert = require('assert'); -const topicRegex = new RegExp(`^${settings.get().mqtt.base_topic}/bridge/(bind|unbind)/.+$`); +const legacyTopicRegex = new RegExp(`^${settings.get().mqtt.base_topic}/bridge/(bind|unbind)/.+$`); const Extension = require('./extension'); const clusters = ['genScenes', 'genOnOff', 'genLevelCtrl', 'lightingColorCtrl', 'closuresWindowCovering']; @@ -9,22 +9,38 @@ const clusters = ['genScenes', 'genOnOff', 'genLevelCtrl', 'lightingColorCtrl', // See zigbee-herdsman-converters devices.js const defaultBindGroup = {type: 'group_number', ID: 901}; -class DeviceBind extends Extension { +class Bind extends Extension { + constructor(zigbee, mqtt, state, publishEntityState, eventBus) { + super(zigbee, mqtt, state, publishEntityState, eventBus); + this.legacyApi = settings.get().advanced.legacy_api; + } + onMQTTConnected() { - this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/bind/#`); - this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/unbind/#`); + /* istanbul ignore else */ + if (this.legacyApi) { + this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/bind/#`); + this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/unbind/#`); + } + } + + parseMQTTMessage(topic, message) { + let type = null; + let sourceKey = null; + let targetKey = null; + + if (this.legacyApi && topic.match(legacyTopicRegex)) { + topic = topic.replace(`${settings.get().mqtt.base_topic}/bridge/`, ''); + type = topic.split('/')[0]; + sourceKey = topic.replace(`${type}/`, ''); + targetKey = message; + } + + return {type, sourceKey, targetKey}; } async onMQTTMessage(topic, message) { - if (!topic.match(topicRegex)) { - return null; - } - - // Parse topic, retrieve type (bind or unbind) and source - topic = topic.replace(`${settings.get().mqtt.base_topic}/bridge/`, ''); - const type = topic.split('/')[0]; - const sourceKey = topic.replace(`${type}/`, ''); - const targetKey = message; + const {type, sourceKey, targetKey} = this.parseMQTTMessage(topic, message); + if (!type) return null; // Find source; can only be a device and target const source = this.zigbee.resolveEntity(sourceKey); @@ -64,10 +80,10 @@ class DeviceBind extends Extension { /* istanbul ignore else */ if (settings.get().advanced.legacy_api) { - const message = {from: sourceName, to: targetName, cluster}; this.mqtt.publish( 'bridge/log', - JSON.stringify({type: `device_${type}`, message}), + JSON.stringify({type: `device_${type}`, + message: {from: sourceName, to: targetName, cluster}}), ); } } catch (error) { @@ -78,10 +94,10 @@ class DeviceBind extends Extension { /* istanbul ignore else */ if (settings.get().advanced.legacy_api) { - const message = {from: sourceName, to: targetName, cluster}; this.mqtt.publish( 'bridge/log', - JSON.stringify({type: `device_${type}_failed`, message}), + JSON.stringify({type: `device_${type}_failed`, + message: {from: sourceName, to: targetName, cluster}}), ); } } @@ -93,14 +109,13 @@ class DeviceBind extends Extension { /* istanbul ignore else */ if (settings.get().advanced.legacy_api) { - const message = {from: sourceName, to: targetName}; this.mqtt.publish( 'bridge/log', - JSON.stringify({type: `device_${type}_failed`, message}), + JSON.stringify({type: `device_${type}_failed`, message: {from: sourceName, to: targetName}}), ); } } } } -module.exports = DeviceBind; +module.exports = Bind; diff --git a/test/deviceBind.test.js b/test/bind.test.js similarity index 99% rename from test/deviceBind.test.js rename to test/bind.test.js index 047d18ab..9386b5d5 100644 --- a/test/deviceBind.test.js +++ b/test/bind.test.js @@ -6,7 +6,7 @@ const settings = require('../lib/util/settings'); const Controller = require('../lib/controller'); const flushPromises = () => new Promise(setImmediate); -describe('Device bind', () => { +describe('Bind', () => { let controller; mockClear = (device) => {