knxultimate
Version:
KNX IP protocol implementation for Node. This is the ENGINE of Node-Red KNX-Ultimate node.
219 lines • 9.21 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.dpts = void 0;
exports.resolve = resolve;
exports.populateAPDU = populateAPDU;
exports.fromBuffer = fromBuffer;
const util = __importStar(require("util"));
const KnxLog_1 = require("../KnxLog");
const utils_1 = require("../utils");
const dpt1_1 = __importDefault(require("./dpt1"));
const dpt2_1 = __importDefault(require("./dpt2"));
const dpt3_1 = __importDefault(require("./dpt3"));
const dpt4_1 = __importDefault(require("./dpt4"));
const dpt5_1 = __importDefault(require("./dpt5"));
const dpt6_1 = __importDefault(require("./dpt6"));
const dpt7_1 = __importDefault(require("./dpt7"));
const dpt8_1 = __importDefault(require("./dpt8"));
const dpt9_1 = __importDefault(require("./dpt9"));
const dpt10_1 = __importDefault(require("./dpt10"));
const dpt11_1 = __importDefault(require("./dpt11"));
const dpt12_1 = __importDefault(require("./dpt12"));
const dpt13_1 = __importDefault(require("./dpt13"));
const dpt14_1 = __importDefault(require("./dpt14"));
const dpt15_1 = __importDefault(require("./dpt15"));
const dpt16_1 = __importDefault(require("./dpt16"));
const dpt17_1 = __importDefault(require("./dpt17"));
const dpt18_1 = __importDefault(require("./dpt18"));
const dpt19_1 = __importDefault(require("./dpt19"));
const dpt20_1 = __importDefault(require("./dpt20"));
const dpt21_1 = __importDefault(require("./dpt21"));
const dpt22_1 = __importDefault(require("./dpt22"));
const dpt28_1 = __importDefault(require("./dpt28"));
const dpt29_1 = __importDefault(require("./dpt29"));
const dpt213_1 = __importDefault(require("./dpt213"));
const dpt222_1 = __importDefault(require("./dpt222"));
const dpt232_1 = __importDefault(require("./dpt232"));
const dpt235_1 = __importDefault(require("./dpt235"));
const dpt237_1 = __importDefault(require("./dpt237"));
const dpt238_1 = __importDefault(require("./dpt238"));
const dpt242_1 = __importDefault(require("./dpt242"));
const dpt249_1 = __importDefault(require("./dpt249"));
const dpt251_1 = __importDefault(require("./dpt251"));
const dpt275_1 = __importDefault(require("./dpt275"));
const dpt999_1 = __importDefault(require("./dpt999"));
const dpt60001_1 = __importDefault(require("./dpt60001"));
const dpt60002_1 = __importDefault(require("./dpt60002"));
const logger = (0, KnxLog_1.module)('DPTLib');
exports.dpts = {
[dpt1_1.default.id]: dpt1_1.default,
[dpt2_1.default.id]: dpt2_1.default,
[dpt3_1.default.id]: dpt3_1.default,
[dpt4_1.default.id]: dpt4_1.default,
[dpt5_1.default.id]: dpt5_1.default,
[dpt6_1.default.id]: dpt6_1.default,
[dpt7_1.default.id]: dpt7_1.default,
[dpt8_1.default.id]: dpt8_1.default,
[dpt9_1.default.id]: dpt9_1.default,
[dpt10_1.default.id]: dpt10_1.default,
[dpt11_1.default.id]: dpt11_1.default,
[dpt12_1.default.id]: dpt12_1.default,
[dpt13_1.default.id]: dpt13_1.default,
[dpt14_1.default.id]: dpt14_1.default,
[dpt15_1.default.id]: dpt15_1.default,
[dpt16_1.default.id]: dpt16_1.default,
[dpt17_1.default.id]: dpt17_1.default,
[dpt18_1.default.id]: dpt18_1.default,
[dpt19_1.default.id]: dpt19_1.default,
[dpt20_1.default.id]: dpt20_1.default,
[dpt21_1.default.id]: dpt21_1.default,
[dpt22_1.default.id]: dpt22_1.default,
[dpt28_1.default.id]: dpt28_1.default,
[dpt29_1.default.id]: dpt29_1.default,
[dpt213_1.default.id]: dpt213_1.default,
[dpt222_1.default.id]: dpt222_1.default,
[dpt232_1.default.id]: dpt232_1.default,
[dpt235_1.default.id]: dpt235_1.default,
[dpt237_1.default.id]: dpt237_1.default,
[dpt238_1.default.id]: dpt238_1.default,
[dpt242_1.default.id]: dpt242_1.default,
[dpt249_1.default.id]: dpt249_1.default,
[dpt251_1.default.id]: dpt251_1.default,
[dpt275_1.default.id]: dpt275_1.default,
[dpt999_1.default.id]: dpt999_1.default,
[dpt60001_1.default.id]: dpt60001_1.default,
[dpt60002_1.default.id]: dpt60002_1.default,
};
function resolve(dptid) {
const m = dptid
.toString()
.toUpperCase()
.match(/^(?:DPT)?(\d+)(\.(\d+))?$/);
if (m === null)
throw Error(`Invalid DPT format: ${dptid}`);
const dptkey = util.format('DPT%s', m[1]);
const dpt = exports.dpts[dptkey];
if (!dpt)
throw Error(`Unsupported DPT: ${dptid}`);
const cloned_dpt = cloneDpt(dpt);
const subtypeId = m[3] || '001';
if (cloned_dpt.subtypes[subtypeId]) {
cloned_dpt.subtypeid = subtypeId;
cloned_dpt.subtype = cloned_dpt.subtypes[subtypeId];
return cloned_dpt;
}
throw Error(`Unsupported subtype ${subtypeId} for DPT ${dptid}`);
}
function populateAPDU(value, apdu, dptid) {
const dpt = resolve(dptid || 'DPT1');
const nbytes = Math.ceil(dpt.basetype.bitlength / 8);
apdu.data = Buffer.alloc(nbytes);
apdu.bitlength = (dpt.basetype && dpt.basetype.bitlength) || 1;
let tgtvalue = value;
if (typeof dpt.formatAPDU === 'function') {
apdu.data = dpt.formatAPDU(value);
}
else {
if (!isFinite(value)) {
throw new Error(util.format('Invalid value, expected a %s', dpt.basetype?.desc));
}
const range = (0, utils_1.hasProp)(dpt.basetype, 'range')
? dpt.basetype.range
: [0, 2 ** dpt.basetype.bitlength - 1];
if ((0, utils_1.hasProp)(dpt, 'subtype') && (0, utils_1.hasProp)(dpt.subtype, 'scalar_range')) {
const scalar = dpt.subtype.scalar_range;
if (value < scalar[0] || value > scalar[1]) {
logger.debug('Value %j(%s) out of scalar range(%j) for %s', value, typeof value, scalar, dpt.id);
}
else {
const a = (scalar[1] - scalar[0]) / (range[1] - range[0]);
const b = scalar[0] - range[0];
tgtvalue = Math.round((value - b) / a);
}
}
else {
if (value < range[0] || value > range[1]) {
logger.debug('Value %j(%s) out of bounds(%j) for %s.%s', value, typeof value, range, dpt.id, dpt.subtypeid);
}
}
if ((0, utils_1.hasProp)(dpt.basetype, 'signedness') &&
dpt.basetype.signedness === 'signed') {
apdu.data.writeIntBE(tgtvalue, 0, nbytes);
}
else {
apdu.data.writeUIntBE(tgtvalue, 0, nbytes);
}
}
return apdu;
}
function fromBuffer(buf, dpt) {
if (!dpt)
throw Error(util.format('DPT %s not found', dpt));
let value = 0;
if (typeof dpt.fromBuffer === 'function') {
value = dpt.fromBuffer(buf);
}
else {
if (buf.length > 6) {
throw Error('cannot handle unsigned integers more then 6 bytes in length');
}
if ((0, utils_1.hasProp)(dpt.basetype, 'signedness') &&
dpt.basetype.signedness === 'signed') {
value = buf.readIntBE(0, buf.length);
}
else {
value = buf.readUIntBE(0, buf.length);
}
if ((0, utils_1.hasProp)(dpt, 'subtype') && (0, utils_1.hasProp)(dpt.subtype, 'scalar_range')) {
const range = (0, utils_1.hasProp)(dpt.basetype, 'range')
? dpt.basetype.range
: [0, 2 ** dpt.basetype.bitlength - 1];
const scalar = dpt.subtype.scalar_range;
const a = (scalar[1] - scalar[0]) / (range[1] - range[0]);
const b = scalar[0] - range[0];
value = Math.round(a * value + b);
}
}
return value;
}
const cloneDpt = (d) => {
const { fromBuffer: fb, formatAPDU: fa } = d;
return { ...JSON.parse(JSON.stringify(d)), fromBuffer: fb, formatAPDU: fa };
};
//# sourceMappingURL=index.js.map