UNPKG

knxultimate

Version:

KNX IP protocol implementation for Node. This is the ENGINE of Node-Red KNX-Ultimate node.

219 lines 9.21 kB
"use strict"; 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