Skip to content

Commit f6f7ba6

Browse files
authored
fix: Write ZIGBEE2MQTT_CONFIG_* envs to yaml as overrides (#26653)
1 parent 1b6ad46 commit f6f7ba6

File tree

3 files changed

+21
-14
lines changed

3 files changed

+21
-14
lines changed

index.js

+1
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ async function start() {
135135
// Validate settings
136136
const settings = require('./dist/util/settings');
137137

138+
settings.write(); // trigger initial writing of `ZIGBEE2MQTT_CONFIG_*` ENVs
138139
settings.reRead();
139140

140141
const settingsMigration = require('./dist/util/settingsMigration');

lib/util/settings.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,12 @@ function parseValueRef(text: string): {filename: string; key: string} | null {
146146
}
147147
}
148148

149-
function write(): void {
149+
export function write(): void {
150150
const settings = getPersistedSettings();
151151
const toWrite: KeyValue = objectAssignDeep({}, settings);
152152

153+
applyEnvironmentVariables(toWrite);
154+
153155
// Read settings to check if we have to split devices/groups into separate file.
154156
const actual = yaml.read(CONFIG_FILE_PATH);
155157

@@ -277,7 +279,6 @@ export function validate(): string[] {
277279

278280
function read(): Partial<Settings> {
279281
const s = yaml.read(CONFIG_FILE_PATH) as Partial<Settings>;
280-
applyEnvironmentVariables(s);
281282

282283
// Read !secret MQTT username and password if set
283284
const interpretValue = <T>(value: T): T => {

test/settings.test.ts

+17-12
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ describe('Settings', () => {
3838

3939
const clearEnvironmentVariables = (): void => {
4040
for (const key in process.env) {
41-
if (key.indexOf('ZIGBEE2MQTT_CONFIG_') >= 0) {
41+
if (key.startsWith('ZIGBEE2MQTT_CONFIG_')) {
4242
delete process.env[key];
4343
}
4444
}
@@ -104,17 +104,16 @@ describe('Settings', () => {
104104
expect(s).toStrictEqual(expected);
105105
});
106106

107-
it('Should apply environment variables', () => {
108-
process.env['ZIGBEE2MQTT_CONFIG_SERIAL_DISABLE_LED'] = 'true';
109-
process.env['ZIGBEE2MQTT_CONFIG_ADVANCED_CHANNEL'] = '15';
110-
process.env['ZIGBEE2MQTT_CONFIG_ADVANCED_OUTPUT'] = 'attribute_and_json';
111-
process.env['ZIGBEE2MQTT_CONFIG_ADVANCED_LOG_OUTPUT'] = '["console"]';
112-
process.env['ZIGBEE2MQTT_CONFIG_MAP_OPTIONS_GRAPHVIZ_COLORS_FILL'] =
113-
'{"enddevice": "#ff0000", "coordinator": "#00ff00", "router": "#0000ff"}';
114-
process.env['ZIGBEE2MQTT_CONFIG_MQTT_BASE_TOPIC'] = 'testtopic';
115-
process.env['ZIGBEE2MQTT_CONFIG_MQTT_SERVER'] = 'testserver';
116-
process.env['ZIGBEE2MQTT_CONFIG_ADVANCED_NETWORK_KEY'] = 'GENERATE';
117-
process.env['ZIGBEE2MQTT_CONFIG_DEVICES'] = 'devices.yaml';
107+
it('Should apply environment variables as overrides', () => {
108+
process.env.ZIGBEE2MQTT_CONFIG_SERIAL_DISABLE_LED = 'true';
109+
process.env.ZIGBEE2MQTT_CONFIG_ADVANCED_CHANNEL = '15';
110+
process.env.ZIGBEE2MQTT_CONFIG_ADVANCED_OUTPUT = 'attribute_and_json';
111+
process.env.ZIGBEE2MQTT_CONFIG_ADVANCED_LOG_OUTPUT = '["console"]';
112+
process.env.ZIGBEE2MQTT_CONFIG_MAP_OPTIONS_GRAPHVIZ_COLORS_FILL = '{"enddevice": "#ff0000", "coordinator": "#00ff00", "router": "#0000ff"}';
113+
process.env.ZIGBEE2MQTT_CONFIG_MQTT_BASE_TOPIC = 'testtopic';
114+
process.env.ZIGBEE2MQTT_CONFIG_MQTT_SERVER = 'testserver';
115+
process.env.ZIGBEE2MQTT_CONFIG_ADVANCED_NETWORK_KEY = 'GENERATE';
116+
process.env.ZIGBEE2MQTT_CONFIG_DEVICES = 'devices.yaml';
118117

119118
const contentDevices = {
120119
'0x00158d00018255df': {
@@ -125,6 +124,7 @@ describe('Settings', () => {
125124

126125
write(configurationFile, {});
127126
write(devicesFile, contentDevices);
127+
expect(settings.write()); // trigger writing of ENVs
128128
expect(settings.validate()).toStrictEqual([]);
129129

130130
const s = settings.get();
@@ -147,6 +147,11 @@ describe('Settings', () => {
147147
expected.advanced.network_key = 'GENERATE';
148148

149149
expect(s).toStrictEqual(expected);
150+
151+
settings.set(['advanced', 'channel'], 25);
152+
153+
expect(settings.get().advanced.channel).toStrictEqual(15);
154+
expect(read(configurationFile)).toMatchObject({advanced: {channel: 15}});
150155
});
151156

152157
it('Should add devices', () => {

0 commit comments

Comments
 (0)