knxultimate
Version:
KNX IP protocol implementation for Node. This is the ENGINE of Node-Red KNX-Ultimate node.
73 lines • 2.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateKNXAddress = exports.splitIP = void 0;
function splitIP(ip, name = 'ip') {
if (ip == null) {
throw new Error(`${name} undefined`);
}
const m = ip.match(/(\d+)\.(\d+)\.(\d+)\.(\d+)/);
if (m === null) {
throw new Error(`Invalid ${name} format - ${ip}`);
}
return m;
}
exports.splitIP = splitIP;
function validateKNXAddress(address, isGroup = false) {
if (typeof address === 'string') {
const digits = address.split(/[./]/);
if (digits.length < 2 || digits.length > 3) {
throw new Error(`Invalid address format: ${address} Only 3 level addresses are allowed`);
}
if ((digits.length === 3 && address === '0/0/0') ||
(digits.length === 1 && address === '0/0')) {
throw new Error(`Invalid address: ${address}`);
}
let count = 0;
let newAddress = 0;
for (let i = digits.length - 1; i >= 0; i--, count++) {
const digit = Number(digits[i]);
if (isGroup && digits.length === 3) {
if (isNaN(digit) ||
(count === 2 && digit > 31) ||
(count === 1 && digit > 7) ||
(count === 0 && digit > 255)) {
throw new Error(`Invalid 3 levels GA digit ${digit} inside address: ${address}`);
}
}
else if (isGroup && digits.length === 2) {
if (isNaN(digit) ||
(count === 1 && digit > 31) ||
(count === 0 && digit > 2047)) {
throw new Error(`Invalid 2 levels GA digit ${digit} inside address: ${address}`);
}
}
else {
if (isNaN(digit) ||
(count > 1 && digit > 15) ||
(count === 0 && digit > 255)) {
throw new Error(`Invalid Individual Address digit ${digit} inside address: ${address}`);
}
}
if (count === 0) {
newAddress = digit;
}
else if (count === 1) {
newAddress += digit << 8;
}
else if (isGroup) {
newAddress += digit << 11;
}
else {
newAddress += digit << 12;
}
}
return newAddress;
}
const _address = Number(address);
if (isNaN(_address) || _address < 0 || _address > 0xffff) {
throw new Error(`Invalid address ${address}`);
}
return _address;
}
exports.validateKNXAddress = validateKNXAddress;
//# sourceMappingURL=KNXUtils.js.map