homebridge-solaxcloud-api 2.3.2 → 2.4.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 (44) hide show
  1. package/CHANGELOG.md +140 -127
  2. package/LICENSE +175 -175
  3. package/config.sample +15 -15
  4. package/config.schema.json +105 -105
  5. package/dist/batteryAccessory.d.ts +70 -70
  6. package/dist/batteryAccessory.d.ts.map +1 -1
  7. package/dist/batteryAccessory.js +124 -123
  8. package/dist/batteryAccessory.js.map +1 -1
  9. package/dist/index.d.ts +6 -6
  10. package/dist/index.js +6 -6
  11. package/dist/lightSensorAccessory.d.ts +34 -34
  12. package/dist/lightSensorAccessory.js +58 -58
  13. package/dist/motionAccessory.d.ts +53 -53
  14. package/dist/motionAccessory.js +93 -93
  15. package/dist/outletAccessory.d.ts +100 -100
  16. package/dist/outletAccessory.js +187 -187
  17. package/dist/platform.d.ts +62 -56
  18. package/dist/platform.d.ts.map +1 -1
  19. package/dist/platform.js +294 -265
  20. package/dist/platform.js.map +1 -1
  21. package/dist/platformAccessory.d.ts +70 -70
  22. package/dist/platformAccessory.js +102 -102
  23. package/dist/platformInverter.d.ts +180 -176
  24. package/dist/platformInverter.d.ts.map +1 -1
  25. package/dist/platformInverter.js +348 -343
  26. package/dist/platformInverter.js.map +1 -1
  27. package/dist/platformMeters.d.ts +68 -68
  28. package/dist/platformMeters.js +2 -2
  29. package/dist/settings.d.ts +8 -8
  30. package/dist/settings.js +11 -11
  31. package/dist/solaxcloudfetch.d.ts +1 -1
  32. package/dist/solaxcloudfetch.js +21 -21
  33. package/dist/solaxcloudfetch.js.map +1 -1
  34. package/dist/statistics.d.ts +36 -36
  35. package/dist/statistics.js +88 -88
  36. package/dist/util.d.ts +23 -23
  37. package/dist/util.js +42 -42
  38. package/package.json +55 -54
  39. package/config.json +0 -16
  40. package/dist/solaxcloudapi.d.ts +0 -163
  41. package/dist/solaxcloudapi.d.ts.map +0 -1
  42. package/dist/solaxcloudapi.js +0 -226
  43. package/dist/solaxcloudapi.js.map +0 -1
  44. package/test/solaxcloudapi.test.ts +0 -164
package/dist/platform.js CHANGED
@@ -1,266 +1,295 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SolaxCloudAPIPlatform = void 0;
4
- const util_1 = require("./util");
5
- const platformInverter_1 = require("./platformInverter");
6
- /**
7
- * Valid inverter brands (Solax, QCells)
8
- */
9
- const VALID_INVERTER_BRANDS = ['solax', 'qcells'];
10
- /**
11
- * Valid smoothing methods (Simple Moving Average, Exponential Moving Average).
12
- */
13
- const VALID_SMOOTHING_METHODS = ['sma', 'ema'];
14
- /**
15
- * Default smoothing method (simple moving average).
16
- */
17
- const DEFAULT_SMOOTHING_METHOD = 'sma';
18
- /**
19
- * Default polling frequency from Solax or QCells Cloud (in seconds).
20
- */
21
- const DEFAULT_POLLING_FREQUENCY = 300;
22
- /**
23
- * Max polls / min (obtain frequency need to be lower than 10 times/min).
24
- */
25
- const MAX_POLLS_MIN = 10;
26
- /**
27
- * Max polls / day (obtain frequency need to be lower than 10,000 times/day).
28
- */
29
- const MAX_POLLS_DAY = 10000;
30
- /**
31
- * Maximum polling frequency (in seconds).
32
- */
33
- const MAX_POLLING_FREQUENCY = Math.max(60 / MAX_POLLS_MIN, (24 * 60 * 60) / MAX_POLLS_DAY);
34
- /**
35
- * SolaxCloudAPIPlatform.
36
- * This class is the main constructor for your plugin, this is where you should
37
- * parse the user config and discover/register accessories with Homebridge.
38
- */
39
- class SolaxCloudAPIPlatform {
40
- /**
41
- * Platform constructor.
42
- * @param log
43
- * @param config
44
- * @param api
45
- * @returns
46
- */
47
- constructor(log, config, api) {
48
- /**
49
- * Number of periods to use for data smoothing.
50
- */
51
- this.smoothingWindow = 1;
52
- /**
53
- * Array of inverters.
54
- */
55
- this.inverters = [];
56
- // store values in properties
57
- this.log = log;
58
- this.config = config;
59
- this.api = api;
60
- // sanity check
61
- if (!api || !config) {
62
- return;
63
- }
64
- // check for valid config
65
- if (!this.checkConfig(this.config)) {
66
- return;
67
- }
68
- // window for smoothing (aim for a 15 minute window)
69
- this.smoothingWindow = Math.floor(15 * 60 / this.config.pollingFrequency);
70
- this.log.info(`Window for smoothing series is ${this.smoothingWindow} periods.`);
71
- try {
72
- // loop over configured inverters
73
- this.config.inverters.forEach(inverter => {
74
- // setup new inverter
75
- const platformInverter = new platformInverter_1.SolaxCloudAPIPlatformInverter(log, config, api, VALID_INVERTER_BRANDS.indexOf(inverter.brand), inverter.tokenId, inverter.sn, inverter.name, inverter.hasBattery, this.smoothingWindow);
76
- // add new inverter to list
77
- this.inverters.push(platformInverter);
78
- });
79
- // create inverter totalizers (pick first inverter as brand)
80
- if (this.inverters.length > 1) {
81
- this.allInverters = new platformInverter_1.SolaxCloudAPIPlatformInverter(log, config, api, VALID_INVERTER_BRANDS.indexOf(this.config.inverters[0].brand), this.config.tokenId, 'total', 'All inverters', this.inverters.map(inverter => +inverter.hasBattery()).reduce((a, b) => a + b, 0) > 0, this.smoothingWindow);
82
- }
83
- // start data fetching
84
- this.fetchDataPeriodically();
85
- this.log.debug('Finished initializing platform.');
86
- }
87
- catch (error) {
88
- this.log.error(`Unexpected error: ${error}`);
89
- }
90
- // When this event is fired it means Homebridge has created all accessories.
91
- this.api.on("didFinishLaunching" /* DID_FINISH_LAUNCHING */, () => {
92
- this.log.debug('Executed didFinishLaunching callback');
93
- });
94
- }
95
- /**
96
- * Check whether object implements interface InverterConfig and brand has a valid entry.
97
- * @param obj Any object.
98
- * @returns Whether object implements interface InverterConfig.
99
- */
100
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
101
- static isInverterConfig(obj) {
102
- return 'name' in obj && 'sn' in obj && 'brand' in obj && 'tokenId' in obj && VALID_INVERTER_BRANDS.includes(obj.brand);
103
- }
104
- /**
105
- * Update data for virtual inverter totalizer based on individual inverter data.
106
- */
107
- updateAllInvertersData() {
108
- this.allInverters.setRawPower(platformInverter_1.ACCESSORY_KEYS.pv, this.inverters.map(inverter => inverter.getRawPower(platformInverter_1.ACCESSORY_KEYS.pv)).reduce((a, b) => a + b, 0));
109
- this.allInverters.setRawPower(platformInverter_1.ACCESSORY_KEYS.inverterAC, this.inverters.map(inverter => inverter.getRawPower(platformInverter_1.ACCESSORY_KEYS.inverterAC)).reduce((a, b) => a + b, 0));
110
- this.allInverters.setRawEnergy(platformInverter_1.ACCESSORY_KEYS.inverterAC, this.inverters.map(inverter => inverter.getRawEnergy(platformInverter_1.ACCESSORY_KEYS.inverterAC)).reduce((a, b) => a + b, 0));
111
- this.allInverters.setRawPower(platformInverter_1.ACCESSORY_KEYS.inverterToGrid, this.inverters.map(inverter => inverter.getRawPower(platformInverter_1.ACCESSORY_KEYS.inverterToGrid)).reduce((a, b) => a + b, 0));
112
- this.allInverters.setRawPower(platformInverter_1.ACCESSORY_KEYS.inverterToHouse, this.inverters.map(inverter => inverter.getRawPower(platformInverter_1.ACCESSORY_KEYS.inverterToHouse)).reduce((a, b) => a + b, 0));
113
- this.allInverters.setRawPower(platformInverter_1.ACCESSORY_KEYS.gridToHouse, this.inverters.map(inverter => inverter.getRawPower(platformInverter_1.ACCESSORY_KEYS.gridToHouse)).reduce((a, b) => a + b, 0));
114
- if (this.allInverters.hasBattery()) {
115
- // get array of inverters with battery
116
- const invertersWithBattery = this.inverters.filter(inverter => inverter.hasBattery());
117
- // battery charge / discharge power
118
- this.allInverters.setRawPower(platformInverter_1.ACCESSORY_KEYS.inverterFromBattery, invertersWithBattery.map(inverter => inverter.getRawPower(platformInverter_1.ACCESSORY_KEYS.inverterFromBattery)).reduce((a, b) => a + b, 0));
119
- this.allInverters.setRawPower(platformInverter_1.ACCESSORY_KEYS.inverterToBattery, invertersWithBattery.map(inverter => inverter.getRawPower(platformInverter_1.ACCESSORY_KEYS.inverterToBattery)).reduce((a, b) => a + b, 0));
120
- // battery SoC
121
- this.allInverters.setBatteryChargeState(Math.max(...invertersWithBattery.map(inverter => inverter.getBatteryChargeState())));
122
- const levelSums = invertersWithBattery.map(inverter => inverter.getBatteryLevel()).reduce((a, b) => a + b, 0);
123
- this.allInverters.setBatteryLevel(levelSums / invertersWithBattery.length); // average levels
124
- }
125
- // notify update with motion
126
- this.allInverters.setMotionUpdate();
127
- }
128
- /**
129
- * Sleeps for a number of milliseconds.
130
- * @param millis {number} The number of milliseconds to sleep.
131
- */
132
- async sleep(millis) {
133
- return new Promise(resolve => setTimeout(resolve, millis));
134
- }
135
- /**
136
- * Periodically retrieves inverter data from Solax Cloud API using configured tokenID and SN.
137
- */
138
- async fetchDataPeriodically() {
139
- // loop forever
140
- for (;;) {
141
- // update data for all configured inverters
142
- this.inverters.forEach(inverter => inverter.updateInverterDataFromCloud());
143
- this.log.info(`Updated data from ${this.config.brand} Cloud API, sleeping for ${this.config.pollingFrequency} seconds.`);
144
- // update inverter totalizers if needed
145
- if (this.inverters.length > 1) {
146
- this.log.info('Computing inverter totals...');
147
- this.updateAllInvertersData();
148
- }
149
- // sleep until next data poll
150
- await this.sleep(this.config.pollingFrequency * 1000);
151
- }
152
- }
153
- /**
154
- * Checks platform config validity and sets defaults whenever needed.
155
- * @returns {boolean} Whether the config is valid.
156
- */
157
- checkConfig(config) {
158
- let result = true;
159
- this.log.debug(`Config read: ${JSON.stringify(config)}`);
160
- // check for mandatory parameters
161
- if (!config.inverters) {
162
- this.log.error('Config check: Can\'t find mandatory parameter "inverters" parameter in config file, aborting!');
163
- result = false;
164
- return result;
165
- }
166
- // check for inverters type
167
- if (Array.isArray(config.inverters)) {
168
- // loop over inverters and check config type
169
- config.inverters.forEach(inverter => {
170
- if (!SolaxCloudAPIPlatform.isInverterConfig(inverter)) {
171
- this.log.error('Config check: Invalid type for inverter under "inverters" in config file, aborting!');
172
- result = false;
173
- return result;
174
- }
175
- });
176
- }
177
- else {
178
- this.log.error('Config check: Incorrect type for mandatory parameter "inverters" in config file, aborting!');
179
- result = false;
180
- return result;
181
- }
182
- // check for duplicates
183
- if (util_1.Util.arrayHasDuplicates(config.inverters.map(inverter => inverter.name))) {
184
- this.log.error('Config check: Duplicate inverter names in config file, aborting!');
185
- result = false;
186
- return result;
187
- }
188
- else if (util_1.Util.arrayHasDuplicates(config.inverters.map(inverter => inverter.sn))) {
189
- this.log.error('Config check: Duplicate inverter SNs in config file, aborting!');
190
- result = false;
191
- return result;
192
- }
193
- // check for polling frequency
194
- if (config.pollingFrequency === undefined) {
195
- this.log.info(`Config check: No polling frequency provided, defaulting to ${DEFAULT_POLLING_FREQUENCY} seconds.`);
196
- config.pollingFrequency = DEFAULT_POLLING_FREQUENCY;
197
- }
198
- else {
199
- if (Number.isInteger(config.pollingFrequency) && config.pollingFrequency > 0) {
200
- // all good?
201
- if (config.pollingFrequency < MAX_POLLING_FREQUENCY) {
202
- this.log.info(`Config check: Polling frequency cannot be higher than ${MAX_POLLS_MIN} times/min and ${MAX_POLLS_DAY} ` +
203
- `times/day, defaulting to ${DEFAULT_POLLING_FREQUENCY} seconds.`);
204
- config.pollingFrequency = DEFAULT_POLLING_FREQUENCY;
205
- }
206
- }
207
- else {
208
- this.log.info('Config check: Invalid polling frequency (must be a positive integer number), defaulting to ' +
209
- `${DEFAULT_POLLING_FREQUENCY} seconds.`);
210
- config.pollingFrequency = DEFAULT_POLLING_FREQUENCY;
211
- }
212
- }
213
- // check for smooth meters
214
- if (config.smoothMeters === undefined) {
215
- config.smoothMeters = true;
216
- this.log.info(`Config check: No config for smooth meters, defaulting to ${config.smoothMeters}.`);
217
- }
218
- else {
219
- if (typeof config.smoothMeters !== 'boolean') {
220
- config.smoothMeters = true;
221
- this.log.info(`Config check: Invalid setting for smooth meters, defaulting to ${config.smoothMeters}.`);
222
- }
223
- }
224
- // check for smoothing method
225
- if (config.smoothingMethod === undefined) {
226
- this.log.info(`Config check: No smoothing method provided, defaulting to "${DEFAULT_SMOOTHING_METHOD}".`);
227
- config.smoothingMethod = DEFAULT_SMOOTHING_METHOD;
228
- }
229
- else {
230
- if (!VALID_SMOOTHING_METHODS.includes(config.smoothingMethod)) {
231
- this.log.info(`Config check: Invalid smoothing method, defaulting to "${DEFAULT_SMOOTHING_METHOD}".`);
232
- config.smoothingMethod = DEFAULT_SMOOTHING_METHOD;
233
- }
234
- }
235
- // check for Home app accessories
236
- if (config.pureHomeApp === undefined) {
237
- config.pureHomeApp = false;
238
- this.log.info(`Config check: No config for using pure Home app accessories, defaulting to ${config.pureHomeApp}.`);
239
- }
240
- else {
241
- if (typeof config.pureHomeApp !== 'boolean') {
242
- config.pureHomeApp = false;
243
- this.log.info(`Config check: Invalid setting for using pure Home app accessories, defaulting to ${config.pureHomeApp}.`);
244
- }
245
- }
246
- this.log.info(`Config check: final config is ${JSON.stringify(config)}`);
247
- return result;
248
- }
249
- /*
250
- * This method is called once at startup.
251
- * The Platform should pass all accessories which need to be created to the callback in form of a AccessoryPlugin.
252
- * The Platform must respond in a timely manner as otherwise the startup of the bridge would be unnecessarily delayed.
253
- */
254
- accessories(callback) {
255
- const accessories = [];
256
- // loop over inverters and add accessories
257
- this.inverters.forEach(inverter => accessories.push(...inverter.getAccessories()));
258
- // add inverter totalizer accessories if needed
259
- if (this.inverters.length > 1) {
260
- accessories.push(...this.allInverters.getAccessories());
261
- }
262
- callback(accessories);
263
- }
264
- }
265
- exports.SolaxCloudAPIPlatform = SolaxCloudAPIPlatform;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SolaxCloudAPIPlatform = void 0;
4
+ const util_1 = require("./util");
5
+ const platformInverter_1 = require("./platformInverter");
6
+ /**
7
+ * Valid inverter brands (Solax, QCells)
8
+ */
9
+ const VALID_INVERTER_BRANDS = ['solax', 'qcells'];
10
+ /**
11
+ * Valid smoothing methods (Simple Moving Average, Exponential Moving Average).
12
+ */
13
+ const VALID_SMOOTHING_METHODS = ['sma', 'ema'];
14
+ /**
15
+ * Default smoothing method (simple moving average).
16
+ */
17
+ const DEFAULT_SMOOTHING_METHOD = 'sma';
18
+ /**
19
+ * Default polling frequency from Solax or QCells Cloud (in seconds).
20
+ */
21
+ const DEFAULT_POLLING_FREQUENCY = 300;
22
+ /**
23
+ * Max polls / min (obtain frequency need to be lower than 10 times/min).
24
+ */
25
+ const MAX_POLLS_MIN = 10;
26
+ /**
27
+ * Max polls / day (obtain frequency need to be lower than 10,000 times/day).
28
+ */
29
+ const MAX_POLLS_DAY = 10000;
30
+ /**
31
+ * Maximum polling frequency (in seconds).
32
+ */
33
+ const MAX_POLLING_FREQUENCY = Math.max(60 / MAX_POLLS_MIN, (24 * 60 * 60) / MAX_POLLS_DAY);
34
+ /**
35
+ * Maximum polling interval that still gives at least one smoothing period.
36
+ */
37
+ const MAX_SMOOTHING_POLLING_FREQUENCY = 15 * 60;
38
+ /**
39
+ * SolaxCloudAPIPlatform.
40
+ * This class is the main constructor for your plugin, this is where you should
41
+ * parse the user config and discover/register accessories with Homebridge.
42
+ */
43
+ class SolaxCloudAPIPlatform {
44
+ /**
45
+ * Platform constructor.
46
+ * @param log
47
+ * @param config
48
+ * @param api
49
+ * @returns
50
+ */
51
+ constructor(log, config, api) {
52
+ /**
53
+ * Number of periods to use for data smoothing.
54
+ */
55
+ this.smoothingWindow = 1;
56
+ /**
57
+ * Array of inverters.
58
+ */
59
+ this.inverters = [];
60
+ // store values in properties
61
+ this.log = log;
62
+ this.config = config;
63
+ this.api = api;
64
+ // sanity check
65
+ if (!api || !config) {
66
+ return;
67
+ }
68
+ // check for valid config
69
+ if (!this.checkConfig(this.config)) {
70
+ return;
71
+ }
72
+ // window for smoothing (aim for a 15 minute window)
73
+ this.smoothingWindow = Math.floor(15 * 60 / this.config.pollingFrequency);
74
+ this.log.info(`Window for smoothing series is ${this.smoothingWindow} periods.`);
75
+ try {
76
+ // loop over configured inverters
77
+ this.config.inverters.forEach(inverter => {
78
+ // setup new inverter
79
+ const platformInverter = new platformInverter_1.SolaxCloudAPIPlatformInverter(log, config, api, VALID_INVERTER_BRANDS.indexOf(inverter.brand), inverter.tokenId, inverter.sn, inverter.name, inverter.hasBattery, this.smoothingWindow);
80
+ // add new inverter to list
81
+ this.inverters.push(platformInverter);
82
+ });
83
+ // create inverter totalizers
84
+ if (this.inverters.length > 1) {
85
+ const uniqueInverterBrands = new Set(this.config.inverters.map(inverter => inverter.brand));
86
+ const brandName = uniqueInverterBrands.size === 1
87
+ ? this.config.inverters[0].brand
88
+ : 'Solax/QCells';
89
+ this.allInverters = new platformInverter_1.SolaxCloudAPIPlatformInverter(log, config, api, VALID_INVERTER_BRANDS.indexOf(this.config.inverters[0].brand), '', 'total', 'All inverters', this.inverters.map(inverter => +inverter.hasBattery()).reduce((a, b) => a + b, 0) > 0, this.smoothingWindow, true, SolaxCloudAPIPlatform.getInverterBrandDisplayName(brandName));
90
+ }
91
+ // start data fetching
92
+ this.fetchDataPeriodically();
93
+ this.log.debug('Finished initializing platform.');
94
+ }
95
+ catch (error) {
96
+ this.log.error(`Unexpected error: ${error}`);
97
+ }
98
+ // When this event is fired it means Homebridge has created all accessories.
99
+ this.api.on("didFinishLaunching" /* DID_FINISH_LAUNCHING */, () => {
100
+ this.log.debug('Executed didFinishLaunching callback');
101
+ });
102
+ }
103
+ /**
104
+ * Check whether object implements interface InverterConfig and brand has a valid entry.
105
+ * @param obj Any object.
106
+ * @returns Whether object implements interface InverterConfig.
107
+ */
108
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
109
+ static isInverterConfig(obj) {
110
+ return 'name' in obj && 'sn' in obj && 'brand' in obj && 'tokenId' in obj && VALID_INVERTER_BRANDS.includes(obj.brand);
111
+ }
112
+ /**
113
+ * Gets an inverter brand display name from config.
114
+ * @param brand Inverter brand from config.
115
+ * @returns Inverter brand display name.
116
+ */
117
+ static getInverterBrandDisplayName(brand) {
118
+ switch (brand) {
119
+ case 'qcells':
120
+ return 'QCells';
121
+ case 'solax':
122
+ return 'Solax';
123
+ default:
124
+ return brand;
125
+ }
126
+ }
127
+ /**
128
+ * Update data for virtual inverter totalizer based on individual inverter data.
129
+ */
130
+ updateAllInvertersData() {
131
+ this.allInverters.setRawPower(platformInverter_1.ACCESSORY_KEYS.pv, this.inverters.map(inverter => inverter.getRawPower(platformInverter_1.ACCESSORY_KEYS.pv)).reduce((a, b) => a + b, 0));
132
+ this.allInverters.setRawPower(platformInverter_1.ACCESSORY_KEYS.inverterAC, this.inverters.map(inverter => inverter.getRawPower(platformInverter_1.ACCESSORY_KEYS.inverterAC)).reduce((a, b) => a + b, 0));
133
+ this.allInverters.setRawEnergy(platformInverter_1.ACCESSORY_KEYS.inverterAC, this.inverters.map(inverter => inverter.getRawEnergy(platformInverter_1.ACCESSORY_KEYS.inverterAC)).reduce((a, b) => a + b, 0));
134
+ this.allInverters.setRawPower(platformInverter_1.ACCESSORY_KEYS.inverterToGrid, this.inverters.map(inverter => inverter.getRawPower(platformInverter_1.ACCESSORY_KEYS.inverterToGrid)).reduce((a, b) => a + b, 0));
135
+ this.allInverters.setRawPower(platformInverter_1.ACCESSORY_KEYS.inverterToHouse, this.inverters.map(inverter => inverter.getRawPower(platformInverter_1.ACCESSORY_KEYS.inverterToHouse)).reduce((a, b) => a + b, 0));
136
+ this.allInverters.setRawPower(platformInverter_1.ACCESSORY_KEYS.gridToHouse, this.inverters.map(inverter => inverter.getRawPower(platformInverter_1.ACCESSORY_KEYS.gridToHouse)).reduce((a, b) => a + b, 0));
137
+ if (this.allInverters.hasBattery()) {
138
+ // get array of inverters with battery
139
+ const invertersWithBattery = this.inverters.filter(inverter => inverter.hasBattery());
140
+ // battery charge / discharge power
141
+ this.allInverters.setRawPower(platformInverter_1.ACCESSORY_KEYS.inverterFromBattery, invertersWithBattery.map(inverter => inverter.getRawPower(platformInverter_1.ACCESSORY_KEYS.inverterFromBattery)).reduce((a, b) => a + b, 0));
142
+ this.allInverters.setRawPower(platformInverter_1.ACCESSORY_KEYS.inverterToBattery, invertersWithBattery.map(inverter => inverter.getRawPower(platformInverter_1.ACCESSORY_KEYS.inverterToBattery)).reduce((a, b) => a + b, 0));
143
+ // battery SoC
144
+ this.allInverters.setBatteryChargeState(Math.max(...invertersWithBattery.map(inverter => inverter.getBatteryChargeState())));
145
+ const levelSums = invertersWithBattery.map(inverter => inverter.getBatteryLevel()).reduce((a, b) => a + b, 0);
146
+ this.allInverters.setBatteryLevel(levelSums / invertersWithBattery.length); // average levels
147
+ }
148
+ // notify update with motion
149
+ this.allInverters.setMotionUpdate();
150
+ }
151
+ /**
152
+ * Sleeps for a number of milliseconds.
153
+ * @param millis {number} The number of milliseconds to sleep.
154
+ */
155
+ async sleep(millis) {
156
+ return new Promise(resolve => setTimeout(resolve, millis));
157
+ }
158
+ /**
159
+ * Periodically retrieves inverter data from Solax Cloud API using configured tokenID and SN.
160
+ */
161
+ async fetchDataPeriodically() {
162
+ // loop forever
163
+ for (;;) {
164
+ // update data for all configured inverters
165
+ this.inverters.forEach(inverter => inverter.updateInverterDataFromCloud());
166
+ this.log.info(`Updated data from configured Cloud APIs, sleeping for ${this.config.pollingFrequency} seconds.`);
167
+ // update inverter totalizers if needed
168
+ if (this.inverters.length > 1) {
169
+ this.log.info('Computing inverter totals...');
170
+ this.updateAllInvertersData();
171
+ }
172
+ // sleep until next data poll
173
+ await this.sleep(this.config.pollingFrequency * 1000);
174
+ }
175
+ }
176
+ /**
177
+ * Checks platform config validity and sets defaults whenever needed.
178
+ * @returns {boolean} Whether the config is valid.
179
+ */
180
+ checkConfig(config) {
181
+ let result = true;
182
+ this.log.debug(`Config read: ${JSON.stringify(config)}`);
183
+ // check for mandatory parameters
184
+ if (!config.inverters) {
185
+ this.log.error('Config check: Can\'t find mandatory parameter "inverters" parameter in config file, aborting!');
186
+ result = false;
187
+ return result;
188
+ }
189
+ // check for inverters type
190
+ if (Array.isArray(config.inverters)) {
191
+ // loop over inverters and check config type
192
+ config.inverters.forEach(inverter => {
193
+ if (!SolaxCloudAPIPlatform.isInverterConfig(inverter)) {
194
+ this.log.error('Config check: Invalid type for inverter under "inverters" in config file, aborting!');
195
+ result = false;
196
+ return result;
197
+ }
198
+ });
199
+ }
200
+ else {
201
+ this.log.error('Config check: Incorrect type for mandatory parameter "inverters" in config file, aborting!');
202
+ result = false;
203
+ return result;
204
+ }
205
+ // check for duplicates
206
+ if (util_1.Util.arrayHasDuplicates(config.inverters.map(inverter => inverter.name))) {
207
+ this.log.error('Config check: Duplicate inverter names in config file, aborting!');
208
+ result = false;
209
+ return result;
210
+ }
211
+ else if (util_1.Util.arrayHasDuplicates(config.inverters.map(inverter => inverter.sn))) {
212
+ this.log.error('Config check: Duplicate inverter SNs in config file, aborting!');
213
+ result = false;
214
+ return result;
215
+ }
216
+ // check for polling frequency
217
+ if (config.pollingFrequency === undefined) {
218
+ this.log.info(`Config check: No polling frequency provided, defaulting to ${DEFAULT_POLLING_FREQUENCY} seconds.`);
219
+ config.pollingFrequency = DEFAULT_POLLING_FREQUENCY;
220
+ }
221
+ else {
222
+ if (Number.isInteger(config.pollingFrequency) && config.pollingFrequency > 0) {
223
+ // all good?
224
+ if (config.pollingFrequency < MAX_POLLING_FREQUENCY) {
225
+ this.log.info(`Config check: Polling frequency cannot be higher than ${MAX_POLLS_MIN} times/min and ${MAX_POLLS_DAY} ` +
226
+ `times/day, defaulting to ${DEFAULT_POLLING_FREQUENCY} seconds.`);
227
+ config.pollingFrequency = DEFAULT_POLLING_FREQUENCY;
228
+ }
229
+ else if (config.pollingFrequency > MAX_SMOOTHING_POLLING_FREQUENCY) {
230
+ const message = 'Config check: Polling frequency cannot be higher than ' +
231
+ `${MAX_SMOOTHING_POLLING_FREQUENCY} seconds, aborting!`;
232
+ this.log.error(message);
233
+ throw new Error(message);
234
+ }
235
+ }
236
+ else {
237
+ this.log.info('Config check: Invalid polling frequency (must be a positive integer number), defaulting to ' +
238
+ `${DEFAULT_POLLING_FREQUENCY} seconds.`);
239
+ config.pollingFrequency = DEFAULT_POLLING_FREQUENCY;
240
+ }
241
+ }
242
+ // check for smooth meters
243
+ if (config.smoothMeters === undefined) {
244
+ config.smoothMeters = true;
245
+ this.log.info(`Config check: No config for smooth meters, defaulting to ${config.smoothMeters}.`);
246
+ }
247
+ else {
248
+ if (typeof config.smoothMeters !== 'boolean') {
249
+ config.smoothMeters = true;
250
+ this.log.info(`Config check: Invalid setting for smooth meters, defaulting to ${config.smoothMeters}.`);
251
+ }
252
+ }
253
+ // check for smoothing method
254
+ if (config.smoothingMethod === undefined) {
255
+ this.log.info(`Config check: No smoothing method provided, defaulting to "${DEFAULT_SMOOTHING_METHOD}".`);
256
+ config.smoothingMethod = DEFAULT_SMOOTHING_METHOD;
257
+ }
258
+ else {
259
+ if (!VALID_SMOOTHING_METHODS.includes(config.smoothingMethod)) {
260
+ this.log.info(`Config check: Invalid smoothing method, defaulting to "${DEFAULT_SMOOTHING_METHOD}".`);
261
+ config.smoothingMethod = DEFAULT_SMOOTHING_METHOD;
262
+ }
263
+ }
264
+ // check for Home app accessories
265
+ if (config.pureHomeApp === undefined) {
266
+ config.pureHomeApp = false;
267
+ this.log.info(`Config check: No config for using pure Home app accessories, defaulting to ${config.pureHomeApp}.`);
268
+ }
269
+ else {
270
+ if (typeof config.pureHomeApp !== 'boolean') {
271
+ config.pureHomeApp = false;
272
+ this.log.info(`Config check: Invalid setting for using pure Home app accessories, defaulting to ${config.pureHomeApp}.`);
273
+ }
274
+ }
275
+ this.log.info(`Config check: final config is ${JSON.stringify(config)}`);
276
+ return result;
277
+ }
278
+ /*
279
+ * This method is called once at startup.
280
+ * The Platform should pass all accessories which need to be created to the callback in form of a AccessoryPlugin.
281
+ * The Platform must respond in a timely manner as otherwise the startup of the bridge would be unnecessarily delayed.
282
+ */
283
+ accessories(callback) {
284
+ const accessories = [];
285
+ // loop over inverters and add accessories
286
+ this.inverters.forEach(inverter => accessories.push(...inverter.getAccessories()));
287
+ // add inverter totalizer accessories if needed
288
+ if (this.inverters.length > 1) {
289
+ accessories.push(...this.allInverters.getAccessories());
290
+ }
291
+ callback(accessories);
292
+ }
293
+ }
294
+ exports.SolaxCloudAPIPlatform = SolaxCloudAPIPlatform;
266
295
  //# sourceMappingURL=platform.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":";;;AAEA,iCAA8B;AAC9B,yDAAmF;AAEnF;;GAEG;AACH,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAElD;;GAEG;AACH,MAAM,uBAAuB,GAAG,CAAE,KAAK,EAAE,KAAK,CAAE,CAAC;AAEjD;;GAEG;AACH,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAEvC;;GAEG;AACH,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAEtC;;GAEG;AACH,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB;;GAEG;AACH,MAAM,aAAa,GAAG,KAAK,CAAC;AAE5B;;GAEG;AACH,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,aAAa,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC;AAE3F;;GAEG;AACH,MAAM,+BAA+B,GAAG,EAAE,GAAG,EAAE,CAAC;AAYhD;;;;GAIG;AACH,MAAa,qBAAqB;IAoBhC;;;;;;OAMG;IACH,YAAa,GAAY,EAAE,MAAsB,EAAE,GAAQ;QAtB3D;;WAEG;QACK,oBAAe,GAAG,CAAC,CAAC;QAE5B;;WAEG;QACK,cAAS,GAAoC,EAAE,CAAC;QAetD,6BAA6B;QAC7B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,eAAe;QACf,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;YACnB,OAAO;SACR;QAED,yBAAyB;QACzB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YAClC,OAAO;SACR;QAED,oDAAoD;QACpD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kCAAkC,IAAI,CAAC,eAAe,WAAW,CAAC,CAAC;QAEjF,IAAI;YACF,iCAAiC;YACjC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBACvC,qBAAqB;gBACrB,MAAM,gBAAgB,GACpB,IAAI,gDAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAChD,qBAAqB,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,EAC3F,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;gBAE/C,2BAA2B;gBAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;YAEH,6BAA6B;YAC7B,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC7B,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5F,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,KAAK,CAAC;oBAC/C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK;oBAChC,CAAC,CAAC,cAAc,CAAC;gBAEnB,IAAI,CAAC,YAAY,GAAG,IAAI,gDAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EACpE,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,EAC3F,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EACtF,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,qBAAqB,CAAC,2BAA2B,CAAC,SAAS,CAAC,CAAC,CAAC;aAC7F;YAED,sBAAsB;YACtB,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAE7B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;SACnD;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;SAC9C;QAED,4EAA4E;QAC5E,IAAI,CAAC,GAAG,CAAC,EAAE,kDAAgC,GAAG,EAAE;YAC9C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,8DAA8D;IACtD,MAAM,CAAC,gBAAgB,CAAC,GAAQ;QACtC,OAAO,MAAM,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,IAAI,qBAAqB,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzH,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,2BAA2B,CAAC,KAAa;QACtD,QAAQ,KAAK,EAAE;YACb,KAAK,QAAQ;gBACX,OAAO,QAAQ,CAAC;YAClB,KAAK,OAAO;gBACV,OAAO,OAAO,CAAC;YACjB;gBACE,OAAO,KAAK,CAAC;SAChB;IACH,CAAC;IAED;;OAEG;IACK,sBAAsB;QAC5B,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,iCAAc,CAAC,EAAE,EAC7C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,iCAAc,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,iCAAc,CAAC,UAAU,EACrD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,iCAAc,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9G,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,iCAAc,CAAC,UAAU,EACtD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,iCAAc,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/G,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,iCAAc,CAAC,cAAc,EACzD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,iCAAc,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClH,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,iCAAc,CAAC,eAAe,EAC1D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,iCAAc,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnH,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,iCAAc,CAAC,WAAW,EACtD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,iCAAc,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/G,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE;YAClC,sCAAsC;YACtC,MAAM,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAEtF,mCAAmC;YACnC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,iCAAc,CAAC,mBAAmB,EAC9D,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,iCAAc,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7H,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,iCAAc,CAAC,iBAAiB,EAC5D,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,iCAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAE3H,cAAc;YACd,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC;YAE7H,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9G,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,SAAS,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB;SAC9F;QAED,4BAA4B;QAC5B,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;IACtC,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,KAAK,CAAC,MAAc;QAChC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,qBAAqB;QACjC,eAAe;QACf,SAAS;YACP,2CAA2C;YAC3C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,2BAA2B,EAAE,CAAC,CAAC;YAE3E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,yDAAyD,IAAI,CAAC,MAAM,CAAC,gBAAgB,WAAW,CAAC,CAAC;YAEhH,uCAAuC;YACvC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAE,8BAA8B,CAAC,CAAC;gBAE/C,IAAI,CAAC,sBAAsB,EAAE,CAAC;aAC/B;YAED,6BAA6B;YAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;SACvD;IACH,CAAC;IAED;;;OAGG;IACK,WAAW,CAAC,MAAsB;QACxC,IAAI,MAAM,GAAG,IAAI,CAAC;QAElB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEzD,iCAAiC;QACjC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;YACrB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,+FAA+F,CAAC,CAAC;YAChH,MAAM,GAAG,KAAK,CAAC;YAEf,OAAO,MAAM,CAAC;SACf;QAED,2BAA2B;QAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;YACnC,4CAA4C;YAC5C,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAClC,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE;oBACrD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qFAAqF,CAAC,CAAC;oBACtG,MAAM,GAAG,KAAK,CAAC;oBAEf,OAAO,MAAM,CAAC;iBACf;YACH,CAAC,CAAC,CAAC;SACJ;aAAM;YACL,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4FAA4F,CAAC,CAAC;YAC7G,MAAM,GAAG,KAAK,CAAC;YAEf,OAAO,MAAM,CAAC;SACf;QAED,uBAAuB;QACvB,IAAI,WAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE;YAC5E,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YACnF,MAAM,GAAG,KAAK,CAAC;YAEf,OAAO,MAAM,CAAC;SACf;aAAM,IAAI,WAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE;YACjF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;YACjF,MAAM,GAAG,KAAK,CAAC;YAEf,OAAO,MAAM,CAAC;SACf;QAED,8BAA8B;QAC9B,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACzC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,8DAA8D,yBAAyB,WAAW,CAAC,CAAC;YAClH,MAAM,CAAC,gBAAgB,GAAG,yBAAyB,CAAC;SACrD;aAAM;YACL,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,gBAAgB,GAAG,CAAC,EAAE;gBAC5E,YAAY;gBACZ,IAAI,MAAM,CAAC,gBAAgB,GAAG,qBAAqB,EAAE;oBACnD,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,yDAAyD,aAAa,kBAAkB,aAAa,GAAG;wBACxG,4BAA4B,yBAAyB,WAAW,CAAC,CAAC;oBACpE,MAAM,CAAC,gBAAgB,GAAG,yBAAyB,CAAC;iBACrD;qBAAM,IAAI,MAAM,CAAC,gBAAgB,GAAG,+BAA+B,EAAE;oBACpE,MAAM,OAAO,GAAG,wDAAwD;wBACtE,GAAG,+BAA+B,qBAAqB,CAAC;oBAE1D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAExB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;iBAC1B;aACF;iBAAM;gBACL,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,6FAA6F;oBAC7F,GAAG,yBAAyB,WAAW,CAAC,CAAC;gBACvD,MAAM,CAAC,gBAAgB,GAAG,yBAAyB,CAAC;aACrD;SACF;QAED,0BAA0B;QAC1B,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE;YACrC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,4DAA4D,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;SACnG;aAAM;YACL,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE;gBAC5C,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kEAAkE,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;aACzG;SACF;QAED,6BAA6B;QAC7B,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,EAAE;YACxC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,8DAA8D,wBAAwB,IAAI,CAAC,CAAC;YAC1G,MAAM,CAAC,eAAe,GAAG,wBAAwB,CAAC;SACnD;aAAM;YACL,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE;gBAC7D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,0DAA0D,wBAAwB,IAAI,CAAC,CAAC;gBACtG,MAAM,CAAC,eAAe,GAAG,wBAAwB,CAAC;aACnD;SACF;QAED,iCAAiC;QACjC,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE;YACpC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,8EAA8E,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;SACpH;aAAM;YACL,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE;gBAC3C,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oFAAoF,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;aAC1H;SACF;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iCAAiC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEzE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,QAAuD;QACjE,MAAM,WAAW,GAAsB,EAAE,CAAC;QAE1C,0CAA0C;QAC1C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAEnF,+CAA+C;QAC/C,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC;SACzD;QAED,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxB,CAAC;CACF;AAzTD,sDAyTC"}