diff --git a/lib/eventBus.ts b/lib/eventBus.ts index afa965b86..f38c9fcca 100644 --- a/lib/eventBus.ts +++ b/lib/eventBus.ts @@ -133,11 +133,11 @@ export default class EventBus { this.on('scenesChanged', callback, key); } - public emitReportingDisabled(data: eventdata.ReportingDisabled): void { - this.emitter.emit('reportingDisabled', data); + public emitReconfigure(data: eventdata.Reconfigure): void { + this.emitter.emit('reconfigure', data); } - public onReportingDisabled(key: ListenerKey, callback: (data: eventdata.ReportingDisabled) => void): void { - this.on('reportingDisabled', callback, key); + public onReconfigure(key: ListenerKey, callback: (data: eventdata.Reconfigure) => void): void { + this.on('reconfigure', callback, key); } public emitStateChange(data: eventdata.StateChange): void { diff --git a/lib/extension/bind.ts b/lib/extension/bind.ts index d95cea173..a94341df0 100755 --- a/lib/extension/bind.ts +++ b/lib/extension/bind.ts @@ -417,7 +417,7 @@ export default class Bind extends Extension { } } - this.eventBus.emitReportingDisabled({device}); + this.eventBus.emitReconfigure({device}); } } diff --git a/lib/extension/configure.ts b/lib/extension/configure.ts index ec4f4e3c5..fe2cd5822 100644 --- a/lib/extension/configure.ts +++ b/lib/extension/configure.ts @@ -16,7 +16,7 @@ export default class Configure extends Extension { private topic = `${settings.get().mqtt.base_topic}/bridge/request/device/configure`; private legacyTopic = `${settings.get().mqtt.base_topic}/bridge/configure`; - @bind private async onReportingDisabled(data: eventdata.ReportingDisabled): Promise { + @bind private async onReconfigure(data: eventdata.Reconfigure): Promise { // Disabling reporting unbinds some cluster which could be bound by configure, re-setup. if (data.device.zh.meta?.hasOwnProperty('configured')) { delete data.device.zh.meta.configured; @@ -79,7 +79,7 @@ export default class Configure extends Extension { this.eventBus.onDeviceInterview(this, (data) => this.configure(data.device, 'zigbee_event')); this.eventBus.onLastSeenChanged(this, (data) => this.configure(data.device, 'zigbee_event')); this.eventBus.onMQTTMessage(this, this.onMQTTMessage); - this.eventBus.onReportingDisabled(this, this.onReportingDisabled); + this.eventBus.onReconfigure(this, this.onReconfigure); } private async configure(device: Device, event: 'started' | 'zigbee_event' | 'reporting_disabled' | 'mqtt_message', diff --git a/lib/extension/legacy/report.ts b/lib/extension/legacy/report.ts index 6f2550639..863e8a5b6 100644 --- a/lib/extension/legacy/report.ts +++ b/lib/extension/legacy/report.ts @@ -116,7 +116,7 @@ export default class Report extends Extension { device.zh.meta.reporting = reportKey; } else { delete device.zh.meta.reporting; - this.eventBus.emitReportingDisabled({device}); + this.eventBus.emitReconfigure({device}); } this.eventBus.emitDevicesChanged(); diff --git a/lib/extension/otaUpdate.ts b/lib/extension/otaUpdate.ts index 4b9e4b11a..2281d4a11 100644 --- a/lib/extension/otaUpdate.ts +++ b/lib/extension/otaUpdate.ts @@ -92,11 +92,11 @@ export default class OTAUpdate extends Extension { } } - private async readSoftwareBuildIDAndDateCode(device: Device, update: boolean): + private async readSoftwareBuildIDAndDateCode(device: Device, update: boolean, sendWhenActive: boolean): Promise<{softwareBuildID: string, dateCode: string}> { try { const endpoint = device.zh.endpoints.find((e) => e.supportsInputCluster('genBasic')); - const result = await endpoint.read('genBasic', ['dateCode', 'swBuildId']); + const result = await endpoint.read('genBasic', ['dateCode', 'swBuildId'], {sendWhenActive}); if (update) { device.zh.softwareBuildID = result.swBuildId; @@ -230,10 +230,11 @@ export default class OTAUpdate extends Extension { } }; - const from_ = await this.readSoftwareBuildIDAndDateCode(device, false); + const from_ = await this.readSoftwareBuildIDAndDateCode(device, false, false); await device.definition.ota.updateToLatest(device.zh, logger, onProgress); - const to = await this.readSoftwareBuildIDAndDateCode(device, true); + const to = await this.readSoftwareBuildIDAndDateCode(device, true, device.zh.type === 'EndDevice'); const [fromS, toS] = [stringify(from_), stringify(to)]; + this.eventBus.emitReconfigure({device}); const msg = `Finished update of '${device.name}'` + (to ? `, from '${fromS}' to '${toS}'` : ``); logger.info(msg); diff --git a/lib/types/types.d.ts b/lib/types/types.d.ts index fb16f25f1..2a973565f 100644 --- a/lib/types/types.d.ts +++ b/lib/types/types.d.ts @@ -142,7 +142,7 @@ declare global { type DeviceAnnounce = { device: Device }; type DeviceInterview = { device: Device, status: 'started' | 'successful' | 'failed' }; type DeviceJoined = { device: Device }; - type ReportingDisabled = { device: Device }; + type Reconfigure = { device: Device }; type DeviceLeave = { ieeeAddr: string, name: string }; type GroupMembersChanged = {group: Group, action: 'remove' | 'add' | 'remove_all', endpoint: zh.Endpoint, skipDisableReporting: boolean }; diff --git a/test/configure.test.js b/test/configure.test.js index 98088d5e2..2e7ef95b8 100644 --- a/test/configure.test.js +++ b/test/configure.test.js @@ -100,12 +100,12 @@ describe('Configure', () => { expectBulbConfigured(); }); - it('Should reconfigure reporting on reportingDisabled event', async () => { + it('Should reconfigure reporting on reconfigure event', async () => { expectBulbConfigured(); const device = controller.zigbee.resolveEntity(zigbeeHerdsman.devices.bulb); mockClear(device.zh); expectBulbNotConfigured(); - controller.eventBus.emitReportingDisabled({device}); + controller.eventBus.emitReconfigure({device}); await flushPromises(); expectBulbConfigured(); }); diff --git a/test/otaUpdate.test.js b/test/otaUpdate.test.js index 4da146ac4..082ba05fe 100644 --- a/test/otaUpdate.test.js +++ b/test/otaUpdate.test.js @@ -71,7 +71,7 @@ describe('OTA update', () => { expect(logger.info).toHaveBeenCalledWith(`Update of 'bulb' at 0.00%`); expect(logger.info).toHaveBeenCalledWith(`Update of 'bulb' at 10.00%, ≈ 60 minutes remaining`); expect(logger.info).toHaveBeenCalledWith(`Finished update of 'bulb', from '{"dateCode":"20190101","softwareBuildID":1}' to '{"dateCode":"20190102","softwareBuildID":2}'`); - expect(device.save).toHaveBeenCalledTimes(1); + expect(device.save).toHaveBeenCalledTimes(3); expect(device.dateCode).toBe('20190102'); expect(device.softwareBuildID).toBe(2); expect(MQTT.publish).toHaveBeenCalledWith( @@ -372,7 +372,7 @@ describe('OTA update', () => { expect(logger.info).toHaveBeenCalledWith(`Update of 'bulb' at 10.00%, ≈ 60 minutes remaining`); expect(logger.info).toHaveBeenCalledWith(`Finished update of 'bulb', from '{"dateCode":"20190101","softwareBuildID":1}' to '{"dateCode":"20190102","softwareBuildID":2}'`); expect(logger.error).toHaveBeenCalledTimes(0); - expect(device.save).toHaveBeenCalledTimes(1); + expect(device.save).toHaveBeenCalledTimes(3); expect(device.dateCode).toBe('20190102'); expect(device.softwareBuildID).toBe(2); });