diff --git a/lib/extension/otaUpdate.js b/lib/extension/otaUpdate.js index 92978d48d..3c19c0fb5 100644 --- a/lib/extension/otaUpdate.js +++ b/lib/extension/otaUpdate.js @@ -30,6 +30,12 @@ class OTAUpdate extends BaseExtension { this.lastChecked[data.device.ieeeAddr] = Date.now(); const available = await mappedDevice.ota.isUpdateAvailable(data.device, logger, data.data); this.publishEntityState(data.device.ieeeAddr, {update_available: available}); + + if (available) { + const message = `Update available for '${settingsDevice.friendly_name}'`; + logger.info(message); + this.mqtt.log('ota_update', message, {status: 'available', device: settingsDevice.friendly_name}); + } } async readSoftwareBuildIDAndDateCode(device, update) { diff --git a/test/otaUpdate.test.js b/test/otaUpdate.test.js index ad7ea1655..7595040f7 100644 --- a/test/otaUpdate.test.js +++ b/test/otaUpdate.test.js @@ -167,15 +167,26 @@ describe('OTA update', () => { const data = {imageType: 12382}; const mapped = zigbeeHerdsmanConverters.findByZigbeeModel(device.modelID) mockClear(mapped); + mapped.ota.isUpdateAvailable.mockReturnValueOnce(true); const payload = {data, cluster: 'genOta', device, endpoint: device.getEndpoint(1), type: 'commandQueryNextImageRequest', linkquality: 10}; + logger.info.mockClear(); await zigbeeHerdsman.events.message(payload); await flushPromises(); expect(mapped.ota.isUpdateAvailable).toHaveBeenCalledTimes(1); expect(mapped.ota.isUpdateAvailable).toHaveBeenCalledWith(device, logger, {"imageType": 12382}); + expect(logger.info).toHaveBeenCalledWith(`Update available for 'bulb'`) // Should not request again when device asks again after a short time await zigbeeHerdsman.events.message(payload); await flushPromises(); expect(mapped.ota.isUpdateAvailable).toHaveBeenCalledTimes(1); + + const extension = controller.extensions.find((e) => e.constructor.name === 'OTAUpdate'); + extension.lastChecked = {}; + logger.info.mockClear(); + mapped.ota.isUpdateAvailable.mockReturnValueOnce(false); + await zigbeeHerdsman.events.message(payload); + await flushPromises(); + expect(logger.info).not.toHaveBeenCalledWith(`Update available for 'bulb'`) }); });