@pietrolubini/homebridge-ecoflow 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/.prettierrc.json +2 -1
  2. package/README.md +1 -0
  3. package/config.schema.json +1 -1
  4. package/dist/accessories/batteries/batteryAccessory.d.ts +59 -0
  5. package/dist/accessories/{delta2maxAccessory.js → batteries/batteryAccessory.js} +43 -46
  6. package/dist/accessories/batteries/batteryAccessory.js.map +1 -0
  7. package/dist/accessories/batteries/delta2Accessory.d.ts +3 -0
  8. package/dist/accessories/batteries/delta2Accessory.js +4 -0
  9. package/dist/accessories/batteries/delta2Accessory.js.map +1 -0
  10. package/dist/accessories/batteries/delta2maxAccessory.d.ts +3 -0
  11. package/dist/accessories/batteries/delta2maxAccessory.js +4 -0
  12. package/dist/accessories/batteries/delta2maxAccessory.js.map +1 -0
  13. package/dist/accessories/ecoFlowAccessory.d.ts +19 -11
  14. package/dist/accessories/ecoFlowAccessory.js +46 -8
  15. package/dist/accessories/ecoFlowAccessory.js.map +1 -1
  16. package/dist/apis/ecoFlowHttpApi.d.ts +46 -0
  17. package/dist/{accessories/apis → apis}/ecoFlowHttpApi.js +31 -5
  18. package/dist/apis/ecoFlowHttpApi.js.map +1 -0
  19. package/dist/apis/ecoFlowMqttApi.d.ts +53 -0
  20. package/dist/apis/ecoFlowMqttApi.js +100 -0
  21. package/dist/apis/ecoFlowMqttApi.js.map +1 -0
  22. package/dist/config.d.ts +2 -1
  23. package/dist/config.js +1 -0
  24. package/dist/config.js.map +1 -1
  25. package/dist/helpers/logger.js.map +1 -1
  26. package/dist/index.js +1 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/platform.d.ts +1 -1
  29. package/dist/platform.js +9 -2
  30. package/dist/platform.js.map +1 -1
  31. package/dist/{accessories/services → services}/accessoryInformationService.js +4 -4
  32. package/dist/services/accessoryInformationService.js.map +1 -0
  33. package/dist/services/batteryService.js.map +1 -0
  34. package/dist/services/outletAcService.d.ts +8 -0
  35. package/dist/services/outletAcService.js +17 -0
  36. package/dist/services/outletAcService.js.map +1 -0
  37. package/dist/{accessories/services → services}/outletCarService.d.ts +2 -2
  38. package/dist/{accessories/services → services}/outletCarService.js +4 -2
  39. package/dist/services/outletCarService.js.map +1 -0
  40. package/dist/{accessories/services → services}/outletServiceBase.d.ts +6 -4
  41. package/dist/{accessories/services → services}/outletServiceBase.js +6 -12
  42. package/dist/services/outletServiceBase.js.map +1 -0
  43. package/dist/{accessories/services → services}/outletUsbService.d.ts +2 -2
  44. package/dist/{accessories/services → services}/outletUsbService.js +2 -2
  45. package/dist/services/outletUsbService.js.map +1 -0
  46. package/dist/{accessories/services → services}/serviceBase.d.ts +2 -2
  47. package/dist/services/serviceBase.js.map +1 -0
  48. package/package.json +4 -2
  49. package/dist/accessories/apis/ecoFlowHttpApi.d.ts +0 -16
  50. package/dist/accessories/apis/ecoFlowHttpApi.js.map +0 -1
  51. package/dist/accessories/apis/ecoFlowMqttApi.d.ts +0 -23
  52. package/dist/accessories/apis/ecoFlowMqttApi.js +0 -94
  53. package/dist/accessories/apis/ecoFlowMqttApi.js.map +0 -1
  54. package/dist/accessories/apis/interfaces/ecoFlowHttpContacts.d.ts +0 -47
  55. package/dist/accessories/apis/interfaces/ecoFlowHttpContacts.js +0 -6
  56. package/dist/accessories/apis/interfaces/ecoFlowHttpContacts.js.map +0 -1
  57. package/dist/accessories/apis/interfaces/ecoFlowMqttContacts.d.ts +0 -68
  58. package/dist/accessories/apis/interfaces/ecoFlowMqttContacts.js +0 -9
  59. package/dist/accessories/apis/interfaces/ecoFlowMqttContacts.js.map +0 -1
  60. package/dist/accessories/delta2maxAccessory.d.ts +0 -24
  61. package/dist/accessories/delta2maxAccessory.js.map +0 -1
  62. package/dist/accessories/services/accessoryInformationService.js.map +0 -1
  63. package/dist/accessories/services/batteryService.js.map +0 -1
  64. package/dist/accessories/services/outletAcService.d.ts +0 -6
  65. package/dist/accessories/services/outletAcService.js +0 -15
  66. package/dist/accessories/services/outletAcService.js.map +0 -1
  67. package/dist/accessories/services/outletCarService.js.map +0 -1
  68. package/dist/accessories/services/outletServiceBase.js.map +0 -1
  69. package/dist/accessories/services/outletUsbService.js.map +0 -1
  70. package/dist/accessories/services/serviceBase.js.map +0 -1
  71. /package/dist/{accessories/services → services}/accessoryInformationService.d.ts +0 -0
  72. /package/dist/{accessories/services → services}/batteryService.d.ts +0 -0
  73. /package/dist/{accessories/services → services}/batteryService.js +0 -0
  74. /package/dist/{accessories/services → services}/serviceBase.js +0 -0
package/.prettierrc.json CHANGED
@@ -7,5 +7,6 @@
7
7
  "arrowParens": "avoid",
8
8
  "trailingComma": "es5",
9
9
  "bracketSameLine": true,
10
- "printWidth": 120
10
+ "printWidth": 120,
11
+ "plugins": ["prettier-plugin-organize-imports"]
11
12
  }
package/README.md CHANGED
@@ -22,6 +22,7 @@ The goal is to add HomeKit support to EcoFlow devices and make them fully contro
22
22
 
23
23
  ## Supported device types
24
24
 
25
+ - Delta 2
25
26
  - Delta 2 Max
26
27
 
27
28
  For a full list of devices that could be potentially added check [here](https://developer-eu.ecoflow.com/us/document/introduction)
@@ -28,7 +28,7 @@
28
28
  "title": "Model",
29
29
  "type": "string",
30
30
  "required": true,
31
- "enum": ["Delta 2 Max"]
31
+ "enum": ["Delta 2", "Delta 2 Max"]
32
32
  },
33
33
  "serialNumber": {
34
34
  "title": "Serial Number",
@@ -0,0 +1,59 @@
1
+ import { Logging, PlatformAccessory } from 'homebridge';
2
+ import { MqttQuotaMessage } from '../../apis/ecoFlowMqttApi.js';
3
+ import { DeviceConfig } from '../../config.js';
4
+ import { EcoFlowHomebridgePlatform } from '../../platform.js';
5
+ import { ServiceBase } from '../../services/serviceBase.js';
6
+ import { EcoFlowAccessoryWithQuota } from '../ecoFlowAccessory.js';
7
+ export declare abstract class BatteryAccessory extends EcoFlowAccessoryWithQuota<BatteryAllQuotaData> {
8
+ private readonly batteryService;
9
+ private readonly outletUsbService;
10
+ private readonly outletAcService;
11
+ private readonly outletCarService;
12
+ constructor(platform: EcoFlowHomebridgePlatform, accessory: PlatformAccessory, config: DeviceConfig, log: Logging);
13
+ protected getServices(): ServiceBase[];
14
+ protected processQuotaMessage(message: MqttQuotaMessage): void;
15
+ protected updateInitialValues(initialData: BatteryAllQuotaData): void;
16
+ private updateBmsInitialValues;
17
+ private updateInvInitialValues;
18
+ private updatePdInitialValues;
19
+ private updateBmsValues;
20
+ private updateInvValues;
21
+ private updatePdValues;
22
+ private getUsbWatts;
23
+ }
24
+ interface BmsStatus {
25
+ f32ShowSoc: number;
26
+ }
27
+ interface InvStatusAc {
28
+ outputWatts?: number;
29
+ cfgAcEnabled?: boolean;
30
+ cfgAcXboost?: boolean;
31
+ cfgAcOutFreq?: number;
32
+ cfgAcOutVol?: number;
33
+ }
34
+ interface InvStatus extends InvStatusAc {
35
+ inputWatts: number;
36
+ }
37
+ interface PdStatusCar {
38
+ carState?: boolean;
39
+ carWatts?: number;
40
+ }
41
+ interface PdStatusUsb {
42
+ dcOutState?: boolean;
43
+ usb1Watts?: number;
44
+ usb2Watts?: number;
45
+ qcUsb1Watts?: number;
46
+ qcUsb2Watts?: number;
47
+ typec1Watts?: number;
48
+ typec2Watts?: number;
49
+ }
50
+ interface PdStatus extends PdStatusUsb, PdStatusCar {
51
+ carState?: boolean;
52
+ carWatts?: number;
53
+ }
54
+ export interface BatteryAllQuotaData {
55
+ bms_bmsStatus: BmsStatus;
56
+ inv: InvStatus;
57
+ pd: PdStatus;
58
+ }
59
+ export {};
@@ -1,10 +1,10 @@
1
- import { EcoFlowAccessoryWithQuota } from './ecoFlowAccessory.js';
2
- import { BatteryService } from './services/batteryService.js';
3
- import { OutletUsbService } from './services/outletUsbService.js';
4
- import { OutletCarService } from './services/outletCarService.js';
5
- import { OutletAcService } from './services/outletAcService.js';
6
- import { MqttMessageType, } from './apis/interfaces/ecoFlowMqttContacts.js';
7
- export class Delta2MaxAccessory extends EcoFlowAccessoryWithQuota {
1
+ import { MqttMessageType } from '../../apis/ecoFlowMqttApi.js';
2
+ import { BatteryService } from '../../services/batteryService.js';
3
+ import { OutletAcService } from '../../services/outletAcService.js';
4
+ import { OutletCarService } from '../../services/outletCarService.js';
5
+ import { OutletUsbService } from '../../services/outletUsbService.js';
6
+ import { EcoFlowAccessoryWithQuota } from '../ecoFlowAccessory.js';
7
+ export class BatteryAccessory extends EcoFlowAccessoryWithQuota {
8
8
  batteryService;
9
9
  outletUsbService;
10
10
  outletAcService;
@@ -19,54 +19,51 @@ export class Delta2MaxAccessory extends EcoFlowAccessoryWithQuota {
19
19
  getServices() {
20
20
  return [this.batteryService, this.outletUsbService, this.outletAcService, this.outletCarService];
21
21
  }
22
- updateInitialValues(initialData) {
23
- this.updateBmsInitialValues(initialData);
24
- this.updateInvInitialValues(initialData);
25
- this.updatePdInitialValues(initialData);
22
+ processQuotaMessage(message) {
23
+ if (message.typeCode === MqttMessageType.BMS) {
24
+ const bmsStatus = message.params;
25
+ this.log.debug('BMS:', bmsStatus);
26
+ Object.assign(this.quota.bms_bmsStatus, bmsStatus);
27
+ this.updateBmsValues(bmsStatus);
28
+ }
29
+ else if (message.typeCode === MqttMessageType.INV) {
30
+ const invStatus = message.params;
31
+ this.log.debug('INV:', invStatus);
32
+ Object.assign(this.quota.inv, invStatus);
33
+ this.updateInvValues(invStatus);
34
+ }
35
+ else if (message.typeCode === MqttMessageType.PD) {
36
+ const pdStatus = message.params;
37
+ this.log.debug('PD:', pdStatus);
38
+ Object.assign(this.quota.pd, pdStatus);
39
+ this.updatePdValues(pdStatus);
40
+ }
26
41
  }
27
- subscribeOnParameterUpdates() {
28
- return [
29
- this.mqttApi.bmsParams$.subscribe(params => this.updateBmsValues(params)),
30
- this.mqttApi.invParams$.subscribe(params => this.updateInvValues(params)),
31
- this.mqttApi.pdParams$.subscribe(params => this.updatePdValues(params)),
32
- ];
42
+ updateInitialValues(initialData) {
43
+ this.updateBmsInitialValues(initialData.bms_bmsStatus);
44
+ this.updateInvInitialValues(initialData.inv);
45
+ this.updatePdInitialValues(initialData.pd);
33
46
  }
34
- updateBmsInitialValues(initialData) {
35
- const bmsMessage = {
47
+ updateBmsInitialValues(params) {
48
+ const message = {
36
49
  typeCode: MqttMessageType.BMS,
37
- params: {
38
- f32ShowSoc: initialData['bms_bmsStatus.f32ShowSoc'],
39
- },
50
+ params,
40
51
  };
41
- this.mqttApi.processMqttMessage(bmsMessage);
52
+ this.processQuotaMessage(message);
42
53
  }
43
- updateInvInitialValues(initialData) {
44
- const invMessage = {
54
+ updateInvInitialValues(params) {
55
+ const message = {
45
56
  typeCode: MqttMessageType.INV,
46
- params: {
47
- inputWatts: initialData['inv.inputWatts'],
48
- outputWatts: initialData['inv.outputWatts'],
49
- cfgAcEnabled: initialData['inv.cfgAcEnabled'],
50
- },
57
+ params,
51
58
  };
52
- this.mqttApi.processMqttMessage(invMessage);
59
+ this.processQuotaMessage(message);
53
60
  }
54
- updatePdInitialValues(initialData) {
55
- const pdMessage = {
61
+ updatePdInitialValues(params) {
62
+ const message = {
56
63
  typeCode: MqttMessageType.PD,
57
- params: {
58
- carState: initialData['pd.carState'],
59
- carWatts: initialData['pd.carWatts'],
60
- dcOutState: initialData['pd.dcOutState'],
61
- usb1Watts: initialData['pd.usb1Watts'],
62
- usb2Watts: initialData['pd.usb2Watts'],
63
- qcUsb1Watts: initialData['pd.qcUsb1Watts'],
64
- qcUsb2Watts: initialData['pd.qcUsb2Watts'],
65
- typec1Watts: initialData['pd.typec1Watts'],
66
- typec2Watts: initialData['pd.typec2Watts'],
67
- },
64
+ params,
68
65
  };
69
- this.mqttApi.processMqttMessage(pdMessage);
66
+ this.processQuotaMessage(message);
70
67
  }
71
68
  updateBmsValues(params) {
72
69
  if (params.f32ShowSoc !== undefined) {
@@ -114,4 +111,4 @@ export class Delta2MaxAccessory extends EcoFlowAccessoryWithQuota {
114
111
  (typec2Watts ?? 0));
115
112
  }
116
113
  }
117
- //# sourceMappingURL=delta2maxAccessory.js.map
114
+ //# sourceMappingURL=batteryAccessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batteryAccessory.js","sourceRoot":"","sources":["../../../src/accessories/batteries/batteryAccessory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { BatteryAccessory } from './batteryAccessory.js';
2
+ export declare class Delta2Accessory extends BatteryAccessory {
3
+ }
@@ -0,0 +1,4 @@
1
+ import { BatteryAccessory } from './batteryAccessory.js';
2
+ export class Delta2Accessory extends BatteryAccessory {
3
+ }
4
+ //# sourceMappingURL=delta2Accessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta2Accessory.js","sourceRoot":"","sources":["../../../src/accessories/batteries/delta2Accessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,OAAO,eAAgB,SAAQ,gBAAgB;CAAG"}
@@ -0,0 +1,3 @@
1
+ import { BatteryAccessory } from './batteryAccessory.js';
2
+ export declare class Delta2MaxAccessory extends BatteryAccessory {
3
+ }
@@ -0,0 +1,4 @@
1
+ import { BatteryAccessory } from './batteryAccessory.js';
2
+ export class Delta2MaxAccessory extends BatteryAccessory {
3
+ }
4
+ //# sourceMappingURL=delta2maxAccessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta2maxAccessory.js","sourceRoot":"","sources":["../../../src/accessories/batteries/delta2maxAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,OAAO,kBAAmB,SAAQ,gBAAgB;CAAG"}
@@ -1,34 +1,42 @@
1
1
  import { Logging, PlatformAccessory } from 'homebridge';
2
- import { EcoFlowHomebridgePlatform } from '../platform.js';
3
- import { DeviceConfig } from '../config.js';
4
- import { ServiceBase } from './services/serviceBase.js';
5
- import { EcoFlowMqttApi } from './apis/ecoFlowMqttApi.js';
6
- import { EcoFlowHttpApi } from './apis/ecoFlowHttpApi.js';
7
- import { CmdResponseData } from './apis/interfaces/ecoFlowHttpContacts.js';
8
2
  import { Subscription } from 'rxjs';
3
+ import { EcoFlowHttpApi } from '../apis/ecoFlowHttpApi.js';
4
+ import { EcoFlowMqttApi, MqttQuotaMessage, MqttSetMessage, MqttSetReplyMessage } from '../apis/ecoFlowMqttApi.js';
5
+ import { DeviceConfig } from '../config.js';
6
+ import { EcoFlowHomebridgePlatform } from '../platform.js';
7
+ import { ServiceBase } from '../services/serviceBase.js';
9
8
  export declare abstract class EcoFlowAccessory {
10
9
  readonly platform: EcoFlowHomebridgePlatform;
11
10
  readonly accessory: PlatformAccessory;
12
11
  readonly config: DeviceConfig;
13
12
  readonly log: Logging;
14
- readonly mqttApi: EcoFlowMqttApi;
13
+ protected readonly mqttApi: EcoFlowMqttApi;
15
14
  protected readonly httpApi: EcoFlowHttpApi;
16
15
  private services;
17
16
  private reconnectMqttTimeoutId;
18
17
  private isMqttConnected;
19
18
  private subscriptions;
19
+ readonly setReplies: Record<string, {
20
+ requestMessage: MqttSetMessage;
21
+ revert: () => void;
22
+ }>;
20
23
  constructor(platform: EcoFlowHomebridgePlatform, accessory: PlatformAccessory, config: DeviceConfig, log: Logging);
21
24
  initialize(): Promise<void>;
22
25
  destroy(): void;
26
+ sendSetCommand<TParams>(moduleType: number, operateType: string, params: TParams, revert: () => void): Promise<void>;
23
27
  protected abstract getServices(): ServiceBase[];
24
- protected abstract subscribeOnParameterUpdates(): Subscription[];
28
+ protected subscribeOnParameterUpdates(): Subscription[];
29
+ protected abstract processQuotaMessage(message: MqttQuotaMessage): void;
30
+ protected processSetReplyMessage(message: MqttSetReplyMessage): void;
31
+ private getMqttSetMessageKey;
25
32
  private initializeServices;
26
33
  private cleanupServices;
27
34
  private connectMqtt;
28
35
  private initMqtt;
29
36
  }
30
- export declare abstract class EcoFlowAccessoryWithQuota<TGetQuotasCmdResponseData extends CmdResponseData> extends EcoFlowAccessory {
31
- private initialData;
37
+ export declare abstract class EcoFlowAccessoryWithQuota<TAllQuotaData> extends EcoFlowAccessory {
38
+ private _quota;
32
39
  initialize(): Promise<void>;
33
- protected abstract updateInitialValues(initialData: TGetQuotasCmdResponseData): void;
40
+ get quota(): TAllQuotaData;
41
+ protected abstract updateInitialValues(quota: TAllQuotaData): void;
34
42
  }
@@ -1,6 +1,6 @@
1
- import { EcoFlowMqttApi } from './apis/ecoFlowMqttApi.js';
2
- import { AccessoryInformationService } from './services/accessoryInformationService.js';
3
- import { EcoFlowHttpApi } from './apis/ecoFlowHttpApi.js';
1
+ import { EcoFlowHttpApi } from '../apis/ecoFlowHttpApi.js';
2
+ import { EcoFlowMqttApi, } from '../apis/ecoFlowMqttApi.js';
3
+ import { AccessoryInformationService } from '../services/accessoryInformationService.js';
4
4
  export class EcoFlowAccessory {
5
5
  platform;
6
6
  accessory;
@@ -12,6 +12,7 @@ export class EcoFlowAccessory {
12
12
  reconnectMqttTimeoutId = null;
13
13
  isMqttConnected = false;
14
14
  subscriptions = [];
15
+ setReplies = {};
15
16
  constructor(platform, accessory, config, log) {
16
17
  this.platform = platform;
17
18
  this.accessory = accessory;
@@ -34,6 +35,38 @@ export class EcoFlowAccessory {
34
35
  }
35
36
  this.subscriptions.forEach(subscription => subscription.unsubscribe());
36
37
  }
38
+ async sendSetCommand(moduleType, operateType, params, revert) {
39
+ const requestMessage = {
40
+ id: Math.floor(Math.random() * 1000000),
41
+ version: '1.0',
42
+ moduleType,
43
+ operateType,
44
+ params,
45
+ };
46
+ this.setReplies[this.getMqttSetMessageKey(requestMessage)] = { requestMessage, revert };
47
+ await this.mqttApi.sendSetCommand(this.config.serialNumber, requestMessage);
48
+ }
49
+ subscribeOnParameterUpdates() {
50
+ return [
51
+ this.mqttApi.quota$.subscribe(message => this.processQuotaMessage(message)),
52
+ this.mqttApi.setReply$.subscribe(message => this.processSetReplyMessage(message)),
53
+ ];
54
+ }
55
+ processSetReplyMessage(message) {
56
+ const messageKey = this.getMqttSetMessageKey(message);
57
+ const command = this.setReplies[messageKey];
58
+ delete this.setReplies[messageKey];
59
+ if (message.data.ack) {
60
+ this.log.warn('Failed to set a value. Reverts value back for:', command.requestMessage.operateType);
61
+ command.revert();
62
+ }
63
+ else {
64
+ this.log.debug('Setting of a value was successful for:', command.requestMessage.operateType);
65
+ }
66
+ }
67
+ getMqttSetMessageKey(message) {
68
+ return `${message.operateType}_${message.id}`;
69
+ }
37
70
  initializeServices() {
38
71
  this.services.forEach(service => {
39
72
  service.initialize();
@@ -59,17 +92,22 @@ export class EcoFlowAccessory {
59
92
  }, 60 * 1000);
60
93
  }
61
94
  async initMqtt() {
62
- this.isMqttConnected = await this.mqttApi.subscribe('/open/<certificateAccount>/<sn>/quota', this.config.serialNumber);
95
+ this.isMqttConnected =
96
+ (await this.mqttApi.subscribeOnQuota(this.config.serialNumber)) &&
97
+ (await this.mqttApi.subscribeOnSetReply(this.config.serialNumber));
63
98
  }
64
99
  }
65
100
  export class EcoFlowAccessoryWithQuota extends EcoFlowAccessory {
66
- initialData = null;
101
+ _quota = null;
67
102
  async initialize() {
68
- if (!this.initialData) {
69
- this.initialData = await this.httpApi.getAllQuotas();
103
+ if (!this._quota) {
104
+ this._quota = await this.httpApi.getAllQuotas();
70
105
  }
71
106
  await super.initialize();
72
- this.updateInitialValues(this.initialData);
107
+ this.updateInitialValues(this._quota);
108
+ }
109
+ get quota() {
110
+ return this._quota;
73
111
  }
74
112
  }
75
113
  //# sourceMappingURL=ecoFlowAccessory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ecoFlowAccessory.js","sourceRoot":"","sources":["../../src/accessories/ecoFlowAccessory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ecoFlowAccessory.js","sourceRoot":"","sources":["../../src/accessories/ecoFlowAccessory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { Logging } from 'homebridge';
2
+ import { DeviceConfig } from '../config.js';
3
+ export declare enum HttpMethod {
4
+ Get = "GET",
5
+ Post = "POST"
6
+ }
7
+ export interface CmdResponse {
8
+ code: string;
9
+ message: string;
10
+ failed: boolean;
11
+ }
12
+ export interface CmdResponseWithData<TData> extends CmdResponse {
13
+ code: string;
14
+ message: string;
15
+ data: TData;
16
+ }
17
+ export interface GetCmdRequest {
18
+ sn: string;
19
+ }
20
+ export interface GetQuotasCmdRequest extends GetCmdRequest {
21
+ params: GetQuotasCmdRequestParams;
22
+ }
23
+ export interface GetQuotasCmdRequestParams {
24
+ quotas: string[];
25
+ }
26
+ export interface AcquireCertificateData {
27
+ certificateAccount: string;
28
+ certificatePassword: string;
29
+ url: string;
30
+ port: string;
31
+ protocol: string;
32
+ }
33
+ export declare class EcoFlowHttpApi {
34
+ private readonly config;
35
+ private readonly log;
36
+ constructor(config: DeviceConfig, log: Logging);
37
+ getQuotas<TData>(quotas: string[]): Promise<TData>;
38
+ getAllQuotas<TData>(): Promise<TData>;
39
+ acquireCertificate(): Promise<AcquireCertificateData | null>;
40
+ protected execute<TResponse extends CmdResponse>(relativeUrl: string, method: HttpMethod, queryParameters?: object | null, body?: object | null): Promise<TResponse>;
41
+ private getNonce;
42
+ private composeSignMessage;
43
+ private createHmacSha256;
44
+ private stringifyOptions;
45
+ private convertData;
46
+ }
@@ -1,9 +1,13 @@
1
1
  import * as crypto from 'crypto';
2
- import { HttpMethod, } from './interfaces/ecoFlowHttpContacts.js';
3
2
  const ApiUrl = 'https://api-e.ecoflow.com';
4
3
  const QuotaPath = '/iot-open/sign/device/quota';
5
4
  const QuotaAllPath = '/iot-open/sign/device/quota/all';
6
5
  const CertificatePath = '/iot-open/sign/certification';
6
+ export var HttpMethod;
7
+ (function (HttpMethod) {
8
+ HttpMethod["Get"] = "GET";
9
+ HttpMethod["Post"] = "POST";
10
+ })(HttpMethod || (HttpMethod = {}));
7
11
  export class EcoFlowHttpApi {
8
12
  config;
9
13
  log;
@@ -21,7 +25,7 @@ export class EcoFlowHttpApi {
21
25
  };
22
26
  const response = await this.execute(QuotaPath, HttpMethod.Post, requestCmd);
23
27
  if (!response.failed) {
24
- const data = response.data;
28
+ const data = this.convertData(response.data);
25
29
  this.log.debug('Quotas:', data);
26
30
  return data;
27
31
  }
@@ -34,7 +38,7 @@ export class EcoFlowHttpApi {
34
38
  };
35
39
  const response = await this.execute(QuotaAllPath, HttpMethod.Get, requestCmd);
36
40
  if (!response.failed) {
37
- const data = response.data;
41
+ const data = this.convertData(response.data);
38
42
  this.log.debug('All quotas:', data);
39
43
  return data;
40
44
  }
@@ -76,13 +80,18 @@ export class EcoFlowHttpApi {
76
80
  const response = await fetch(requestUrl, options);
77
81
  const result = (await response.json());
78
82
  if (result.code !== '0') {
79
- throw Error(`Request to "${requestUrl}" with options: "${this.stringifyOptions(options)}" is failed [${response.status}]: ${response.statusText}; result: ${JSON.stringify(result)}`);
83
+ throw Error(`Request to "${requestUrl}" with options: "${this.stringifyOptions(options)}" is failed
84
+ [${response.status}]: ${response.statusText}; result: ${JSON.stringify(result)}`);
80
85
  }
81
86
  return result;
82
87
  }
83
88
  catch (e) {
84
89
  this.log.error('Request is failed:', e);
85
- return { code: '500', message: e?.message, failed: true };
90
+ return {
91
+ code: '500',
92
+ message: e?.message,
93
+ failed: true,
94
+ };
86
95
  }
87
96
  }
88
97
  getNonce() {
@@ -131,5 +140,22 @@ export class EcoFlowHttpApi {
131
140
  };
132
141
  return JSON.stringify(newOptions);
133
142
  }
143
+ convertData(data) {
144
+ const result = {};
145
+ Object.keys(data).forEach(key => {
146
+ const keys = key.split('.');
147
+ let current = result;
148
+ keys.forEach((k, index) => {
149
+ if (index === keys.length - 1) {
150
+ current[k] = data[key];
151
+ }
152
+ else {
153
+ current[k] = current[k] || {};
154
+ current = current[k];
155
+ }
156
+ });
157
+ });
158
+ return result;
159
+ }
134
160
  }
135
161
  //# sourceMappingURL=ecoFlowHttpApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecoFlowHttpApi.js","sourceRoot":"","sources":["../../src/apis/ecoFlowHttpApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { Logging } from 'homebridge';
2
+ import { EcoFlowHttpApi } from './ecoFlowHttpApi.js';
3
+ export declare enum MqttMessageType {
4
+ PD = "pdStatus",
5
+ MPPT = "mpptStatus",
6
+ INV = "invStatus",
7
+ BMS = "bmsStatus",
8
+ EMS = "emsStatus"
9
+ }
10
+ export interface MqttQuotaMessage {
11
+ typeCode: MqttMessageType;
12
+ }
13
+ export interface MqttQuotaMessageWithParams<TParams> extends MqttQuotaMessage {
14
+ typeCode: MqttMessageType;
15
+ params: TParams;
16
+ }
17
+ export interface MqttSetMessage {
18
+ id: number;
19
+ version: string;
20
+ operateType: string;
21
+ }
22
+ export interface MqttSetMessageWithParams<TParams> extends MqttSetMessage {
23
+ moduleType: number;
24
+ params: TParams;
25
+ }
26
+ export interface MqttSetReplyMessage extends MqttSetMessage {
27
+ data: {
28
+ ack: boolean;
29
+ };
30
+ }
31
+ export declare enum MqttTopicType {
32
+ Quota = "quota",
33
+ SetReply = "set_reply"
34
+ }
35
+ export declare class EcoFlowMqttApi {
36
+ private httpApi;
37
+ private log;
38
+ private client;
39
+ private certificateData;
40
+ private readonly quotaSubject;
41
+ private readonly setReplySubject;
42
+ readonly quota$: import("rxjs").Observable<MqttQuotaMessage>;
43
+ readonly setReply$: import("rxjs").Observable<MqttSetReplyMessage>;
44
+ constructor(httpApi: EcoFlowHttpApi, log: Logging);
45
+ destroy(): Promise<void>;
46
+ subscribeOnQuota(serialNumber: string): Promise<boolean>;
47
+ subscribeOnSetReply(serialNumber: string): Promise<boolean>;
48
+ sendSetCommand(serialNumber: string, message: MqttSetMessage): Promise<void>;
49
+ private connect;
50
+ private subscribe;
51
+ private processReceivedMessage;
52
+ private acquireCertificate;
53
+ }