Don't crash when devices doesn't respond to read modelID after update. https://github.com/Koenkk/zigbee2mqtt/issues/2921

This commit is contained in:
Koen Kanters
2020-02-13 21:10:44 +01:00
parent 984bad4cb3
commit 87faaa1817
2 changed files with 31 additions and 9 deletions
+13 -9
View File
@@ -16,16 +16,20 @@ class OTAUpdate extends BaseExtension {
}
async readSoftwareBuildIDAndDateCode(device, update) {
const endpoint = device.endpoints.find((e) => e.supportsInputCluster('genBasic'));
const result = await endpoint.read('genBasic', ['dateCode', 'swBuildId']);
try {
const endpoint = device.endpoints.find((e) => e.supportsInputCluster('genBasic'));
const result = await endpoint.read('genBasic', ['dateCode', 'swBuildId']);
if (update) {
device.softwareBuildID = result.swBuildId;
device.dateCode = result.dateCode;
device.save();
if (update) {
device.softwareBuildID = result.swBuildId;
device.dateCode = result.dateCode;
device.save();
}
return {softwareBuildID: result.swBuildId, dateCode: result.dateCode};
} catch (e) {
return null;
}
return {softwareBuildID: result.swBuildId, dateCode: result.dateCode};
}
async onMQTTMessage(topic, message) {
@@ -74,7 +78,7 @@ class OTAUpdate extends BaseExtension {
await device.mapped.ota.updateToLatest(device.device, logger, onProgress);
const to = await this.readSoftwareBuildIDAndDateCode(device.device, true);
const [fromS, toS] = [JSON.stringify(from_), JSON.stringify(to)];
logger.info(`Finished update of '${device.name}', from '${fromS}' to '${toS}'`);
logger.info(`Finished update of '${device.name}'` + (to ? `, from '${fromS}' to '${toS}'` : ``));
} catch (error) {
logger.error(`Update of '${device.name}' failed (${error.message})`);
}
+18
View File
@@ -143,4 +143,22 @@ describe('OTA update', () => {
jest.runAllTimers();
await flushPromises();
});
it('Shouldnt crash when read modelID after OTA update fails', async () => {
const device = zigbeeHerdsman.devices.bulb;
const endpoint = device.endpoints[0];
let count = 0;
endpoint.read.mockImplementation(() => {
if (count === 1) throw new Error('Failed!')
count++;
return {swBuildId: 1, dateCode: '2019010'}
});
const mapped = zigbeeHerdsmanConverters.findByZigbeeModel(device.modelID)
mockClear(mapped);
logger.info.mockClear();
MQTT.events.message('zigbee2mqtt/bridge/ota_update/update', 'bulb');
await flushPromises();
expect(logger.info).toHaveBeenCalledWith(`Finished update of 'bulb'`);
});
});