Skip to content

Commit

Permalink
feat: add getParsedTelegram method
Browse files Browse the repository at this point in the history
  • Loading branch information
jvandenaardweg committed Dec 18, 2022
1 parent e7b3ed3 commit f874f18
Show file tree
Hide file tree
Showing 7 changed files with 187 additions and 149 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
"prepare": "is-ci || husky install",
"lint-staged": "lint-staged",
"watch": "nodemon ./src/examples/**",
"watch:polling": "nodemon ./src/examples/polling-p1-meter-telegram.ts"
"watch:polling": "nodemon ./src/examples/p1-meter-parsed-telegram.ts"
},
"keywords": [
"homewizard",
Expand Down
85 changes: 85 additions & 0 deletions src/examples/p1-meter-parsed-telegram.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import { P1MeterApi } from '../';

const p1Meter = new P1MeterApi('http://192.168.1.35');

(async () => {
try {
// Get a parsed version of the telegram
const parsedTelegram = await p1Meter.getParsedTelegram();
// Returns a parsed version of the telegram:
// {
// meterType: 'ISK5\\2M550T-1012',
// version: '50',
// timestamp: '2022-12-18T22:16:34.000Z',
// equipmentId: '4530303434303237303138303138314137',
// textMessage: { codes: null, message: '' },
// power: {
// import: {
// t1: { value: 19067.638, unit: 'kWh' },
// t2: { value: 19505.815, unit: 'kWh' },
// active: { value: 0.715, unit: 'kW' },
// },
// export: {
// t1: { value: 0.002, unit: 'kWh' },
// t2: { value: 0.007, unit: 'kWh' },
// active: { value: 0, unit: 'kW' },
// },
// tariffIndicator: 1,
// threshold: { value: null, unit: null },
// fuseThreshold: { value: null, unit: null },
// switchPosition: null,
// numberOfPowerFailures: 7,
// numberOfLongPowerFailures: 4,
// longPowerFailureLog: {
// count: 1,
// log: [
// {
// startOfFailure: '2017-11-30T18:14:43.000Z',
// endOfFailure: '2017-11-30T18:30:27.000Z',
// duration: 944,
// unit: 's',
// },
// ],
// },
// voltageSags: { l1: 8, l2: 7, l3: 11 },
// voltageSwell: { l1: 1, l2: 9, l3: 9 },
// instantaneous: {
// current: {
// l1: { value: 0, unit: 'A' },
// l2: { value: 0, unit: 'A' },
// l3: { value: 2, unit: 'A' },
// },
// voltage: {
// l1: { value: 227, unit: 'V' },
// l2: { value: 223, unit: 'V' },
// l3: { value: 222, unit: 'V' },
// },
// power: {
// positive: {
// l1: { value: 0.076, unit: 'kW' },
// l2: { value: 0.01, unit: 'kW' },
// l3: { value: 0.627, unit: 'kW' },
// },
// negative: {
// l1: { value: 0, unit: 'kW' },
// l2: { value: 0, unit: 'kW' },
// l3: { value: 0, unit: 'kW' },
// },
// },
// },
// },
// gas: {
// deviceType: '003',
// equipmentId: '4730303332353635353330393732333137',
// timestamp: '2022-12-18T22:15:04.000Z',
// value: 6798.545,
// unit: 'm3',
// valvePosition: null,
// },
// };

console.log(JSON.stringify(parsedTelegram));
} catch (err) {
console.error(err);
}
})();
2 changes: 1 addition & 1 deletion src/examples/p1-meter.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { P1MeterApi } from '../';

const p1Meter = new P1MeterApi('http://192.168.1.11');
const p1Meter = new P1MeterApi('http://192.168.1.35');

(async () => {
try {
Expand Down
76 changes: 39 additions & 37 deletions src/mocks/data/telegram.ts
Original file line number Diff line number Diff line change
@@ -1,39 +1,40 @@
// const v50l3 = `ISK5\\2M550T-1012\r
// \r
// 1-3:0.2.8(50)\r
// 0-0:1.0.0(191229233714W)\r
// 0-0:96.1.1(4530303434303037313138353239333138)\r
// 1-0:1.8.1(004000.647*kWh)\r
// 1-0:1.8.2(001154.948*kWh)\r
// 1-0:2.8.1(000000.000*kWh)\r
// 1-0:2.8.2(000000.000*kWh)\r
// 0-0:96.14.0(0001)\r
// 1-0:1.7.0(01.765*kW)\r
// 1-0:2.7.0(00.000*kW)\r
// 0-0:96.7.21(00009)\r
// 0-0:96.7.9(00004)\r
// 1-0:99.97.0(2)(0-0:96.7.19)(180327064111S)(0000000180*s)(190108105923W)(0000002603*s)\r
// 1-0:32.32.0(00001)\r
// 1-0:52.32.0(00001)\r
// 1-0:72.32.0(00001)\r
// 1-0:32.36.0(00001)\r
// 1-0:52.36.0(00001)\r
// 1-0:72.36.0(00001)\r
// 0-0:96.13.0()\r
// 1-0:32.7.0(236.9*V)\r
// 1-0:52.7.0(235.1*V)\r
// 1-0:72.7.0(234.9*V)\r
// 1-0:31.7.0(000*A)\r
// 1-0:51.7.0(000*A)\r
// 1-0:71.7.0(006*A)\r
// 1-0:21.7.0(00.132*kW)\r
// 1-0:41.7.0(00.037*kW)\r
// 1-0:61.7.0(01.596*kW)\r
// 1-0:22.7.0(00.000*kW)\r
// 1-0:42.7.0(00.000*kW)\r
// 1-0:62.7.0(00.000*kW)\r
// !58E5\r`;
const v50l3 = `ISK5\\2M550T-1012\r
const v50l3_1 = `ISK5\\2M550T-1012\r
\r
1-3:0.2.8(50)\r
0-0:1.0.0(191229233714W)\r
0-0:96.1.1(4530303434303037313138353239333138)\r
1-0:1.8.1(004000.647*kWh)\r
1-0:1.8.2(001154.948*kWh)\r
1-0:2.8.1(000000.000*kWh)\r
1-0:2.8.2(000000.000*kWh)\r
0-0:96.14.0(0001)\r
1-0:1.7.0(01.765*kW)\r
1-0:2.7.0(00.000*kW)\r
0-0:96.7.21(00009)\r
0-0:96.7.9(00004)\r
1-0:99.97.0(2)(0-0:96.7.19)(180327064111S)(0000000180*s)(190108105923W)(0000002603*s)\r
1-0:32.32.0(00001)\r
1-0:52.32.0(00001)\r
1-0:72.32.0(00001)\r
1-0:32.36.0(00001)\r
1-0:52.36.0(00001)\r
1-0:72.36.0(00001)\r
0-0:96.13.0()\r
1-0:32.7.0(236.9*V)\r
1-0:52.7.0(235.1*V)\r
1-0:72.7.0(234.9*V)\r
1-0:31.7.0(000*A)\r
1-0:51.7.0(000*A)\r
1-0:71.7.0(006*A)\r
1-0:21.7.0(00.132*kW)\r
1-0:41.7.0(00.037*kW)\r
1-0:61.7.0(01.596*kW)\r
1-0:22.7.0(00.000*kW)\r
1-0:42.7.0(00.000*kW)\r
1-0:62.7.0(00.000*kW)\r
!58E5\r`;

const v50l3_2 = `ISK5\\2M550T-1012\r
\r
1-3:0.2.8(50)\r
0-0:1.0.0(221215222225W)\r
Expand Down Expand Up @@ -210,7 +211,8 @@ const v50 = `XMX5LGBBLA4415290514\r
`;

export const mockTelegramResponse = {
v50l3,
v50l3_1,
v50l3_2,
v50be,
v22,
v42,
Expand Down
4 changes: 2 additions & 2 deletions src/p1-meter-api.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,13 +101,13 @@ describe('HomeWizardEnergyApi', () => {
method: 'GET',
})
.reply(() => ({
data: mockTelegramResponse['v50l3'],
data: mockTelegramResponse['v50l3_1'],
statusCode: 200,
}));

const data = await p1MeterApi.getTelegram();

expect(data).toStrictEqual(mockTelegramResponse['v50l3']);
expect(data).toStrictEqual(mockTelegramResponse['v50l3_1']);
});

it('should throw an error on GET when the "telegram" endpoint returns a server error', async () => {
Expand Down
16 changes: 16 additions & 0 deletions src/p1-meter-api.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { BaseApi, BaseApiOptions, BasePolling, PollMethod } from '@/base-api';
import { BasicInformationResponse, P1MeterDataResponse, TelegramResponse } from '@/types';
import { ParsedTelegram, parseTelegram } from './utils/telegram';

export interface P1MeterPolling<TTelegramResponse extends TelegramResponse>
extends BasePolling<P1MeterDataResponse> {
Expand Down Expand Up @@ -90,4 +91,19 @@ export class P1MeterApi extends BaseApi {

return data;
}

/**
* The /api/v1/telegram endpoint returns the most recent, valid telegram that was given by the P1 meter in a text format.
*
* This method fetches the telegram and parses it and returns it as a JSON object.
*/
async getParsedTelegram<T extends ParsedTelegram>(): Promise<T> {
const telegram = await this.getTelegram();

const parsedTelegram = parseTelegram(telegram) as T;

this.log(`Parsed telegram ${JSON.stringify(parsedTelegram)} from ${this.endpoints.telegram}`);

return parsedTelegram;
}
}
Loading

0 comments on commit f874f18

Please sign in to comment.