homebridge-solaxcloud-api 1.5.1 → 2.0.3
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/README.md +28 -18
- package/config.schema.json +28 -0
- package/dist/lightSensorAccessory.d.ts +36 -0
- package/dist/lightSensorAccessory.d.ts.map +1 -0
- package/dist/lightSensorAccessory.js +60 -0
- package/dist/lightSensorAccessory.js.map +1 -0
- package/dist/outletAccessory.d.ts +23 -4
- package/dist/outletAccessory.d.ts.map +1 -1
- package/dist/outletAccessory.js +69 -17
- package/dist/outletAccessory.js.map +1 -1
- package/dist/platform.d.ts +45 -14
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +231 -67
- package/dist/platform.js.map +1 -1
- package/dist/platformAccessory.d.ts +5 -0
- package/dist/platformAccessory.d.ts.map +1 -1
- package/dist/platformAccessory.js +10 -3
- package/dist/platformAccessory.js.map +1 -1
- package/dist/platformMeters.d.ts +53 -0
- package/dist/platformMeters.d.ts.map +1 -0
- package/dist/platformMeters.js +3 -0
- package/dist/platformMeters.js.map +1 -0
- package/dist/solaxcloudfetch.d.ts +2 -0
- package/dist/solaxcloudfetch.d.ts.map +1 -0
- package/dist/solaxcloudfetch.js +19 -0
- package/dist/solaxcloudfetch.js.map +1 -0
- package/dist/statistics.d.ts +36 -1
- package/dist/statistics.d.ts.map +1 -1
- package/dist/statistics.js +86 -16
- package/dist/statistics.js.map +1 -1
- package/images/homebridge-ui.png +0 -0
- package/images/plugin-accessories-home-pure.png +0 -0
- package/images/plugin-accessories-home.png +0 -0
- package/images/plugin-outlet-consumption.png +0 -0
- package/package.json +3 -3
- package/test/solaxcloudapi.test.ts +1 -1
- package/test/statistics.test.ts +51 -0
package/dist/platform.js
CHANGED
|
@@ -6,10 +6,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.SolaxCloudAPIPlatform = void 0;
|
|
7
7
|
const homebridge_lib_1 = require("homebridge-lib");
|
|
8
8
|
const fakegato_history_1 = __importDefault(require("fakegato-history"));
|
|
9
|
-
const outletAccessory_1 = require("./outletAccessory");
|
|
10
9
|
const util_1 = __importDefault(require("util"));
|
|
11
10
|
const solaxcloudapi_1 = require("./solaxcloudapi");
|
|
11
|
+
const outletAccessory_1 = require("./outletAccessory");
|
|
12
12
|
const motionAccessory_1 = require("./motionAccessory");
|
|
13
|
+
const lightSensorAccessory_1 = require("./lightSensorAccessory");
|
|
14
|
+
/**
|
|
15
|
+
* Valid smoothing methods (Simple Moving Average, Exponential Moving Average).
|
|
16
|
+
*/
|
|
17
|
+
const VALID_SMOOTHING_METHODS = ['sma', 'ema'];
|
|
18
|
+
/**
|
|
19
|
+
* Default smoothing method (simple moving average).
|
|
20
|
+
*/
|
|
21
|
+
const DEFAULT_SMOOTHING_METHOD = 'sma';
|
|
13
22
|
/**
|
|
14
23
|
* Default polling frequency from Solax Cloud (in seconds).
|
|
15
24
|
*/
|
|
@@ -26,6 +35,16 @@ const MAX_POLLS_DAY = 10000;
|
|
|
26
35
|
* Maximum polling frequency (in seconds).
|
|
27
36
|
*/
|
|
28
37
|
const MAX_POLLING_FREQUENCY = Math.max(60 / MAX_POLLS_MIN, (24 * 60 * 60) / MAX_POLLS_DAY);
|
|
38
|
+
/**
|
|
39
|
+
* Accessory names.
|
|
40
|
+
*/
|
|
41
|
+
const ACCESSORY_NAMES = {
|
|
42
|
+
pv: 'PV',
|
|
43
|
+
inverterAC: 'AC',
|
|
44
|
+
inverterToGrid: 'To Grid',
|
|
45
|
+
inverterToHouse: 'To House',
|
|
46
|
+
gridToHouse: 'From Grid',
|
|
47
|
+
};
|
|
29
48
|
/**
|
|
30
49
|
* SolaxCloudAPIPlatform.
|
|
31
50
|
* This class is the main constructor for your plugin, this is where you should
|
|
@@ -40,6 +59,10 @@ class SolaxCloudAPIPlatform {
|
|
|
40
59
|
* @returns
|
|
41
60
|
*/
|
|
42
61
|
constructor(log, config, api) {
|
|
62
|
+
/**
|
|
63
|
+
* Numeber of periods to use for data smoothing.
|
|
64
|
+
*/
|
|
65
|
+
this.smoothingWindow = 1;
|
|
43
66
|
/** Array with all accessories */
|
|
44
67
|
this.solaxAccessories = [];
|
|
45
68
|
this.sleep = util_1.default.promisify(setTimeout);
|
|
@@ -51,76 +74,82 @@ class SolaxCloudAPIPlatform {
|
|
|
51
74
|
if (!api || !config) {
|
|
52
75
|
return;
|
|
53
76
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if (!this.config.name) {
|
|
57
|
-
this.log.error('Can\'t find mandatory parameter "name" parameter in config file, aborting!');
|
|
77
|
+
// check for valid config
|
|
78
|
+
if (!this.checkConfig(this.config)) {
|
|
58
79
|
return;
|
|
59
80
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
if (!this.config.sn) {
|
|
65
|
-
this.log.error('Can\'t find mandatory parameter "sn" parameter in config file, aborting!');
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
// setup default polling frequency
|
|
69
|
-
if (this.config.pollingFrequency) {
|
|
70
|
-
if (Number.isInteger(this.config.pollingFrequency) && this.config.pollingFrequency > 0) {
|
|
71
|
-
// all good?
|
|
72
|
-
if (this.config.pollingFrequency < MAX_POLLING_FREQUENCY) {
|
|
73
|
-
this.log.info(`Polling frequency cannot be higher than ${MAX_POLLS_MIN} times/min and ${MAX_POLLS_DAY} ` +
|
|
74
|
-
`times/day, defaulting to ${DEFAULT_POLLING_FREQUENCY} seconds.`);
|
|
75
|
-
this.config.pollingFrequency = DEFAULT_POLLING_FREQUENCY;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
log.info(`Invalid polling frequency (must be a positive integer number), defaulting to ${DEFAULT_POLLING_FREQUENCY} seconds.`);
|
|
80
|
-
this.config.pollingFrequency = DEFAULT_POLLING_FREQUENCY;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
log.info(`No polling frequency provided, defaulting to ${DEFAULT_POLLING_FREQUENCY} seconds.`);
|
|
85
|
-
this.config.pollingFrequency = DEFAULT_POLLING_FREQUENCY;
|
|
86
|
-
}
|
|
81
|
+
// window for smoothing (aim for a 15 minute window)
|
|
82
|
+
this.smoothingWindow = Math.floor(15 * 60 / this.config.pollingFrequency);
|
|
83
|
+
this.log.info(`Window for smoothing series is ${this.smoothingWindow} periods.`);
|
|
87
84
|
try {
|
|
88
85
|
this.eve = new homebridge_lib_1.EveHomeKitTypes(this.api);
|
|
89
86
|
this.eveService = (0, fakegato_history_1.default)(this.api);
|
|
90
87
|
// init new Solax Cloud API object with give tokenID and sn
|
|
91
88
|
this.solaxCloudAPI = new solaxcloudapi_1.SolaxCloudAPI(this.config.tokenId, this.config.sn);
|
|
92
89
|
// initial data set
|
|
93
|
-
|
|
94
|
-
this.log.debug(`apiData = ${JSON.stringify(
|
|
90
|
+
const apiData = this.solaxCloudAPI.getAPIData();
|
|
91
|
+
this.log.debug(`apiData = ${JSON.stringify(apiData)}`);
|
|
95
92
|
let inverterSN;
|
|
96
93
|
let inverterModel;
|
|
97
|
-
if (
|
|
98
|
-
inverterSN =
|
|
99
|
-
inverterModel = solaxcloudapi_1.SolaxCloudAPI.getInverterType(
|
|
94
|
+
if (apiData.success) {
|
|
95
|
+
inverterSN = apiData.result.inverterSN.toLowerCase();
|
|
96
|
+
inverterModel = solaxcloudapi_1.SolaxCloudAPI.getInverterType(apiData.result.inverterType);
|
|
100
97
|
}
|
|
101
98
|
else {
|
|
102
99
|
this.log.info('Could not retrieve initial values from Solax Cloud, accessory Serial Number and Model properties deferred...');
|
|
103
|
-
inverterSN = this.config.name;
|
|
100
|
+
inverterSN = String(this.config.name);
|
|
104
101
|
inverterModel = 'Unknown';
|
|
105
102
|
}
|
|
106
|
-
// setup outlet accessories
|
|
107
|
-
this.
|
|
108
|
-
new outletAccessory_1.SolaxOutletAccessory(this, this.log, `${this.config.name}
|
|
109
|
-
|
|
110
|
-
new outletAccessory_1.SolaxOutletAccessory(this, this.log, `${this.config.name}
|
|
111
|
-
|
|
112
|
-
new outletAccessory_1.SolaxOutletAccessory(this, this.log, `${this.config.name}
|
|
113
|
-
|
|
114
|
-
new outletAccessory_1.SolaxOutletAccessory(this, this.log, `${this.config.name} Inverter to House`, `inv-house-${inverterSN}`, inverterModel);
|
|
115
|
-
this.outletGridToHouse =
|
|
116
|
-
new outletAccessory_1.SolaxOutletAccessory(this, this.log, `${this.config.name} Grid to House`, `grid-house-${inverterSN}`, inverterModel);
|
|
103
|
+
// setup raw outlet accessories
|
|
104
|
+
this.rawOutlets = {
|
|
105
|
+
pv: new outletAccessory_1.SolaxOutletAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.pv}`, `pv-${inverterSN}`, inverterModel),
|
|
106
|
+
inverterAC: new outletAccessory_1.SolaxOutletAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.inverterAC}`, `inv-ac-${inverterSN}`, inverterModel),
|
|
107
|
+
inverterToGrid: new outletAccessory_1.SolaxOutletAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.inverterToGrid}`, `inv-grid-${inverterSN}`, inverterModel),
|
|
108
|
+
inverterToHouse: new outletAccessory_1.SolaxOutletAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.inverterToHouse}`, `inv-house-${inverterSN}`, inverterModel),
|
|
109
|
+
gridToHouse: new outletAccessory_1.SolaxOutletAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.gridToHouse}`, `grid-house-${inverterSN}`, inverterModel),
|
|
110
|
+
};
|
|
117
111
|
// setup update motion sensor
|
|
118
|
-
this.motionUpdate =
|
|
119
|
-
|
|
120
|
-
// create array with all accessories
|
|
112
|
+
this.motionUpdate = new motionAccessory_1.SolaxMotionAccessory(this, this.log, `${this.config.name} Update`, `update-${inverterSN}`, inverterModel);
|
|
113
|
+
// create array with all base accessories
|
|
121
114
|
this.solaxAccessories =
|
|
122
|
-
[this.
|
|
123
|
-
this.
|
|
115
|
+
[this.rawOutlets.pv, this.rawOutlets.inverterAC, this.rawOutlets.inverterToGrid,
|
|
116
|
+
this.rawOutlets.inverterToHouse, this.rawOutlets.gridToHouse, this.motionUpdate];
|
|
117
|
+
// check if "pure" Home App accessories are needed
|
|
118
|
+
if (this.config.pureHomeApp) {
|
|
119
|
+
// add raw light sensors
|
|
120
|
+
this.rawLightSensors = {
|
|
121
|
+
pv: new lightSensorAccessory_1.SolaxLightSensorAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.pv} sensor`, `pv-light-${inverterSN}`, inverterModel),
|
|
122
|
+
inverterAC: new lightSensorAccessory_1.SolaxLightSensorAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.inverterAC} sensor`, `inv-ac-light-${inverterSN}`, inverterModel),
|
|
123
|
+
inverterToGrid: new lightSensorAccessory_1.SolaxLightSensorAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.inverterToGrid} sensor`, `inv-grid-light-${inverterSN}`, inverterModel),
|
|
124
|
+
inverterToHouse: new lightSensorAccessory_1.SolaxLightSensorAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.inverterToHouse} sensor`, `inv-house-light-${inverterSN}`, inverterModel),
|
|
125
|
+
gridToHouse: new lightSensorAccessory_1.SolaxLightSensorAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.gridToHouse} sensor`, `grid-house-light-${inverterSN}`, inverterModel),
|
|
126
|
+
};
|
|
127
|
+
this.solaxAccessories.push(this.rawLightSensors.pv, this.rawLightSensors.inverterAC, this.rawLightSensors.inverterToGrid, this.rawLightSensors.inverterToHouse, this.rawLightSensors.gridToHouse);
|
|
128
|
+
if (this.config.smoothMeters) {
|
|
129
|
+
// add smooth light sensors
|
|
130
|
+
this.smoothLightSensors = {
|
|
131
|
+
pv: new lightSensorAccessory_1.SolaxLightSensorAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.pv} sensor (smooth)`, `pv-light-${inverterSN}`, inverterModel),
|
|
132
|
+
inverterAC: new lightSensorAccessory_1.SolaxLightSensorAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.inverterAC} sensor (smooth)`, `inv-ac-light-smooth-${inverterSN}`, inverterModel),
|
|
133
|
+
inverterToGrid: new lightSensorAccessory_1.SolaxLightSensorAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.inverterToGrid} sensor (smooth)`, `inv-grid-light-smooth-${inverterSN}`, inverterModel),
|
|
134
|
+
inverterToHouse: new lightSensorAccessory_1.SolaxLightSensorAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.inverterToHouse} sensor (smooth)`, `inv-house-light-smooth-${inverterSN}`, inverterModel),
|
|
135
|
+
gridToHouse: new lightSensorAccessory_1.SolaxLightSensorAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.gridToHouse} sensor (smooth)`, `grid-house-light-smooth-${inverterSN}`, inverterModel),
|
|
136
|
+
};
|
|
137
|
+
this.solaxAccessories.push(this.smoothLightSensors.pv, this.smoothLightSensors.inverterAC, this.smoothLightSensors.inverterToGrid, this.smoothLightSensors.inverterToHouse, this.smoothLightSensors.gridToHouse);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
if (this.config.smoothMeters) {
|
|
142
|
+
// setup smooth outlet accessories
|
|
143
|
+
this.smoothOutlets = {
|
|
144
|
+
pv: new outletAccessory_1.SolaxOutletAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.pv} (smooth)`, `pv-smooth-${inverterSN}`, inverterModel),
|
|
145
|
+
inverterAC: new outletAccessory_1.SolaxOutletAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.inverterAC} (smooth)`, `inv-ac-smooth-${inverterSN}`, inverterModel),
|
|
146
|
+
inverterToGrid: new outletAccessory_1.SolaxOutletAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.inverterToGrid} (smooth)`, `inv-grid-smooth-${inverterSN}`, inverterModel),
|
|
147
|
+
inverterToHouse: new outletAccessory_1.SolaxOutletAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.inverterToHouse} (smooth)`, `inv-house-smooth-${inverterSN}`, inverterModel),
|
|
148
|
+
gridToHouse: new outletAccessory_1.SolaxOutletAccessory(this, this.log, `${this.config.name} ${ACCESSORY_NAMES.gridToHouse} (smooth)`, `grid-house-smooth-${inverterSN}`, inverterModel),
|
|
149
|
+
};
|
|
150
|
+
this.solaxAccessories.push(this.smoothOutlets.pv, this.smoothOutlets.inverterAC, this.smoothOutlets.inverterToGrid, this.smoothOutlets.inverterToHouse, this.smoothOutlets.gridToHouse);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
124
153
|
// start data fetching
|
|
125
154
|
this.fetchDataPeriodically();
|
|
126
155
|
this.log.debug('Finished initializing platform.');
|
|
@@ -139,21 +168,13 @@ class SolaxCloudAPIPlatform {
|
|
|
139
168
|
async fetchDataPeriodically() {
|
|
140
169
|
try {
|
|
141
170
|
this.log.debug('Retrieving data from Solax Cloud API.');
|
|
142
|
-
|
|
143
|
-
if (
|
|
144
|
-
this.log.debug(`Retrieved inverter status: ${JSON.stringify(
|
|
145
|
-
|
|
146
|
-
this.outletPV.setPowerConsumption(solaxcloudapi_1.SolaxCloudAPI.getPVPower(this.apiData.result));
|
|
147
|
-
this.outletInverterAC.setPowerConsumption(solaxcloudapi_1.SolaxCloudAPI.getInverterACPower(this.apiData.result));
|
|
148
|
-
this.outletInverterAC.setTotalEnergyConsumption(solaxcloudapi_1.SolaxCloudAPI.getYieldTotal(this.apiData.result));
|
|
149
|
-
this.outletInverterToGrid.setPowerConsumption(solaxcloudapi_1.SolaxCloudAPI.getInverterPowerToGrid(this.apiData.result));
|
|
150
|
-
this.outletInverterToHouse.setPowerConsumption(solaxcloudapi_1.SolaxCloudAPI.getInverterPowerToHouse(this.apiData.result));
|
|
151
|
-
this.outletGridToHouse.setPowerConsumption(solaxcloudapi_1.SolaxCloudAPI.getGridPowerToHouse(this.apiData.result));
|
|
152
|
-
// update motion sensor
|
|
153
|
-
this.motionUpdate.setState(true);
|
|
171
|
+
const apiData = this.solaxCloudAPI.getAPIData();
|
|
172
|
+
if (apiData.success) {
|
|
173
|
+
this.log.debug(`Retrieved inverter status: ${JSON.stringify(apiData.result)}`);
|
|
174
|
+
this.updateAccessories(apiData);
|
|
154
175
|
}
|
|
155
176
|
else {
|
|
156
|
-
throw new Error(
|
|
177
|
+
throw new Error(apiData.exception);
|
|
157
178
|
}
|
|
158
179
|
}
|
|
159
180
|
catch (error) {
|
|
@@ -165,6 +186,149 @@ class SolaxCloudAPIPlatform {
|
|
|
165
186
|
.then(async () => await this.fetchDataPeriodically());
|
|
166
187
|
}
|
|
167
188
|
}
|
|
189
|
+
/**
|
|
190
|
+
* Update all platform accessory status based on the values read from the API.
|
|
191
|
+
* @param {SolaxCloudAPIResponse} apiData API data from Solax Cloud.
|
|
192
|
+
*/
|
|
193
|
+
updateAccessories(apiData) {
|
|
194
|
+
// update raw outlets on/off, power & energy settings
|
|
195
|
+
this.updateRawOutlets(apiData);
|
|
196
|
+
if (this.config.pureHomeApp) {
|
|
197
|
+
// update raw light sensors with power consumption
|
|
198
|
+
this.updateRawLightSensors(apiData);
|
|
199
|
+
if (this.config.smoothMeters) {
|
|
200
|
+
// update smooth light sensors from raw outlets by applying smoothing function to power consumption
|
|
201
|
+
this.updateSmoothLightSensors();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
if (this.config.smoothMeters) {
|
|
206
|
+
// update smooth outlets data from raw outlets by applying smoothing function to power consumption
|
|
207
|
+
this.updateSmoothOutlets();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// update motion sensor
|
|
211
|
+
this.motionUpdate.setState(true);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Updates smooth ambient light sensors data from raw outlet data by applying configured smoothing function.
|
|
215
|
+
*/
|
|
216
|
+
updateSmoothLightSensors() {
|
|
217
|
+
this.smoothLightSensors.pv.setAmbientLightLevel(this.rawOutlets.pv.getSmoothPowerConsumption(this.config.smoothingMethod, this.smoothingWindow));
|
|
218
|
+
this.smoothLightSensors.inverterAC.setAmbientLightLevel(this.rawOutlets.inverterAC.getSmoothPowerConsumption(this.config.smoothingMethod, this.smoothingWindow));
|
|
219
|
+
this.smoothLightSensors.inverterToGrid.setAmbientLightLevel(this.rawOutlets.inverterToGrid.getSmoothPowerConsumption(this.config.smoothingMethod, this.smoothingWindow));
|
|
220
|
+
this.smoothLightSensors.inverterToHouse.setAmbientLightLevel(this.rawOutlets.inverterToHouse.getSmoothPowerConsumption(this.config.smoothingMethod, this.smoothingWindow));
|
|
221
|
+
this.smoothLightSensors.gridToHouse.setAmbientLightLevel(this.rawOutlets.gridToHouse.getSmoothPowerConsumption(this.config.smoothingMethod, this.smoothingWindow));
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Update raw ambient light sensors with power consumption data from Solax Cloud API.
|
|
225
|
+
* @param {SolaxCloudAPIResponse} apiData API data retrieved from Solax Cloud.
|
|
226
|
+
*/
|
|
227
|
+
updateRawLightSensors(apiData) {
|
|
228
|
+
this.rawLightSensors.pv.setAmbientLightLevel(solaxcloudapi_1.SolaxCloudAPI.getPVPower(apiData.result));
|
|
229
|
+
this.rawLightSensors.inverterAC.setAmbientLightLevel(solaxcloudapi_1.SolaxCloudAPI.getInverterACPower(apiData.result));
|
|
230
|
+
this.rawLightSensors.inverterToGrid.setAmbientLightLevel(solaxcloudapi_1.SolaxCloudAPI.getInverterPowerToGrid(apiData.result));
|
|
231
|
+
this.rawLightSensors.inverterToHouse.setAmbientLightLevel(solaxcloudapi_1.SolaxCloudAPI.getInverterPowerToHouse(apiData.result));
|
|
232
|
+
this.rawLightSensors.gridToHouse.setAmbientLightLevel(solaxcloudapi_1.SolaxCloudAPI.getGridPowerToHouse(apiData.result));
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Updates smooth outlet data from raw outlet data by applying configured smoothing function.
|
|
236
|
+
*/
|
|
237
|
+
updateSmoothOutlets() {
|
|
238
|
+
this.smoothOutlets.pv.setPowerConsumption(this.rawOutlets.pv.getSmoothPowerConsumption(this.config.smoothingMethod, this.smoothingWindow));
|
|
239
|
+
this.smoothOutlets.inverterAC.setPowerConsumption(this.rawOutlets.inverterAC.getSmoothPowerConsumption(this.config.smoothingMethod, this.smoothingWindow));
|
|
240
|
+
this.smoothOutlets.inverterToGrid.setPowerConsumption(this.rawOutlets.inverterToGrid.getSmoothPowerConsumption(this.config.smoothingMethod, this.smoothingWindow));
|
|
241
|
+
this.smoothOutlets.inverterToHouse.setPowerConsumption(this.rawOutlets.inverterToHouse.getSmoothPowerConsumption(this.config.smoothingMethod, this.smoothingWindow));
|
|
242
|
+
this.smoothOutlets.gridToHouse.setPowerConsumption(this.rawOutlets.gridToHouse.getSmoothPowerConsumption(this.config.smoothingMethod, this.smoothingWindow));
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Update raw outlet data from API data read from Solax Cloud.
|
|
246
|
+
* @param {SolaxCloudAPIResponse} apiData Solax Cloud API data.
|
|
247
|
+
* */
|
|
248
|
+
updateRawOutlets(apiData) {
|
|
249
|
+
this.rawOutlets.pv.setPowerConsumption(solaxcloudapi_1.SolaxCloudAPI.getPVPower(apiData.result));
|
|
250
|
+
this.rawOutlets.inverterAC.setPowerConsumption(solaxcloudapi_1.SolaxCloudAPI.getInverterACPower(apiData.result));
|
|
251
|
+
this.rawOutlets.inverterAC.setTotalEnergyConsumption(solaxcloudapi_1.SolaxCloudAPI.getYieldTotal(apiData.result));
|
|
252
|
+
this.rawOutlets.inverterToGrid.setPowerConsumption(solaxcloudapi_1.SolaxCloudAPI.getInverterPowerToGrid(apiData.result));
|
|
253
|
+
this.rawOutlets.inverterToHouse.setPowerConsumption(solaxcloudapi_1.SolaxCloudAPI.getInverterPowerToHouse(apiData.result));
|
|
254
|
+
this.rawOutlets.gridToHouse.setPowerConsumption(solaxcloudapi_1.SolaxCloudAPI.getGridPowerToHouse(apiData.result));
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Checks platform config validity and sets defaults whenever needed.
|
|
258
|
+
* @returns {boolean} Whether the config is valid.
|
|
259
|
+
*/
|
|
260
|
+
checkConfig(config) {
|
|
261
|
+
let result = true;
|
|
262
|
+
this.log.debug(`Config read: ${JSON.stringify(config)}`);
|
|
263
|
+
// check for mandatory parameters
|
|
264
|
+
if (!config.name) {
|
|
265
|
+
this.log.error('Config check: Can\'t find mandatory parameter "name" parameter in config file, aborting!');
|
|
266
|
+
result = false;
|
|
267
|
+
}
|
|
268
|
+
else if (!config.tokenId) {
|
|
269
|
+
this.log.error('Config check: Can\'t find mandatory parameter "tokenId" parameter in config file, aborting!');
|
|
270
|
+
result = false;
|
|
271
|
+
}
|
|
272
|
+
else if (!config.sn) {
|
|
273
|
+
this.log.error('Config check: Can\'t find mandatory parameter "sn" parameter in config file, aborting!');
|
|
274
|
+
result = false;
|
|
275
|
+
}
|
|
276
|
+
// check for polling frequency
|
|
277
|
+
if (config.pollingFrequency === undefined) {
|
|
278
|
+
this.log.info(`Config check: No polling frequency provided, defaulting to ${DEFAULT_POLLING_FREQUENCY} seconds.`);
|
|
279
|
+
config.pollingFrequency = DEFAULT_POLLING_FREQUENCY;
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
if (Number.isInteger(config.pollingFrequency) && config.pollingFrequency > 0) {
|
|
283
|
+
// all good?
|
|
284
|
+
if (config.pollingFrequency < MAX_POLLING_FREQUENCY) {
|
|
285
|
+
this.log.info(`Config check: Polling frequency cannot be higher than ${MAX_POLLS_MIN} times/min and ${MAX_POLLS_DAY} ` +
|
|
286
|
+
`times/day, defaulting to ${DEFAULT_POLLING_FREQUENCY} seconds.`);
|
|
287
|
+
config.pollingFrequency = DEFAULT_POLLING_FREQUENCY;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
this.log.info('Config check: Invalid polling frequency (must be a positive integer number), defaulting to ' +
|
|
292
|
+
`${DEFAULT_POLLING_FREQUENCY} seconds.`);
|
|
293
|
+
config.pollingFrequency = DEFAULT_POLLING_FREQUENCY;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// check for smooth meters
|
|
297
|
+
if (config.smoothMeters === undefined) {
|
|
298
|
+
config.smoothMeters = true;
|
|
299
|
+
this.log.info(`Config check: No config for smooth meters, defaulting to ${config.smoothMeters}.`);
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
if (typeof config.smoothMeters !== 'boolean') {
|
|
303
|
+
config.smoothMeters = true;
|
|
304
|
+
this.log.info(`Config check: Invalid setting for smooth meters, defaulting to ${config.smoothMeters}.`);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// check for smoothing method
|
|
308
|
+
if (config.smoothingMethod === undefined) {
|
|
309
|
+
this.log.info(`Config check: No smoothing method provided, defaulting to "${DEFAULT_SMOOTHING_METHOD}".`);
|
|
310
|
+
config.smoothingMethod = DEFAULT_SMOOTHING_METHOD;
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
if (!VALID_SMOOTHING_METHODS.includes(config.smoothingMethod)) {
|
|
314
|
+
this.log.info(`Config check: Invalid smoothing method, defaulting to "${DEFAULT_SMOOTHING_METHOD}".`);
|
|
315
|
+
config.smoothingMethod = DEFAULT_SMOOTHING_METHOD;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// check for Home app accessories
|
|
319
|
+
if (config.pureHomeApp === undefined) {
|
|
320
|
+
config.pureHomeApp = false;
|
|
321
|
+
this.log.info(`Config check: No config for using pure Home app accessories, defaulting to ${config.pureHomeApp}.`);
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
if (typeof config.pureHomeApp !== 'boolean') {
|
|
325
|
+
config.pureHomeApp = false;
|
|
326
|
+
this.log.info(`Config check: Invalid setting for using pure Home app accessories, defaulting to ${config.pureHomeApp}.`);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
this.log.info(`Config check: final config is ${JSON.stringify(config)}`);
|
|
330
|
+
return result;
|
|
331
|
+
}
|
|
168
332
|
/*
|
|
169
333
|
* This method is called once at startup.
|
|
170
334
|
* The Platform should pass all accessories which need to be created to the callback in form of a AccessoryPlugin.
|
package/dist/platform.js.map
CHANGED
|
@@ -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":"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"}
|
|
@@ -21,6 +21,10 @@ export declare class SolaxPlatformAccessory implements AccessoryPlugin {
|
|
|
21
21
|
* Acessory display name.
|
|
22
22
|
*/
|
|
23
23
|
protected readonly displayName: string;
|
|
24
|
+
/**
|
|
25
|
+
* Real-world accessory serial number.
|
|
26
|
+
*/
|
|
27
|
+
protected trueSerialNumber: string;
|
|
24
28
|
/**
|
|
25
29
|
* Accessory serial number (string from 64 bit hash)
|
|
26
30
|
*/
|
|
@@ -62,6 +66,7 @@ export declare class SolaxPlatformAccessory implements AccessoryPlugin {
|
|
|
62
66
|
* @param {string} serial Serial number to set.
|
|
63
67
|
*/
|
|
64
68
|
setSerial(serial: string): void;
|
|
69
|
+
identify(): void;
|
|
65
70
|
getServices(): Service[];
|
|
66
71
|
}
|
|
67
72
|
//# sourceMappingURL=platformAccessory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platformAccessory.d.ts","sourceRoot":"","sources":["../src/platformAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AASnD;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,eAAe;IAC5D;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IAEnD;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IAEhC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEhC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAEvC;;OAEG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;IAE/B;;OAEG;IACH,SAAS,CAAC,KAAK,SAAoB;IAEnC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IAE/C;;;;;;;OAOG;gBACS,QAAQ,EAAE,qBAAqB,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"platformAccessory.d.ts","sourceRoot":"","sources":["../src/platformAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AASnD;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,eAAe;IAC5D;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IAEnD;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IAEhC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEhC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAEvC;;OAEG;IACH,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAEnC;;OAEG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;IAE/B;;OAEG;IACH,SAAS,CAAC,KAAK,SAAoB;IAEnC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IAE/C;;;;;;;OAOG;gBACS,QAAQ,EAAE,qBAAqB,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAkC5G;;;OAGG;IACI,QAAQ,IAAI,MAAM;IAMzB;;;OAGG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM;IAQ7B;;;OAGG;IACI,SAAS,IAAI,MAAM;IAM1B;;;OAGG;IACI,SAAS,CAAC,MAAM,EAAE,MAAM;IAW/B,QAAQ,IAAI,IAAI;IAQhB,WAAW,IAAI,OAAO,EAAE;CAIzB"}
|
|
@@ -33,6 +33,8 @@ class SolaxPlatformAccessory {
|
|
|
33
33
|
this.name = name;
|
|
34
34
|
// display name
|
|
35
35
|
this.displayName = name;
|
|
36
|
+
// serial
|
|
37
|
+
this.trueSerialNumber = serialNumber;
|
|
36
38
|
// hash "real-world" serial and hostname to 64 bit hex string
|
|
37
39
|
this.serialNumber = (0, string_hash_64_1.default)(`${serialNumber}-${os_1.default.hostname()}`).toString(16);
|
|
38
40
|
// remove non-standard chars from model name
|
|
@@ -83,14 +85,19 @@ class SolaxPlatformAccessory {
|
|
|
83
85
|
this.serialNumber = serial;
|
|
84
86
|
this.informationService.setCharacteristic(this.platform.api.hap.Characteristic.SerialNumber, serial);
|
|
85
87
|
}
|
|
88
|
+
/*
|
|
89
|
+
* This method is optional to implement. It is called when HomeKit ask to identify the accessory.
|
|
90
|
+
* Typical this only ever happens at the pairing process.
|
|
91
|
+
*/
|
|
92
|
+
identify() {
|
|
93
|
+
this.log.info(`${this.name}: Identify (true serial=${this.trueSerialNumber}, serial=${this.serialNumber})`);
|
|
94
|
+
}
|
|
86
95
|
/*
|
|
87
96
|
* This method is called directly after creation of this instance.
|
|
88
97
|
* It should return all services which should be added to the accessory.
|
|
89
98
|
*/
|
|
90
99
|
getServices() {
|
|
91
|
-
return [
|
|
92
|
-
this.informationService,
|
|
93
|
-
];
|
|
100
|
+
return [this.informationService];
|
|
94
101
|
}
|
|
95
102
|
}
|
|
96
103
|
exports.SolaxPlatformAccessory = SolaxPlatformAccessory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platformAccessory.js","sourceRoot":"","sources":["../src/platformAccessory.ts"],"names":[],"mappings":";;;;;;AAGA,iCAA8B;AAE9B,4CAAoB;AACpB,oEAAkC;AAElC,8DAA8D;AAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE1C;;;GAGG;AACH,MAAa,sBAAsB;
|
|
1
|
+
{"version":3,"file":"platformAccessory.js","sourceRoot":"","sources":["../src/platformAccessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { SolaxLightSensorAccessory } from './lightSensorAccessory';
|
|
2
|
+
import { SolaxOutletAccessory } from './outletAccessory';
|
|
3
|
+
/**
|
|
4
|
+
* Interface with outlets exposed by the platform.
|
|
5
|
+
*/
|
|
6
|
+
export interface PlatformOutletMeters {
|
|
7
|
+
/**
|
|
8
|
+
* Virtual outlet used to detect and measure photovoltaic production.
|
|
9
|
+
*/
|
|
10
|
+
pv: SolaxOutletAccessory;
|
|
11
|
+
/**
|
|
12
|
+
* Virtual outlet used to detect and measure inverter AC production.
|
|
13
|
+
*/
|
|
14
|
+
inverterAC: SolaxOutletAccessory;
|
|
15
|
+
/**
|
|
16
|
+
* Virtual outlet used to detect and measure inverter excess production injected in the grid.
|
|
17
|
+
*/
|
|
18
|
+
inverterToGrid: SolaxOutletAccessory;
|
|
19
|
+
/**
|
|
20
|
+
* Virtual outlet used to detect and measure inverter production directly fed into the house (self-consumption).
|
|
21
|
+
*/
|
|
22
|
+
inverterToHouse: SolaxOutletAccessory;
|
|
23
|
+
/**
|
|
24
|
+
* Virtual outlet used to detect and measure grid power fed into the house.
|
|
25
|
+
*/
|
|
26
|
+
gridToHouse: SolaxOutletAccessory;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Interface with lights sensors exposed by the platform.
|
|
30
|
+
*/
|
|
31
|
+
export interface PlatformLightSensorMeters {
|
|
32
|
+
/**
|
|
33
|
+
* Virtual ambient light meter used to detect and measure photovoltaic production.
|
|
34
|
+
*/
|
|
35
|
+
pv: SolaxLightSensorAccessory;
|
|
36
|
+
/**
|
|
37
|
+
* Virtual ambient light meter used to detect and measure inverter AC production.
|
|
38
|
+
*/
|
|
39
|
+
inverterAC: SolaxLightSensorAccessory;
|
|
40
|
+
/**
|
|
41
|
+
* Virtual ambient light meter used to detect and measure inverter excess production injected in the grid.
|
|
42
|
+
*/
|
|
43
|
+
inverterToGrid: SolaxLightSensorAccessory;
|
|
44
|
+
/**
|
|
45
|
+
* Virtual ambient light meter used to detect and measure inverter production directly fed into the house (self-consumption).
|
|
46
|
+
*/
|
|
47
|
+
inverterToHouse: SolaxLightSensorAccessory;
|
|
48
|
+
/**
|
|
49
|
+
* Virtual ambient light meter used to detect and measure grid power fed into the house.
|
|
50
|
+
*/
|
|
51
|
+
gridToHouse: SolaxLightSensorAccessory;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=platformMeters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platformMeters.d.ts","sourceRoot":"","sources":["../src/platformMeters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC;;MAEE;IACF,EAAE,EAAE,oBAAoB,CAAC;IAEzB;;MAEE;IACF,UAAU,EAAE,oBAAoB,CAAC;IAEjC;;MAEE;IACF,cAAc,EAAE,oBAAoB,CAAC;IAErC;;MAEE;IACF,eAAe,EAAE,oBAAoB,CAAC;IAEtC;;MAEE;IACF,WAAW,EAAE,oBAAoB,CAAC;CACnC;AAEH;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACtC;;MAEE;IACF,EAAE,EAAE,yBAAyB,CAAC;IAE9B;;MAEE;IACF,UAAU,EAAE,yBAAyB,CAAC;IAEtC;;MAEE;IACF,cAAc,EAAE,yBAAyB,CAAC;IAE1C;;MAEE;IACF,eAAe,EAAE,yBAAyB,CAAC;IAE3C;;MAEE;IACF,WAAW,EAAE,yBAAyB,CAAC;CACxC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platformMeters.js","sourceRoot":"","sources":["../src/platformMeters.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solaxcloudfetch.d.ts","sourceRoot":"","sources":["../src/solaxcloudfetch.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
/* eslint-disable no-console */
|
|
7
|
+
const solaxcloudapi_1 = require("./solaxcloudapi");
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const config = JSON.parse(fs_1.default.readFileSync('config.json').toString());
|
|
10
|
+
const api = new solaxcloudapi_1.SolaxCloudAPI(config.platforms[0].tokenId, config.platforms[0].sn);
|
|
11
|
+
const result = api.getAPIData();
|
|
12
|
+
console.log(`PV Power: ${solaxcloudapi_1.SolaxCloudAPI.getPVPower(result.result)}W`);
|
|
13
|
+
console.log(`Inverter AC Power: ${solaxcloudapi_1.SolaxCloudAPI.getInverterACPower(result.result)}W`);
|
|
14
|
+
console.log(`Grid Power to House: ${solaxcloudapi_1.SolaxCloudAPI.getGridPowerToHouse(result.result)}W`);
|
|
15
|
+
console.log(`Inverter Power to Grid: ${solaxcloudapi_1.SolaxCloudAPI.getInverterPowerToGrid(result.result)}W`);
|
|
16
|
+
console.log(`Inverter Power to House: ${solaxcloudapi_1.SolaxCloudAPI.getInverterPowerToHouse(result.result)}W`);
|
|
17
|
+
console.log(`Yield Today: ${solaxcloudapi_1.SolaxCloudAPI.getYieldToday(result.result)}KWh`);
|
|
18
|
+
console.log(`Yield Total: ${solaxcloudapi_1.SolaxCloudAPI.getYieldTotal(result.result)}KWh`);
|
|
19
|
+
//# sourceMappingURL=solaxcloudfetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solaxcloudfetch.js","sourceRoot":"","sources":["../src/solaxcloudfetch.ts"],"names":[],"mappings":";;;;;AAAA,+BAA+B;AAC/B,mDAAgD;AAEhD,4CAAoB;AAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACrE,MAAM,GAAG,GAAG,IAAI,6BAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAEnF,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;AAEhC,OAAO,CAAC,GAAG,CAAC,aAAa,6BAAa,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACrE,OAAO,CAAC,GAAG,CAAC,sBAAsB,6BAAa,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACtF,OAAO,CAAC,GAAG,CAAC,wBAAwB,6BAAa,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzF,OAAO,CAAC,GAAG,CAAC,2BAA2B,6BAAa,CAAC,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC/F,OAAO,CAAC,GAAG,CAAC,4BAA4B,6BAAa,CAAC,uBAAuB,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAEjG,OAAO,CAAC,GAAG,CAAC,gBAAgB,6BAAa,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7E,OAAO,CAAC,GAAG,CAAC,gBAAgB,6BAAa,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC"}
|
package/dist/statistics.d.ts
CHANGED
|
@@ -1,2 +1,37 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Statistics.
|
|
3
|
+
* This class is used for statistical calculations for the purpose of smoothing a series of value.
|
|
4
|
+
*/
|
|
5
|
+
export declare class Statistics {
|
|
6
|
+
/**
|
|
7
|
+
* Simple moving average calculation from a series of values.
|
|
8
|
+
* Formula is
|
|
9
|
+
* SMA = (V1 + V2 + ... + Vn) / n
|
|
10
|
+
* where
|
|
11
|
+
* Vn = Series value for period n
|
|
12
|
+
* n = number values in period
|
|
13
|
+
* @param {number[]} series Array with series of values.
|
|
14
|
+
* @param {number} windowSize Size of moving average window.
|
|
15
|
+
* @param {number} maxCalculations Maximum calculations to be performed.
|
|
16
|
+
* @returns {number[]} Array with simple moving averages from series.
|
|
17
|
+
*/
|
|
18
|
+
static simpleMovingAverage(series: number[], windowSize: number, maxCalculations?: number): number[];
|
|
19
|
+
/**
|
|
20
|
+
* Exponential moving average calculation from a series of values.
|
|
21
|
+
* Formula is
|
|
22
|
+
* EMAn = (Vn - EMAn-1) * weight + EMAn-1
|
|
23
|
+
* where
|
|
24
|
+
* EMAn = Exponential Moving Average for period n
|
|
25
|
+
* EMAn-1 = Exponential Moving Average for period n - 1
|
|
26
|
+
* Vn = Series value for period n
|
|
27
|
+
* weight = multiplier to use lower weights for older value
|
|
28
|
+
* w = window size
|
|
29
|
+
* and
|
|
30
|
+
* weight = 2 / (w + 1)
|
|
31
|
+
* @param {number[]} series Array with series of values.
|
|
32
|
+
* @param {number} windowSize Size of moving average window.
|
|
33
|
+
* @returns {number[]} Array with exponential moving averages from series.
|
|
34
|
+
*/
|
|
35
|
+
static exponentialMovingAverage(series: number[], windowSize: number): number[];
|
|
36
|
+
}
|
|
2
37
|
//# sourceMappingURL=statistics.d.ts.map
|
package/dist/statistics.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statistics.d.ts","sourceRoot":"","sources":["../src/statistics.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"statistics.d.ts","sourceRoot":"","sources":["../src/statistics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,UAAU;IAErB;;;;;;;;;;;SAWK;WACS,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,SAAW,GAAG,MAAM,EAAE;IAgC7G;;;;;;;;;;;;;;;SAeK;WACS,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM;CAsC5E"}
|