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
JavaScript
;
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=