wireless-mbus-parser
Version:
Parse telegram data received via wireless mbus
273 lines (267 loc) • 7.92 kB
text/typescript
declare function stripAnyCrc(data: Buffer, containsCrc?: boolean): Buffer<ArrayBufferLike>;
interface WiredLinkLayer {
lField: number;
cField: number;
aField: number;
}
interface LinkLayer extends WiredLinkLayer {
mField: number;
version: number;
type: number;
addressRaw: Buffer;
aFieldRaw: Buffer;
manufacturer: string;
typeString: string;
meterId: string;
}
interface MeterData {
manufacturer: string;
id: string;
type: number;
deviceType: string;
version: number;
status?: string;
accessNo?: number;
radio?: {
manufacturer: string;
id: string;
type: number;
deviceType: string;
version: number;
};
}
interface ParserOptionsCommon {
key?: Buffer;
containsCrc?: boolean;
}
interface ParserOptionsFull extends ParserOptionsCommon {
verbose: true;
}
interface ParserOptionsSimple extends ParserOptionsCommon {
verbose?: false;
}
type ParserOptions = ParserOptionsFull | ParserOptionsSimple;
interface ParserResult {
data: EvaluatedData[];
meter: MeterData;
}
interface ParserResultVerbose extends ParserResult {
linkLayer: LinkLayer;
extendedLinkLayer?: ExtendedLinkLayer;
authenticationAndFragmentationLayer?: AuthenticationAndFragmentationLayer;
applicationLayer: ApplicationLayer;
dataRecords: DataRecord[];
rawData: Buffer;
}
interface DataRecord {
header: DataRecordHeader;
value: DataType;
}
interface DataRecordHeader {
dib: DataInformationBlock;
vib: ValueInformationBlock;
offset: number;
length: number;
}
type DataType = string | number | bigint | Buffer | null;
declare const EvaluatedDataType: {
readonly Number: "Number";
readonly BigInt: "BigInt";
readonly String: "String";
readonly Date: "Date";
readonly DateTime: "DateTime";
readonly Buffer: "Buffer";
readonly Null: "Null";
};
type EvaluatedDataType = (typeof EvaluatedDataType)[keyof typeof EvaluatedDataType];
interface EvaluatedData {
value: DataType | Date;
unit: string;
description: string;
type: EvaluatedDataType;
info: {
legacyVif: string;
tariff: number;
deviceUnit: number;
storageNo: number;
};
}
declare const VifTable: {
readonly Default: "Default";
readonly FD: "FD";
readonly FB: "FB";
readonly Plain: "Plain";
readonly Manufacturer: "Manufacturer";
};
type VifTable = (typeof VifTable)[keyof typeof VifTable];
interface DataInformationBlock {
tariff: number;
deviceUnit: number;
storageNo: number;
functionField: number;
dataField: number;
}
type PrimaryVif = PrimaryVifNumber | PrimaryVifString;
interface PrimaryVifNumber {
vif: number;
table: Exclude<VifTable, typeof VifTable.Plain>;
extensionBitSet: boolean;
}
interface PrimaryVifString {
vif: number;
table: typeof VifTable.Plain;
plainText: string;
extensionBitSet: boolean;
}
interface ValueInformationBlock {
primary: PrimaryVif;
extensions: number[];
}
type Config = ConfigMode5 | ConfigMode7 | ConfigMode13;
interface ConfigMode5 {
mode: 0 | 5;
bidirectional: boolean;
accessability: boolean;
synchronous: boolean;
encryptedBlocks: number;
content: number;
hopCounter: number;
}
interface ConfigMode7 {
mode: 7;
content: number;
encryptedBlocks: number;
kdfSel: number;
keyid: number;
}
interface ConfigMode13 {
mode: 13;
content: number;
encryptedBytes: number;
protoType: number;
}
type ApplicationLayer = ApplicationLayer0 | ApplicationLayer4 | ApplicationLayer12 | ApplicationLayerCompact | ApplicationLayerDummy;
interface ApplicationLayerDummy {
ci: 0xa0 | 0xa1 | 0xa2 | 0xa3 | 0xa4 | 0xa5 | 0xa6 | 0xa7;
offset: number;
}
interface ApplicationLayer0 {
ci: 0x78;
offset: number;
}
interface ApplicationLayer4 extends Omit<ApplicationLayer0, "ci"> {
ci: 0x7a;
accessNo: number;
statusCode: number;
status: string;
config: Config;
}
interface ApplicationLayer12 extends Omit<ApplicationLayer4, "ci"> {
ci: 0x72;
meterId: number;
meterManufacturer: number;
meterVersion: number;
meterDevice: number;
meterIdString: string;
meterDeviceString: string;
meterManufacturerString: string;
}
interface ApplicationLayerCompact extends Omit<ApplicationLayer0, "ci"> {
ci: 0x79;
headerCrc: number;
frameCrc: number;
}
interface AuthenticationAndFragmentationLayer {
ci: 0x90;
afll: number;
fclRaw: number;
fcl: {
mf: boolean;
mclp: boolean;
mlp: boolean;
mcrp: boolean;
macp: boolean;
kip: boolean;
fid: number;
};
mclRaw?: number;
mcl?: {
mlmp: boolean;
mcmp: boolean;
kimp: boolean;
at: number;
};
kiRaw?: number;
ki?: {
keyVersion: number;
kdfSelection: number;
keyId: number;
};
mcr?: number;
mac?: Buffer;
ml?: number;
}
interface ExtendedLinkLayer2 {
ci: 0x8c;
communicationControl: number;
accessNumber: number;
}
interface ExtendedLinkLayer10 extends Omit<ExtendedLinkLayer2, "ci"> {
ci: 0x8e;
manufacturer: number;
address: Buffer;
}
interface ExtendedLinkLayer8 extends Omit<ExtendedLinkLayer2, "ci"> {
ci: 0x8d;
sessionNumber: number;
session: {
enc: number;
time: number;
session: number;
};
}
type ExtendedLinkLayer16 = {
ci: 0x8f;
} & Omit<ExtendedLinkLayer10, "ci"> & Omit<ExtendedLinkLayer8, "ci">;
type ExtendedLinkLayer = ExtendedLinkLayer2 | ExtendedLinkLayer10 | ExtendedLinkLayer8 | ExtendedLinkLayer16;
interface LegacyResult {
deviceInformation: {
AccessNumber: number;
Id: string;
Manufacturer: string;
Medium: string;
Status: number;
StatusString: string;
Version: number;
Address: string;
};
dataRecord: {
number: number;
value: string | number;
unit: string;
type: string;
description: string;
tariff: number;
storageNo: number;
devUnit: number;
functionFieldText: string;
functionField: number;
}[];
}
declare class WirelessMbusParser {
private dataRecordHeaderCache;
parse(data: Buffer, options: ParserOptionsFull): Promise<ParserResultVerbose>;
parse(data: Buffer, options?: ParserOptionsSimple): Promise<ParserResult>;
static toLegacyResult(result: ParserResultVerbose): LegacyResult;
private parseFullResult;
private parseSimple;
private handleDataRecordDecoding;
}
type ErrorName = "CRC_ERROR" | "NO_AES_KEY" | "WRONG_AES_KEY" | "DECRYPTION_ERROR" | "DATA_RECORD_CACHE_MISSING" | "UNEXPECTED_STATE" | "UNIMPLEMENTED_FEATURE";
declare class ParserError extends Error {
name: ErrorName;
message: string;
constructor(name: ErrorName, message: string);
}
declare function guessDeviceId(data: Buffer, offset?: number): string;
export { type ApplicationLayer, type ApplicationLayer0, type ApplicationLayer12, type ApplicationLayer4, type ApplicationLayerCompact, type ApplicationLayerDummy, type AuthenticationAndFragmentationLayer, type Config, type ConfigMode13, type ConfigMode5, type ConfigMode7, type DataInformationBlock, type DataRecord, type DataRecordHeader, type DataType, type ErrorName, type EvaluatedData, EvaluatedDataType, type ExtendedLinkLayer, type ExtendedLinkLayer10, type ExtendedLinkLayer16, type ExtendedLinkLayer2, type ExtendedLinkLayer8, type LegacyResult, type LinkLayer, type MeterData, ParserError, type ParserOptions, type ParserOptionsFull, type ParserOptionsSimple, type ParserResult, type ParserResultVerbose, type PrimaryVif, type PrimaryVifNumber, type PrimaryVifString, type ValueInformationBlock, VifTable, type WiredLinkLayer, WirelessMbusParser, guessDeviceId, stripAnyCrc };