更新 main.js
This commit is contained in:
parent
36025dac53
commit
524596ac25
388
main.js
388
main.js
@ -726,246 +726,6 @@ function parseConfig(callback) {
|
|||||||
iterateAddresses(true, deviceId, device.coils, 'coils', 'coils', localOptions);
|
iterateAddresses(true, deviceId, device.coils, 'coils', 'coils', localOptions);
|
||||||
iterateAddresses(false, deviceId, device.inputRegs, 'inputRegisters', 'inputRegs', localOptions);
|
iterateAddresses(false, deviceId, device.inputRegs, 'inputRegisters', 'inputRegs', localOptions);
|
||||||
iterateAddresses(false, deviceId, device.holdingRegs, 'holdingRegisters', 'holdingRegs', localOptions);
|
iterateAddresses(false, deviceId, device.holdingRegs, 'holdingRegisters', 'holdingRegs', localOptions);
|
||||||
/*let regs = adapter.config.disInputs;
|
|
||||||
let res = device.disInputs;
|
|
||||||
if (regs && regs.length) {
|
|
||||||
res.addressLow = 0xFFFFFFFF;
|
|
||||||
res.addressHigh = 0;
|
|
||||||
for (i = regs.length - 1; i >= 0; i--) {
|
|
||||||
address = parseInt(regs[i].address, 10);
|
|
||||||
|
|
||||||
if (address < 0) {
|
|
||||||
adapter.log.error('Invalid discrete inputs address: ' + address);
|
|
||||||
regs.splice(i, 1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
regs[i].id = 'discreteInputs.';
|
|
||||||
if (showAliases) {
|
|
||||||
regs[i].id += address2alias('disInputs', address, directAddresses, res.offset, options.multiDeviceId, regs[i].deviceId);
|
|
||||||
} else {
|
|
||||||
regs[i].id += address;
|
|
||||||
}
|
|
||||||
regs[i].id += (regs[i].name ? '_' + (regs[i].name.replace('.', '_').replace(' ', '_')) : '');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (regs.length) {
|
|
||||||
regs.sort(sortByAddress);
|
|
||||||
if (!doNotRoundAddressToWord) {
|
|
||||||
res.addressLow = Math.floor(regs[0].address / 16) * 16;
|
|
||||||
}
|
|
||||||
res.addressHigh = regs[regs.length - 1].address;
|
|
||||||
res.length = res.addressHigh - res.addressLow + 1;
|
|
||||||
if (!doNotRoundAddressToWord && (res.length % 16)) {
|
|
||||||
res.length = (Math.floor(res.length / 16) + 1) * 16;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
res.length = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Coils
|
|
||||||
regs = adapter.config.coils;
|
|
||||||
res = device.coils;
|
|
||||||
if (regs && regs.length) {
|
|
||||||
res.addressLow = 0xFFFFFFFF;
|
|
||||||
res.addressHigh = 0;
|
|
||||||
for (i = regs.length - 1; i >= 0; i--) {
|
|
||||||
address = parseInt(regs[i].address, 10);
|
|
||||||
|
|
||||||
if (address < 0) {
|
|
||||||
adapter.log.error('Invalid coils address: ' + address);
|
|
||||||
regs.splice(i, 1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
regs[i].id = 'coils.';
|
|
||||||
if (showAliases) {
|
|
||||||
regs[i].id += address2alias('coils', address, directAddresses, res.offset, options.multiDeviceId, regs[i].deviceId);
|
|
||||||
} else {
|
|
||||||
regs[i].id += address;
|
|
||||||
}
|
|
||||||
regs[i].id += (regs[i].name ? '_' + (regs[i].name.replace('.', '_').replace(' ', '_')) : '');
|
|
||||||
|
|
||||||
if (options.config.slave || regs[i].poll) {
|
|
||||||
if (address < res.addressLow) res.addressLow = address;
|
|
||||||
if (address > res.addressHigh) res.addressHigh = address;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (regs.length) {
|
|
||||||
regs.sort(sortByAddress);
|
|
||||||
if (!doNotRoundAddressToWord) {
|
|
||||||
res.addressLow = Math.floor(res.addressLow / 16) * 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
res.length = res.addressHigh - res.addressLow + 1;
|
|
||||||
if (!doNotRoundAddressToWord && (res.length % 16)) {
|
|
||||||
res.length = (Math.floor(res.length / 16) + 1) * 16;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
regs.length = 0;
|
|
||||||
}
|
|
||||||
if (regs.mapping) {
|
|
||||||
for (i = 0; i < regs.length; i++) {
|
|
||||||
regs.mapping[regs[i].address - res.addressLow] = adapter.namespace + '.' + regs[i].id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Input registers
|
|
||||||
regs = adapter.config.inputRegs;
|
|
||||||
res = device.inputRegs;
|
|
||||||
if (regs.length) {
|
|
||||||
for (i = regs.length - 1; i >= 0; i--) {
|
|
||||||
address = parseInt(regs[i].address, 10);
|
|
||||||
if (address < 0) {
|
|
||||||
adapter.log.error('Invalid input register address: ' + address);
|
|
||||||
regs.splice(i, 1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
regs[i].type = regs[i].type || 'uint16be';
|
|
||||||
regs[i].offset = parseFloat(regs[i].offset) || 0;
|
|
||||||
regs[i].factor = parseFloat(regs[i].factor) || 1;
|
|
||||||
if (regs[i].type === 'string') {
|
|
||||||
regs[i].len = parseInt(regs[i].len) || 1;
|
|
||||||
} else {
|
|
||||||
regs[i].len = type_items_len[regs[i].type];
|
|
||||||
}
|
|
||||||
regs[i].len = regs[i].len || 1;
|
|
||||||
|
|
||||||
if (!regs[i].len) regs[i].len = parseInt(regs[i].len) || 1;
|
|
||||||
|
|
||||||
regs[i].id = 'inputRegisters.';
|
|
||||||
if (showAliases) {
|
|
||||||
regs[i].id += address2alias('inputRegs', address, directAddresses, res.offset, options.multiDeviceId, regs[i].deviceId);
|
|
||||||
} else {
|
|
||||||
regs[i].id += address;
|
|
||||||
}
|
|
||||||
|
|
||||||
regs[i].id += (regs[i].name ? '_' + (regs[i].name.replace('.', '_').replace(' ', '_')) : '');
|
|
||||||
}
|
|
||||||
|
|
||||||
lastAddress = null;
|
|
||||||
startIndex = 0;
|
|
||||||
for (i = 0; i < regs.length; i++) {
|
|
||||||
address = parseInt(regs[i].address, 10);
|
|
||||||
if (address < 0) continue;
|
|
||||||
if (lastAddress === null) {
|
|
||||||
startIndex = i;
|
|
||||||
blockStart = address;
|
|
||||||
lastAddress = address + regs[i].len;
|
|
||||||
}
|
|
||||||
|
|
||||||
// try to detect next block
|
|
||||||
if (res.blocks) {
|
|
||||||
if ((address - lastAddress > 10 && regs[i].len < 10) || (lastAddress - blockStart >= options.config.maxBlock)) {
|
|
||||||
if (res.blocks.map(obj => obj.start).indexOf(blockStart) === -1) {
|
|
||||||
res.blocks.push({start: blockStart, count: lastAddress - blockStart, startIndex: startIndex, endIndex: i});
|
|
||||||
}
|
|
||||||
blockStart = address;
|
|
||||||
startIndex = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lastAddress = address + regs[i].len;
|
|
||||||
}
|
|
||||||
if (res.blocks && res.blocks.map(obj => obj.start).indexOf(blockStart) === -1) {
|
|
||||||
res.blocks.push({start: blockStart, count: lastAddress - blockStart, startIndex: startIndex, endIndex: i});
|
|
||||||
}
|
|
||||||
if (regs.length) {
|
|
||||||
res.addressLow = regs[0].address;
|
|
||||||
res.addressHigh = regs[regs.length - 1].address + regs[regs.length - 1].len;
|
|
||||||
res.length = res.addressHigh - res.addressLow;
|
|
||||||
} else {
|
|
||||||
regs.length = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Holding registers
|
|
||||||
regs = adapter.config.holdingRegs;
|
|
||||||
res = device.holdingRegs;
|
|
||||||
if (regs.length) {
|
|
||||||
res.addressLow = 0xFFFFFFFF;
|
|
||||||
res.addressHigh = 0;
|
|
||||||
|
|
||||||
for (i = regs.length - 1; i >= 0; i--) {
|
|
||||||
address = parseInt(regs[i].address, 10);
|
|
||||||
|
|
||||||
if (address < 0) {
|
|
||||||
adapter.log.error('Invalid holding register address: ' + address);
|
|
||||||
regs.splice(i, 1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
regs[i].type = regs[i].type || 'uint16be';
|
|
||||||
regs[i].offset = parseFloat(regs[i].offset) || 0;
|
|
||||||
regs[i].factor = parseFloat(regs[i].factor) || 1;
|
|
||||||
if (regs[i].type === 'string') {
|
|
||||||
regs[i].len = parseInt(regs[i].len) || 1;
|
|
||||||
} else {
|
|
||||||
regs[i].len = type_items_len[regs[i].type];
|
|
||||||
}
|
|
||||||
regs[i].len = regs[i].len || 1;
|
|
||||||
|
|
||||||
regs[i].id = 'holdingRegisters.';
|
|
||||||
if (showAliases) {
|
|
||||||
regs[i].id += address2alias('holdingRegs', address, directAddresses, res.offset, options.multiDeviceId, regs[i].deviceId);
|
|
||||||
} else {
|
|
||||||
regs[i].id += address;
|
|
||||||
}
|
|
||||||
regs[i].id += (regs[i].name ? '_' + (regs[i].name.replace('.', '_').replace(' ', '_')) : '');
|
|
||||||
|
|
||||||
// collect cyclic write registers
|
|
||||||
if (regs[i].cw) {
|
|
||||||
res.cyclicWrite.push(adapter.namespace + '.' + regs[i].id);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options.config.slave || regs[i].poll) {
|
|
||||||
if (address < res.addressLow) res.addressLow = address;
|
|
||||||
if (address + regs[i].len > res.addressHigh) res.addressHigh = address + regs[i].len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
lastAddress = null;
|
|
||||||
startIndex = 0;
|
|
||||||
for (i = 0; i < regs.length; i++) {
|
|
||||||
address = parseInt(regs[i].address, 10);
|
|
||||||
if (address < 0) continue;
|
|
||||||
if (lastAddress === null) {
|
|
||||||
startIndex = i;
|
|
||||||
blockStart = address;
|
|
||||||
lastAddress = address + regs[i].len;
|
|
||||||
}
|
|
||||||
// try to detect next block
|
|
||||||
if (res.blocks) {
|
|
||||||
if ((address - lastAddress > 10 && regs[i].len < 10) || (lastAddress - blockStart >= options.config.maxBlock)) {
|
|
||||||
if (res.blocks.map(obj => obj.start).indexOf(blockStart) === -1) {
|
|
||||||
res.blocks.push({start: blockStart, count: lastAddress - blockStart, startIndex: startIndex, endIndex: i});
|
|
||||||
}
|
|
||||||
blockStart = address;
|
|
||||||
startIndex = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lastAddress = address + regs[i].len;
|
|
||||||
}
|
|
||||||
if (res.blocks && res.blocks.map(obj => obj.start).indexOf(blockStart) === -1) {
|
|
||||||
res.blocks.push({start: blockStart, count: lastAddress - blockStart, startIndex: startIndex, endIndex: i});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (regs.length) {
|
|
||||||
res.length = res.addressHigh - res.addressLow;
|
|
||||||
} else {
|
|
||||||
res.length = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
lastAddress = null;
|
|
||||||
|
|
||||||
if (regs.mapping) {
|
|
||||||
for (i = 0; i < regs.length; i++) {
|
|
||||||
res.mapping[regs[i].address - res.addressLow] = adapter.namespace + '.' + regs[i].id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// ------------- create states and objects ----------------------------
|
// ------------- create states and objects ----------------------------
|
||||||
checkObjects(adapter.config, 'disInputs', 'discreteInputs', 'Discrete inputs', tasks, newObjects);
|
checkObjects(adapter.config, 'disInputs', 'discreteInputs', 'Discrete inputs', tasks, newObjects);
|
||||||
@ -980,152 +740,6 @@ function parseConfig(callback) {
|
|||||||
device.holdingRegs.fullIds = adapter.config.holdingRegs.filter(e => e.deviceId === deviceId).map(e => e.fullId);
|
device.holdingRegs.fullIds = adapter.config.holdingRegs.filter(e => e.deviceId === deviceId).map(e => e.fullId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*for (i = 0; regs.length > i; i++) {
|
|
||||||
id = adapter.namespace + '.' + regs[i].id;
|
|
||||||
regs[i].fullId = id;
|
|
||||||
objects[id] = {
|
|
||||||
_id: regs[i].id,
|
|
||||||
type: 'state',
|
|
||||||
common: {
|
|
||||||
name: regs[i].description,
|
|
||||||
role: regs[i].role,
|
|
||||||
type: 'boolean',
|
|
||||||
read: true,
|
|
||||||
write: false,
|
|
||||||
def: false
|
|
||||||
},
|
|
||||||
native: {
|
|
||||||
regType: 'disInputs',
|
|
||||||
address: regs[i].address
|
|
||||||
}
|
|
||||||
};
|
|
||||||
tasks.push({
|
|
||||||
id: regs[i].id,
|
|
||||||
name: 'add',
|
|
||||||
obj: objects[id]
|
|
||||||
});
|
|
||||||
tasks.push({
|
|
||||||
id: id,
|
|
||||||
name: 'syncEnums',
|
|
||||||
obj: regs[i].room
|
|
||||||
});
|
|
||||||
newObjects.push(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
regs = adapter.config.coils;
|
|
||||||
for (i = 0; regs.length > i; i++) {
|
|
||||||
id = adapter.namespace + '.' + regs[i].id;
|
|
||||||
regs[i].fullId = id;
|
|
||||||
objects[id] = {
|
|
||||||
_id: regs[i].id,
|
|
||||||
type: 'state',
|
|
||||||
common: {
|
|
||||||
name: regs[i].description,
|
|
||||||
role: regs[i].role,
|
|
||||||
type: 'boolean',
|
|
||||||
read: true,
|
|
||||||
write: true,
|
|
||||||
def: false
|
|
||||||
},
|
|
||||||
native: {
|
|
||||||
regType: 'coils',
|
|
||||||
address: regs[i].address,
|
|
||||||
|
|
||||||
poll: regs[i].poll,
|
|
||||||
wp: regs[i].wp
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
tasks.push({
|
|
||||||
id: regs[i].id,
|
|
||||||
name: 'add',
|
|
||||||
obj: objects[id]
|
|
||||||
});
|
|
||||||
tasks.push({
|
|
||||||
id: id,
|
|
||||||
name: 'syncEnums',
|
|
||||||
obj: regs[i].room
|
|
||||||
});
|
|
||||||
newObjects.push(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
regs = adapter.config.inputRegs;
|
|
||||||
for (i = 0; regs.length > i; i++) {
|
|
||||||
id = adapter.namespace + '.' + regs[i].id;
|
|
||||||
regs[i].fullId = id;
|
|
||||||
objects[id] = {
|
|
||||||
_id: regs[i].id,
|
|
||||||
type: 'state',
|
|
||||||
common: {
|
|
||||||
name: regs[i].description,
|
|
||||||
role: regs[i].role,
|
|
||||||
type: 'number',
|
|
||||||
read: true,
|
|
||||||
write: false,
|
|
||||||
def: 0,
|
|
||||||
unit: regs[i].unit || ''
|
|
||||||
},
|
|
||||||
native: {
|
|
||||||
regType: 'inputRegs',
|
|
||||||
address: regs[i].address,
|
|
||||||
type: regs[i].type,
|
|
||||||
len: regs[i].len,
|
|
||||||
offset: regs[i].offset,
|
|
||||||
factor: regs[i].factor
|
|
||||||
}
|
|
||||||
};
|
|
||||||
tasks.push({
|
|
||||||
id: regs[i].id,
|
|
||||||
name: 'add',
|
|
||||||
obj: objects[id]
|
|
||||||
});
|
|
||||||
tasks.push({
|
|
||||||
id: id,
|
|
||||||
name: 'syncEnums',
|
|
||||||
obj: regs[i].room
|
|
||||||
});
|
|
||||||
newObjects.push(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
regs = adapter.config.holdingRegs;
|
|
||||||
for (i = 0; regs.length > i; i++) {
|
|
||||||
id = adapter.namespace + '.' + regs[i].id;
|
|
||||||
regs[i].fullId = id;
|
|
||||||
objects[id] = {
|
|
||||||
_id: regs[i].id,
|
|
||||||
type: 'state',
|
|
||||||
common: {
|
|
||||||
name: regs[i].description,
|
|
||||||
role: regs[i].role,
|
|
||||||
type: 'number',
|
|
||||||
read: true,
|
|
||||||
write: true,
|
|
||||||
def: 0,
|
|
||||||
unit: regs[i].unit || ''
|
|
||||||
},
|
|
||||||
native: {
|
|
||||||
regType: 'holdingRegs',
|
|
||||||
address: regs[i].address,
|
|
||||||
poll: regs[i].poll,
|
|
||||||
// wp: adapter.config.coils[i].wp
|
|
||||||
type: regs[i].type,
|
|
||||||
len: regs[i].len,
|
|
||||||
offset: regs[i].offset,
|
|
||||||
factor: regs[i].factor
|
|
||||||
}
|
|
||||||
};
|
|
||||||
tasks.push({
|
|
||||||
id: regs[i].id,
|
|
||||||
name: 'add',
|
|
||||||
obj: objects[id]
|
|
||||||
});
|
|
||||||
tasks.push({
|
|
||||||
id: id,
|
|
||||||
name: 'syncEnums',
|
|
||||||
obj: regs[i].room
|
|
||||||
});
|
|
||||||
newObjects.push(id);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
if (!options.config.multiDeviceId) {
|
if (!options.config.multiDeviceId) {
|
||||||
break;
|
break;
|
||||||
@ -1194,6 +808,7 @@ function parseConfig(callback) {
|
|||||||
function main() {
|
function main() {
|
||||||
parseConfig(options => {
|
parseConfig(options => {
|
||||||
let Modbus;
|
let Modbus;
|
||||||
|
/*
|
||||||
if (options.config.slave) {
|
if (options.config.slave) {
|
||||||
Modbus = require(__dirname + '/lib/slave');
|
Modbus = require(__dirname + '/lib/slave');
|
||||||
} else {
|
} else {
|
||||||
@ -1201,6 +816,7 @@ function main() {
|
|||||||
}
|
}
|
||||||
modbus = new Modbus(options, adapter);
|
modbus = new Modbus(options, adapter);
|
||||||
modbus.start();
|
modbus.start();
|
||||||
|
*/
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user