@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
@@ -0,0 +1,100 @@
1
+ import mqtt from 'mqtt';
2
+ import { Subject } from 'rxjs';
3
+ import { getMachineId } from '../helpers/machineId.js';
4
+ export var MqttMessageType;
5
+ (function (MqttMessageType) {
6
+ MqttMessageType["PD"] = "pdStatus";
7
+ MqttMessageType["MPPT"] = "mpptStatus";
8
+ MqttMessageType["INV"] = "invStatus";
9
+ MqttMessageType["BMS"] = "bmsStatus";
10
+ MqttMessageType["EMS"] = "emsStatus";
11
+ })(MqttMessageType || (MqttMessageType = {}));
12
+ export var MqttTopicType;
13
+ (function (MqttTopicType) {
14
+ MqttTopicType["Quota"] = "quota";
15
+ MqttTopicType["SetReply"] = "set_reply";
16
+ })(MqttTopicType || (MqttTopicType = {}));
17
+ export class EcoFlowMqttApi {
18
+ httpApi;
19
+ log;
20
+ client = null;
21
+ certificateData = null;
22
+ quotaSubject = new Subject();
23
+ setReplySubject = new Subject();
24
+ quota$ = this.quotaSubject.asObservable();
25
+ setReply$ = this.setReplySubject.asObservable();
26
+ constructor(httpApi, log) {
27
+ this.httpApi = httpApi;
28
+ this.log = log;
29
+ }
30
+ async destroy() {
31
+ await this.client?.unsubscribeAsync('#');
32
+ this.log.debug('Unsubscribed from all topics');
33
+ await this.client?.end();
34
+ this.log.info('Disconnected from EcoFlow MQTT Service');
35
+ }
36
+ subscribeOnQuota(serialNumber) {
37
+ return this.subscribe(serialNumber, MqttTopicType.Quota);
38
+ }
39
+ subscribeOnSetReply(serialNumber) {
40
+ return this.subscribe(serialNumber, MqttTopicType.SetReply);
41
+ }
42
+ async sendSetCommand(serialNumber, message) {
43
+ const client = await this.connect();
44
+ if (client) {
45
+ const topic = `/open/${this.certificateData.certificateAccount}/${serialNumber}/set`;
46
+ await client.publishAsync(topic, JSON.stringify(message));
47
+ this.log.debug(`Published to topic '${topic}':`, message);
48
+ }
49
+ }
50
+ async connect() {
51
+ if (!this.client) {
52
+ const certificateData = await this.acquireCertificate();
53
+ if (certificateData) {
54
+ const clientId = `HOMEBRIDGE_${(await getMachineId(this.log)).toUpperCase()}`;
55
+ this.client = await mqtt.connectAsync(`${certificateData.protocol}://${certificateData.url}:${certificateData.port}`, {
56
+ username: `${certificateData.certificateAccount}`,
57
+ password: `${certificateData.certificatePassword}`,
58
+ clientId,
59
+ protocolVersion: 5,
60
+ });
61
+ this.log.info('Connected to EcoFlow MQTT Service');
62
+ this.client.on('message', (topic, message) => {
63
+ const mqttMessage = JSON.parse(message.toString());
64
+ this.processReceivedMessage(topic, (topic.split('/').pop() || ''), mqttMessage);
65
+ });
66
+ }
67
+ }
68
+ return this.client;
69
+ }
70
+ async subscribe(serialNumber, topicType) {
71
+ const client = await this.connect();
72
+ if (client) {
73
+ const topic = `/open/${this.certificateData.certificateAccount}/${serialNumber}/${topicType}`;
74
+ await client.subscribeAsync(topic);
75
+ this.log.debug('Subscribed to topic:', topic);
76
+ return true;
77
+ }
78
+ return false;
79
+ }
80
+ processReceivedMessage(topic, topicType, message) {
81
+ switch (topicType) {
82
+ case MqttTopicType.Quota:
83
+ this.quotaSubject.next(message);
84
+ break;
85
+ case MqttTopicType.SetReply:
86
+ this.log.debug(`Read from topic '${topic}':`, message);
87
+ this.setReplySubject.next(message);
88
+ break;
89
+ default:
90
+ this.log.warn('Received message for unsupported topic:', topicType);
91
+ }
92
+ }
93
+ async acquireCertificate() {
94
+ if (!this.certificateData) {
95
+ this.certificateData = await this.httpApi.acquireCertificate();
96
+ }
97
+ return this.certificateData;
98
+ }
99
+ }
100
+ //# sourceMappingURL=ecoFlowMqttApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecoFlowMqttApi.js","sourceRoot":"","sources":["../../src/apis/ecoFlowMqttApi.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -3,7 +3,8 @@ export interface EcoFlowConfig extends PlatformConfig {
3
3
  devices: DeviceConfig[];
4
4
  }
5
5
  export declare enum DeviceModel {
6
- Delta2Max = "Delta 2 Max"
6
+ Delta2Max = "Delta 2 Max",
7
+ Delta2 = "Delta 2"
7
8
  }
8
9
  export interface DeviceConfig extends AccessoryConfig {
9
10
  model: DeviceModel;
package/dist/config.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export var DeviceModel;
2
2
  (function (DeviceModel) {
3
3
  DeviceModel["Delta2Max"] = "Delta 2 Max";
4
+ DeviceModel["Delta2"] = "Delta 2";
4
5
  })(DeviceModel || (DeviceModel = {}));
5
6
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,MAAM,CAAN,IAAY,WAEX;AAFD,WAAY,WAAW;IACrB,wCAAyB,CAAA;AAC3B,CAAC,EAFW,WAAW,KAAX,WAAW,QAEtB"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,MAAM,CAAN,IAAY,WAGX;AAHD,WAAY,WAAW;IACrB,wCAAyB,CAAA;IACzB,iCAAkB,CAAA;AACpB,CAAC,EAHW,WAAW,KAAX,WAAW,QAGtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/helpers/logger.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,MAAM;IACoB;IAAkC;IAAvE,YAAqC,MAAe,EAAmB,UAAkB;QAApD,WAAM,GAAN,MAAM,CAAS;QAAmB,eAAU,GAAV,UAAU,CAAQ;IAAG,CAAC;IAEtF,MAAM,CAAC,MAAM,CAAC,MAAe,EAAE,UAAkB;QACtD,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,CAAuB,CAAC;IAC9D,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,8DAA8D;IACvD,IAAI,CAAC,OAAe,EAAE,GAAG,UAAiB;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED,8DAA8D;IACvD,OAAO,CAAC,OAAe,EAAE,GAAG,UAAiB;QAClD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7D,CAAC;IAED,8DAA8D;IACvD,IAAI,CAAC,OAAe,EAAE,GAAG,UAAiB;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED,8DAA8D;IACvD,KAAK,CAAC,OAAe,EAAE,GAAG,UAAiB;QAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;IAED,8DAA8D;IACvD,KAAK,CAAC,OAAe,EAAE,GAAG,UAAiB;QAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;IAED,8DAA8D;IACvD,GAAG,CAAC,KAAe,EAAE,OAAe,EAAE,GAAG,UAAiB;QAC/D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;IAEO,WAAW,CAAC,OAAe;QACjC,OAAO,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;IAC3C,CAAC;CACF"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/helpers/logger.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,MAAM;IAEE;IACA;IAFnB,YACmB,MAAe,EACf,UAAkB;QADlB,WAAM,GAAN,MAAM,CAAS;QACf,eAAU,GAAV,UAAU,CAAQ;IAClC,CAAC;IAEG,MAAM,CAAC,MAAM,CAAC,MAAe,EAAE,UAAkB;QACtD,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,CAAuB,CAAC;IAC9D,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,8DAA8D;IACvD,IAAI,CAAC,OAAe,EAAE,GAAG,UAAiB;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED,8DAA8D;IACvD,OAAO,CAAC,OAAe,EAAE,GAAG,UAAiB;QAClD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7D,CAAC;IAED,8DAA8D;IACvD,IAAI,CAAC,OAAe,EAAE,GAAG,UAAiB;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED,8DAA8D;IACvD,KAAK,CAAC,OAAe,EAAE,GAAG,UAAiB;QAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;IAED,8DAA8D;IACvD,KAAK,CAAC,OAAe,EAAE,GAAG,UAAiB;QAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;IAED,8DAA8D;IACvD,GAAG,CAAC,KAAe,EAAE,OAAe,EAAE,GAAG,UAAiB;QAC/D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;IAEO,WAAW,CAAC,OAAe;QACjC,OAAO,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;IAC3C,CAAC;CACF"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { PLATFORM_NAME } from './settings.js';
2
1
  import { EcoFlowHomebridgePlatform } from './platform.js';
2
+ import { PLATFORM_NAME } from './settings.js';
3
3
  /**
4
4
  * This method registers the platform with Homebridge
5
5
  */
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D;;GAEG;AACH,eAAe,CAAC,GAAQ,EAAE,EAAE;IAC1B,GAAG,CAAC,gBAAgB,CAAC,aAAa,EAAE,yBAAyB,CAAC,CAAC;AACjE,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C;;GAEG;AACH,eAAe,CAAC,GAAQ,EAAE,EAAE;IAC1B,GAAG,CAAC,gBAAgB,CAAC,aAAa,EAAE,yBAAyB,CAAC,CAAC;AACjE,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { API, DynamicPlatformPlugin, Logging, PlatformAccessory, PlatformConfig, Service, Characteristic, UnknownContext } from 'homebridge';
1
+ import { API, Characteristic, DynamicPlatformPlugin, Logging, PlatformAccessory, PlatformConfig, Service, UnknownContext } from 'homebridge';
2
2
  import { DeviceConfig } from './config.js';
3
3
  /**
4
4
  * HomebridgePlatform
package/dist/platform.js CHANGED
@@ -1,7 +1,8 @@
1
- import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
1
+ import { Delta2Accessory } from './accessories/batteries/delta2Accessory.js';
2
+ import { Delta2MaxAccessory } from './accessories/batteries/delta2maxAccessory.js';
2
3
  import { DeviceModel } from './config.js';
3
- import { Delta2MaxAccessory } from './accessories/delta2maxAccessory.js';
4
4
  import { Logger } from './helpers/logger.js';
5
+ import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
5
6
  /**
6
7
  * HomebridgePlatform
7
8
  * This class is the main constructor for your plugin, this is where you should
@@ -50,6 +51,9 @@ export class EcoFlowHomebridgePlatform {
50
51
  registerDevices() {
51
52
  const logs = {};
52
53
  const configuredAccessories = [];
54
+ if (!this.ecoFlowConfig.devices) {
55
+ return;
56
+ }
53
57
  for (const config of this.ecoFlowConfig.devices) {
54
58
  const log = Logger.create(this.commonLog, config.name);
55
59
  const existingAccessory = configuredAccessories.find(accessory => accessory.context.deviceConfig.serialNumber === config.serialNumber);
@@ -95,6 +99,9 @@ export class EcoFlowHomebridgePlatform {
95
99
  case DeviceModel.Delta2Max:
96
100
  ecoFlowAccessory = new Delta2MaxAccessory(this, accessory, config, log);
97
101
  break;
102
+ case DeviceModel.Delta2:
103
+ ecoFlowAccessory = new Delta2Accessory(this, accessory, config, log);
104
+ break;
98
105
  default:
99
106
  log.warn(`"${config.model}" is not supported. Ignoring the device`);
100
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { ServiceBase } from './serviceBase.js';
2
- import { fileURLToPath } from 'url';
3
- import path from 'path';
4
1
  import fs from 'fs';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import { ServiceBase } from './serviceBase.js';
5
5
  export class AccessoryInformationService extends ServiceBase {
6
6
  createService() {
7
7
  const service = this.ecoFlowAccessory.accessory.getService(this.ecoFlowAccessory.platform.Service.AccessoryInformation) ||
@@ -16,7 +16,7 @@ export class AccessoryInformationService extends ServiceBase {
16
16
  getVersion() {
17
17
  const filename = fileURLToPath(import.meta.url);
18
18
  const dirname = path.dirname(filename);
19
- const packageJsonPath = path.resolve(dirname, '../../../package.json');
19
+ const packageJsonPath = path.resolve(dirname, '../../package.json');
20
20
  const packageData = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
21
21
  return packageData?.version;
22
22
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessoryInformationService.js","sourceRoot":"","sources":["../../src/services/accessoryInformationService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,OAAO,2BAA4B,SAAQ,WAAW;IACvC,aAAa;QAC9B,MAAM,OAAO,GACX,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC;YACvG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAE1G,OAAO;aACJ,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,SAAS,CAAC;aACxF,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC;aAC1G,iBAAiB,CAChB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAC1D,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAC1C;aACA,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACxG,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,UAAU;QAChB,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;QACzE,OAAO,WAAW,EAAE,OAAO,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batteryService.js","sourceRoot":"","sources":["../../src/services/batteryService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,OAAO,cAAe,SAAQ,WAAW;IAC1B,aAAa;QAC9B,MAAM,OAAO,GACX,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;YAC1F,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CACxC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAC9C,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAClC,CAAC;QACJ,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,sBAAsB,CAAC,YAAoB;QAChD,MAAM,gBAAgB,GAAG,YAAY,GAAG,EAAE,CAAC;QAC3C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO;aACT,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC;aACjF,WAAW,CACV,gBAAgB;YACd,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,iBAAiB;YAClF,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,oBAAoB,CACxF,CAAC;IACN,CAAC;IAEM,kBAAkB,CAAC,YAAoB;QAC5C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;aACT,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC;aAC7E,WAAW,CAAC,YAAY,CAAC,CAAC;IAC/B,CAAC;IAEM,mBAAmB,CAAC,aAAqB;QAC9C,MAAM,UAAU,GAAG,aAAa,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACtH,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import { BatteryAllQuotaData } from 'accessories/batteries/batteryAccessory.js';
2
+ import { EcoFlowAccessoryWithQuota } from '../accessories/ecoFlowAccessory.js';
3
+ import { OutletsServiceBase } from './outletServiceBase.js';
4
+ export declare class OutletAcService<TAllQuotaData extends BatteryAllQuotaData> extends OutletsServiceBase {
5
+ protected readonly ecoFlowAccessory: EcoFlowAccessoryWithQuota<TAllQuotaData>;
6
+ constructor(ecoFlowAccessory: EcoFlowAccessoryWithQuota<TAllQuotaData>);
7
+ protected setOn(value: boolean, revert: () => void): Promise<void>;
8
+ }
@@ -0,0 +1,17 @@
1
+ import { OutletsServiceBase } from './outletServiceBase.js';
2
+ export class OutletAcService extends OutletsServiceBase {
3
+ ecoFlowAccessory;
4
+ constructor(ecoFlowAccessory) {
5
+ super('AC', ecoFlowAccessory);
6
+ this.ecoFlowAccessory = ecoFlowAccessory;
7
+ }
8
+ setOn(value, revert) {
9
+ return this.sendOn(3, 'acOutCfg', {
10
+ out_voltage: this.ecoFlowAccessory.quota.inv.cfgAcOutVol,
11
+ out_freq: this.ecoFlowAccessory.quota.inv.cfgAcOutFreq,
12
+ xboost: Number(this.ecoFlowAccessory.quota.inv.cfgAcXboost !== undefined ? this.ecoFlowAccessory.quota.inv.cfgAcXboost : true),
13
+ enabled: Number(value),
14
+ }, revert);
15
+ }
16
+ }
17
+ //# sourceMappingURL=outletAcService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outletAcService.js","sourceRoot":"","sources":["../../src/services/outletAcService.ts"],"names":[],"mappings":"AAEA,OAAO,EAA+B,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEzF,MAAM,OAAO,eAA2D,SAAQ,kBAAkB;IACjE;IAA/B,YAA+B,gBAA0D;QACvF,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QADD,qBAAgB,GAAhB,gBAAgB,CAA0C;IAEzF,CAAC;IAEkB,KAAK,CAAC,KAAc,EAAE,MAAkB;QACzD,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,EACD,UAAU,EACV;YACE,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,WAAY;YACzD,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,YAAa;YACvD,MAAM,EAAE,MAAM,CACZ,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAC/G;YACD,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;SACvB,EACD,MAAM,CACP,CAAC;IACJ,CAAC;CACF"}
@@ -1,6 +1,6 @@
1
+ import { EcoFlowAccessory } from '../accessories/ecoFlowAccessory.js';
1
2
  import { OutletsServiceBase } from './outletServiceBase.js';
2
- import { EcoFlowAccessory } from 'accessories/ecoFlowAccessory.js';
3
3
  export declare class OutletCarService extends OutletsServiceBase {
4
4
  constructor(ecoFlowAccessory: EcoFlowAccessory);
5
- protected setOn(value: boolean): Promise<void>;
5
+ protected setOn(value: boolean, revert: () => void): Promise<void>;
6
6
  }
@@ -3,8 +3,10 @@ export class OutletCarService extends OutletsServiceBase {
3
3
  constructor(ecoFlowAccessory) {
4
4
  super('CAR', ecoFlowAccessory);
5
5
  }
6
- setOn(value) {
7
- return this.publishEnabled(5, 'mpptCar', { enabled: Number(value) });
6
+ setOn(value, revert) {
7
+ return this.sendOn(5, 'mpptCar', {
8
+ enabled: Number(value),
9
+ }, revert);
8
10
  }
9
11
  }
10
12
  //# sourceMappingURL=outletCarService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outletCarService.js","sourceRoot":"","sources":["../../src/services/outletCarService.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEzF,MAAM,OAAO,gBAAiB,SAAQ,kBAAkB;IACtD,YAAY,gBAAkC;QAC5C,KAAK,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACjC,CAAC;IAEkB,KAAK,CAAC,KAAc,EAAE,MAAkB;QACzD,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,EACD,SAAS,EACT;YACE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;SACvB,EACD,MAAM,CACP,CAAC;IACJ,CAAC;CACF"}
@@ -1,15 +1,17 @@
1
1
  import { Service } from 'homebridge';
2
+ import { EcoFlowAccessory } from '../accessories/ecoFlowAccessory.js';
2
3
  import { ServiceBase } from './serviceBase.js';
3
- import { MqttSetMessageParams } from 'accessories/apis/interfaces/ecoFlowMqttContacts.js';
4
- import { EcoFlowAccessory } from 'accessories/ecoFlowAccessory.js';
4
+ export interface MqttSetEnabledMessageParams {
5
+ enabled: number;
6
+ }
5
7
  export declare abstract class OutletsServiceBase extends ServiceBase {
6
8
  private readonly serviceSubType;
7
9
  constructor(serviceSubType: string, ecoFlowAccessory: EcoFlowAccessory);
8
10
  updateState(state: boolean): void;
9
11
  updateInUse(isInUse: boolean): void;
10
12
  protected createService(): Service;
11
- protected abstract setOn(value: boolean): Promise<void>;
12
- protected publishEnabled<TParams extends MqttSetMessageParams>(moduleType: number, operateType: string, params: TParams): Promise<void>;
13
+ protected abstract setOn(value: boolean, revert: () => void): Promise<void>;
14
+ protected sendOn<TParams>(moduleType: number, operateType: string, params: TParams, revert: () => void): Promise<void>;
13
15
  private addCharacteristics;
14
16
  private getOrAddService;
15
17
  }
@@ -18,20 +18,14 @@ export class OutletsServiceBase extends ServiceBase {
18
18
  this.addCharacteristics(service);
19
19
  return service;
20
20
  }
21
- async publishEnabled(moduleType, operateType, params) {
22
- const data = {
23
- id: Math.floor(Math.random() * 1000000),
24
- version: '1.0',
25
- moduleType,
26
- operateType,
27
- params,
28
- };
29
- await this.ecoFlowAccessory.mqttApi.publish('/open/<certificateAccount>/<sn>/set', this.ecoFlowAccessory.config.serialNumber, data);
21
+ sendOn(moduleType, operateType, params, revert) {
22
+ return this.ecoFlowAccessory.sendSetCommand(moduleType, operateType, params, revert);
30
23
  }
31
24
  addCharacteristics(service) {
32
- service
33
- .getCharacteristic(this.ecoFlowAccessory.platform.Characteristic.On)
34
- .onSet(value => this.setOn(value));
25
+ service.getCharacteristic(this.ecoFlowAccessory.platform.Characteristic.On).onSet(value => {
26
+ const newValue = value;
27
+ this.setOn(newValue, () => this.updateState(!newValue));
28
+ });
35
29
  }
36
30
  getOrAddService(deviceName, serviceSubType) {
37
31
  const serviceName = deviceName + ' ' + serviceSubType;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outletServiceBase.js","sourceRoot":"","sources":["../../src/services/outletServiceBase.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAM/C,MAAM,OAAgB,kBAAmB,SAAQ,WAAW;IAEvC;IADnB,YACmB,cAAsB,EACvC,gBAAkC;QAElC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAHP,mBAAc,GAAd,cAAc,CAAQ;IAIzC,CAAC;IAEM,WAAW,CAAC,KAAc;QAC/B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,cAAc,WAAW,EAAE,KAAK,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACtG,CAAC;IAEM,WAAW,CAAC,OAAgB;QACjC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,cAAc,WAAW,EAAE,OAAO,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACjH,CAAC;IAEkB,aAAa;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7F,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,OAAO,CAAC;IACjB,CAAC;IAIS,MAAM,CACd,UAAkB,EAClB,WAAmB,EACnB,MAAe,EACf,MAAkB;QAElB,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACvF,CAAC;IAEO,kBAAkB,CAAC,OAAgB;QACzC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACxF,MAAM,QAAQ,GAAG,KAAgB,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,eAAe,CAAC,UAAkB,EAAE,cAAsB;QAChE,MAAM,WAAW,GAAG,UAAU,GAAG,GAAG,GAAG,cAAc,CAAC;QACtD,MAAM,OAAO,GACX,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC;YAC7G,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CACxC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAC7C,WAAW,EACX,cAAc,CACf,CAAC;QAEJ,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAE3F,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -1,6 +1,6 @@
1
+ import { EcoFlowAccessory } from '../accessories/ecoFlowAccessory.js';
1
2
  import { OutletsServiceBase } from './outletServiceBase.js';
2
- import { EcoFlowAccessory } from 'accessories/ecoFlowAccessory.js';
3
3
  export declare class OutletUsbService extends OutletsServiceBase {
4
4
  constructor(ecoFlowAccessory: EcoFlowAccessory);
5
- protected setOn(value: boolean): Promise<void>;
5
+ protected setOn(value: boolean, revert: () => void): Promise<void>;
6
6
  }
@@ -3,8 +3,8 @@ export class OutletUsbService extends OutletsServiceBase {
3
3
  constructor(ecoFlowAccessory) {
4
4
  super('USB', ecoFlowAccessory);
5
5
  }
6
- setOn(value) {
7
- return this.publishEnabled(1, 'dcOutCfg', { enabled: Number(value) });
6
+ setOn(value, revert) {
7
+ return this.sendOn(1, 'dcOutCfg', { enabled: Number(value) }, revert);
8
8
  }
9
9
  }
10
10
  //# sourceMappingURL=outletUsbService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outletUsbService.js","sourceRoot":"","sources":["../../src/services/outletUsbService.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEzF,MAAM,OAAO,gBAAiB,SAAQ,kBAAkB;IACtD,YAAY,gBAAkC;QAC5C,KAAK,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACjC,CAAC;IAEkB,KAAK,CAAC,KAAc,EAAE,MAAkB;QACzD,OAAO,IAAI,CAAC,MAAM,CAA8B,CAAC,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACrG,CAAC;CACF"}
@@ -1,7 +1,7 @@
1
1
  import { Logging, Service } from 'homebridge';
2
- import { EcoFlowAccessory } from 'accessories/ecoFlowAccessory.js';
2
+ import { EcoFlowAccessory } from '../accessories/ecoFlowAccessory.js';
3
3
  export declare abstract class ServiceBase {
4
- protected ecoFlowAccessory: EcoFlowAccessory;
4
+ protected readonly ecoFlowAccessory: EcoFlowAccessory;
5
5
  protected readonly log: Logging;
6
6
  private _service;
7
7
  constructor(ecoFlowAccessory: EcoFlowAccessory);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceBase.js","sourceRoot":"","sources":["../../src/services/serviceBase.ts"],"names":[],"mappings":"AAGA,MAAM,OAAgB,WAAW;IAIA;IAHZ,GAAG,CAAU;IACxB,QAAQ,GAAmB,IAAI,CAAC;IAExC,YAA+B,gBAAkC;QAAlC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAC/D,IAAI,CAAC,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC;IAClC,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;IACvC,CAAC;IAED,qBAAqB;IACrB,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAS,CAAC;IACxB,CAAC;CAGF"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "displayName": "Homebridge Ecoflow",
3
3
  "name": "@pietrolubini/homebridge-ecoflow",
4
- "version": "1.0.2",
4
+ "version": "1.1.0",
5
5
  "description": "Homebridge plugin for EcoFlow devices",
6
6
  "license": "MIT",
7
7
  "author": "PietroLubini",
@@ -16,7 +16,7 @@
16
16
  "homepage": "https://github.com/PietroLubini/homebridge-ecoflow#readme",
17
17
  "engines": {
18
18
  "node": "^18.16.0 || ^20.9.0",
19
- "homebridge": "^1.8.0"
19
+ "homebridge": "^1.7.0"
20
20
  },
21
21
  "main": "dist/index.js",
22
22
  "scripts": {
@@ -48,6 +48,8 @@
48
48
  "eslint": "^8.57.0",
49
49
  "homebridge": "^1.7.0",
50
50
  "nodemon": "^3.1.2",
51
+ "prettier": "^3.3.3",
52
+ "prettier-plugin-organize-imports": "^4.0.0",
51
53
  "rimraf": "^5.0.7",
52
54
  "ts-node": "^10.9.2",
53
55
  "typescript": "^5.4.5"
@@ -1,16 +0,0 @@
1
- import { Logging } from 'homebridge';
2
- import { AcquireCertificateResponseData, CmdResponseBase, CmdResponseData, HttpMethod } from './interfaces/ecoFlowHttpContacts.js';
3
- import { DeviceConfig } from '../../config.js';
4
- export declare class EcoFlowHttpApi {
5
- private readonly config;
6
- private readonly log;
7
- constructor(config: DeviceConfig, log: Logging);
8
- getQuotas<TCmdResponseData extends CmdResponseData>(quotas: string[]): Promise<TCmdResponseData>;
9
- getAllQuotas<TCmdResponseData extends CmdResponseData>(): Promise<TCmdResponseData>;
10
- acquireCertificate(): Promise<AcquireCertificateResponseData | null>;
11
- protected execute<TResponse extends CmdResponseBase>(relativeUrl: string, method: HttpMethod, queryParameters?: object | null, body?: object | null): Promise<TResponse>;
12
- private getNonce;
13
- private composeSignMessage;
14
- private createHmacSha256;
15
- private stringifyOptions;
16
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"ecoFlowHttpApi.js","sourceRoot":"","sources":["../../../src/accessories/apis/ecoFlowHttpApi.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- import { Logging } from 'homebridge';
2
- import { BmsStatusMqttMessageParams, InvStatusMqttMessageParams, MqttMessage, MqttMessageParams, MqttSetMessageBase, PdStatusMqttMessageParams } from './interfaces/ecoFlowMqttContacts.js';
3
- import { EcoFlowHttpApi } from './ecoFlowHttpApi.js';
4
- export declare class EcoFlowMqttApi {
5
- private httpApi;
6
- private log;
7
- private client;
8
- private certificateData;
9
- private readonly bmsParamsSubject;
10
- private readonly invParamsSubject;
11
- private readonly pdParamsSubject;
12
- bmsParams$: import("rxjs").Observable<BmsStatusMqttMessageParams>;
13
- invParams$: import("rxjs").Observable<InvStatusMqttMessageParams>;
14
- pdParams$: import("rxjs").Observable<PdStatusMqttMessageParams>;
15
- constructor(httpApi: EcoFlowHttpApi, log: Logging);
16
- destroy(): Promise<void>;
17
- subscribe(topicPattern: string, serialNumber: string): Promise<boolean>;
18
- publish(topicPattern: string, serialNumber: string, data: MqttSetMessageBase): Promise<void>;
19
- processMqttMessage(message: MqttMessage<MqttMessageParams>): void;
20
- private connect;
21
- private acquireCertificate;
22
- private composeTopic;
23
- }
@@ -1,94 +0,0 @@
1
- import mqtt from 'mqtt';
2
- import { MqttMessageType, } from './interfaces/ecoFlowMqttContacts.js';
3
- import { Subject } from 'rxjs';
4
- import { getMachineId } from './../../helpers/machineId.js';
5
- export class EcoFlowMqttApi {
6
- httpApi;
7
- log;
8
- client = null;
9
- certificateData = null;
10
- bmsParamsSubject = new Subject();
11
- invParamsSubject = new Subject();
12
- pdParamsSubject = new Subject();
13
- bmsParams$ = this.bmsParamsSubject.asObservable();
14
- invParams$ = this.invParamsSubject.asObservable();
15
- pdParams$ = this.pdParamsSubject.asObservable();
16
- constructor(httpApi, log) {
17
- this.httpApi = httpApi;
18
- this.log = log;
19
- }
20
- async destroy() {
21
- await this.client?.unsubscribeAsync('#');
22
- this.log.debug('Unsubscribed from all topics');
23
- await this.client?.end();
24
- this.log.info('Disconnected from EcoFlow MQTT Service');
25
- }
26
- async subscribe(topicPattern, serialNumber) {
27
- const client = await this.connect();
28
- if (client) {
29
- const topic = this.composeTopic(topicPattern, serialNumber);
30
- await client.subscribeAsync(topic);
31
- this.log.debug('Subscribed to topic:', topic);
32
- client.on('message', (_, message) => {
33
- const mqttMessage = JSON.parse(message.toString());
34
- this.processMqttMessage(mqttMessage);
35
- });
36
- return true;
37
- }
38
- return false;
39
- }
40
- async publish(topicPattern, serialNumber, data) {
41
- const client = await this.connect();
42
- if (client) {
43
- const topic = this.composeTopic(topicPattern, serialNumber);
44
- const message = JSON.stringify(data);
45
- await client.publishAsync(topic, message);
46
- this.log.debug(`Published to topic '${topic}'`, message);
47
- }
48
- }
49
- processMqttMessage(message) {
50
- if (message.typeCode === MqttMessageType.BMS) {
51
- const params = message.params;
52
- this.log.debug('BMS:', params);
53
- this.bmsParamsSubject.next(params);
54
- }
55
- else if (message.typeCode === MqttMessageType.INV) {
56
- const params = message.params;
57
- this.log.debug('INV:', params);
58
- this.invParamsSubject.next(params);
59
- }
60
- else if (message.typeCode === MqttMessageType.PD) {
61
- const params = message.params;
62
- this.log.debug('PD:', params);
63
- this.pdParamsSubject.next(params);
64
- }
65
- }
66
- async connect() {
67
- if (!this.client) {
68
- const certificateData = await this.acquireCertificate();
69
- if (certificateData) {
70
- const clientId = `HOMEBRIDGE_${(await getMachineId(this.log)).toUpperCase()}`;
71
- this.client = await mqtt.connectAsync(`${certificateData.protocol}://${certificateData.url}:${certificateData.port}`, {
72
- username: `${certificateData.certificateAccount}`,
73
- password: `${certificateData.certificatePassword}`,
74
- clientId,
75
- protocolVersion: 5,
76
- });
77
- this.log.info('Connected to EcoFlow MQTT Service');
78
- }
79
- }
80
- return this.client;
81
- }
82
- async acquireCertificate() {
83
- if (!this.certificateData) {
84
- this.certificateData = await this.httpApi.acquireCertificate();
85
- }
86
- return this.certificateData;
87
- }
88
- composeTopic(topicPattern, serialNumber) {
89
- return topicPattern
90
- .replace('<certificateAccount>', this.certificateData.certificateAccount)
91
- .replace('<sn>', serialNumber);
92
- }
93
- }
94
- //# sourceMappingURL=ecoFlowMqttApi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ecoFlowMqttApi.js","sourceRoot":"","sources":["../../../src/accessories/apis/ecoFlowMqttApi.ts"],"names":[],"mappings":"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"}