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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. 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.21",
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",
@@ -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.powerAndEnergy[key].powerPeak;
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.powerAndEnergy[key].powerPeak = powerPeak;
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.esubs.devices = updatedEnsembles.filter(Boolean);
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.esubs.secctrl = secctrl;
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.esubs.counters = counters;
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.esubs.relay = relay;
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.esubs.encharges.devices = updatedEncharges.filter(Boolean);
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.esubs.encharges.settings = settings;
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.esubs.encharges.tariff = tariff;
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.esubs.encharges.ratedPowerSumKw = ratedPowerSum;
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.esubs.encharges.realPowerSumKw = realPowerSum;
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
- enpowerData.dryContacts[i] = dryContactData;
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.esubs.enpowers = updatedEnpowers.filter(Boolean);
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.esubs.collars = updatedCollars.filter(Boolean);
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.esubs.c6CombinerControllers = updatedC6CombinerControllers.filter(Boolean);
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.esubs.c6Rgms = updatedC6Rgms.filter(Boolean);
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.esubs.generator = generatorData;
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.esubs.encharges.phaseA;
5508
- const phaseB = this.pv.inventory.esubs.encharges.phaseB;
5509
- const phaseC = this.pv.inventory.esubs.encharges.phaseC;
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.pv.inventory.esubs.encharges.installed) activeDevices.push({ type: 'Storage', meter: meters.storage });
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.esubs.enpowers[0].mainsAdminStateBool;
6495
- characteristics.push({ type: Characteristic.EnpowerGridMode, label: 'enpower grid mode', value: this.pv.inventory.esubs.enpowers[0].enpwrGridModeTranslated });
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.esubs.generator.adminModeOnBool || this.pv.inventory.esubs.generator.adminModeAutoBool;
6526
- characteristics.push({ type: Characteristic.GeneratorMode, label: 'generator mode', value: this.pv.inventory.esubs.generator.adminMode });
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.esubs.secctrl;
7223
- const counters = this.pv.inventory.esubs.counters;
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.esubs.ratedPowerSumKw, unit: 'kW' });
7274
- if (enchargesPowerSupported) characteristics.push({ type: Characteristic.RealPower, label: 'real power', value: this.pv.inventory.esubs.realPowerSumKw, unit: 'kW' });
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.esubs.devices) {
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.esubs.encharges.devices) {
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.esubs.encharges.tariff.storageSettings;
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.esubs.enpowers) {
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.esubs.collars) {
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.esubs.c6CombinerControllers) {
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.esubs.c6Rgms) {
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.esubs.generator;
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`);