diff --git a/index.js b/index.js index bf4d39b38..b6fe4ec33 100644 --- a/index.js +++ b/index.js @@ -135,6 +135,7 @@ async function start() { // Validate settings const settings = require('./dist/util/settings'); + settings.write(); // trigger initial writing of `ZIGBEE2MQTT_CONFIG_*` ENVs settings.reRead(); const settingsMigration = require('./dist/util/settingsMigration'); diff --git a/lib/util/settings.ts b/lib/util/settings.ts index 13f0d0a45..96ae6682a 100644 --- a/lib/util/settings.ts +++ b/lib/util/settings.ts @@ -146,10 +146,12 @@ function parseValueRef(text: string): {filename: string; key: string} | null { } } -function write(): void { +export function write(): void { const settings = getPersistedSettings(); const toWrite: KeyValue = objectAssignDeep({}, settings); + applyEnvironmentVariables(toWrite); + // Read settings to check if we have to split devices/groups into separate file. const actual = yaml.read(CONFIG_FILE_PATH); @@ -277,7 +279,6 @@ export function validate(): string[] { function read(): Partial { const s = yaml.read(CONFIG_FILE_PATH) as Partial; - applyEnvironmentVariables(s); // Read !secret MQTT username and password if set const interpretValue = (value: T): T => { diff --git a/test/settings.test.ts b/test/settings.test.ts index 8b159de1f..a850155db 100644 --- a/test/settings.test.ts +++ b/test/settings.test.ts @@ -38,7 +38,7 @@ describe('Settings', () => { const clearEnvironmentVariables = (): void => { for (const key in process.env) { - if (key.indexOf('ZIGBEE2MQTT_CONFIG_') >= 0) { + if (key.startsWith('ZIGBEE2MQTT_CONFIG_')) { delete process.env[key]; } } @@ -104,17 +104,16 @@ describe('Settings', () => { expect(s).toStrictEqual(expected); }); - it('Should apply environment variables', () => { - process.env['ZIGBEE2MQTT_CONFIG_SERIAL_DISABLE_LED'] = 'true'; - process.env['ZIGBEE2MQTT_CONFIG_ADVANCED_CHANNEL'] = '15'; - process.env['ZIGBEE2MQTT_CONFIG_ADVANCED_OUTPUT'] = 'attribute_and_json'; - process.env['ZIGBEE2MQTT_CONFIG_ADVANCED_LOG_OUTPUT'] = '["console"]'; - process.env['ZIGBEE2MQTT_CONFIG_MAP_OPTIONS_GRAPHVIZ_COLORS_FILL'] = - '{"enddevice": "#ff0000", "coordinator": "#00ff00", "router": "#0000ff"}'; - process.env['ZIGBEE2MQTT_CONFIG_MQTT_BASE_TOPIC'] = 'testtopic'; - process.env['ZIGBEE2MQTT_CONFIG_MQTT_SERVER'] = 'testserver'; - process.env['ZIGBEE2MQTT_CONFIG_ADVANCED_NETWORK_KEY'] = 'GENERATE'; - process.env['ZIGBEE2MQTT_CONFIG_DEVICES'] = 'devices.yaml'; + it('Should apply environment variables as overrides', () => { + process.env.ZIGBEE2MQTT_CONFIG_SERIAL_DISABLE_LED = 'true'; + process.env.ZIGBEE2MQTT_CONFIG_ADVANCED_CHANNEL = '15'; + process.env.ZIGBEE2MQTT_CONFIG_ADVANCED_OUTPUT = 'attribute_and_json'; + process.env.ZIGBEE2MQTT_CONFIG_ADVANCED_LOG_OUTPUT = '["console"]'; + process.env.ZIGBEE2MQTT_CONFIG_MAP_OPTIONS_GRAPHVIZ_COLORS_FILL = '{"enddevice": "#ff0000", "coordinator": "#00ff00", "router": "#0000ff"}'; + process.env.ZIGBEE2MQTT_CONFIG_MQTT_BASE_TOPIC = 'testtopic'; + process.env.ZIGBEE2MQTT_CONFIG_MQTT_SERVER = 'testserver'; + process.env.ZIGBEE2MQTT_CONFIG_ADVANCED_NETWORK_KEY = 'GENERATE'; + process.env.ZIGBEE2MQTT_CONFIG_DEVICES = 'devices.yaml'; const contentDevices = { '0x00158d00018255df': { @@ -125,6 +124,7 @@ describe('Settings', () => { write(configurationFile, {}); write(devicesFile, contentDevices); + expect(settings.write()); // trigger writing of ENVs expect(settings.validate()).toStrictEqual([]); const s = settings.get(); @@ -147,6 +147,11 @@ describe('Settings', () => { expected.advanced.network_key = 'GENERATE'; expect(s).toStrictEqual(expected); + + settings.set(['advanced', 'channel'], 25); + + expect(settings.get().advanced.channel).toStrictEqual(15); + expect(read(configurationFile)).toMatchObject({advanced: {channel: 15}}); }); it('Should add devices', () => {