zwave-js-ui
Version:
Z-Wave Control Panel and MQTT Gateway
170 lines (169 loc) • 6.96 kB
JavaScript
import { readFileSync, existsSync } from 'node:fs';
import { driverPresets } from 'zwave-js';
import { module } from "./logger.js";
const logger = module('ExternalSettings');
let cachedSettings = null;
let settingsLoaded = false;
export function loadExternalSettings() {
if (settingsLoaded)
return cachedSettings;
settingsLoaded = true;
const filePath = process.env.ZWAVE_EXTERNAL_SETTINGS;
if (!filePath)
return null;
if (!existsSync(filePath)) {
logger.warn(`External settings file not found: ${filePath}`);
return null;
}
try {
cachedSettings = JSON.parse(readFileSync(filePath, 'utf-8'));
logger.info(`Loaded external Z-Wave settings from: ${filePath}`);
return cachedSettings;
}
catch (error) {
logger.error(`Failed to load external settings: ${error.message}`);
return null;
}
}
export function getExternallyManagedPaths() {
const settings = loadExternalSettings();
if (!settings)
return [];
const paths = [];
// Logging (logFilename and forceConsole are driver-only, no UI mapping)
if (settings.logEnabled !== undefined)
paths.push('zwave.logEnabled');
if (settings.logLevel !== undefined)
paths.push('zwave.logLevel');
if (settings.logToFile !== undefined)
paths.push('zwave.logToFile');
if (settings.maxFiles !== undefined)
paths.push('zwave.maxFiles');
// RF settings
if (settings.rf?.region !== undefined)
paths.push('zwave.rf.region');
if (settings.rf?.autoPowerlevels !== undefined)
paths.push('zwave.rf.autoPowerlevels');
// Security keys (check each specific key)
if (settings.securityKeys?.S0_Legacy !== undefined)
paths.push('zwave.securityKeys.S0_Legacy');
if (settings.securityKeys?.S2_Unauthenticated !== undefined)
paths.push('zwave.securityKeys.S2_Unauthenticated');
if (settings.securityKeys?.S2_Authenticated !== undefined)
paths.push('zwave.securityKeys.S2_Authenticated');
if (settings.securityKeys?.S2_AccessControl !== undefined)
paths.push('zwave.securityKeys.S2_AccessControl');
if (settings.securityKeysLongRange?.S2_Authenticated !== undefined)
paths.push('zwave.securityKeysLongRange.S2_Authenticated');
if (settings.securityKeysLongRange?.S2_AccessControl !== undefined)
paths.push('zwave.securityKeysLongRange.S2_AccessControl');
// Features
if (settings.enableSoftReset !== undefined)
paths.push('zwave.enableSoftReset');
// Device config
if (settings.deviceConfigPriorityDir !== undefined)
paths.push('zwave.deviceConfigPriorityDir');
// Home Assistant / Z-Wave JS Server settings
if (settings.serverEnabled !== undefined)
paths.push('zwave.serverEnabled');
if (settings.serverPort !== undefined)
paths.push('zwave.serverPort');
if (settings.serverHost !== undefined)
paths.push('zwave.serverHost');
if (settings.serverServiceDiscoveryDisabled !== undefined)
paths.push('zwave.serverServiceDiscoveryDisabled');
// Presets (driver-only, no UI mapping)
return paths;
}
export function applyExternalDriverSettings(zwaveOptions) {
const settings = loadExternalSettings();
if (!settings)
return;
if (settings.logFilename !== undefined ||
settings.forceConsole !== undefined) {
zwaveOptions.logConfig = zwaveOptions.logConfig || {};
if (settings.logFilename !== undefined)
zwaveOptions.logConfig.filename = settings.logFilename;
if (settings.forceConsole !== undefined)
zwaveOptions.logConfig.forceConsole = settings.forceConsole;
}
if (settings.storage) {
zwaveOptions.storage = zwaveOptions.storage || {};
if (settings.storage.cacheDir !== undefined)
zwaveOptions.storage.cacheDir = settings.storage.cacheDir;
if (settings.storage.throttle !== undefined)
zwaveOptions.storage.throttle = settings.storage.throttle;
}
if (settings.presets && settings.presets.length > 0) {
for (const presetName of settings.presets) {
const preset = driverPresets[presetName];
if (preset) {
Object.assign(zwaveOptions, preset);
}
else {
logger.warn(`Unknown driver preset: ${presetName}`);
}
}
}
}
/**
* Merge external settings into ZwaveConfig.
* This should be called once in app.ts before passing settings to ZwaveClient.
*/
export function mergeExternalSettings(zwaveConfig) {
const settings = loadExternalSettings();
if (!settings)
return;
// Server settings
if (settings.serverEnabled !== undefined)
zwaveConfig.serverEnabled = settings.serverEnabled;
if (settings.serverPort !== undefined)
zwaveConfig.serverPort = settings.serverPort;
if (settings.serverHost !== undefined)
zwaveConfig.serverHost = settings.serverHost;
if (settings.serverServiceDiscoveryDisabled !== undefined)
zwaveConfig.serverServiceDiscoveryDisabled =
settings.serverServiceDiscoveryDisabled;
// Logging settings
if (settings.logEnabled !== undefined)
zwaveConfig.logEnabled = settings.logEnabled;
if (settings.logLevel !== undefined)
zwaveConfig.logLevel = settings.logLevel;
if (settings.logToFile !== undefined)
zwaveConfig.logToFile = settings.logToFile;
if (settings.maxFiles !== undefined)
zwaveConfig.maxFiles = settings.maxFiles;
// RF settings
if (settings.rf) {
zwaveConfig.rf = zwaveConfig.rf || {};
const rf = zwaveConfig.rf;
if (settings.rf.region !== undefined)
rf.region = settings.rf.region;
if (settings.rf.autoPowerlevels !== undefined)
rf.autoPowerlevels = settings.rf.autoPowerlevels;
}
// Security keys (stored as hex strings, converted to Buffers later by ZwaveClient)
if (settings.securityKeys) {
zwaveConfig.securityKeys = zwaveConfig.securityKeys || {};
const keys = zwaveConfig.securityKeys;
for (const [key, value] of Object.entries(settings.securityKeys)) {
if (value)
keys[key] = value;
}
}
if (settings.securityKeysLongRange) {
zwaveConfig.securityKeysLongRange =
zwaveConfig.securityKeysLongRange || {};
const keys = zwaveConfig.securityKeysLongRange;
for (const [key, value] of Object.entries(settings.securityKeysLongRange)) {
if (value)
keys[key] = value;
}
}
// Features
if (settings.enableSoftReset !== undefined)
zwaveConfig.enableSoftReset = settings.enableSoftReset;
// Device config
if (settings.deviceConfigPriorityDir !== undefined)
zwaveConfig.deviceConfigPriorityDir = settings.deviceConfigPriorityDir;
}