diff --git a/src/codetables.ts b/src/codetables.ts new file mode 100644 index 0000000..39786c1 --- /dev/null +++ b/src/codetables.ts @@ -0,0 +1,31 @@ +export namespace MeterbusLibCodeTables { + export const MEDIUM_CODE : string[] = + ['Other', + 'Oil', + 'Electrity', + 'Gas', + 'Heat (Volume measured at return temperature: outlet', + 'Steam', + 'Hot Water', + 'Water', + 'Heat Cost Allocator', + 'Compressed Air', + 'Cooling Load Meter (Volume measured at return temperature: outlet', + 'Cooling Load Meter (Volume measured at flow temperature: inlet', + 'Heat (Volume measured at flow temperature: inlet)', + 'Heat / Cooling Load Meter', + 'Bus / System', + 'Unknown Medium', + 'Reserved (10)', + 'Reserved (11)', + 'Reserved (12)', + 'Reserved (13)', + 'Reserved (14)', + 'Reserved (15)', + 'Cold Water', + 'Dual Water', + 'Pressure', + 'A/D Converter', + ] + +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 8d6ac0d..dbf4dfb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,6 @@ export {MeterbusLib} from './meterbus' export {MeterbusLibUtils} from './utils' export {MeterbusLibLongFrame} from './longframe' -import {MeterbusLibExceptions} from './exceptions' -import {MeterbusLibFrames} from './simpleframes' +export {MeterbusLibExceptions} from './exceptions' +export {MeterbusLibFrames} from './simpleframes' +export {MeterbusLibCodeTables} from './codetables' diff --git a/src/longframe.ts b/src/longframe.ts index 66d1e7b..9079648 100644 --- a/src/longframe.ts +++ b/src/longframe.ts @@ -1,16 +1,60 @@ import {MeterbusLibExceptions} from './exceptions' import {MeterbusLibFrames} from './simpleframes' +import {MeterbusLibUtils} from './utils' +import {MeterbusLibCodeTables} from './codetables' export namespace MeterbusLibLongFrame { export class LongFrame extends MeterbusLibFrames.ControlFrame { + private _fixedDataHeader : FixedDataHeader + get fixedDataHeader() : FixedDataHeader { return this._fixedDataHeader } + constructor(telegram : number[]) { super(telegram) } parse2() { super.parse2() // control frame parse2 method + this._fixedDataHeader = new FixedDataHeader(this._telegram.slice(7, 19)) + this._fixedDataHeader.parse() } } + export class FixedDataHeader { + private _data : number[] + + private _identNo : number + private _manufacturer : string + private _version : number + private _medium : string + private _accessNo : number + private _status : number + private _signature : number[] + + get identNo() : number { return this._identNo } + get manufacturer() : string { return this._manufacturer } + get version() : number { return this._version } + get medium() : string { return this._medium } + get accessNo() : number { return this._accessNo } + get status() : number { return this._status } + get signature() : number[] { return this._signature } + + constructor(data : number[]) { + this._data = data + } + + parse() : void { + this._identNo = MeterbusLibUtils.bcd(this._data.slice(0, 4)) + this._manufacturer = MeterbusLibUtils.manufCode(this._data.slice(4, 6)) + this._version = this._data[6] + this._medium = MeterbusLibCodeTables.MEDIUM_CODE[this._data[7]] + this._accessNo = this._data[8] + this._status = this._data[9] + this._signature = this._data.slice(10, 12) + } + + getJSON() : string { + return JSON.stringify(this) + } + } } \ No newline at end of file diff --git a/src/meterbus.test.ts b/src/meterbus.test.ts index 60c19c5..f947bcb 100644 --- a/src/meterbus.test.ts +++ b/src/meterbus.test.ts @@ -2,7 +2,9 @@ import {MeterbusLib} from './meterbus' import {MeterbusLibLongFrame} from './longframe' import {MeterbusLibExceptions} from './exceptions' import {MeterbusLibFrames} from './simpleframes' +import {MeterbusLibCodeTables} from './codetables' + import * as mocha from 'mocha' import * as chai from 'chai' @@ -134,4 +136,43 @@ describe('The Meterbus Library', () => { expect((telegram.frame as MeterbusLibFrames.ControlFrame).ciField).to.equal(3) }) + describe('The Meterbus Longframe Library', () => { + let telegram : MeterbusLib.Telegram + + beforeEach(() => { + telegram = new MeterbusLib.Telegram() + telegram.fromHexString(inputOkLongFrame_1phase_electric) + telegram.parse() + }) + + it('should find the identNo', () => { + expect((telegram.frame as MeterbusLibLongFrame.LongFrame).fixedDataHeader.identNo) + .to.equal(17001300) + }) + it('should find the manufacturer', () => { + expect((telegram.frame as MeterbusLibLongFrame.LongFrame).fixedDataHeader.manufacturer) + .to.equal("FIN") + }) + it('should find the version', () => { + expect((telegram.frame as MeterbusLibLongFrame.LongFrame).fixedDataHeader.version) + .to.equal(0x24) + }) + it('should find the medium', () => { + expect((telegram.frame as MeterbusLibLongFrame.LongFrame).fixedDataHeader.medium) + .to.equal("Electrity") + }) + it('should find the accessNo', () => { + expect((telegram.frame as MeterbusLibLongFrame.LongFrame).fixedDataHeader.accessNo) + .to.equal(0xd6) + }) + it('should find the status', () => { + expect((telegram.frame as MeterbusLibLongFrame.LongFrame).fixedDataHeader.status) + .to.equal(0) + }) + it('should find the signature', () => { + expect((telegram.frame as MeterbusLibLongFrame.LongFrame).fixedDataHeader.signature) + .to.deep.equal([0,0]) + }) + }) + }) \ No newline at end of file diff --git a/src/utils.test.ts b/src/utils.test.ts index 2a9038c..a00d03d 100644 --- a/src/utils.test.ts +++ b/src/utils.test.ts @@ -22,4 +22,7 @@ describe('The Meterbus Library Utils', () => { it('should convert a bcd to a number (99999999)', () => { expect(MeterbusLibUtils.bcd([0x99, 0x99, 0x99, 0x99])).to.equal(99999999) }) + it('should convert two number to manufacturer code', () => { + expect(MeterbusLibUtils.manufCode([0x2e, 0x19])).to.equal("FIN") + }) }) diff --git a/src/utils.ts b/src/utils.ts index c33ddde..3c69b4e 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -9,4 +9,8 @@ export namespace MeterbusLibUtils { return r } + export function manufCode(data : number[]) : string { + let v : number = (data[1] << 8) + data[0] + return String.fromCharCode((((v >> 10) & 0x1f) + 64), (((v >> 5) & 0x1f) + 64), ((v & 0x1f) + 64)) + } } \ No newline at end of file