From 00c2894bb41fa13462beca08ed7dd6fb8120d817 Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Tue, 9 Mar 2021 19:50:05 +0100 Subject: [PATCH] Reread settings on restart. https://github.com/Koenkk/zigbee2mqtt/discussions/6628 --- index.js | 1 + lib/util/settings.js | 8 ++++---- test/availability.test.js | 2 +- test/bind.test.js | 2 +- test/bridge.test.js | 2 +- test/configure.test.js | 2 +- test/controller.test.js | 2 +- test/externalConverters.test.js | 2 +- test/externalExtension.test.js | 2 +- test/frontend.test.js | 2 +- test/group.test.js | 2 +- test/homeassistant.test.js | 2 +- test/legacy/bridgeLegacy.test.js | 2 +- test/legacy/report.test.js | 2 +- test/logger.test.js | 2 +- test/networkMap.test.js | 2 +- test/onEvent.test.js | 2 +- test/otaUpdate.test.js | 2 +- test/publish.test.js | 2 +- test/receive.test.js | 2 +- test/settings.test.js | 32 ++++++++++++++++---------------- 21 files changed, 39 insertions(+), 38 deletions(-) diff --git a/index.js b/index.js index 64ec75724..19bcd3da3 100644 --- a/index.js +++ b/index.js @@ -24,6 +24,7 @@ async function start() { // Validate settings const settings = require('./lib/util/settings'); + settings.reRead(); const errors = settings.validate(); if (errors.length > 0) { console.log(`\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`); diff --git a/lib/util/settings.js b/lib/util/settings.js index ac34a4a10..7842329a8 100644 --- a/lib/util/settings.js +++ b/lib/util/settings.js @@ -683,15 +683,15 @@ module.exports = { changeEntityOptions, changeFriendlyName, schema, - - // For tests only - _write: write, - _reRead: () => { + reRead: () => { _settings = null; get(); _settingsWithDefaults = null; getWithDefaults(); }, + + // For tests only + _write: write, _clear: () => { _settings = null; _settingsWithDefaults = null; diff --git a/test/availability.test.js b/test/availability.test.js index 23e3acc32..bc53f58da 100644 --- a/test/availability.test.js +++ b/test/availability.test.js @@ -25,7 +25,7 @@ describe('Availability', () => { beforeEach(async () => { data.writeDefaultConfiguration(); - settings._reRead(); + settings.reRead(); data.writeEmptyState(); jest.useFakeTimers(); settings.set(['advanced', 'availability_timeout'], 10); diff --git a/test/bind.test.js b/test/bind.test.js index 9323ffc57..4c1e6079d 100644 --- a/test/bind.test.js +++ b/test/bind.test.js @@ -25,7 +25,7 @@ describe('Bind', () => { beforeEach(async () => { data.writeDefaultConfiguration(); - settings._reRead(); + settings.reRead(); data.writeEmptyState(); zigbeeHerdsman.groups.group_1.members = []; zigbeeHerdsman.devices.bulb_color.getEndpoint(1).configureReporting.mockClear(); diff --git a/test/bridge.test.js b/test/bridge.test.js index 5720598df..c61dc2853 100644 --- a/test/bridge.test.js +++ b/test/bridge.test.js @@ -22,7 +22,7 @@ describe('Bridge', () => { beforeEach(async () => { MQTT.mock.reconnecting = false; data.writeDefaultConfiguration(); - settings._reRead(); + settings.reRead(); settings.set(['advanced', 'legacy_api'], false); data.writeDefaultState(); logger.info.mockClear(); diff --git a/test/configure.test.js b/test/configure.test.js index 9119e1ccf..038c02953 100644 --- a/test/configure.test.js +++ b/test/configure.test.js @@ -44,7 +44,7 @@ describe('Configure', () => { beforeEach(async () => { jest.useRealTimers(); data.writeDefaultConfiguration(); - settings._reRead(); + settings.reRead(); data.writeEmptyState(); controller = new Controller(jest.fn(), jest.fn()); await controller.start(); diff --git a/test/controller.test.js b/test/controller.test.js index 57cd02e91..785368f38 100644 --- a/test/controller.test.js +++ b/test/controller.test.js @@ -26,7 +26,7 @@ describe('Controller', () => { controller = new Controller(jest.fn(), mockExit); mocksClear.forEach((m) => m.mockClear()); data.writeDefaultConfiguration(); - settings._reRead(); + settings.reRead(); data.writeDefaultState(); }); diff --git a/test/externalConverters.test.js b/test/externalConverters.test.js index 8ab6a582d..8d96344c2 100644 --- a/test/externalConverters.test.js +++ b/test/externalConverters.test.js @@ -47,7 +47,7 @@ describe('Loads external converters', () => { mocksClear.forEach((m) => m.mockClear()); data.writeDefaultConfiguration(); data.writeEmptyState(); - settings._reRead(); + settings.reRead(); }); it('Does not load external converters', async () => { diff --git a/test/externalExtension.test.js b/test/externalExtension.test.js index 92a49b432..ee9ff4a89 100644 --- a/test/externalExtension.test.js +++ b/test/externalExtension.test.js @@ -28,7 +28,7 @@ describe('User extensions', () => { controller = new Controller(jest.fn(), mockExit); mocksClear.forEach((m) => m.mockClear()); data.writeDefaultConfiguration(); - settings._reRead(); + settings.reRead(); data.writeDefaultState(); }); afterEach(() => { diff --git a/test/frontend.test.js b/test/frontend.test.js index 8b58da715..6f5c63577 100644 --- a/test/frontend.test.js +++ b/test/frontend.test.js @@ -74,7 +74,7 @@ describe('Frontend', () => { mockWS.implementation.clients = []; data.writeDefaultConfiguration(); data.writeDefaultState(); - settings._reRead(); + settings.reRead(); settings.set(['frontend'], {port: 8081, host: "127.0.0.1"}); settings.set(['homeassistant'], true); zigbeeHerdsman.devices.bulb.linkquality = 10; diff --git a/test/group.test.js b/test/group.test.js index cbeb804ad..c122a5263 100644 --- a/test/group.test.js +++ b/test/group.test.js @@ -23,7 +23,7 @@ describe('Groups', () => { controller = new Controller(jest.fn(), jest.fn()); Object.values(zigbeeHerdsman.groups).forEach((g) => g.members = []); data.writeDefaultConfiguration(); - settings._reRead(); + settings.reRead(); MQTT.publish.mockClear(); zigbeeHerdsmanConverters.toZigbeeConverters.__clearStore__(); }) diff --git a/test/homeassistant.test.js b/test/homeassistant.test.js index f521444e2..33f1a2a65 100644 --- a/test/homeassistant.test.js +++ b/test/homeassistant.test.js @@ -18,7 +18,7 @@ describe('HomeAssistant extension', () => { this.version = `Zigbee2MQTT ${this.version.version}`; jest.useRealTimers(); data.writeDefaultConfiguration(); - settings._reRead(); + settings.reRead(); data.writeEmptyState(); MQTT.publish.mockClear(); settings.set(['homeassistant'], true); diff --git a/test/legacy/bridgeLegacy.test.js b/test/legacy/bridgeLegacy.test.js index 7c39d2018..432ae9cfe 100644 --- a/test/legacy/bridgeLegacy.test.js +++ b/test/legacy/bridgeLegacy.test.js @@ -21,7 +21,7 @@ describe('Bridge legacy', () => { beforeEach(() => { data.writeDefaultConfiguration(); - settings._reRead(); + settings.reRead(); data.writeDefaultState(); logger.info.mockClear(); logger.warn.mockClear(); diff --git a/test/legacy/report.test.js b/test/legacy/report.test.js index 97f31285c..ca0a3b584 100644 --- a/test/legacy/report.test.js +++ b/test/legacy/report.test.js @@ -71,7 +71,7 @@ describe('Report', () => { beforeEach(async () => { data.writeDefaultConfiguration(); - settings._reRead(); + settings.reRead(); data.writeEmptyState(); settings.set(['advanced', 'report'], true); for (const device of Object.values(zigbeeHerdsman.devices)) { diff --git a/test/logger.test.js b/test/logger.test.js index f9d708a5c..1665d91fc 100644 --- a/test/logger.test.js +++ b/test/logger.test.js @@ -14,7 +14,7 @@ describe('Logger', () => { jest.resetModules(); settings = require('../lib/util/settings'); settings.set(['advanced', 'log_directory'], dir.name + '/%TIMESTAMP%'); - settings._reRead(); + settings.reRead(); stdOutWriteOriginal = console._stdout.write; console._stdout.write = () => {}; }); diff --git a/test/networkMap.test.js b/test/networkMap.test.js index 51561b874..671ee3cef 100644 --- a/test/networkMap.test.js +++ b/test/networkMap.test.js @@ -27,7 +27,7 @@ describe('Networkmap', () => { beforeAll(async () => { data.writeDefaultConfiguration(); - settings._reRead(); + settings.reRead(); data.writeEmptyState(); fs.copyFileSync(path.join(__dirname, 'assets', 'mock-external-converter.js'), path.join(data.mockDir, 'mock-external-converter.js')); settings.set(['external_converters'], ['mock-external-converter.js']); diff --git a/test/onEvent.test.js b/test/onEvent.test.js index fdd277b77..387fb24a7 100644 --- a/test/onEvent.test.js +++ b/test/onEvent.test.js @@ -23,7 +23,7 @@ describe('On event', () => { beforeEach(async () => { data.writeDefaultConfiguration(); - settings._reRead(); + settings.reRead(); data.writeEmptyState(); controller = new Controller(jest.fn(), jest.fn()); await controller.start(); diff --git a/test/otaUpdate.test.js b/test/otaUpdate.test.js index 8e9fc459b..08ec42405 100644 --- a/test/otaUpdate.test.js +++ b/test/otaUpdate.test.js @@ -18,7 +18,7 @@ describe('OTA update', () => { beforeEach(async () => { data.writeDefaultConfiguration(); - settings._reRead(); + settings.reRead(); settings.set(['advanced', 'ikea_ota_use_test_url'], true); data.writeEmptyState(); controller = new Controller(jest.fn(), jest.fn()); diff --git a/test/publish.test.js b/test/publish.test.js index e13ded5f6..f565123f8 100644 --- a/test/publish.test.js +++ b/test/publish.test.js @@ -38,7 +38,7 @@ describe('Publish', () => { await flushPromises(); data.writeDefaultConfiguration(); controller.state.state = {}; - settings._reRead(); + settings.reRead(); mocksClear.forEach((m) => m.mockClear()); Object.values(zigbeeHerdsman.devices).forEach((d) => { d.endpoints.forEach((e) => { diff --git a/test/receive.test.js b/test/receive.test.js index 90af4f47f..b157a2df0 100755 --- a/test/receive.test.js +++ b/test/receive.test.js @@ -15,7 +15,7 @@ describe('Receive', () => { beforeEach(async () => { jest.useRealTimers(); data.writeDefaultConfiguration(); - settings._reRead(); + settings.reRead(); data.writeEmptyState(); controller = new Controller(jest.fn(), jest.fn()); await controller.start(); diff --git a/test/settings.test.js b/test/settings.test.js index d342ccd6a..8b131303d 100644 --- a/test/settings.test.js +++ b/test/settings.test.js @@ -22,7 +22,7 @@ describe('Settings', () => { const write = (file, json, reread=true) => { fs.writeFileSync(file, yaml.safeDump(json)) if (reread) { - settings._reRead(); + settings.reRead(); } }; const read = (file) => yaml.safeLoad(fs.readFileSync(file, 'utf8')); @@ -616,7 +616,7 @@ describe('Settings', () => { advanced: {network_key: 'NOT_GENERATE'}, }); - settings._reRead(); + settings.reRead(); const error = `advanced.network_key: should be array or 'GENERATE' (is 'NOT_GENERATE')`; expect(settings.validate()).toEqual(expect.arrayContaining([error])); @@ -628,7 +628,7 @@ describe('Settings', () => { advanced: {pan_id: 'NOT_GENERATE'}, }); - settings._reRead(); + settings.reRead(); const error = `advanced.pan_id: should be number or 'GENERATE' (is 'NOT_GENERATE')`; expect(settings.validate()).toEqual(expect.arrayContaining([error])); @@ -641,7 +641,7 @@ describe('Settings', () => { devices: {'0x0017880104e45519': {friendly_name: 'tain', retention: 900}}, }); - settings._reRead(); + settings.reRead(); expect(settings.validate()).toEqual([]); }); @@ -652,7 +652,7 @@ describe('Settings', () => { devices: {'0x0017880104e45519': {friendly_name: 'tain', retention: 900}}, }); - settings._reRead(); + settings.reRead(); const error = 'MQTT retention requires protocol version 5'; expect(settings.validate()).toEqual(expect.arrayContaining([error])); @@ -665,7 +665,7 @@ describe('Settings', () => { advanced: {availability_blocklist: ['0x0017880104e45519', 'non_existing']}, }); - settings._reRead(); + settings.reRead(); const error = `Non-existing entity 'non_existing' specified in 'availability_blocklist'`; expect(settings.validate()).toEqual(expect.arrayContaining([error])); @@ -677,7 +677,7 @@ describe('Settings', () => { advanced: null, }); - settings._reRead(); + settings.reRead(); const error = `advanced should be object`; expect(settings.validate()).toEqual(expect.arrayContaining([error])); @@ -723,7 +723,7 @@ describe('Settings', () => { groups: {'1': {friendly_name: 'myname', retain: false}}, }); - settings._reRead(); + settings.reRead(); const error = `Duplicate friendly_name 'myname' found`; expect(settings.validate()).toEqual(expect.arrayContaining([error])); @@ -735,7 +735,7 @@ describe('Settings', () => { devices: {'0x0017880104e45519': {friendly_name: '', retain: false}}, }); - settings._reRead(); + settings.reRead(); const error = `friendly_name must be at least 1 char long`; expect(settings.validate()).toEqual(expect.arrayContaining([error])); @@ -747,7 +747,7 @@ describe('Settings', () => { devices: {'0x0017880104e45519': {friendly_name: 'blaa/', retain: false}}, }); - settings._reRead(); + settings.reRead(); const error = `friendly_name is not allowed to end or start with /`; expect(settings.validate()).toEqual(expect.arrayContaining([error])); @@ -759,7 +759,7 @@ describe('Settings', () => { devices: {'0x0017880104e45519': {friendly_name: 'blaa/blaa' + String.fromCharCode(0), retain: false}}, }); - settings._reRead(); + settings.reRead(); const error = `friendly_name is not allowed to contain null char`; expect(settings.validate()).toEqual(expect.arrayContaining([error])); @@ -771,7 +771,7 @@ describe('Settings', () => { devices: {'0x0017880104e45519': {friendly_name: 'myname/123', retain: false}}, }); - settings._reRead(); + settings.reRead(); const error = `Friendly name cannot end with a "/DIGIT" ('myname/123')`; expect(settings.validate()).toEqual(expect.arrayContaining([error])); @@ -783,7 +783,7 @@ describe('Settings', () => { devices: {'0x0017880104e45519': {friendly_name: 'myname#', retain: false}}, }); - settings._reRead(); + settings.reRead(); const error = `MQTT wildcard (+ and #) not allowed in friendly_name ('myname#')`; expect(settings.validate()).toEqual(expect.arrayContaining([error])); @@ -795,7 +795,7 @@ describe('Settings', () => { devices: {'0x0017880104e45519': {friendly_name: 'left', retain: false}}, }); - settings._reRead(); + settings.reRead(); const error = `Following friendly_name are not allowed: '${utils.getEndpointNames()}'`; expect(settings.validate()).toEqual(expect.arrayContaining([error])); @@ -809,7 +809,7 @@ describe('Settings', () => { }, }); - settings._reRead(); + settings.reRead(); expect(() => { settings.changeFriendlyName('myname1', 'myname'); @@ -824,7 +824,7 @@ describe('Settings', () => { }, }); - settings._reRead(); + settings.reRead(); expect(() => { settings.removeDevice('myname33');