mirror of
https://github.com/lehanspb/tuya-mqtt.git
synced 2025-12-16 17:54:36 +00:00
3.0.1 Update * Script to merge device additions and changes into devices.conf (#49) * Fix typos in README.md * Add republish on reconnect * Filter additional invalid characters '+','#','/' from topic line (replace with '_') * Minor bugfixes for parse values * Include script for merging new devices into existing config * Update dependency Co-authored-by: tsightler <tsightler@gmail.com> Co-authored-by: Doug Krahmer <doug.git@remhark.com>
116 lines
4.2 KiB
JavaScript
116 lines
4.2 KiB
JavaScript
#!/usr/bin/env node
|
|
const fs = require('fs');
|
|
const json5 = require('json5');
|
|
const utils = require('./lib/utils');
|
|
|
|
// Setup Exit Handlers
|
|
process.on('exit', processExit.bind(0));
|
|
process.on('SIGINT', processExit.bind(0));
|
|
process.on('SIGTERM', processExit.bind(0));
|
|
process.on('uncaughtException', processExit.bind(1));
|
|
|
|
async function processExit(exitCode) {
|
|
if (exitCode || exitCode === 0)
|
|
console.error('Exit code: ' + exitCode)
|
|
process.exit();
|
|
}
|
|
|
|
// Main code function
|
|
const main = async() => {
|
|
const date = new Date();
|
|
const dateTimeStr = date.getFullYear() + '-' + ("0" + (date.getMonth() + 1)).slice(-2) + '-' + ("0" + date.getDate()).slice(-2) + '_' + ("0" + date.getHours()).slice(-2) + ("0" + date.getMinutes()).slice(-2) + ("0" + date.getSeconds()).slice(-2);
|
|
const configDevicesFilename = 'devices.conf';
|
|
const configDevicesBackupFilename = `${configDevicesFilename}_${dateTimeStr}.bak`;
|
|
const configNewDevicesFilename = `new-${configDevicesFilename}`;
|
|
|
|
let configDevices;
|
|
let configNewDevices;
|
|
|
|
try {
|
|
console.log(`Loading ${configNewDevicesFilename}...`);
|
|
configNewDevices = fs.readFileSync(`./${configNewDevicesFilename}`, 'utf8');
|
|
configNewDevices = json5.parse(configNewDevices);
|
|
}
|
|
catch (e) {
|
|
console.error(`Could not parse new devices config file [${configNewDevicesFilename}]!`);
|
|
console.error(e);
|
|
process.exit(1);
|
|
}
|
|
|
|
try {
|
|
console.log(`Loading ${configDevicesFilename}...`);
|
|
configDevices = fs.readFileSync(`./${configDevicesFilename}`, 'utf8');
|
|
configDevices = json5.parse(configDevices);
|
|
}
|
|
catch (e) {
|
|
console.error(`Could not parse devices config file [${configDevicesFilename}]!`);
|
|
console.error(e);
|
|
process.exit(1);
|
|
}
|
|
|
|
try {
|
|
console.log(`Backing up devices config file [${configDevicesFilename}] to [${configDevicesBackupFilename}]...`);
|
|
fs.copyFileSync(`./${configDevicesFilename}`, `./${configDevicesBackupFilename}`);
|
|
}
|
|
catch (e) {
|
|
console.error(`Could not make backup of devices config file [${configDevicesFilename}] to [${configDevicesBackupFilename}].`);
|
|
console.error(e);
|
|
process.exit(1);
|
|
}
|
|
|
|
console.log('Indexing devices...');
|
|
|
|
// Create a dictionary for faster lookups with many devices
|
|
const configDevicesDictionary = {};
|
|
for (let configDevice of configDevices) {
|
|
configDevicesDictionary[configDevice.id] = configDevice;
|
|
}
|
|
|
|
console.log('Merging devices...');
|
|
|
|
// Add new devices and update existing devices
|
|
for (let configNewDevice of configNewDevices) {
|
|
let configDevice = configDevicesDictionary[configNewDevice.id];
|
|
if (configDevice == null) {
|
|
// Add new device
|
|
console.log(`Adding device: ${configNewDevice.name} (id: ${configNewDevice.id})...`);
|
|
configDevices.push(configNewDevice);
|
|
configDevicesDictionary[configNewDevice.id] = configNewDevice;
|
|
continue;
|
|
}
|
|
|
|
if (configDevice.allowMerge === false)
|
|
continue; // No merge updates allowed for this device
|
|
|
|
// Update existing device
|
|
if (configDevice.name !== configNewDevice.name) {
|
|
console.log(`Updating device name: '${configDevice.name}' to '${configNewDevice.name}' (device id: ${configDevice.key})...`);
|
|
configDevice.name = configNewDevice.name;
|
|
}
|
|
if (configDevice.key !== configNewDevice.key) {
|
|
console.log(`Updating device key for: '${configDevice.name}' (device id: ${configDevice.key})...`);
|
|
configDevice.key = configNewDevice.key;
|
|
}
|
|
}
|
|
|
|
// Sort the devices by name
|
|
configDevices.sort((a, b) => a.name < b.name ? -1 : 1);
|
|
const configDevicesJson = json5.stringify(configDevices, { space: ' ', quote: '"' });
|
|
|
|
//console.log(configDevicesJson);
|
|
|
|
try {
|
|
console.log(`Saving devices config file [${configDevicesFilename}]...`);
|
|
fs.writeFileSync(`./${configDevicesFilename}`, configDevicesJson, { encoding: 'utf8' });
|
|
}
|
|
catch (e) {
|
|
console.error(`Could not write devices config file [${configDevicesFilename}]!`)
|
|
console.error(e)
|
|
process.exit(1)
|
|
}
|
|
|
|
console.log('Done!');
|
|
}
|
|
|
|
// Call the main code
|
|
main(); |