initial, start porting Python MeterbusLib to node

This commit is contained in:
Wolfgang Hottgenroth 2017-08-09 14:45:17 +02:00
commit d1c969a793
12 changed files with 221 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
node_modules
*.map

1
dist/index.d.ts vendored Normal file
View File

@ -0,0 +1 @@
export { MeterbusLib } from './meterbus';

4
dist/index.js vendored Normal file
View File

@ -0,0 +1,4 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var meterbus_1 = require("./meterbus");
exports.MeterbusLib = meterbus_1.MeterbusLib;

10
dist/meterbus.d.ts vendored Normal file
View File

@ -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;
}
}

28
dist/meterbus.js vendored Normal file
View File

@ -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 = {}));

0
dist/meterbus.test.d.ts vendored Normal file
View File

12
dist/meterbus.test.js vendored Normal file
View File

@ -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");
});
});

33
package.json Normal file
View File

@ -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 <woho@hottis.de>",
"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"
}
}

1
src/index.ts Normal file
View File

@ -0,0 +1 @@
export {MeterbusLib} from './meterbus'

44
src/meterbus.test.ts Normal file
View File

@ -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)
})
})

75
src/meterbus.ts Normal file
View File

@ -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<number>((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')
}
}
}
}

11
tsconfig.json Normal file
View File

@ -0,0 +1,11 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"declaration": true,
"outDir": "./dist"
},
"include": [
"src/**/*"
]
}