homebridge-enphase-envoy 10.2.2-beta.21 → 10.2.2-beta.24
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/package.json +1 -1
- package/src/envoydevice.js +68 -40
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"private": false,
|
|
3
3
|
"displayName": "Enphase Envoy",
|
|
4
4
|
"name": "homebridge-enphase-envoy",
|
|
5
|
-
"version": "10.2.2-beta.
|
|
5
|
+
"version": "10.2.2-beta.24",
|
|
6
6
|
"description": "Homebridge p7ugin for Photovoltaic Energy System manufactured by Enphase.",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"author": "grzegorz914",
|
package/src/envoydevice.js
CHANGED
|
@@ -939,6 +939,28 @@ class EnvoyDevice extends EventEmitter {
|
|
|
939
939
|
relay: {},
|
|
940
940
|
generator: {}
|
|
941
941
|
},
|
|
942
|
+
esubsData: {
|
|
943
|
+
devices: [],
|
|
944
|
+
encharges: {
|
|
945
|
+
devices: [],
|
|
946
|
+
settings: {},
|
|
947
|
+
tariff: {},
|
|
948
|
+
tariffRaw: {},
|
|
949
|
+
ratedPowerSumKw: null,
|
|
950
|
+
realPowerSumKw: null,
|
|
951
|
+
phaseA: false,
|
|
952
|
+
phaseB: false,
|
|
953
|
+
phaseC: false,
|
|
954
|
+
},
|
|
955
|
+
enpowers: [],
|
|
956
|
+
collars: [],
|
|
957
|
+
c6CombinerControllers: [],
|
|
958
|
+
c6Rgms: [],
|
|
959
|
+
counters: {},
|
|
960
|
+
secctrl: {},
|
|
961
|
+
relay: {},
|
|
962
|
+
generator: {}
|
|
963
|
+
},
|
|
942
964
|
},
|
|
943
965
|
meters: [],
|
|
944
966
|
powerAndEnergy: {
|
|
@@ -947,17 +969,23 @@ class EnvoyDevice extends EventEmitter {
|
|
|
947
969
|
eim: {},
|
|
948
970
|
rgm: {},
|
|
949
971
|
pmu: {},
|
|
950
|
-
powerPeak: -100000
|
|
951
972
|
},
|
|
952
973
|
consumptionNet: {
|
|
953
|
-
powerPeak: -100000
|
|
954
974
|
},
|
|
955
975
|
consumptionTotal: {
|
|
956
|
-
powerPeak: -100000
|
|
957
976
|
},
|
|
958
977
|
},
|
|
959
978
|
powerAndEnergyData: {
|
|
960
979
|
data: [],
|
|
980
|
+
production: {
|
|
981
|
+
powerPeak: -100000
|
|
982
|
+
},
|
|
983
|
+
consumptionNet: {
|
|
984
|
+
powerPeak: -100000
|
|
985
|
+
},
|
|
986
|
+
consumptionTotal: {
|
|
987
|
+
powerPeak: -100000
|
|
988
|
+
},
|
|
961
989
|
},
|
|
962
990
|
liveData: {},
|
|
963
991
|
gridProfile: {},
|
|
@@ -3978,7 +4006,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
3978
4006
|
let sourceMeter, sourceEnergy;
|
|
3979
4007
|
let power, powerLevel, powerState, powerPeak, powerPeakDetected;
|
|
3980
4008
|
let energyToday, energyLastSevenDays, energyLifetime, energyLifetimeUpload, energyLifetimeWithOffset;
|
|
3981
|
-
const powerPeakStored = this.pv.
|
|
4009
|
+
const powerPeakStored = this.pv.powerAndEnergyData[key].powerPeak;
|
|
3982
4010
|
|
|
3983
4011
|
switch (key) {
|
|
3984
4012
|
case 'production': {
|
|
@@ -4024,7 +4052,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
4024
4052
|
break;
|
|
4025
4053
|
}
|
|
4026
4054
|
}
|
|
4027
|
-
if (this.isValidValue(powerPeak)) this.pv.
|
|
4055
|
+
if (this.isValidValue(powerPeak)) this.pv.powerAndEnergyData[key].powerPeak = powerPeak;
|
|
4028
4056
|
|
|
4029
4057
|
if (!sourceMeter) continue;
|
|
4030
4058
|
if (this.logDebug) {
|
|
@@ -4316,7 +4344,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
4316
4344
|
}));
|
|
4317
4345
|
|
|
4318
4346
|
// Update ensemble
|
|
4319
|
-
this.pv.inventory.
|
|
4347
|
+
this.pv.inventory.esubsData.devices = updatedEnsembles.filter(Boolean);
|
|
4320
4348
|
}
|
|
4321
4349
|
|
|
4322
4350
|
// Ensemble secctrl
|
|
@@ -4385,7 +4413,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
4385
4413
|
});
|
|
4386
4414
|
}
|
|
4387
4415
|
|
|
4388
|
-
this.pv.inventory.
|
|
4416
|
+
this.pv.inventory.esubsData.secctrl = secctrl;
|
|
4389
4417
|
|
|
4390
4418
|
// Add to ensemble summary characteristics
|
|
4391
4419
|
ensembleSummaryCharacteristics.push(
|
|
@@ -4577,7 +4605,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
4577
4605
|
backupSocLimitAbove100: counterData.backupSocLimitAbove100,
|
|
4578
4606
|
apiEcagtGetGenRelayState: counterData.api_ecagtGetGenRelayState,
|
|
4579
4607
|
};
|
|
4580
|
-
this.pv.inventory.
|
|
4608
|
+
this.pv.inventory.esubsData.counters = counters;
|
|
4581
4609
|
|
|
4582
4610
|
// Add to ensemble summary characteristics
|
|
4583
4611
|
if (this.isValidValue(counters.restPowerKw)) ensembleSummaryCharacteristics.push({ type: Characteristic.RestPower, value: counters.restPowerKw });
|
|
@@ -4603,7 +4631,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
4603
4631
|
solarGridModeTranslated: ApiCodes[relayData.Solar_grid_mode] ?? relayData.Solar_grid_mode,
|
|
4604
4632
|
solarGridStateBool: relayData.mains_admin_state === 'closed',
|
|
4605
4633
|
};
|
|
4606
|
-
this.pv.inventory.
|
|
4634
|
+
this.pv.inventory.esubsData.relay = relay;
|
|
4607
4635
|
|
|
4608
4636
|
// encharge grid state sensor
|
|
4609
4637
|
if (this.enchargeGridStateActiveSensor) {
|
|
@@ -4842,7 +4870,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
4842
4870
|
}));
|
|
4843
4871
|
|
|
4844
4872
|
// Filter out nulls and update inventory
|
|
4845
|
-
this.pv.inventory.
|
|
4873
|
+
this.pv.inventory.esubsData.encharges.devices = updatedEncharges.filter(Boolean);
|
|
4846
4874
|
|
|
4847
4875
|
// Add encharges settings
|
|
4848
4876
|
if (enchargesSettingsSupported) {
|
|
@@ -4855,7 +4883,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
4855
4883
|
currentLimit: settingsData.currentLimit,
|
|
4856
4884
|
perPhase: settingsData.perPhase
|
|
4857
4885
|
};
|
|
4858
|
-
this.pv.inventory.
|
|
4886
|
+
this.pv.inventory.esubsData.encharges.settings = settings;
|
|
4859
4887
|
|
|
4860
4888
|
if (this.enchargeStateActiveSensor) {
|
|
4861
4889
|
const state = settings.enable;
|
|
@@ -4994,13 +5022,13 @@ class EnvoyDevice extends EventEmitter {
|
|
|
4994
5022
|
}
|
|
4995
5023
|
|
|
4996
5024
|
// Save updated tariff
|
|
4997
|
-
this.pv.inventory.
|
|
5025
|
+
this.pv.inventory.esubsData.encharges.tariff = tariff;
|
|
4998
5026
|
}
|
|
4999
5027
|
|
|
5000
5028
|
// Calculate encharges rated power summary in kW
|
|
5001
5029
|
if (enchargesStatusSupported) {
|
|
5002
5030
|
const ratedPowerSum = enchargesRatedPowerSummary.length > 0 ? (enchargesRatedPowerSummary.reduce((total, num) => total + num, 0) / enchargesRatedPowerSummary.length) / 1000 : null;
|
|
5003
|
-
this.pv.inventory.
|
|
5031
|
+
this.pv.inventory.esubsData.encharges.ratedPowerSumKw = ratedPowerSum;
|
|
5004
5032
|
|
|
5005
5033
|
// Add to ensemble summary characteristics
|
|
5006
5034
|
ensembleSummaryCharacteristics.push({ type: Characteristic.RatedPower, value: ratedPowerSum });
|
|
@@ -5009,7 +5037,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
5009
5037
|
// Calculate encharges real power summary in kW
|
|
5010
5038
|
if (enchargesPowerSupported) {
|
|
5011
5039
|
const realPowerSum = enchargesRealPowerSummary.length > 0 ? (enchargesRealPowerSummary.reduce((total, num) => total + num, 0) / enchargesRealPowerSummary.length) / 1000 : null;
|
|
5012
|
-
this.pv.inventory.
|
|
5040
|
+
this.pv.inventory.esubsData.encharges.realPowerSumKw = realPowerSum;
|
|
5013
5041
|
|
|
5014
5042
|
// Add to ensemble summary characteristics
|
|
5015
5043
|
ensembleSummaryCharacteristics.push({ type: Characteristic.RealPower, value: realPowerSum });
|
|
@@ -5128,7 +5156,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
5128
5156
|
};
|
|
5129
5157
|
}
|
|
5130
5158
|
|
|
5131
|
-
|
|
5159
|
+
this.pv.inventory.esubsData.dryContacts[i] = dryContactData;
|
|
5132
5160
|
});
|
|
5133
5161
|
}
|
|
5134
5162
|
|
|
@@ -5190,7 +5218,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
5190
5218
|
}));
|
|
5191
5219
|
|
|
5192
5220
|
// Filter out nulls and update inventory
|
|
5193
|
-
this.pv.inventory.
|
|
5221
|
+
this.pv.inventory.esubsData.enpowers = updatedEnpowers.filter(Boolean);
|
|
5194
5222
|
}
|
|
5195
5223
|
|
|
5196
5224
|
// IQ Meter Collars
|
|
@@ -5241,7 +5269,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
5241
5269
|
}));
|
|
5242
5270
|
|
|
5243
5271
|
// Update collars
|
|
5244
|
-
this.pv.inventory.
|
|
5272
|
+
this.pv.inventory.esubsData.collars = updatedCollars.filter(Boolean);
|
|
5245
5273
|
}
|
|
5246
5274
|
|
|
5247
5275
|
// IQ C6 Combiner Controllers
|
|
@@ -5283,7 +5311,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
5283
5311
|
}));
|
|
5284
5312
|
|
|
5285
5313
|
// Update c6 combiner controllers
|
|
5286
|
-
this.pv.inventory.
|
|
5314
|
+
this.pv.inventory.esubsData.c6CombinerControllers = updatedC6CombinerControllers.filter(Boolean);
|
|
5287
5315
|
}
|
|
5288
5316
|
|
|
5289
5317
|
// IQ C6 Rgm
|
|
@@ -5319,7 +5347,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
5319
5347
|
}));
|
|
5320
5348
|
|
|
5321
5349
|
// Update C6 rgms
|
|
5322
|
-
this.pv.inventory.
|
|
5350
|
+
this.pv.inventory.esubsData.c6Rgms = updatedC6Rgms.filter(Boolean);
|
|
5323
5351
|
}
|
|
5324
5352
|
|
|
5325
5353
|
// Generators
|
|
@@ -5472,7 +5500,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
5472
5500
|
}
|
|
5473
5501
|
|
|
5474
5502
|
// Save processed generator data
|
|
5475
|
-
this.pv.inventory.
|
|
5503
|
+
this.pv.inventory.esubsData.generator = generatorData;
|
|
5476
5504
|
}
|
|
5477
5505
|
|
|
5478
5506
|
// Set supported flag
|
|
@@ -5504,9 +5532,9 @@ class EnvoyDevice extends EventEmitter {
|
|
|
5504
5532
|
}
|
|
5505
5533
|
|
|
5506
5534
|
// Get encharges installed phases
|
|
5507
|
-
const phaseA = this.pv.inventory.
|
|
5508
|
-
const phaseB = this.pv.inventory.
|
|
5509
|
-
const phaseC = this.pv.inventory.
|
|
5535
|
+
const phaseA = this.pv.inventory.esubsData.encharges.phaseA;
|
|
5536
|
+
const phaseB = this.pv.inventory.esubsData.encharges.phaseB;
|
|
5537
|
+
const phaseC = this.pv.inventory.esubsData.encharges.phaseC;
|
|
5510
5538
|
|
|
5511
5539
|
// Extract connection status — aka the heartbeat of the system
|
|
5512
5540
|
const connection = live.connection ?? {};
|
|
@@ -5569,7 +5597,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
5569
5597
|
if (this.feature.meters.production.enabled) activeDevices.push({ type: 'Production', meter: meters.pv });
|
|
5570
5598
|
if (this.feature.meters.consumptionNet.enabled) activeDevices.push({ type: 'Consumption Net', meter: meters.grid });
|
|
5571
5599
|
if (this.feature.meters.consumptionTotal.enabled) activeDevices.push({ type: 'Consumption Total', meter: meters.load });
|
|
5572
|
-
if (this.feature.meters.storage.enabled || this.
|
|
5600
|
+
if (this.feature.meters.storage.enabled || this.feature.inventory.esubs.encharges.installed) activeDevices.push({ type: 'Storage', meter: meters.storage });
|
|
5573
5601
|
if (this.feature.meters.generator.enabled) activeDevices.push({ type: 'Generator', meter: meters.generator });
|
|
5574
5602
|
for (const [index, { type, meter }] of activeDevices.entries()) {
|
|
5575
5603
|
if (!meter) {
|
|
@@ -6491,8 +6519,8 @@ class EnvoyDevice extends EventEmitter {
|
|
|
6491
6519
|
}
|
|
6492
6520
|
|
|
6493
6521
|
if (enpowersInstalled) {
|
|
6494
|
-
const enpowerState = this.pv.inventory.
|
|
6495
|
-
characteristics.push({ type: Characteristic.EnpowerGridMode, label: 'enpower grid mode', value: this.pv.inventory.
|
|
6522
|
+
const enpowerState = this.pv.inventory.esubsData.enpowers[0].mainsAdminStateBool;
|
|
6523
|
+
characteristics.push({ type: Characteristic.EnpowerGridMode, label: 'enpower grid mode', value: this.pv.inventory.esubsData.enpowers[0].enpwrGridModeTranslated });
|
|
6496
6524
|
service.getCharacteristic(Characteristic.EnpowerGridState)
|
|
6497
6525
|
.onGet(async () => {
|
|
6498
6526
|
const state = enpowerState;
|
|
@@ -6522,8 +6550,8 @@ class EnvoyDevice extends EventEmitter {
|
|
|
6522
6550
|
}
|
|
6523
6551
|
|
|
6524
6552
|
if (generatorInstalled) {
|
|
6525
|
-
const generatorState = this.pv.inventory.
|
|
6526
|
-
characteristics.push({ type: Characteristic.GeneratorMode, label: 'generator mode', value: this.pv.inventory.
|
|
6553
|
+
const generatorState = this.pv.inventory.esubsData.generator.adminModeOnBool || this.pv.inventory.esubsData.generator.adminModeAutoBool;
|
|
6554
|
+
characteristics.push({ type: Characteristic.GeneratorMode, label: 'generator mode', value: this.pv.inventory.esubsData.generator.adminMode });
|
|
6527
6555
|
service.getCharacteristic(Characteristic.State)
|
|
6528
6556
|
.onGet(async () => {
|
|
6529
6557
|
const state = generatorState
|
|
@@ -7219,8 +7247,8 @@ class EnvoyDevice extends EventEmitter {
|
|
|
7219
7247
|
|
|
7220
7248
|
//summary
|
|
7221
7249
|
if (ensemblesCountersSupported || ensemblesSecCtrlSupported) {
|
|
7222
|
-
const secctrl = this.pv.inventory.
|
|
7223
|
-
const counters = this.pv.inventory.
|
|
7250
|
+
const secctrl = this.pv.inventory.esubsData.secctrl;
|
|
7251
|
+
const counters = this.pv.inventory.esubsData.counters;
|
|
7224
7252
|
|
|
7225
7253
|
if (this.logDebug) this.emit('debug', `Prepare Ensemble Summary Service`);
|
|
7226
7254
|
|
|
@@ -7270,8 +7298,8 @@ class EnvoyDevice extends EventEmitter {
|
|
|
7270
7298
|
}
|
|
7271
7299
|
|
|
7272
7300
|
if (ensemblesCountersSupported) characteristics.push({ type: Characteristic.RestPower, label: 'rest power', value: counters.restPowerKw, unit: 'kW' });
|
|
7273
|
-
if (enchargesStatusSupported) characteristics.push({ type: Characteristic.RatedPower, label: 'rated power', value: this.pv.inventory.
|
|
7274
|
-
if (enchargesPowerSupported) characteristics.push({ type: Characteristic.RealPower, label: 'real power', value: this.pv.inventory.
|
|
7301
|
+
if (enchargesStatusSupported) characteristics.push({ type: Characteristic.RatedPower, label: 'rated power', value: this.pv.inventory.esubsData.ratedPowerSumKw, unit: 'kW' });
|
|
7302
|
+
if (enchargesPowerSupported) characteristics.push({ type: Characteristic.RealPower, label: 'real power', value: this.pv.inventory.esubsData.realPowerSumKw, unit: 'kW' });
|
|
7275
7303
|
|
|
7276
7304
|
for (const { type, label, value, unit = '', postfix = '' } of characteristics) {
|
|
7277
7305
|
if (!this.isValidValue(value)) continue;
|
|
@@ -7290,7 +7318,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
7290
7318
|
if (ensemblesInstalled) {
|
|
7291
7319
|
this.ensembleServices = [];
|
|
7292
7320
|
|
|
7293
|
-
for (const ensemble of this.pv.inventory.
|
|
7321
|
+
for (const ensemble of this.pv.inventory.esubsData.devices) {
|
|
7294
7322
|
const serialNumber = ensemblesInstalled ? ensemble.serialNumber : ensemble.status.deviceType;
|
|
7295
7323
|
if (this.logDebug) this.emit('debug', `Prepare Ensemble ${serialNumber} Service`);
|
|
7296
7324
|
|
|
@@ -7458,7 +7486,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
7458
7486
|
this.enchargeServices = [];
|
|
7459
7487
|
this.enchargeLevelAndStateServices = [];
|
|
7460
7488
|
|
|
7461
|
-
for (const encharge of this.pv.inventory.
|
|
7489
|
+
for (const encharge of this.pv.inventory.esubsData.encharges.devices) {
|
|
7462
7490
|
const serialNumber = encharge.serialNumber;
|
|
7463
7491
|
|
|
7464
7492
|
// Backup level and state (individual)
|
|
@@ -7591,7 +7619,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
7591
7619
|
if (this.enchargeProfileActiveControls.length > 0) {
|
|
7592
7620
|
if (this.logDebug) this.emit('debug', `Prepare ${enchargeName} Profile Control Services`);
|
|
7593
7621
|
|
|
7594
|
-
const enchargeSettings = this.pv.inventory.
|
|
7622
|
+
const enchargeSettings = this.pv.inventory.esubsData.encharges.tariff.storageSettings;
|
|
7595
7623
|
this.enchargeProfileControlsServices = [];
|
|
7596
7624
|
|
|
7597
7625
|
for (let i = 0; i < this.enchargeProfileActiveControls.length; i++) {
|
|
@@ -7751,7 +7779,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
7751
7779
|
this.enpowerGridModeSensorServices = [];
|
|
7752
7780
|
|
|
7753
7781
|
//devices
|
|
7754
|
-
for (const enpower of this.pv.inventory.
|
|
7782
|
+
for (const enpower of this.pv.inventory.esubsData.enpowers) {
|
|
7755
7783
|
const serialNumber = enpower.serialNumber;
|
|
7756
7784
|
|
|
7757
7785
|
if (this.logDebug) this.emit('debug', `Prepare Enpower ${serialNumber} Service`);
|
|
@@ -7963,7 +7991,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
7963
7991
|
if (collarsInstalled) {
|
|
7964
7992
|
this.collarServices = [];
|
|
7965
7993
|
|
|
7966
|
-
for (const collar of this.pv.inventory.
|
|
7994
|
+
for (const collar of this.pv.inventory.esubsData.collars) {
|
|
7967
7995
|
const serialNumber = collar.serialNumber;
|
|
7968
7996
|
if (this.logDebug) this.emit('debug', `Prepare Collar ${serialNumber} Service`);
|
|
7969
7997
|
|
|
@@ -8000,7 +8028,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
8000
8028
|
if (c6CombinerControllersInstalled) {
|
|
8001
8029
|
this.c6CombinerControllerServices = [];
|
|
8002
8030
|
|
|
8003
|
-
for (const c6CombinerController of this.pv.inventory.
|
|
8031
|
+
for (const c6CombinerController of this.pv.inventory.esubsData.c6CombinerControllers) {
|
|
8004
8032
|
const serialNumber = c6CombinerController.serialNumber;
|
|
8005
8033
|
if (this.logDebug) this.emit('debug', `Prepare C6 Combiner Controller ${serialNumber} Service`);
|
|
8006
8034
|
|
|
@@ -8034,7 +8062,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
8034
8062
|
if (c6RgmsInstalled) {
|
|
8035
8063
|
this.c6RgmServices = [];
|
|
8036
8064
|
|
|
8037
|
-
for (const c6Rgm of this.pv.inventory.
|
|
8065
|
+
for (const c6Rgm of this.pv.inventory.esubsData.c6Rgms) {
|
|
8038
8066
|
const serialNumber = c6Rgm.serialNumber;
|
|
8039
8067
|
if (this.logDebug) this.emit('debug', `Prepare C6 Rgm ${serialNumber} Service`);
|
|
8040
8068
|
|
|
@@ -8065,7 +8093,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
8065
8093
|
|
|
8066
8094
|
//generator
|
|
8067
8095
|
if (generatorInstalled) {
|
|
8068
|
-
const generator = this.pv.inventory.
|
|
8096
|
+
const generator = this.pv.inventory.esubsData.generator;
|
|
8069
8097
|
const generatorType = generator.type;
|
|
8070
8098
|
|
|
8071
8099
|
if (this.logDebug) this.emit('debug', `Prepare Generator ${type} Service`);
|