diff --git a/lib/extension/deviceBind.js b/lib/extension/deviceBind.js index 4506c52d1..50dc4ce4a 100644 --- a/lib/extension/deviceBind.js +++ b/lib/extension/deviceBind.js @@ -8,10 +8,10 @@ const clusters = ['genScenes', 'genOnOff', 'genLevelCtrl', 'lightingColorCtrl']; class DeviceBind extends BaseExtension { onMQTTConnected() { - this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/bind/+`); - this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/bind/+/+`); - this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/unbind/+`); - this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/unbind/+/+`); + for (let step = 1; step < 20; step++) { + this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/bind${'/+'.repeat(step)}`); + this.mqtt.subscribe(`${settings.get().mqtt.base_topic}/bridge/unbind${'/+'.repeat(step)}`); + } } async onMQTTMessage(topic, message) { diff --git a/test/deviceBind.test.js b/test/deviceBind.test.js index de6be232c..b450b7b9b 100644 --- a/test/deviceBind.test.js +++ b/test/deviceBind.test.js @@ -29,6 +29,13 @@ describe('Device bind', () => { MQTT.publish.mockClear(); }); + it('Should subscribe to nested topics', async () => { + expect(MQTT.subscribe).toHaveBeenCalledWith('zigbee2mqtt/bridge/bind/+'); + expect(MQTT.subscribe).toHaveBeenCalledWith('zigbee2mqtt/bridge/bind/+/+'); + expect(MQTT.subscribe).toHaveBeenCalledWith('zigbee2mqtt/bridge/bind/+/+/+'); + expect(MQTT.subscribe).toHaveBeenCalledWith('zigbee2mqtt/bridge/bind/+/+/+/+/+'); + }); + it('Should bind', async () => { const device = zigbeeHerdsman.devices.remote; const target = zigbeeHerdsman.devices.bulb_color.getEndpoint(1);