@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.
- package/.prettierrc.json +2 -1
- package/README.md +1 -0
- package/config.schema.json +1 -1
- package/dist/accessories/batteries/batteryAccessory.d.ts +59 -0
- package/dist/accessories/{delta2maxAccessory.js → batteries/batteryAccessory.js} +43 -46
- package/dist/accessories/batteries/batteryAccessory.js.map +1 -0
- package/dist/accessories/batteries/delta2Accessory.d.ts +3 -0
- package/dist/accessories/batteries/delta2Accessory.js +4 -0
- package/dist/accessories/batteries/delta2Accessory.js.map +1 -0
- package/dist/accessories/batteries/delta2maxAccessory.d.ts +3 -0
- package/dist/accessories/batteries/delta2maxAccessory.js +4 -0
- package/dist/accessories/batteries/delta2maxAccessory.js.map +1 -0
- package/dist/accessories/ecoFlowAccessory.d.ts +19 -11
- package/dist/accessories/ecoFlowAccessory.js +46 -8
- package/dist/accessories/ecoFlowAccessory.js.map +1 -1
- package/dist/apis/ecoFlowHttpApi.d.ts +46 -0
- package/dist/{accessories/apis → apis}/ecoFlowHttpApi.js +31 -5
- package/dist/apis/ecoFlowHttpApi.js.map +1 -0
- package/dist/apis/ecoFlowMqttApi.d.ts +53 -0
- package/dist/apis/ecoFlowMqttApi.js +100 -0
- package/dist/apis/ecoFlowMqttApi.js.map +1 -0
- package/dist/config.d.ts +2 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/helpers/logger.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +1 -1
- package/dist/platform.js +9 -2
- package/dist/platform.js.map +1 -1
- package/dist/{accessories/services → services}/accessoryInformationService.js +4 -4
- package/dist/services/accessoryInformationService.js.map +1 -0
- package/dist/services/batteryService.js.map +1 -0
- package/dist/services/outletAcService.d.ts +8 -0
- package/dist/services/outletAcService.js +17 -0
- package/dist/services/outletAcService.js.map +1 -0
- package/dist/{accessories/services → services}/outletCarService.d.ts +2 -2
- package/dist/{accessories/services → services}/outletCarService.js +4 -2
- package/dist/services/outletCarService.js.map +1 -0
- package/dist/{accessories/services → services}/outletServiceBase.d.ts +6 -4
- package/dist/{accessories/services → services}/outletServiceBase.js +6 -12
- package/dist/services/outletServiceBase.js.map +1 -0
- package/dist/{accessories/services → services}/outletUsbService.d.ts +2 -2
- package/dist/{accessories/services → services}/outletUsbService.js +2 -2
- package/dist/services/outletUsbService.js.map +1 -0
- package/dist/{accessories/services → services}/serviceBase.d.ts +2 -2
- package/dist/services/serviceBase.js.map +1 -0
- package/package.json +4 -2
- package/dist/accessories/apis/ecoFlowHttpApi.d.ts +0 -16
- package/dist/accessories/apis/ecoFlowHttpApi.js.map +0 -1
- package/dist/accessories/apis/ecoFlowMqttApi.d.ts +0 -23
- package/dist/accessories/apis/ecoFlowMqttApi.js +0 -94
- package/dist/accessories/apis/ecoFlowMqttApi.js.map +0 -1
- package/dist/accessories/apis/interfaces/ecoFlowHttpContacts.d.ts +0 -47
- package/dist/accessories/apis/interfaces/ecoFlowHttpContacts.js +0 -6
- package/dist/accessories/apis/interfaces/ecoFlowHttpContacts.js.map +0 -1
- package/dist/accessories/apis/interfaces/ecoFlowMqttContacts.d.ts +0 -68
- package/dist/accessories/apis/interfaces/ecoFlowMqttContacts.js +0 -9
- package/dist/accessories/apis/interfaces/ecoFlowMqttContacts.js.map +0 -1
- package/dist/accessories/delta2maxAccessory.d.ts +0 -24
- package/dist/accessories/delta2maxAccessory.js.map +0 -1
- package/dist/accessories/services/accessoryInformationService.js.map +0 -1
- package/dist/accessories/services/batteryService.js.map +0 -1
- package/dist/accessories/services/outletAcService.d.ts +0 -6
- package/dist/accessories/services/outletAcService.js +0 -15
- package/dist/accessories/services/outletAcService.js.map +0 -1
- package/dist/accessories/services/outletCarService.js.map +0 -1
- package/dist/accessories/services/outletServiceBase.js.map +0 -1
- package/dist/accessories/services/outletUsbService.js.map +0 -1
- package/dist/accessories/services/serviceBase.js.map +0 -1
- /package/dist/{accessories/services → services}/accessoryInformationService.d.ts +0 -0
- /package/dist/{accessories/services → services}/batteryService.d.ts +0 -0
- /package/dist/{accessories/services → services}/batteryService.js +0 -0
- /package/dist/{accessories/services → services}/serviceBase.js +0 -0
package/.prettierrc.json
CHANGED
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)
|
package/config.schema.json
CHANGED
|
@@ -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 {
|
|
2
|
-
import { BatteryService } from '
|
|
3
|
-
import {
|
|
4
|
-
import { OutletCarService } from '
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
export class
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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(
|
|
35
|
-
const
|
|
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.
|
|
52
|
+
this.processQuotaMessage(message);
|
|
42
53
|
}
|
|
43
|
-
updateInvInitialValues(
|
|
44
|
-
const
|
|
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.
|
|
59
|
+
this.processQuotaMessage(message);
|
|
53
60
|
}
|
|
54
|
-
updatePdInitialValues(
|
|
55
|
-
const
|
|
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.
|
|
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=
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
|
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<
|
|
31
|
-
private
|
|
37
|
+
export declare abstract class EcoFlowAccessoryWithQuota<TAllQuotaData> extends EcoFlowAccessory {
|
|
38
|
+
private _quota;
|
|
32
39
|
initialize(): Promise<void>;
|
|
33
|
-
|
|
40
|
+
get quota(): TAllQuotaData;
|
|
41
|
+
protected abstract updateInitialValues(quota: TAllQuotaData): void;
|
|
34
42
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
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 =
|
|
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
|
-
|
|
101
|
+
_quota = null;
|
|
67
102
|
async initialize() {
|
|
68
|
-
if (!this.
|
|
69
|
-
this.
|
|
103
|
+
if (!this._quota) {
|
|
104
|
+
this._quota = await this.httpApi.getAllQuotas();
|
|
70
105
|
}
|
|
71
106
|
await super.initialize();
|
|
72
|
-
this.updateInitialValues(this.
|
|
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":"
|
|
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
|
|
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 {
|
|
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
|
+
}
|