diff --git a/lib/controller.js b/lib/controller.js index 2a098d4e6..6ae8df9a6 100644 --- a/lib/controller.js +++ b/lib/controller.js @@ -15,7 +15,7 @@ const ExtensionSoftReset = require('./extension/softReset'); const ExtensionHomeAssistant = require('./extension/homeassistant'); const ExtensionDeviceConfigure = require('./extension/deviceConfigure'); const ExtensionDeviceGroupMembership = require('./extension/deviceGroupMembership'); -const ExtensionBridgeConfig = require('./extension/bridgeConfig'); +const ExtensionBridgeLegacy = require('./extension/bridgeLegacy'); const ExtensionGroups = require('./extension/groups'); const ExtensionDeviceAvailability = require('./extension/deviceAvailability'); const ExtensionDeviceBind = require('./extension/deviceBind'); @@ -34,44 +34,39 @@ class Controller { this.onZigbeeAdapterDisconnected = this.onZigbeeAdapterDisconnected.bind(this); // Initialize extensions. + const args = [this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus]; this.extensions = [ - new ExtensionEntityPublish(this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus), - new ExtensionDeviceReceive(this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus), - new ExtensionDeviceGroupMembership( - this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus, - ), - new ExtensionDeviceConfigure(this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus), - new ExtensionNetworkMap(this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus), - new ExtensionBridgeConfig(this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus), - new ExtensionGroups(this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus), - new ExtensionDeviceBind(this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus), - new ExtensionDeviceEvent(this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus), - new ExtensionOTAUpdate(this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus), + new ExtensionEntityPublish(...args), + new ExtensionDeviceReceive(...args), + new ExtensionDeviceGroupMembership(...args), + new ExtensionDeviceConfigure(...args), + new ExtensionNetworkMap(...args), + new ExtensionGroups(...args), + new ExtensionDeviceBind(...args), + new ExtensionDeviceEvent(...args), + new ExtensionOTAUpdate(...args), ]; + /* istanbul ignore else */ + if (settings.get().advanced.legacy_api) { + this.extensions.push(new ExtensionBridgeLegacy(...args)); + } + if (settings.get().advanced.report) { - this.extensions.push(new ExtensionDeviceReport( - this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus, - )); + this.extensions.push(new ExtensionDeviceReport(...args)); } if (settings.get().homeassistant) { - this.extensions.push(new ExtensionHomeAssistant( - this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus, - )); + this.extensions.push(new ExtensionHomeAssistant(...args)); } /* istanbul ignore next */ if (settings.get().advanced.soft_reset_timeout !== 0) { - this.extensions.push(new ExtensionSoftReset( - this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus, - )); + this.extensions.push(new ExtensionSoftReset(...args)); } if (settings.get().advanced.availability_timeout) { - this.extensions.push(new ExtensionDeviceAvailability( - this.zigbee, this.mqtt, this.state, this.publishEntityState, this.eventBus, - )); + this.extensions.push(new ExtensionDeviceAvailability(...args)); } } @@ -193,7 +188,6 @@ class Controller { ); } else if (type === 'deviceJoined') { logger.info(`Device '${name}' joined`); - this.mqtt.log('device_connected', {friendly_name: name}); } else if (type === 'deviceInterview') { if (data.status === 'successful') { logger.info(`Successfully interviewed '${name}', device has successfully been paired`); @@ -203,34 +197,26 @@ class Controller { logger.info( `Device '${name}' is supported, identified as: ${vendor} ${description} (${model})`, ); - - const log = {friendly_name: name, model, vendor, description, supported: true}; - this.mqtt.log('pairing', 'interview_successful', log); } else { logger.warn( `Device '${name}' with Zigbee model '${data.device.modelID}' is NOT supported, ` + `please follow https://www.zigbee2mqtt.io/how_tos/how_to_support_new_devices.html`, ); - this.mqtt.log('pairing', 'interview_successful', {friendly_name: name, supported: false}); } } else if (data.status === 'failed') { logger.error(`Failed to interview '${name}', device has not successfully been paired`); - this.mqtt.log('pairing', 'interview_failed', {friendly_name: name}); } else { /* istanbul ignore else */ if (data.status === 'started') { logger.info(`Starting interview of '${name}'`); - this.mqtt.log('pairing', 'interview_started', {friendly_name: name}); } } } else if (type === 'deviceAnnounce') { logger.debug(`Device '${name}' announced itself`); - this.mqtt.log('device_announced', 'announce', {friendly_name: name}); } else { /* istanbul ignore else */ if (type === 'deviceLeave') { logger.warn(`Device '${name || data.ieeeAddr}' left the network`); - this.mqtt.log('device_removed', 'left_network', {friendly_name: name || data.ieeeAddr}); } } diff --git a/lib/extension/bridgeConfig.js b/lib/extension/bridgeLegacy.js similarity index 89% rename from lib/extension/bridgeConfig.js rename to lib/extension/bridgeLegacy.js index 0cbf71a23..2230f5d73 100644 --- a/lib/extension/bridgeConfig.js +++ b/lib/extension/bridgeLegacy.js @@ -9,7 +9,7 @@ const configRegex = new RegExp(`${settings.get().mqtt.base_topic}/bridge/config/((?:\\w+/get)|(?:\\w+/factory_reset)|(?:\\w+))`); const allowedLogLevels = ['error', 'warn', 'info', 'debug']; -class BridgeConfig extends BaseExtension { +class BridgeLegacy extends BaseExtension { constructor(zigbee, mqtt, state, publishEntityState, eventBus) { super(zigbee, mqtt, state, publishEntityState, eventBus); @@ -372,6 +372,37 @@ class BridgeConfig extends BaseExtension { if (type === 'deviceJoined') { this.lastJoinedDeviceName = settingsDevice.friendlyName; } + + const entity = this.zigbee.resolveEntity(data.device || data.ieeeAddr); + const name = entity && entity.settings ? entity.settings.friendlyName : null; + + if (type === 'deviceJoined') { + this.mqtt.log('device_connected', {friendly_name: name}); + } else if (type === 'deviceInterview') { + if (data.status === 'successful') { + if (entity.mapped) { + const {vendor, description, model} = entity.mapped; + const log = {friendly_name: name, model, vendor, description, supported: true}; + this.mqtt.log('pairing', 'interview_successful', log); + } else { + this.mqtt.log('pairing', 'interview_successful', {friendly_name: name, supported: false}); + } + } else if (data.status === 'failed') { + this.mqtt.log('pairing', 'interview_failed', {friendly_name: name}); + } else { + /* istanbul ignore else */ + if (data.status === 'started') { + this.mqtt.log('pairing', 'interview_started', {friendly_name: name}); + } + } + } else if (type === 'deviceAnnounce') { + this.mqtt.log('device_announced', 'announce', {friendly_name: name}); + } else { + /* istanbul ignore else */ + if (type === 'deviceLeave') { + this.mqtt.log('device_removed', 'left_network', {friendly_name: name || data.ieeeAddr}); + } + } } async touchlinkFactoryReset() { @@ -389,4 +420,4 @@ class BridgeConfig extends BaseExtension { } } -module.exports = BridgeConfig; +module.exports = BridgeLegacy; diff --git a/lib/util/settings.js b/lib/util/settings.js index 9ff26b33c..b74fdad61 100644 --- a/lib/util/settings.js +++ b/lib/util/settings.js @@ -43,6 +43,7 @@ const defaults = { output: 'json', }, advanced: { + legacy_api: true, log_rotation: true, log_output: ['console', 'file'], log_directory: path.join(data.getPath(), 'log', '%TIMESTAMP%'), @@ -164,6 +165,7 @@ const schema = { advanced: { type: 'object', properties: { + legacy_api: {type: 'boolean'}, pan_id: {type: 'number'}, ext_pan_id: {type: 'array', items: {type: 'number'}}, channel: {type: 'number', minimum: 11, maximum: 26}, diff --git a/test/bridgeConfig.test.js b/test/bridgeLegacy.test.js similarity index 99% rename from test/bridgeConfig.test.js rename to test/bridgeLegacy.test.js index 3650e22bc..d405d903e 100644 --- a/test/bridgeConfig.test.js +++ b/test/bridgeLegacy.test.js @@ -9,7 +9,7 @@ const Controller = require('../lib/controller'); const flushPromises = () => new Promise(setImmediate); -describe('Bridge config', () => { +describe('Bridge legacy', () => { let controller; beforeAll(async () => {