UNPKG

knx-listener

Version:

A thin client that creates a tunnel to knx gateway to listen to telegrams within knx net

72 lines 10.4 kB
#!/usr/bin/env node "use strict"; const chalk = require("chalk"); const yargs = require("yargs"); const index_1 = require("../dist/utils/index"); const bus_listener_1 = require("../dist/bus-listener"); const util_1 = require("util"); const argv = yargs.usage('Usage $0 -s <ip address> -g <group address> -d <XX:XX:..>') .demand(['server', 'groupAddress', 'data']) .alias('s', 'server') .alias('p', 'port') .alias('g', 'groupAddress') .alias('d', 'data') .alias('h', 'help') .default('port', 3671) .describe('data', 'Data to write') .describe('server', 'Remote ip address') .describe('port', 'Remote port number') .describe('groupAddress', 'Group address to issue the write telegram to') .coerce('server', (ip) => { if (!index_1.isIPv4(ip)) { throw new Error(`Invalid ip address ${ip}`); } return ip; }) .coerce('data', (data) => { if (!/^([0-9A-Fa-f]{2})+([:][0-9A-Fa-f]{2})?$/.test(data)) { throw new Error(`Invalid data format ${data}`); } return data; }) .coerce('port', (port) => { const portNumber = +port; if (portNumber < 0 || 65535 < portNumber) { throw new Error(`Invalid port number ${portNumber}`); } return portNumber; }) .check((args) => { if (!index_1.isKnxAddress(args.groupAddress)) { throw new Error(`Invalid group address ${args.groupAddress}`); } return true; }) .example('$0 -s 10.10.10.0 -g 0/0/1 -d 00:FF', 'Writes 0x00 0xFF to 0/0/1 through 10.10.10.0 knx gateway') .epilog(util_1.format('GitHub: %s', chalk.underline('https://github.com/crabicode/knx-listener'))) .help('help').argv; const server = new bus_listener_1.BusListener(); const die = () => { return server.disconnect().then(() => process.exit(), () => process.exit()); }; const fail = (format, ...param) => { console.error(chalk.red(`[ FAIL ]`) + ` ${util_1.format(format, ...param)}`); die(); }; const ok = (format, ...param) => { console.error(chalk.green(`[ OK ]`) + ` ${util_1.format(format, ...param)}`); setImmediate(die); }; process.on('SIGINT', die); server.bind(argv.server, argv.port).catch((err) => { fail('Failed to send request to %s:%d due to %s', argv.server, argv.port, err.code); }); server.ready(() => { const data = Buffer.from(argv.data.split(':').map(i => parseInt(i, 16))); server.write(data, index_1.knxAddr2num(argv.groupAddress)).then(() => { ok(`Sent %s to %s`, argv.data, argv.groupAddress); }).catch((_err) => { fail(`Failed to write %s to %s`, argv.data, argv.groupAddress); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXBzd3JpdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJncm91cHN3cml0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLCtCQUErQjtBQUMvQiwrQkFBK0I7QUFDL0IsK0NBQXdFO0FBQ3hFLHVEQUFtRDtBQUNuRCwrQkFBMkM7QUFFM0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQywyREFBMkQsQ0FBQztLQUNsRixNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQzFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO0tBQ3BCLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0tBQ2xCLEtBQUssQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDO0tBQzFCLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0tBQ2xCLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0tBQ2xCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO0tBQ3JCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDO0tBQ2pDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUM7S0FDdkMsUUFBUSxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQztLQUN0QyxRQUFRLENBQUMsY0FBYyxFQUFFLDhDQUE4QyxDQUFDO0tBQ3hFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFVO0lBQzNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxNQUFNLENBQUMsRUFBRSxDQUFDO0FBQ1osQ0FBQyxDQUFDO0tBQ0QsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQVk7SUFDM0IsRUFBRSxDQUFDLENB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Q0FBQztJQUN6RSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxtQkFBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN0RCxFQUFFLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUk7UUFDWixJQUFJLENBQUMsMEJBQTBCLEVBQzdCLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBpc0lQdjQsIGtueEFkZHIybnVtLCBpc0tueEFkZHJlc3MgfSBmcm9tICcuLi9kaXN0L3V0aWxzL2luZGV4JztcbmltcG9ydCB7IEJ1c0xpc3RlbmVyIH0gZnJvbSAnLi4vZGlzdC9idXMtbGlzdGVuZXInO1xuaW1wb3J0IHsgZm9ybWF0IGFzIHN0ckZvcm1hdCB9IGZyb20gJ3V0aWwnO1xuXG5jb25zdCBhcmd2ID0geWFyZ3MudXNhZ2UoJ1VzYWdlICQwIC1zIDxpcCBhZGRyZXNzPiAtZyA8Z3JvdXAgYWRkcmVzcz4gLWQgPFhYOlhYOi4uPicpXG4gIC5kZW1hbmQoWydzZXJ2ZXInLCAnZ3JvdXBBZGRyZXNzJywgJ2RhdGEnXSlcbiAgLmFsaWFzKCdzJywgJ3NlcnZlcicpXG4gIC5hbGlhcygncCcsICdwb3J0JylcbiAgLmFsaWFzKCdnJywgJ2dyb3VwQWRkcmVzcycpXG4gIC5hbGlhcygnZCcsICdkYXRhJylcbiAgLmFsaWFzKCdoJywgJ2hlbHAnKVxuICAuZGVmYXVsdCgncG9ydCcsIDM2NzEpXG4gIC5kZXNjcmliZSgnZGF0YScsICdEYXRhIHRvIHdyaXRlJylcbiAgLmRlc2NyaWJlKCdzZXJ2ZXInLCAnUmVtb3RlIGlwIGFkZHJlc3MnKVxuICAuZGVzY3JpYmUoJ3BvcnQnLCAnUmVtb3RlIHBvcnQgbnVtYmVyJylcbiAgLmRlc2NyaWJlKCdncm91cEFkZHJlc3MnLCAnR3JvdXAgYWRkcmVzcyB0byBpc3N1ZSB0aGUgd3JpdGUgdGVsZWdyYW0gdG8nKVxuICAuY29lcmNlKCdzZXJ2ZXInLCAoaXA6IHN0cmluZykgPT4ge1xuICAgIGlmICghaXNJUHY0KGlwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGlwIGFkZHJlc3MgJHtpcH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGlwO1xuICB9KVxuICAuY29lcmNlKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgIGlmICghL14oWzAtOUEtRmEtZl17Mn0pKyhbOl1bMC05QS1GYS1mXXsyfSk/JC8udGVzdChkYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRhdGEgZm9ybWF0ICR7ZGF0YX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0pXG4gIC5jb2VyY2UoJ3BvcnQnLCAocG9ydDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcG9ydE51bWJlciA9ICtwb3J0O1xuICAgIGlmIChwb3J0TnVtYmVyIDwgMCB8fCA2NTUzNSA8IHBvcnROdW1iZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwb3J0IG51bWJlciAke3BvcnROdW1iZXJ9YCk7XG4gICAgfVxuICAgIHJldHVybiBwb3J0TnVtYmVyO1xuICB9KVxuICAuY2hlY2soKGFyZ3MpID0+IHtcbiAgICBpZiAoIWlzS254QWRkcmVzcyhhcmdzLmdyb3VwQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBncm91cCBhZGRyZXNzICR7YXJncy5ncm91cEFkZHJlc3N9YCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KVxuICAuZXhhbXBsZSgnJDAgLXMgMTAuMTAuMTAuMCAtZyAwLzAvMSAtZCAwMDpGRicsICdXcml0ZXMgMHgwMCAweEZGIHRvIDAvMC8xIHRocm91Z2ggMTAuMTAuMTAuMCBrbnggZ2F0ZXdheScpXG4gIC5lcGlsb2coc3RyRm9ybWF0KCdHaXRIdWI6ICVzJywgY2hhbGsudW5kZXJsaW5lKCdodHRwczovL2dpdGh1Yi5jb20vY3JhYmljb2RlL2tueC1saXN0ZW5lcicpKSlcbiAgLmhlbHAoJ2hlbHAnKS5hcmd2O1xuXG5jb25zdCBzZXJ2ZXIgPSBuZXcgQnVzTGlzdGVuZXIoKTtcblxuY29uc3QgZGllID0gKCkgPT4ge1xuICByZXR1cm4gc2VydmVyLmRpc2Nvbm5lY3QoKS50aGVuKFxuICAgICgpID0+IHByb2Nlc3MuZXhpdCgpLFxuICAgICgpID0+IHByb2Nlc3MuZXhpdCgpLFxuICApO1xufTtcblxuY29uc3QgZmFpbCA9IChmb3JtYXQ6IGFueSwgLi4ucGFyYW06IGFueVtdKSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgY2hhbGsucmVkKGBbIEZBSUwgXWApICsgYCAke3N0ckZvcm1hdChmb3JtYXQsIC4uLnBhcmFtKX1gLFxuICApO1xuICBkaWUoKTtcbn07XG5cbmNvbnN0IG9rID0gKGZvcm1hdDogYW55LCAuLi5wYXJhbTogYW55W10pID0+IHtcbiAgY29uc29sZS5lcnJvcihcbiAgICBjaGFsay5ncmVlbihgWyBPSyBdYCkgKyBgICR7c3RyRm9ybWF0KGZvcm1hdCwgLi4ucGFyYW0pfWAsXG4gICk7XG4gIC8vIHNjaGVkdWxlIGRpZSBuZXh0IGN5Y2xlXG4gIHNldEltbWVkaWF0ZShkaWUpO1xufTtcblxucHJvY2Vzcy5vbignU0lHSU5UJywgZGllKTsgLy8gQ2xvc2UgdHVubmVsaW5nIG9uIGN0cmwrY1xuXG5zZXJ2ZXIuYmluZChhcmd2LnNlcnZlciwgYXJndi5wb3J0KS5jYXRjaCgoZXJyKSA9PiB7XG4gIGZhaWwoJ0ZhaWxlZCB0byBzZW5kIHJlcXVlc3QgdG8gJXM6JWQgZHVlIHRvICVzJywgYXJndi5zZXJ2ZXIsIGFyZ3YucG9ydCwgZXJyLmNvZGUpO1xufSk7XG5cbnNlcnZlci5yZWFkeSgoKSA9PiB7XG4gIGNvbnN0IGRhdGEgPSBCdWZmZXIuZnJvbShhcmd2LmRhdGEuc3BsaXQoJzonKS5tYXAoaSA9PiBwYXJzZUludChpLCAxNikpKTtcbiAgc2VydmVyLndyaXRlKGRhdGEsIGtueEFkZHIybnVtKGFyZ3YuZ3JvdXBBZGRyZXNzKSkudGhlbigoKSA9PiB7XG4gICAgb2soYFNlbnQgJXMgdG8gJXNgLCBhcmd2LmRhdGEsIGFyZ3YuZ3JvdXBBZGRyZXNzKTtcbiAgfSkuY2F0Y2goKF9lcnIpID0+IHtcbiAgICBmYWlsKGBGYWlsZWQgdG8gd3JpdGUgJXMgdG8gJXNgLFxuICAgICAgYXJndi5kYXRhLCBhcmd2Lmdyb3VwQWRkcmVzcyk7XG4gIH0pO1xufSk7XG4iXX0=