@pietrolubini/homebridge-ecoflow 1.0.3 → 1.2.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 (86) hide show
  1. package/.prettierrc.json +2 -1
  2. package/README.md +32 -0
  3. package/config.schema.json +18 -1
  4. package/dist/accessories/batteries/batteryAccessory.d.ts +59 -0
  5. package/dist/accessories/batteries/batteryAccessory.js +120 -0
  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 +49 -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 -6
  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/characteristics/CustomCharacteristic.d.ts +16 -0
  23. package/dist/characteristics/CustomCharacteristic.js +78 -0
  24. package/dist/characteristics/CustomCharacteristic.js.map +1 -0
  25. package/dist/config.d.ts +11 -1
  26. package/dist/config.js +7 -0
  27. package/dist/config.js.map +1 -1
  28. package/dist/helpers/logger.js +6 -6
  29. package/dist/helpers/logger.js.map +1 -1
  30. package/dist/index.js +1 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/platform.d.ts +7 -4
  33. package/dist/platform.js +29 -13
  34. package/dist/platform.js.map +1 -1
  35. package/dist/{accessories/services → services}/accessoryInformationService.d.ts +2 -1
  36. package/dist/services/accessoryInformationService.js +32 -0
  37. package/dist/services/accessoryInformationService.js.map +1 -0
  38. package/dist/{accessories/services/batteryService.d.ts → services/batteryStatusService.d.ts} +3 -2
  39. package/dist/services/batteryStatusService.js +32 -0
  40. package/dist/services/batteryStatusService.js.map +1 -0
  41. package/dist/services/outletAcService.d.ts +8 -0
  42. package/dist/services/outletAcService.js +17 -0
  43. package/dist/services/outletAcService.js.map +1 -0
  44. package/dist/{accessories/services → services}/outletCarService.d.ts +2 -2
  45. package/dist/{accessories/services → services}/outletCarService.js +4 -2
  46. package/dist/services/outletCarService.js.map +1 -0
  47. package/dist/services/outletServiceBase.d.ts +24 -0
  48. package/dist/services/outletServiceBase.js +62 -0
  49. package/dist/services/outletServiceBase.js.map +1 -0
  50. package/dist/{accessories/services → services}/outletUsbService.d.ts +2 -2
  51. package/dist/{accessories/services → services}/outletUsbService.js +2 -2
  52. package/dist/services/outletUsbService.js.map +1 -0
  53. package/dist/services/serviceBase.d.ts +24 -0
  54. package/dist/services/serviceBase.js +52 -0
  55. package/dist/services/serviceBase.js.map +1 -0
  56. package/docs/images/BatteryAdditionalCharacteristics.jpg +0 -0
  57. package/package.json +3 -1
  58. package/dist/accessories/apis/ecoFlowHttpApi.d.ts +0 -16
  59. package/dist/accessories/apis/ecoFlowHttpApi.js.map +0 -1
  60. package/dist/accessories/apis/ecoFlowMqttApi.d.ts +0 -23
  61. package/dist/accessories/apis/ecoFlowMqttApi.js +0 -94
  62. package/dist/accessories/apis/ecoFlowMqttApi.js.map +0 -1
  63. package/dist/accessories/apis/interfaces/ecoFlowHttpContacts.d.ts +0 -47
  64. package/dist/accessories/apis/interfaces/ecoFlowHttpContacts.js +0 -6
  65. package/dist/accessories/apis/interfaces/ecoFlowHttpContacts.js.map +0 -1
  66. package/dist/accessories/apis/interfaces/ecoFlowMqttContacts.d.ts +0 -68
  67. package/dist/accessories/apis/interfaces/ecoFlowMqttContacts.js +0 -9
  68. package/dist/accessories/apis/interfaces/ecoFlowMqttContacts.js.map +0 -1
  69. package/dist/accessories/delta2maxAccessory.d.ts +0 -24
  70. package/dist/accessories/delta2maxAccessory.js +0 -117
  71. package/dist/accessories/delta2maxAccessory.js.map +0 -1
  72. package/dist/accessories/services/accessoryInformationService.js +0 -24
  73. package/dist/accessories/services/accessoryInformationService.js.map +0 -1
  74. package/dist/accessories/services/batteryService.js +0 -29
  75. package/dist/accessories/services/batteryService.js.map +0 -1
  76. package/dist/accessories/services/outletAcService.d.ts +0 -6
  77. package/dist/accessories/services/outletAcService.js +0 -15
  78. package/dist/accessories/services/outletAcService.js.map +0 -1
  79. package/dist/accessories/services/outletCarService.js.map +0 -1
  80. package/dist/accessories/services/outletServiceBase.d.ts +0 -15
  81. package/dist/accessories/services/outletServiceBase.js +0 -44
  82. package/dist/accessories/services/outletServiceBase.js.map +0 -1
  83. package/dist/accessories/services/outletUsbService.js.map +0 -1
  84. package/dist/accessories/services/serviceBase.d.ts +0 -11
  85. package/dist/accessories/services/serviceBase.js +0 -17
  86. package/dist/accessories/services/serviceBase.js.map +0 -1
@@ -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"}
@@ -0,0 +1,24 @@
1
+ import { Characteristic, CharacteristicValue, Service, WithUUID } from 'homebridge';
2
+ import { EcoFlowAccessory } from '../accessories/ecoFlowAccessory.js';
3
+ import { ServiceBase } from './serviceBase.js';
4
+ export interface MqttSetEnabledMessageParams {
5
+ enabled: number;
6
+ }
7
+ export declare abstract class OutletsServiceBase extends ServiceBase {
8
+ private readonly serviceSubType;
9
+ constructor(serviceSubType: string, ecoFlowAccessory: EcoFlowAccessory);
10
+ updateState(state: boolean): void;
11
+ updateOutputConsumption(watt: number): void;
12
+ updateInputConsumption(watt: number): void;
13
+ updateBatteryLevel(batteryLevel: number): void;
14
+ protected createService(): Service;
15
+ protected addCharacteristics(): Characteristic[];
16
+ protected abstract setOn(value: boolean, revert: () => void): Promise<void>;
17
+ protected sendOn<TParams>(moduleType: number, operateType: string, params: TParams, revert: () => void): Promise<void>;
18
+ protected updateCharacteristic(characteristic: WithUUID<{
19
+ new (): Characteristic;
20
+ }>, name: string, value: CharacteristicValue): void;
21
+ private tryAddCustomCharacteristic;
22
+ private updateCustomCharacteristic;
23
+ private get serviceName();
24
+ }
@@ -0,0 +1,62 @@
1
+ import { AdditionalBatteryCharacteristicType as CharacteristicType } from '../config.js';
2
+ import { ServiceBase } from './serviceBase.js';
3
+ export class OutletsServiceBase extends ServiceBase {
4
+ serviceSubType;
5
+ constructor(serviceSubType, ecoFlowAccessory) {
6
+ super(ecoFlowAccessory);
7
+ this.serviceSubType = serviceSubType;
8
+ }
9
+ updateState(state) {
10
+ this.updateCharacteristic(this.platform.Characteristic.On, 'State', state);
11
+ }
12
+ updateOutputConsumption(watt) {
13
+ this.updateCharacteristic(this.platform.Characteristic.OutletInUse, 'InUse', watt > 0);
14
+ this.updateCustomCharacteristic(this.platform.Characteristic.PowerConsumption.OutputConsumptionWatts, 'Output Consumption, W', watt, CharacteristicType.OutputConsumptionInWatts);
15
+ }
16
+ updateInputConsumption(watt) {
17
+ this.updateCustomCharacteristic(this.platform.Characteristic.PowerConsumption.InputConsumptionWatts, 'Input Consumption, W', watt, CharacteristicType.InputConsumptionInWatts);
18
+ }
19
+ updateBatteryLevel(batteryLevel) {
20
+ this.updateCustomCharacteristic(this.platform.Characteristic.BatteryLevel, 'Battery Level, %', batteryLevel, CharacteristicType.BatteryLevel);
21
+ }
22
+ createService() {
23
+ return this.getOrAddServiceById(this.platform.Service.Outlet, this.serviceName, this.serviceSubType);
24
+ }
25
+ addCharacteristics() {
26
+ const onCharacteristic = this.addCharacteristic(this.platform.Characteristic.On);
27
+ onCharacteristic.onSet(value => {
28
+ const newValue = value;
29
+ this.setOn(newValue, () => this.updateState(!newValue));
30
+ });
31
+ const characteristics = [
32
+ this.addCharacteristic(this.platform.Characteristic.OutletInUse),
33
+ onCharacteristic,
34
+ this.tryAddCustomCharacteristic(this.platform.Characteristic.PowerConsumption.InputConsumptionWatts, CharacteristicType.InputConsumptionInWatts),
35
+ this.tryAddCustomCharacteristic(this.platform.Characteristic.PowerConsumption.OutputConsumptionWatts, CharacteristicType.OutputConsumptionInWatts),
36
+ this.tryAddCustomCharacteristic(this.platform.Characteristic.BatteryLevel, CharacteristicType.BatteryLevel),
37
+ ];
38
+ this.service.setCharacteristic(this.platform.Characteristic.Name, this.serviceName);
39
+ return characteristics.filter(characteristic => characteristic !== null);
40
+ }
41
+ sendOn(moduleType, operateType, params, revert) {
42
+ return this.ecoFlowAccessory.sendSetCommand(moduleType, operateType, params, revert);
43
+ }
44
+ updateCharacteristic(characteristic, name, value) {
45
+ super.updateCharacteristic(characteristic, `${this.serviceSubType} ${name}`, value);
46
+ }
47
+ tryAddCustomCharacteristic(characteristic, characteristicType) {
48
+ if (this.ecoFlowAccessory.config.battery?.additionalCharacteristics?.includes(characteristicType)) {
49
+ return this.addCharacteristic(characteristic);
50
+ }
51
+ return null;
52
+ }
53
+ updateCustomCharacteristic(characteristic, name, value, characteristicType) {
54
+ if (this.ecoFlowAccessory.config.battery?.additionalCharacteristics?.includes(characteristicType)) {
55
+ super.updateCharacteristic(characteristic, name, value);
56
+ }
57
+ }
58
+ get serviceName() {
59
+ return `${this.ecoFlowAccessory.config.name} ${this.serviceSubType}`;
60
+ }
61
+ }
62
+ //# sourceMappingURL=outletServiceBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outletServiceBase.js","sourceRoot":"","sources":["../../src/services/outletServiceBase.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -0,0 +1,24 @@
1
+ import { Characteristic, CharacteristicValue, Logging, Service, WithUUID } from 'homebridge';
2
+ import { EcoFlowAccessory } from '../accessories/ecoFlowAccessory.js';
3
+ import { EcoFlowHomebridgePlatform } from '../platform.js';
4
+ export declare abstract class ServiceBase {
5
+ protected readonly ecoFlowAccessory: EcoFlowAccessory;
6
+ protected readonly log: Logging;
7
+ protected readonly platform: EcoFlowHomebridgePlatform;
8
+ protected characteristics: Characteristic[];
9
+ private _service;
10
+ constructor(ecoFlowAccessory: EcoFlowAccessory);
11
+ initialize(): void;
12
+ cleanupCharacteristics(): void;
13
+ get service(): Service;
14
+ protected abstract createService(): Service;
15
+ protected abstract addCharacteristics(): Characteristic[];
16
+ protected addCharacteristic(characteristic: WithUUID<{
17
+ new (): Characteristic;
18
+ }>): Characteristic;
19
+ protected getOrAddService(service: WithUUID<typeof Service>, displayName?: string): Service;
20
+ protected getOrAddServiceById(service: WithUUID<typeof Service>, serviceName: string, serviceSubType: string): Service;
21
+ protected updateCharacteristic(characteristic: WithUUID<{
22
+ new (): Characteristic;
23
+ }>, name: string, value: CharacteristicValue): void;
24
+ }
@@ -0,0 +1,52 @@
1
+ export class ServiceBase {
2
+ ecoFlowAccessory;
3
+ log;
4
+ platform;
5
+ characteristics = [];
6
+ _service = null;
7
+ constructor(ecoFlowAccessory) {
8
+ this.ecoFlowAccessory = ecoFlowAccessory;
9
+ this.log = ecoFlowAccessory.log;
10
+ this.platform = ecoFlowAccessory.platform;
11
+ }
12
+ initialize() {
13
+ this._service = this.createService();
14
+ this.characteristics = this.addCharacteristics();
15
+ this.characteristics.push(this.addCharacteristic(this.platform.Characteristic.Name));
16
+ }
17
+ cleanupCharacteristics() {
18
+ this.service.characteristics
19
+ .filter(characteristic => !this.characteristics.includes(characteristic))
20
+ .forEach(characteristic => {
21
+ this.log.warn(`[${this.service.displayName}] Removing obsolete characteristic:`, characteristic.displayName);
22
+ this.service.removeCharacteristic(characteristic);
23
+ });
24
+ }
25
+ // Getter for service
26
+ get service() {
27
+ return this._service;
28
+ }
29
+ addCharacteristic(characteristic) {
30
+ const existingCharacteristic = this.service.getCharacteristic(characteristic);
31
+ if (!existingCharacteristic) {
32
+ return this.service.addCharacteristic(characteristic);
33
+ }
34
+ return existingCharacteristic;
35
+ }
36
+ getOrAddService(service, displayName) {
37
+ const result = this.ecoFlowAccessory.accessory.getService(service) ||
38
+ this.ecoFlowAccessory.accessory.addService(service, displayName, service.UUID);
39
+ result.displayName = displayName ?? result.displayName;
40
+ return result;
41
+ }
42
+ getOrAddServiceById(service, serviceName, serviceSubType) {
43
+ const result = this.ecoFlowAccessory.accessory.getServiceById(service, serviceSubType) ||
44
+ this.ecoFlowAccessory.accessory.addService(service, serviceName, serviceSubType);
45
+ return result;
46
+ }
47
+ updateCharacteristic(characteristic, name, value) {
48
+ this.log.debug(`${name} ->`, value);
49
+ this.service.getCharacteristic(characteristic).updateValue(value);
50
+ }
51
+ }
52
+ //# sourceMappingURL=serviceBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceBase.js","sourceRoot":"","sources":["../../src/services/serviceBase.ts"],"names":[],"mappings":"AAIA,MAAM,OAAgB,WAAW;IAMA;IALZ,GAAG,CAAU;IACb,QAAQ,CAA4B;IAC7C,eAAe,GAAqB,EAAE,CAAC;IACzC,QAAQ,GAAmB,IAAI,CAAC;IAExC,YAA+B,gBAAkC;QAAlC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAC/D,IAAI,CAAC,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC;IAC5C,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACjD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IACvF,CAAC;IAEM,sBAAsB;QAC3B,IAAI,CAAC,OAAO,CAAC,eAAe;aACzB,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;aACxE,OAAO,CAAC,cAAc,CAAC,EAAE;YACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,qCAAqC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;YAC7G,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACP,CAAC;IAED,qBAAqB;IACrB,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAS,CAAC;IACxB,CAAC;IAMS,iBAAiB,CAAC,cAAoD;QAC9E,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAC9E,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAES,eAAe,CAAC,OAAiC,EAAE,WAAoB;QAC/E,MAAM,MAAM,GACV,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC;YACnD,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACjF,MAAM,CAAC,WAAW,GAAG,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC;QAEvD,OAAO,MAAM,CAAC;IAChB,CAAC;IAES,mBAAmB,CAC3B,OAAiC,EACjC,WAAmB,EACnB,cAAsB;QAEtB,MAAM,MAAM,GACV,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC;YACvE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;QAEnF,OAAO,MAAM,CAAC;IAChB,CAAC;IAES,oBAAoB,CAC5B,cAAoD,EACpD,IAAY,EACZ,KAA0B;QAE1B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC;CACF"}
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.3",
4
+ "version": "1.2.0",
5
5
  "description": "Homebridge plugin for EcoFlow devices",
6
6
  "license": "MIT",
7
7
  "author": "PietroLubini",
@@ -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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"}
@@ -1,47 +0,0 @@
1
- export declare enum HttpMethod {
2
- Get = "GET",
3
- Post = "POST"
4
- }
5
- export interface CmdResponseBase {
6
- code: string;
7
- message: string;
8
- failed: boolean;
9
- }
10
- export interface CmdResponseData {
11
- }
12
- export interface CmdResponse<TData extends CmdResponseData> extends CmdResponseBase {
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 AcquireCertificateResponseData extends CmdResponseData {
27
- certificateAccount: string;
28
- certificatePassword: string;
29
- url: string;
30
- port: string;
31
- protocol: string;
32
- }
33
- export interface GetQuotaAllCmdResponseData extends CmdResponseData {
34
- 'bms_bmsStatus.f32ShowSoc': number;
35
- 'inv.inputWatts': number;
36
- 'inv.cfgAcEnabled': boolean;
37
- 'inv.outputWatts': number;
38
- 'pd.carState': boolean;
39
- 'pd.carWatts': number;
40
- 'pd.dcOutState': boolean;
41
- 'pd.usb1Watts': number;
42
- 'pd.usb2Watts': number;
43
- 'pd.qcUsb1Watts': number;
44
- 'pd.qcUsb2Watts': number;
45
- 'pd.typec1Watts': number;
46
- 'pd.typec2Watts': number;
47
- }
@@ -1,6 +0,0 @@
1
- export var HttpMethod;
2
- (function (HttpMethod) {
3
- HttpMethod["Get"] = "GET";
4
- HttpMethod["Post"] = "POST";
5
- })(HttpMethod || (HttpMethod = {}));
6
- //# sourceMappingURL=ecoFlowHttpContacts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ecoFlowHttpContacts.js","sourceRoot":"","sources":["../../../../src/accessories/apis/interfaces/ecoFlowHttpContacts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,UAGX;AAHD,WAAY,UAAU;IACpB,yBAAW,CAAA;IACX,2BAAa,CAAA;AACf,CAAC,EAHW,UAAU,KAAV,UAAU,QAGrB"}
@@ -1,68 +0,0 @@
1
- export declare enum MqttMessageType {
2
- PD = "pdStatus",
3
- MPPT = "mpptStatus",
4
- INV = "invStatus",
5
- BMS = "bmsStatus",
6
- EMS = "emsStatus"
7
- }
8
- export interface MqttMessageBase {
9
- typeCode: MqttMessageType;
10
- }
11
- export interface MqttMessage<TParams extends MqttMessageParams> extends MqttMessageBase {
12
- params: TParams;
13
- }
14
- export interface MqttMessageParams {
15
- }
16
- export interface PdStatusMqttMessageCarParams {
17
- carState?: boolean;
18
- carWatts?: number;
19
- }
20
- export interface PdStatusMqttMessageUsbParams {
21
- dcOutState?: boolean;
22
- usb1Watts?: number;
23
- usb2Watts?: number;
24
- qcUsb1Watts?: number;
25
- qcUsb2Watts?: number;
26
- typec1Watts?: number;
27
- typec2Watts?: number;
28
- }
29
- export interface PdStatusMqttMessageParams extends MqttMessageParams, PdStatusMqttMessageCarParams, PdStatusMqttMessageUsbParams {
30
- beepMode?: boolean;
31
- }
32
- export interface MpptStatusMqttMessageParams extends MqttMessageParams {
33
- }
34
- export interface InvStatusMqttMessageAcParams {
35
- cfgAcEnabled?: boolean;
36
- outputWatts?: number;
37
- }
38
- export interface InvStatusMqttMessageParams extends MqttMessageParams, InvStatusMqttMessageAcParams {
39
- inputWatts?: number;
40
- }
41
- export interface BmsStatusMqttMessageParams extends MqttMessageParams {
42
- soc?: number;
43
- vol?: number;
44
- amp?: number;
45
- temp?: number;
46
- f32ShowSoc?: number;
47
- }
48
- export interface EmsStatusMqttMessageParams extends MqttMessageParams {
49
- }
50
- export interface MqttSetMessageBase {
51
- id: number;
52
- version: string;
53
- moduleType: number;
54
- operateType: string;
55
- }
56
- export interface MqttSetMessageParams {
57
- }
58
- export interface MqttSetEnabledMessageParams extends MqttSetMessageParams {
59
- enabled: number;
60
- }
61
- export interface MqttSetAcEnabledMessageParams extends MqttSetEnabledMessageParams {
62
- out_voltage: number;
63
- out_freq: number;
64
- xboost: number;
65
- }
66
- export interface MqttSetMessage<TParams extends MqttSetMessageParams> extends MqttSetMessageBase {
67
- params: TParams;
68
- }
@@ -1,9 +0,0 @@
1
- export var MqttMessageType;
2
- (function (MqttMessageType) {
3
- MqttMessageType["PD"] = "pdStatus";
4
- MqttMessageType["MPPT"] = "mpptStatus";
5
- MqttMessageType["INV"] = "invStatus";
6
- MqttMessageType["BMS"] = "bmsStatus";
7
- MqttMessageType["EMS"] = "emsStatus";
8
- })(MqttMessageType || (MqttMessageType = {}));
9
- //# sourceMappingURL=ecoFlowMqttContacts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ecoFlowMqttContacts.js","sourceRoot":"","sources":["../../../../src/accessories/apis/interfaces/ecoFlowMqttContacts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,kCAAe,CAAA;IACf,sCAAmB,CAAA;IACnB,oCAAiB,CAAA;IACjB,oCAAiB,CAAA;IACjB,oCAAiB,CAAA;AACnB,CAAC,EANW,eAAe,KAAf,eAAe,QAM1B"}
@@ -1,24 +0,0 @@
1
- import { EcoFlowAccessoryWithQuota } from './ecoFlowAccessory.js';
2
- import { ServiceBase } from './services/serviceBase.js';
3
- import { GetQuotaAllCmdResponseData } from './apis/interfaces/ecoFlowHttpContacts.js';
4
- import { Subscription } from 'rxjs';
5
- import { EcoFlowHomebridgePlatform } from 'platform.js';
6
- import { Logging, PlatformAccessory } from 'homebridge';
7
- import { DeviceConfig } from 'config.js';
8
- export declare class Delta2MaxAccessory extends EcoFlowAccessoryWithQuota<GetQuotaAllCmdResponseData> {
9
- private readonly batteryService;
10
- private readonly outletUsbService;
11
- private readonly outletAcService;
12
- private readonly outletCarService;
13
- constructor(platform: EcoFlowHomebridgePlatform, accessory: PlatformAccessory, config: DeviceConfig, log: Logging);
14
- protected getServices(): ServiceBase[];
15
- protected updateInitialValues(initialData: GetQuotaAllCmdResponseData): void;
16
- protected subscribeOnParameterUpdates(): Subscription[];
17
- private updateBmsInitialValues;
18
- private updateInvInitialValues;
19
- private updatePdInitialValues;
20
- private updateBmsValues;
21
- private updateInvValues;
22
- private updatePdValues;
23
- private getUsbWatts;
24
- }