diff --git a/lib/extension/publish.js b/lib/extension/publish.js index ed31f8411..93f8fc449 100644 --- a/lib/extension/publish.js +++ b/lib/extension/publish.js @@ -143,7 +143,7 @@ class EntityPublish extends Extension { entries.sort((a, b) => (['state', 'brightness', 'brightness_percent'].includes(a[0]) ? sorter : sorter * -1)); // For each attribute call the corresponding converter - const usedConverters = []; + const usedConverters = {}; for (let [key, value] of entries) { let endpointName = topic.endpointName; let actualTarget = target; @@ -160,9 +160,11 @@ class EntityPublish extends Extension { } } + const endpointOrGroupID = actualTarget.constructor.name == 'Group' ? actualTarget.groupID : actualTarget.ID; + if (!usedConverters.hasOwnProperty(endpointOrGroupID)) usedConverters[endpointOrGroupID] = []; const converter = converters.find((c) => c.key.includes(key)); - if (usedConverters.includes(converter)) { + if (usedConverters[endpointOrGroupID].includes(converter)) { // Use a converter only once (e.g. light_onoff_brightness converters can convert state and brightness) continue; } @@ -238,7 +240,7 @@ class EntityPublish extends Extension { } } - usedConverters.push(converter); + usedConverters[endpointOrGroupID].push(converter); } return true; diff --git a/test/publish.test.js b/test/publish.test.js index 1172724a4..48c12ecce 100644 --- a/test/publish.test.js +++ b/test/publish.test.js @@ -414,6 +414,18 @@ describe('Publish', () => { expect(endpoint.read).toHaveBeenCalledWith('genOnOff', ['onOff']); }); + it('Should handle get with multiple endpoints', async () => { + const device = zigbeeHerdsman.devices.QBKG03LM; + const endpoint2 = device.getEndpoint(2); + const endpoint3 = device.getEndpoint(3); + await MQTT.events.message('zigbee2mqtt/0x0017880104e45542/get', JSON.stringify({state_left: '', state_right: ''})); + await flushPromises(); + expect(endpoint2.read).toHaveBeenCalledTimes(1); + expect(endpoint2.read).toHaveBeenCalledWith('genOnOff', ['onOff']); + expect(endpoint3.read).toHaveBeenCalledTimes(1); + expect(endpoint3.read).toHaveBeenCalledWith('genOnOff', ['onOff']); + }); + it('Should not respond to bridge/config/devices/get', async () => { await MQTT.events.message('zigbee2mqtt/bridge/config/devices/get', JSON.stringify({state: 'ON'})); await flushPromises();