commit d1c969a7939ccb0894d42be3fb80e4a2a52d0ba8 Author: Wolfgang Hottgenroth Date: Wed Aug 9 14:45:17 2017 +0200 initial, start porting Python MeterbusLib to node diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fc467d1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +*.map diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..3043d0d --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1 @@ +export { MeterbusLib } from './meterbus'; diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..dfd7fae --- /dev/null +++ b/dist/index.js @@ -0,0 +1,4 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var meterbus_1 = require("./meterbus"); +exports.MeterbusLib = meterbus_1.MeterbusLib; diff --git a/dist/meterbus.d.ts b/dist/meterbus.d.ts new file mode 100644 index 0000000..19acb8e --- /dev/null +++ b/dist/meterbus.d.ts @@ -0,0 +1,10 @@ +export declare namespace MeterbusLib { + class Telegram { + private _hexString; + private _telegram; + constructor(); + readonly hexString: string; + readonly telegram: number[]; + fromHexString(hexString: string): void; + } +} diff --git a/dist/meterbus.js b/dist/meterbus.js new file mode 100644 index 0000000..961565b --- /dev/null +++ b/dist/meterbus.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var MeterbusLib; +(function (MeterbusLib) { + var Telegram = (function () { + function Telegram() { + } + Object.defineProperty(Telegram.prototype, "hexString", { + get: function () { + return this._hexString; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Telegram.prototype, "telegram", { + get: function () { + return this._telegram; + }, + enumerable: true, + configurable: true + }); + Telegram.prototype.fromHexString = function (hexString) { + this._hexString = hexString; + }; + return Telegram; + }()); + MeterbusLib.Telegram = Telegram; +})(MeterbusLib = exports.MeterbusLib || (exports.MeterbusLib = {})); diff --git a/dist/meterbus.test.d.ts b/dist/meterbus.test.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/dist/meterbus.test.js b/dist/meterbus.test.js new file mode 100644 index 0000000..d6b5b1c --- /dev/null +++ b/dist/meterbus.test.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var meterbus_1 = require("./meterbus"); +var chai = require("chai"); +var expect = chai.expect; +describe('Meterbus Library', function () { + it('should store hexString', function () { + var telegram = new meterbus_1.MeterbusLib.Telegram(); + telegram.fromHexString("01 02 03"); + expect(telegram.hexString).to.equal("01 02 03"); + }); +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..5cdf107 --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "meterbuslibts", + "version": "1.0.0", + "description": "Parser for MBus telegrams into JS/TS objects", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "./node_modules/typescript/bin/tsc", + "test": "./node_modules/mocha/bin/mocha -r ts-node/register src/**/*.test.ts" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@gitlab.com/wolutator/meterbuslibts.git" + }, + "keywords": [ + "mbus" + ], + "author": "Wolfgang Hottgenroth ", + "license": "MIT", + "bugs": { + "url": "https://gitlab.com/wolutator/meterbuslibts/issues" + }, + "homepage": "https://gitlab.com/wolutator/meterbuslibts#README", + "devDependencies": { + "@types/chai": "^4.0.2", + "@types/mocha": "^2.2.41", + "@types/node": "^8.0.20", + "chai": "^4.1.1", + "mocha": "^3.5.0", + "ts-node": "^3.3.0", + "typescript": "^2.4.2" + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..c9f4ea7 --- /dev/null +++ b/src/index.ts @@ -0,0 +1 @@ +export {MeterbusLib} from './meterbus' diff --git a/src/meterbus.test.ts b/src/meterbus.test.ts new file mode 100644 index 0000000..2435216 --- /dev/null +++ b/src/meterbus.test.ts @@ -0,0 +1,44 @@ +import {MeterbusLib} from './meterbus' + +import * as mocha from 'mocha' +import * as chai from 'chai' + +const expect = chai.expect + +describe('The Meterbus Library', () => { + it('should store hexString', () => { + const telegram = new MeterbusLib.Telegram() + telegram.fromHexString("01 02 03") + expect(telegram.hexString).to.equal("01 02 03") + }) + it('should parse the hexString into the telegram array', () => { + const telegram = new MeterbusLib.Telegram() + telegram.fromHexString("01 02 03") + expect(telegram.telegram).to.deep.equal([1, 2, 3]) + }) + it('should detect a control frame', () => { + const telegram = new MeterbusLib.Telegram() + telegram.fromHexString("68 03") + telegram.parse() + expect(telegram.frame).instanceof(MeterbusLib.ControlFrame) + }) + it('should detect a short frame', () => { + const telegram = new MeterbusLib.Telegram() + telegram.fromHexString("10") + telegram.parse() + expect(telegram.frame).instanceof(MeterbusLib.ShortFrame) + }) + it('should detect a long frame', () => { + const telegram = new MeterbusLib.Telegram() + telegram.fromHexString("68 10") + telegram.parse() + expect(telegram.frame).instanceof(MeterbusLib.LongFrame) + }) + it('should detect a single char frame', () => { + const telegram = new MeterbusLib.Telegram() + telegram.fromHexString("e5") + telegram.parse() + expect(telegram.frame).instanceof(MeterbusLib.SingleCharFrame) + }) + +}) \ No newline at end of file diff --git a/src/meterbus.ts b/src/meterbus.ts new file mode 100644 index 0000000..c2a2a0e --- /dev/null +++ b/src/meterbus.ts @@ -0,0 +1,75 @@ +export namespace MeterbusLib { + export class Frame { + private _telegram : number[] + + constructor(telegram : number[]) { + this._telegram = telegram + } + } + + export class ControlFrame extends Frame { + constructor(telegram : number[]) { + super(telegram) + } + } + + export class ShortFrame extends Frame { + constructor(telegram : number[]) { + super(telegram) + } + } + + export class LongFrame extends Frame { + constructor(telegram : number[]) { + super(telegram) + } + } + + export class SingleCharFrame extends Frame { + constructor(telegram : number[]) { + super(telegram) + } + } + + export class Telegram { + private _hexString : string + private _telegram : number[] + private _frame : Frame + + constructor() { + } + + get hexString() : string { + return this._hexString + } + + get telegram() : number[] { + return this._telegram + } + + get frame() : Frame { + return this._frame + } + + fromHexString(hexString : string) { + this._hexString = hexString + this._telegram = this._hexString.split(' ').map((val) => { + return parseInt(val, 16) + }) + } + + parse() { + if (this._telegram[0] === 0x68 && this._telegram[1] === 0x03) { + this._frame = new ControlFrame(this._telegram) + } else if (this._telegram[0] === 0x68) { + this._frame = new LongFrame(this._telegram) + } else if (this._telegram[0] === 0x10) { + this._frame = new ShortFrame(this._telegram) + } else if (this._telegram[0] === 0xe5) { + this._frame = new SingleCharFrame(this._telegram) + } else { + throw Error('invalid start char') + } + } + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..b4cfe01 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es5", + "declaration": true, + "outDir": "./dist" + }, + "include": [ + "src/**/*" + ] +}