更新 main.js

This commit is contained in:
2019-02-02 14:55:27 +00:00
parent 2c7d2b292c
commit 51d2b6e8c7
+449 -443
View File
@@ -1,443 +1,449 @@
/** /**
* *
* yunkong2 node-red Adapter * yunkong2 node-red Adapter
* *
* (c) 2014 bluefox<bluefox@ccu.io> * (c) 2014 bluefox<bluefox@ccu.io>
* *
* Apache 2.0 License * Apache 2.0 License
* *
*/ */
/* jshint -W097 */// jshint strict:false /* jshint -W097 */// jshint strict:false
/*jslint node: true */ /*jslint node: true */
'use strict'; 'use strict';
const utils = require(__dirname + '/lib/utils'); // Get common adapter utils const utils = require(__dirname + '/lib/utils'); // Get common adapter utils
const adapter = utils.Adapter({ const adapter = utils.Adapter({
name: 'node-red', name: 'node-red',
systemConfig: true, // get the system configuration as systemConfig parameter of adapter systemConfig: true, // get the system configuration as systemConfig parameter of adapter
unload: unloadRed unload: unloadRed
}); });
const fs = require('fs'); const fs = require('fs');
const path = require('path'); const path = require('path');
const spawn = require('child_process').spawn; const spawn = require('child_process').spawn;
const Notify = require('fs.notify'); const Notify = require('fs.notify');
const attempts = {}; const attempts = {};
const additional = []; const additional = [];
let secret; let secret;
let userdataDir = __dirname + '/userdata/'; let userdataDir = __dirname + '/userdata/';
adapter.on('message', function (obj) { adapter.on('message', function (obj) {
if (obj) processMessage(obj); if (obj) processMessage(obj);
processMessages(); processMessages();
}); });
adapter.on('ready', function () { adapter.on('ready', function () {
installLibraries(main); installLibraries(main);
}); });
function installNpm(npmLib, callback) { function installNpm(npmLib, callback) {
const path = __dirname; const path = __dirname;
if (typeof npmLib === 'function') { if (typeof npmLib === 'function') {
callback = npmLib; callback = npmLib;
npmLib = undefined; npmLib = undefined;
} }
const cmd = 'npm install ' + npmLib + ' --production --prefix "' + path + '" --save'; const cmd = 'npm install ' + npmLib + ' --production --prefix "' + path + '" --save';
adapter.log.info(cmd + ' (System call)'); adapter.log.info(cmd + ' (System call)');
// Install node modules as system call // Install node modules as system call
// System call used for update of js-controller itself, // System call used for update of js-controller itself,
// because during installation npm packet will be deleted too, but some files must be loaded even during the install process. // because during installation npm packet will be deleted too, but some files must be loaded even during the install process.
const exec = require('child_process').exec; const exec = require('child_process').exec;
const child = exec(cmd); const child = exec(cmd);
child.stdout.on('data', function(buf) { child.stdout.on('data', function(buf) {
adapter.log.info(buf.toString('utf8')); adapter.log.info(buf.toString('utf8'));
}); });
child.stderr.on('data', function(buf) { child.stderr.on('data', function(buf) {
adapter.log.error(buf.toString('utf8')); adapter.log.error(buf.toString('utf8'));
}); });
child.on('exit', function (code, signal) { child.on('exit', function (code, signal) {
if (code) { if (code) {
adapter.log.error('Cannot install ' + npmLib + ': ' + code); adapter.log.error('Cannot install ' + npmLib + ': ' + code);
} }
// command succeeded // command succeeded
if (callback) callback(npmLib); if (callback) callback(npmLib);
}); });
} }
function installLibraries(callback) { function installLibraries(callback) {
let allInstalled = true; let allInstalled = true;
if (typeof adapter.common.npmLibs === 'string') { if (typeof adapter.common.npmLibs === 'string') {
adapter.common.npmLibs = adapter.common.npmLibs.split(/[,;\s]+/); adapter.common.npmLibs = adapter.common.npmLibs.split(/[,;\s]+/);
} }
if (adapter.common && adapter.common.npmLibs) { if (adapter.common && adapter.common.npmLibs) {
for (let lib = 0; lib < adapter.common.npmLibs.length; lib++) { for (let lib = 0; lib < adapter.common.npmLibs.length; lib++) {
if (adapter.common.npmLibs[lib] && adapter.common.npmLibs[lib].trim()) { if (adapter.common.npmLibs[lib] && adapter.common.npmLibs[lib].trim()) {
adapter.common.npmLibs[lib] = adapter.common.npmLibs[lib].trim(); adapter.common.npmLibs[lib] = adapter.common.npmLibs[lib].trim();
if (!fs.existsSync(__dirname + '/node_modules/' + adapter.common.npmLibs[lib] + '/package.json')) { if (!fs.existsSync(__dirname + '/node_modules/' + adapter.common.npmLibs[lib] + '/package.json')) {
if (!attempts[adapter.common.npmLibs[lib]]) { if (!attempts[adapter.common.npmLibs[lib]]) {
attempts[adapter.common.npmLibs[lib]] = 1; attempts[adapter.common.npmLibs[lib]] = 1;
} else { } else {
attempts[adapter.common.npmLibs[lib]]++; attempts[adapter.common.npmLibs[lib]]++;
} }
if (attempts[adapter.common.npmLibs[lib]] > 3) { if (attempts[adapter.common.npmLibs[lib]] > 3) {
adapter.log.error('Cannot install npm packet: ' + adapter.common.npmLibs[lib]); adapter.log.error('Cannot install npm packet: ' + adapter.common.npmLibs[lib]);
continue; continue;
} }
installNpm(adapter.common.npmLibs[lib], function () { installNpm(adapter.common.npmLibs[lib], function () {
installLibraries(callback); installLibraries(callback);
}); });
allInstalled = false; allInstalled = false;
break; break;
} else { } else {
if (additional.indexOf(adapter.common.npmLibs[lib]) === -1) additional.push(adapter.common.npmLibs[lib]); if (additional.indexOf(adapter.common.npmLibs[lib]) === -1) additional.push(adapter.common.npmLibs[lib]);
} }
} }
} }
} }
if (allInstalled) callback(); if (allInstalled) callback();
} }
// is called if a subscribed state changes // is called if a subscribed state changes
//adapter.on('stateChange', function (id, state) { //adapter.on('stateChange', function (id, state) {
//}); //});
function unloadRed (callback) { function unloadRed (callback) {
// Stop node-red // Stop node-red
stopping = true; stopping = true;
if (redProcess) { if (redProcess) {
adapter.log.info("kill node-red task"); adapter.log.info("kill node-red task");
redProcess.kill(); redProcess.kill();
redProcess = null; redProcess = null;
} }
if (notificationsCreds) notificationsCreds.close(); if (notificationsCreds) notificationsCreds.close();
if (notificationsFlows) notificationsFlows.close(); if (notificationsFlows) notificationsFlows.close();
if (callback) callback(); if (callback) callback();
} }
function processMessage(obj) { function processMessage(obj) {
if (!obj || !obj.command) return; if (!obj || !obj.command) return;
switch (obj.command) { switch (obj.command) {
case 'update': case 'update':
writeStateList(error => { writeStateList(error => {
if (typeof obj.callback === 'function') adapter.sendTo(obj.from, obj.command, error, obj.callback); if (typeof obj.callback === 'function') adapter.sendTo(obj.from, obj.command, error, obj.callback);
}); });
break; break;
case 'stopInstance': case 'stopInstance':
unloadRed(); unloadRed();
break; break;
} }
} }
function processMessages() { function processMessages() {
adapter.getMessage((err, obj) => { adapter.getMessage((err, obj) => {
if (obj) { if (obj) {
processMessage(obj.command, obj.message); processMessage(obj.command, obj.message);
processMessages(); processMessages();
} }
}); });
} }
function getNodeRedPath() { function getNodeRedPath() {
let nodeRed = __dirname + '/node_modules/node-red'; let nodeRed = __dirname + '/node_modules/node-red';
if (!fs.existsSync(nodeRed)) { if (!fs.existsSync(nodeRed)) {
nodeRed = path.normalize(__dirname + '/../node-red'); nodeRed = path.normalize(__dirname + '/../node-red');
if (!fs.existsSync(nodeRed)) { if (!fs.existsSync(nodeRed)) {
nodeRed = path.normalize(__dirname + '/../node_modules/node-red'); nodeRed = path.normalize(__dirname + '/../node_modules/node-red');
if (!fs.existsSync(nodeRed)) { if (!fs.existsSync(nodeRed)) {
adapter && adapter.log && adapter.log.error('Cannot find node-red packet!'); adapter && adapter.log && adapter.log.error('Cannot find node-red packet!');
throw new Error('Cannot find node-red packet!'); throw new Error('Cannot find node-red packet!');
} }
} }
} }
return nodeRed; return nodeRed;
} }
let redProcess; let redProcess;
let stopping; let stopping;
let notificationsFlows; let notificationsFlows;
let notificationsCreds; let notificationsCreds;
let saveTimer; let saveTimer;
const nodePath = getNodeRedPath(); const nodePath = getNodeRedPath();
function startNodeRed() { function startNodeRed() {
adapter.config.maxMemory = parseInt(adapter.config.maxMemory, 10) || 128; adapter.config.maxMemory = parseInt(adapter.config.maxMemory, 10) || 128;
const args = ['--max-old-space-size=' + adapter.config.maxMemory, nodePath + '/red.js', '-v', '--settings', userdataDir + 'settings.js']; const args = ['--max-old-space-size=' + adapter.config.maxMemory, nodePath + '/red.js', '-v', '--settings', userdataDir + 'settings.js'];
adapter.log.info('Starting node-red: ' + args.join(' ')); adapter.log.info('Starting node-red: ' + args.join(' '));
redProcess = spawn('node', args); redProcess = spawn('node', args);
redProcess.on('error', function (err) { redProcess.on('error', function (err) {
adapter.log.error('catched exception from node-red:' + JSON.stringify(err)); adapter.log.error('catched exception from node-red:' + JSON.stringify(err));
}); });
redProcess.stdout.on('data', function (data) { redProcess.stdout.on('data', function (data) {
if (!data) return; if (!data) return;
data = data.toString(); data = data.toString();
if (data[data.length - 2] === '\r' && data[data.length - 1] === '\n') data = data.substring(0, data.length - 2); if (data[data.length - 2] === '\r' && data[data.length - 1] === '\n') data = data.substring(0, data.length - 2);
if (data[data.length - 2] === '\n' && data[data.length - 1] === '\r') data = data.substring(0, data.length - 2); if (data[data.length - 2] === '\n' && data[data.length - 1] === '\r') data = data.substring(0, data.length - 2);
if (data[data.length - 1] === '\r') data = data.substring(0, data.length - 1); if (data[data.length - 1] === '\r') data = data.substring(0, data.length - 1);
if (data.indexOf('[err') !== -1) { if (data.indexOf('[err') !== -1) {
adapter.log.error(data); adapter.log.error(data);
} else if (data.indexOf('[warn]') !== -1) { } else if (data.indexOf('[warn]') !== -1) {
adapter.log.warn(data); adapter.log.warn(data);
} else { } else {
adapter.log.debug(data); adapter.log.debug(data);
} }
}); });
redProcess.stderr.on('data', function (data) { redProcess.stderr.on('data', function (data) {
if (!data) return; if (!data) return;
if (data[0]) { if (data[0]) {
let text = ''; let text = '';
for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
text += String.fromCharCode(data[i]); text += String.fromCharCode(data[i]);
} }
data = text; data = text;
} }
if (data.indexOf && data.indexOf('[warn]') === -1) { if (data.indexOf && data.indexOf('[warn]') === -1) {
adapter.log.warn(data); adapter.log.warn(data);
} else { } else {
adapter.log.error(JSON.stringify(data)); adapter.log.error(JSON.stringify(data));
} }
}); });
redProcess.on('exit', function (exitCode) { redProcess.on('exit', function (exitCode) {
adapter.log.info('node-red exited with ' + exitCode); adapter.log.info('node-red exited with ' + exitCode);
redProcess = null; redProcess = null;
if (!stopping) { if (!stopping) {
setTimeout(startNodeRed, 5000); setTimeout(startNodeRed, 5000);
} }
}); });
} }
function setOption(line, option, value) { function setOption(line, option, value) {
const toFind = "'%%" + option + "%%'"; const toFind = "'%%" + option + "%%'";
const pos = line.indexOf(toFind); const pos = line.indexOf(toFind);
if (pos !== -1) { if (pos !== -1) {
return line.substring(0, pos) + ((value !== undefined) ? value : (adapter.config[option] === null || adapter.config[option] === undefined) ? '' : adapter.config[option]) + line.substring(pos + toFind.length); return line.substring(0, pos) + ((value !== undefined) ? value : (adapter.config[option] === null || adapter.config[option] === undefined) ? '' : adapter.config[option]) + line.substring(pos + toFind.length);
} }
return line; return line;
} }
function writeSettings() { function writeSettings() {
const config = JSON.stringify(adapter.systemConfig); const config = JSON.stringify(adapter.systemConfig);
const text = fs.readFileSync(__dirname + '/settings.js').toString(); const text = fs.readFileSync(__dirname + '/settings.js').toString();
const lines = text.split('\n'); const lines = text.split('\n');
let npms = '\r\n'; let npms = '\r\n';
const dir = __dirname.replace(/\\/g, '/') + '/node_modules/'; const dir = __dirname.replace(/\\/g, '/') + '/node_modules/';
const nodesDir = '"' + __dirname.replace(/\\/g, '/') + '/nodes/"'; const nodesDir = '"' + __dirname.replace(/\\/g, '/') + '/nodes/"';
const bind = '"' + (adapter.config.bind || '0.0.0.0') + '"'; const bind = '"' + (adapter.config.bind || '0.0.0.0') + '"';
const auth = adapter.config.user && adapter.config.pass ? JSON.stringify({user: adapter.config.user, pass: adapter.config.pass}) : '""'; const auth = adapter.config.user && adapter.config.pass ? JSON.stringify({user: adapter.config.user, pass: adapter.config.pass}) : '""';
const pass = '"' + adapter.config.pass + '"'; const pass = '"' + adapter.config.pass + '"';
for (let a = 0; a < additional.length; a++) { const ui_auth = adapter.config.ui_user && adapter.config.ui_pass ? JSON.stringify({ui_user: adapter.config.ui_user, ui_pass: adapter.config.ui_pass}) : '""';
if (additional[a].match(/^node-red-/)) continue; const ui_pass = '"' + adapter.config.ui_pass + '"';
npms += ' "' + additional[a] + '": require("' + dir + additional[a] + '")';
if (a !== additional.length - 1) {
npms += ', \r\n'; for (let a = 0; a < additional.length; a++) {
} if (additional[a].match(/^node-red-/)) continue;
} npms += ' "' + additional[a] + '": require("' + dir + additional[a] + '")';
if (a !== additional.length - 1) {
// update from 1.0.1 (new convert-option) npms += ', \r\n';
if (adapter.config.valueConvert === null || }
adapter.config.valueConvert === undefined || }
adapter.config.valueConvert === '' ||
adapter.config.valueConvert === 'true' || // update from 1.0.1 (new convert-option)
adapter.config.valueConvert === '1' || if (adapter.config.valueConvert === null ||
adapter.config.valueConvert === 1) { adapter.config.valueConvert === undefined ||
adapter.config.valueConvert = true; adapter.config.valueConvert === '' ||
} adapter.config.valueConvert === 'true' ||
if (adapter.config.valueConvert === 0 || adapter.config.valueConvert === '1' ||
adapter.config.valueConvert === '0' || adapter.config.valueConvert === 1) {
adapter.config.valueConvert === 'false') { adapter.config.valueConvert = true;
adapter.config.valueConvert = false; }
} if (adapter.config.valueConvert === 0 ||
for (let i = 0; i < lines.length; i++) { adapter.config.valueConvert === '0' ||
lines[i] = setOption(lines[i], 'port'); adapter.config.valueConvert === 'false') {
lines[i] = setOption(lines[i], 'auth', auth); adapter.config.valueConvert = false;
lines[i] = setOption(lines[i], 'pass', pass); }
lines[i] = setOption(lines[i], 'bind', bind); for (let i = 0; i < lines.length; i++) {
lines[i] = setOption(lines[i], 'port'); lines[i] = setOption(lines[i], 'port');
lines[i] = setOption(lines[i], 'instance', adapter.instance); lines[i] = setOption(lines[i], 'auth', auth);
lines[i] = setOption(lines[i], 'config', config); lines[i] = setOption(lines[i], 'pass', pass);
lines[i] = setOption(lines[i], 'functionGlobalContext', npms); lines[i] = setOption(lines[i], 'bind', bind);
lines[i] = setOption(lines[i], 'nodesdir', nodesDir); lines[i] = setOption(lines[i], 'port');
lines[i] = setOption(lines[i], 'httpRoot'); lines[i] = setOption(lines[i], 'ui_auth', ui_auth);
lines[i] = setOption(lines[i], 'credentialSecret', secret); lines[i] = setOption(lines[i], 'ui_pass', ui_pass);
lines[i] = setOption(lines[i], 'valueConvert'); lines[i] = setOption(lines[i], 'instance', adapter.instance);
} lines[i] = setOption(lines[i], 'config', config);
fs.writeFileSync(userdataDir + 'settings.js', lines.join('\n')); lines[i] = setOption(lines[i], 'functionGlobalContext', npms);
} lines[i] = setOption(lines[i], 'nodesdir', nodesDir);
lines[i] = setOption(lines[i], 'httpRoot');
function writeStateList(callback) { lines[i] = setOption(lines[i], 'credentialSecret', secret);
adapter.getForeignObjects('*', 'state', ['rooms', 'functions'], function (err, obj) { lines[i] = setOption(lines[i], 'valueConvert');
// remove native information }
for (const i in obj) { fs.writeFileSync(userdataDir + 'settings.js', lines.join('\n'));
if (obj.hasOwnProperty(i) && obj[i].native) { }
delete obj[i].native;
} function writeStateList(callback) {
} adapter.getForeignObjects('*', 'state', ['rooms', 'functions'], function (err, obj) {
// remove native information
fs.writeFileSync(nodePath + '/public/yunkong2.json', JSON.stringify(obj)); for (const i in obj) {
if (callback) callback(err); if (obj.hasOwnProperty(i) && obj[i].native) {
}); delete obj[i].native;
} }
}
function saveObjects() {
if (saveTimer) { fs.writeFileSync(nodePath + '/public/yunkong2.json', JSON.stringify(obj));
clearTimeout(saveTimer); if (callback) callback(err);
saveTimer = null; });
} }
let cred = undefined;
let flows = undefined; function saveObjects() {
if (saveTimer) {
try { clearTimeout(saveTimer);
if (fs.existsSync(userdataDir + 'flows_cred.json')) { saveTimer = null;
cred = JSON.parse(fs.readFileSync(userdataDir + 'flows_cred.json')); }
} let cred = undefined;
} catch(e) { let flows = undefined;
adapter.log.error('Cannot save ' + userdataDir + 'flows_cred.json');
} try {
try { if (fs.existsSync(userdataDir + 'flows_cred.json')) {
if (fs.existsSync(userdataDir + 'flows.json')) { cred = JSON.parse(fs.readFileSync(userdataDir + 'flows_cred.json'));
flows = JSON.parse(fs.readFileSync(userdataDir + 'flows.json')); }
} } catch(e) {
} catch(e) { adapter.log.error('Cannot save ' + userdataDir + 'flows_cred.json');
adapter.log.error('Cannot save ' + userdataDir + 'flows.json'); }
} try {
//upload it to config if (fs.existsSync(userdataDir + 'flows.json')) {
adapter.setObject('flows', { flows = JSON.parse(fs.readFileSync(userdataDir + 'flows.json'));
common: { }
name: 'Flows for node-red' } catch(e) {
}, adapter.log.error('Cannot save ' + userdataDir + 'flows.json');
native: { }
cred: cred, //upload it to config
flows: flows adapter.setObject('flows', {
}, common: {
type: 'config' name: 'Flows for node-red'
}, function () { },
adapter.log.info('Save ' + userdataDir + 'flows.json'); native: {
}); cred: cred,
} flows: flows
},
function syncPublic(path) { type: 'config'
if (!path) path = '/public'; }, function () {
adapter.log.info('Save ' + userdataDir + 'flows.json');
const dir = fs.readdirSync(__dirname + path); });
}
if (!fs.existsSync(nodePath + path)) {
fs.mkdirSync(nodePath + path); function syncPublic(path) {
} if (!path) path = '/public';
for (let i = 0; i < dir.length; i++) { const dir = fs.readdirSync(__dirname + path);
const stat = fs.statSync(__dirname + path + '/' + dir[i]);
if (stat.isDirectory()) { if (!fs.existsSync(nodePath + path)) {
syncPublic(path + '/' + dir[i]); fs.mkdirSync(nodePath + path);
} else { }
if (!fs.existsSync(nodePath + path + '/' + dir[i])) {
fs.createReadStream(__dirname + path + '/' + dir[i]).pipe(fs.createWriteStream(nodePath + path + '/' + dir[i])); for (let i = 0; i < dir.length; i++) {
} const stat = fs.statSync(__dirname + path + '/' + dir[i]);
} if (stat.isDirectory()) {
} syncPublic(path + '/' + dir[i]);
} } else {
if (!fs.existsSync(nodePath + path + '/' + dir[i])) {
function installNotifierFlows(isFirst) { fs.createReadStream(__dirname + path + '/' + dir[i]).pipe(fs.createWriteStream(nodePath + path + '/' + dir[i]));
if (!notificationsFlows) { }
if (fs.existsSync(userdataDir + 'flows.json')) { }
if (!isFirst) saveObjects(); }
// monitor project file }
notificationsFlows = new Notify([userdataDir + 'flows.json']);
notificationsFlows.on('change', function () { function installNotifierFlows(isFirst) {
if (saveTimer) clearTimeout(saveTimer); if (!notificationsFlows) {
saveTimer = setTimeout(saveObjects, 500); if (fs.existsSync(userdataDir + 'flows.json')) {
}); if (!isFirst) saveObjects();
} else { // monitor project file
// Try to install notifier every 10 seconds till the file will be created notificationsFlows = new Notify([userdataDir + 'flows.json']);
setTimeout(function () { notificationsFlows.on('change', function () {
installNotifierFlows(); if (saveTimer) clearTimeout(saveTimer);
}, 10000); saveTimer = setTimeout(saveObjects, 500);
} });
} } else {
} // Try to install notifier every 10 seconds till the file will be created
setTimeout(function () {
function installNotifierCreds(isFirst) { installNotifierFlows();
if (!notificationsCreds) { }, 10000);
if (fs.existsSync(userdataDir + 'flows_cred.json')) { }
if (!isFirst) saveObjects(); }
// monitor project file }
notificationsCreds = new Notify([userdataDir + 'flows_cred.json']);
notificationsCreds.on('change', function () { function installNotifierCreds(isFirst) {
if (saveTimer) clearTimeout(saveTimer); if (!notificationsCreds) {
saveTimer = setTimeout(saveObjects, 500); if (fs.existsSync(userdataDir + 'flows_cred.json')) {
}); if (!isFirst) saveObjects();
} else { // monitor project file
// Try to install notifier every 10 seconds till the file will be created notificationsCreds = new Notify([userdataDir + 'flows_cred.json']);
setTimeout(function () { notificationsCreds.on('change', function () {
installNotifierCreds(); if (saveTimer) clearTimeout(saveTimer);
}, 10000); saveTimer = setTimeout(saveObjects, 500);
} });
} } else {
} // Try to install notifier every 10 seconds till the file will be created
setTimeout(function () {
function main() { installNotifierCreds();
// Find userdata directory }, 10000);
}
// normally /opt/yunkong2/node_modules/yunkong2.js-controller }
// but can be /example/yunkong2.js-controller }
const controllerDir = utils.controllerDir;
const parts = controllerDir.split('/'); function main() {
if (parts.length > 1 && parts[parts.length - 2] === 'node_modules') { // Find userdata directory
parts.splice(parts.length - 2, 2);
userdataDir = parts.join('/'); // normally /opt/yunkong2/node_modules/yunkong2.js-controller
userdataDir += '/yunkong2-data/node-red/'; // but can be /example/yunkong2.js-controller
} const controllerDir = utils.controllerDir;
const parts = controllerDir.split('/');
// create userdata directory if (parts.length > 1 && parts[parts.length - 2] === 'node_modules') {
if (!fs.existsSync(userdataDir)) { parts.splice(parts.length - 2, 2);
fs.mkdirSync(userdataDir); userdataDir = parts.join('/');
} userdataDir += '/yunkong2-data/node-red/';
}
syncPublic();
// create userdata directory
// Read configuration if (!fs.existsSync(userdataDir)) {
adapter.getObject('flows', function (err, obj) { fs.mkdirSync(userdataDir);
if (obj && obj.native && obj.native.cred) { }
const c = JSON.stringify(obj.native.cred);
// If really not empty syncPublic();
if (c !== '{}' && c !== '[]') {
fs.writeFileSync(userdataDir + 'flows_cred.json', JSON.stringify(obj.native.cred)); // Read configuration
} adapter.getObject('flows', function (err, obj) {
} if (obj && obj.native && obj.native.cred) {
if (obj && obj.native && obj.native.flows) { const c = JSON.stringify(obj.native.cred);
const f = JSON.stringify(obj.native.flows); // If really not empty
// If really not empty if (c !== '{}' && c !== '[]') {
if (f !== '{}' && f !== '[]') { fs.writeFileSync(userdataDir + 'flows_cred.json', JSON.stringify(obj.native.cred));
fs.writeFileSync(userdataDir + 'flows.json', JSON.stringify(obj.native.flows)); }
} }
} if (obj && obj.native && obj.native.flows) {
const f = JSON.stringify(obj.native.flows);
installNotifierFlows(true); // If really not empty
installNotifierCreds(true); if (f !== '{}' && f !== '[]') {
fs.writeFileSync(userdataDir + 'flows.json', JSON.stringify(obj.native.flows));
adapter.getForeignObject('system.config', (err, obj) => { }
if (obj && obj.native && obj.native.secret) { }
//noinspection JSUnresolvedVariable
secret = obj.native.secret; installNotifierFlows(true);
} installNotifierCreds(true);
// Create settings for node-red
writeSettings(); adapter.getForeignObject('system.config', (err, obj) => {
writeStateList(() => startNodeRed()); if (obj && obj.native && obj.native.secret) {
}); //noinspection JSUnresolvedVariable
}); secret = obj.native.secret;
} }
// Create settings for node-red
writeSettings();
writeStateList(() => startNodeRed());
});
});
}