Skip to content

Support all configuration options in config.js #1345

@synthead

Description

@synthead

This is example_config.js:

module.exports = {
logConfig: {
filename: "/var/log/zwave/zwave",
forceConsole: true,
logToFile: true,
level: "info",
},
storage: {
cacheDir: "/opt/zwave_js_server/data",
deviceConfigPriorityDir: "/opt/zwave_js_server/data/config",
},
// Generated with: "< /dev/urandom tr -dc A-F0-9 | head -c32 ;echo"
securityKeys: {
S0_Legacy: Buffer.from("<NETWORK_KEY>", "hex"),
},
};

Here is where the config file is parsed:

if (configPath) {
try {
// Pull presets out of options so we can pass them to the driver
({ presets: presetNames, ...options } = require(configPath));
// If both securityKeys.S0_Legacy and networkKey are defined, throw an error.
if (options.securityKeys?.S0_Legacy && options.networkKey) {
throw new Error(
"Both `networkKey` and `securityKeys.S0_Legacy` options are present in the " +
"config. Remove `networkKey`.",
);
}
const securityKeyNames = [
"S0_Legacy",
"S2_AccessControl",
"S2_Authenticated",
"S2_Unauthenticated",
];
// We prefer the securityKeys option over the networkKey one
if (options.securityKeys) {
for (const key of securityKeyNames) {
if (key in options.securityKeys) {
options.securityKeys[key] = normalizeKey(
options.securityKeys[key],
`securityKeys.${key}`,
);
}
}
}
// If we get here, securityKeys.S0_Legacy is not defined, so we can safely use networkKey
// make sure that networkKey is passed as buffer and accept both zwave2mqtt format and ozw format
if (options.networkKey) {
if (!options.securityKeys) options.securityKeys = {};
options.securityKeys.S0_Legacy = normalizeKey(
options.networkKey,
"networkKey",
);
console.warn(
"The `networkKey` option is deprecated in favor of `securityKeys` option. To eliminate " +
"this warning, move your networkKey into the securityKeys.S0_Legacy option. Refer to " +
"the Z-Wave JS docs for more information",
);
delete options.networkKey;
} else if (!options.securityKeys?.S0_Legacy)
throw new Error("Error: `securityKeys.S0_Legacy` key is missing.");
// Support long range keys
const securityKeysLongRangeNames = [
"S2_AccessControl",
"S2_Authenticated",
];
if (options.securityKeysLongRange) {
for (const key of securityKeysLongRangeNames) {
if (key in options.securityKeysLongRange) {
options.securityKeysLongRange[key] = normalizeKey(
options.securityKeysLongRange[key],
`securityKeysLongRange.${key}`,
);
}
}
}
} catch (err) {
console.error(`Error: failed loading config file ${configPath}`);
console.error(err);
return;
}
}

It supports a lot of options, but it does not support "mock-driver", "port", "host", or "disable-dns-sd" options. Instead, these options are parsed separately:

const args = parseArgs<Args>([
"_",
"config",
"mock-driver",
"port",
"host",
"disable-dns-sd",
]);

It would be really great to be able to tell zwave-js-server to "read all my config options" and have the port, host, encryption keys, and the like all in one place. This would make it a lot easier to maintain individual configurations for each zwave device and its corresponding server, which is useful for how zwave-js-server is typically deployed on a server.

For example, this is the zwave-js-server package in the Arch Linux AUR:

https://aur.archlinux.org/packages/zwave-js-server

Here is the zwave-js-server@.service file that it includes (link):

[Unit]
Description=ZWave-JS Server Daemon "%i" instance
Before=home-assistant.service

[Service]
ExecStart=/usr/bin/zwave-server /dev/%I

[Install]
WantedBy=multi-user.target

If we could pass a configuration file to zwave-server and have everything we need, then this would be great 😄

Thanks for the great project! Cheers!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions