homebridge-solaxcloud-api 1.4.5 → 2.0.1-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -10
- package/config.schema.json +15 -1
- 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 +19 -4
- package/dist/outletAccessory.d.ts.map +1 -1
- package/dist/outletAccessory.js +57 -18
- package/dist/outletAccessory.js.map +1 -1
- package/dist/platform.d.ts +47 -14
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +272 -56
- 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/package.json +3 -3
- package/test/solaxcloudapi.test.ts +1 -1
- package/test/statistics.test.ts +51 -0
package/README.md
CHANGED
|
@@ -8,18 +8,18 @@
|
|
|
8
8
|
|
|
9
9
|
# Solax Cloud Plugin for Homebridge
|
|
10
10
|
|
|
11
|
-
 
|
|
11
|
+
  [](https://github.com/homebridge/homebridge/wiki/Verified-Plugins)
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
The Solax Cloud Plugin for [Homebridge](https://homebridge.io/) was created as a platform plugin to gather data exposed by Solax inverters to the cloud through the [Solax Cloud API](https://www.eu.solaxcloud.com/phoebus/resource/files/userGuide/Solax_API_for_End-user_V1.0.pdf).
|
|
15
15
|
|
|
16
16
|
As HomeKit is still clueless about what a solar panel is, this plugin exposes a set of standard HomeKit accessories though Homebridge that will allow interacting and automating your smart home based on the data made available from the Solax platform:
|
|
17
17
|
|
|
18
|
-
- **
|
|
19
|
-
- **Inverter AC
|
|
20
|
-
- **Inverter to Grid
|
|
21
|
-
- **Inverter to House
|
|
22
|
-
- **Grid
|
|
18
|
+
- **PV** (PV outlet with power consumption)
|
|
19
|
+
- **AC** (Inverter AC outlet with power and total energy consumptions)
|
|
20
|
+
- **To Grid** (Inverter to Grid outlet with power consumption)
|
|
21
|
+
- **To House** (Inverter to House outlet with power consumption)
|
|
22
|
+
- **From Grid** (Grid to House outlet with power consumption)
|
|
23
23
|
- **Update** (Motion sensor)
|
|
24
24
|
|
|
25
25
|
<img src="images/plugin-accessories-home.png" width="50%" height="50%">
|
|
@@ -42,7 +42,7 @@ Edit `config.json` manually to add your Solax inverters. See below for instructi
|
|
|
42
42
|
|
|
43
43
|
## Platform configuration
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
Minimal platform configuration is depicted by the example configuration file below:
|
|
46
46
|
|
|
47
47
|
```json
|
|
48
48
|
{
|
|
@@ -51,13 +51,24 @@ Minimum platform configuration is depicted by the example configuration file bel
|
|
|
51
51
|
"platform": "SolaxCloudAPI",
|
|
52
52
|
"name": "My Solax",
|
|
53
53
|
"tokenId": "20200722185111234567890",
|
|
54
|
-
"sn": "ABCDEFGHIJ"
|
|
55
|
-
"pollingFrequency": 60
|
|
54
|
+
"sn": "ABCDEFGHIJ"
|
|
56
55
|
}
|
|
57
56
|
]
|
|
58
57
|
}
|
|
59
58
|
```
|
|
60
|
-
|
|
59
|
+
Configuration parameters are described on the table below:
|
|
60
|
+
|
|
61
|
+
| **Parameter** | **Type** | **Description** | **Default** | **Mandatory?** |
|
|
62
|
+
| ------------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------- | -------------:| :------------: |
|
|
63
|
+
| `platform` | string | Platform name (must be SolaxCloudAPI) | - | Y |
|
|
64
|
+
| `name` | string | Inverter name, used as prefix for accessory naming | - | Y |
|
|
65
|
+
| `tokenId` | string | Users get information from Solax Cloud through the granted tokenID. Please obtain your tokenID on the API page of Solax Cloud. | - | Y |
|
|
66
|
+
| `sn` | string | Registration No. (inverter module SN) | - | Y |
|
|
67
|
+
| `pollingFrequency` | number | Plugin data polling frequency from Solax Cloud (in seconds) | 300 | N |
|
|
68
|
+
| `smoothingMeters` | boolean | Whether to create additional meters by smoothing raw values from Solax Cloud | true | N |
|
|
69
|
+
| `pureHomeApp` | boolean | Whether to create meters as standard accessories that can be used on the Home App (power will show as ambient light sensors). | false | N |
|
|
70
|
+
|
|
71
|
+
**NOTE:** The `pollingFrequency` parameter defaults to 300 seconds, since Solax inverters update cloud data every 5 minutes.
|
|
61
72
|
|
|
62
73
|
Configuration through the the use of [Homebridge UI](https://github.com/oznu/homebridge-config-ui-x) plugin is also available and recommended:
|
|
63
74
|
|
|
@@ -71,6 +82,10 @@ This will allow some important non-standard characteristics to be visible (like
|
|
|
71
82
|
|
|
72
83
|
<img src="images/plugin-outlet-consumption.png" width="50%" height="50%">
|
|
73
84
|
|
|
85
|
+
If you want to rely solely on the native Home App, please enable the `pureHomeApp` config setting by editing the `config.json` file or using Homebridge UI. In this case, power consumption on each meter will be exposed as an Ambient Light Sensor, as shown below (minimum value for an Ambient Light Sensor is 0.1 lux):
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
74
89
|
# Automation
|
|
75
90
|
|
|
76
91
|
Automation can be achieved with the help of the virtual **Update** motion sensor that was specifically tailored for this effect. This motion sensor will be triggered whenever data gets updated from the Solax Cloud API (according to what is defined on the `pollingFrequency` configuration setting).
|
|
@@ -158,4 +173,6 @@ Next planned plugin releases should include:
|
|
|
158
173
|
|
|
159
174
|
- [X] **Inverter AC** to include Yield Energy
|
|
160
175
|
- [X] Consumption history through the [fakegato-history](https://github.com/simont77/fakegato-history) module
|
|
176
|
+
- [x] Enable support for "pure" Home App accessories (power meters will be exposed as Ambient Light sensors)
|
|
177
|
+
- [x] Add "smooth" accessories for power meters (compensating for sporadic scenarios like cloud a passing)
|
|
161
178
|
- [ ] Accessories for battery state and consumptions (do not have one available)
|
package/config.schema.json
CHANGED
|
@@ -43,7 +43,21 @@
|
|
|
43
43
|
{ "title": "600 (10 minutes)", "enum": [ 600 ] },
|
|
44
44
|
{ "title": "900 (15 minutes)", "enum": [ 900 ] }
|
|
45
45
|
],
|
|
46
|
-
"description": "Plugin data polling frequency from Solax Cloud in seconds."
|
|
46
|
+
"description": "Plugin data polling frequency from Solax Cloud (in seconds)."
|
|
47
|
+
},
|
|
48
|
+
"smoothMeters": {
|
|
49
|
+
"title": "Add accessories for smooth meters?",
|
|
50
|
+
"type": "boolean",
|
|
51
|
+
"required": false,
|
|
52
|
+
"default": true,
|
|
53
|
+
"description": "Enable this option to create accessories for smoothing raw values read from Solax Cloud."
|
|
54
|
+
},
|
|
55
|
+
"pureHomeApp": {
|
|
56
|
+
"title": "Add \"pure\" Home app accessories?",
|
|
57
|
+
"type": "boolean",
|
|
58
|
+
"required": false,
|
|
59
|
+
"default": false,
|
|
60
|
+
"description": "Enable this option to create light ambient sensors for power consumption."
|
|
47
61
|
}
|
|
48
62
|
}
|
|
49
63
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { AccessoryPlugin, CharacteristicGetCallback, Logging, Service } from 'homebridge';
|
|
2
|
+
import { SolaxCloudAPIPlatform } from './platform';
|
|
3
|
+
import { SolaxPlatformAccessory } from './platformAccessory';
|
|
4
|
+
/**
|
|
5
|
+
* Solax Light Sensor Accessory.
|
|
6
|
+
* Virtual light sensor used to monitor and measure both power consumption from Solax devices
|
|
7
|
+
* (for "Home app"-only purists).
|
|
8
|
+
* Using Lux to display power comsumption.
|
|
9
|
+
*/
|
|
10
|
+
export declare class SolaxLightSensorAccessory extends SolaxPlatformAccessory implements AccessoryPlugin {
|
|
11
|
+
private readonly lightService;
|
|
12
|
+
/**
|
|
13
|
+
* Ambient light level.
|
|
14
|
+
*/
|
|
15
|
+
private lux;
|
|
16
|
+
/**
|
|
17
|
+
* Solax virtual light sensor class constructor.
|
|
18
|
+
* @param {SolaxCloudApiPlatform} platform The API Platform for Solax Cloud.
|
|
19
|
+
* @param {Logging} log The platform logging for homebridge.
|
|
20
|
+
* @param {string} name The accessory name.
|
|
21
|
+
* @param {string} serial "Real world" serial number for this accessory.
|
|
22
|
+
* @param {string} model Accessory model.
|
|
23
|
+
*/
|
|
24
|
+
constructor(platform: SolaxCloudAPIPlatform, log: Logging, name: string, serial: string, model: string);
|
|
25
|
+
/**
|
|
26
|
+
* Gets the current ambient light level (power consumpion in Watts).
|
|
27
|
+
*/
|
|
28
|
+
getAmbientLightLevel(callback: CharacteristicGetCallback): void;
|
|
29
|
+
/**
|
|
30
|
+
* Sets the current ambient light level (power consumption in Watts).
|
|
31
|
+
* @param {number} lux The lux (power consumption) value to set.
|
|
32
|
+
*/
|
|
33
|
+
setAmbientLightLevel(lux: number): void;
|
|
34
|
+
getServices(): Service[];
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=lightSensorAccessory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lightSensorAccessory.d.ts","sourceRoot":"","sources":["../src/lightSensorAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAA4B,yBAAyB,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEpH,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;;;GAKG;AACH,qBAAa,yBAA0B,SAAQ,sBAAuB,YAAW,eAAe;IAC9F,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IAEvC;;OAEG;IACH,OAAO,CAAC,GAAG,CAAK;IAEhB;;;;;;;OAOG;gBACS,QAAQ,EAAE,qBAAqB,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAgBtG;;OAEG;IACI,oBAAoB,CAAC,QAAQ,EAAE,yBAAyB,GAAG,IAAI;IAMtE;;;OAGG;IACI,oBAAoB,CAAC,GAAG,EAAE,MAAM;IAavC,WAAW,IAAI,OAAO,EAAE;CAIzB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SolaxLightSensorAccessory = void 0;
|
|
4
|
+
const platformAccessory_1 = require("./platformAccessory");
|
|
5
|
+
/**
|
|
6
|
+
* Solax Light Sensor Accessory.
|
|
7
|
+
* Virtual light sensor used to monitor and measure both power consumption from Solax devices
|
|
8
|
+
* (for "Home app"-only purists).
|
|
9
|
+
* Using Lux to display power comsumption.
|
|
10
|
+
*/
|
|
11
|
+
class SolaxLightSensorAccessory extends platformAccessory_1.SolaxPlatformAccessory {
|
|
12
|
+
/**
|
|
13
|
+
* Solax virtual light sensor class constructor.
|
|
14
|
+
* @param {SolaxCloudApiPlatform} platform The API Platform for Solax Cloud.
|
|
15
|
+
* @param {Logging} log The platform logging for homebridge.
|
|
16
|
+
* @param {string} name The accessory name.
|
|
17
|
+
* @param {string} serial "Real world" serial number for this accessory.
|
|
18
|
+
* @param {string} model Accessory model.
|
|
19
|
+
*/
|
|
20
|
+
constructor(platform, log, name, serial, model) {
|
|
21
|
+
super(platform, log, name, serial, model);
|
|
22
|
+
/**
|
|
23
|
+
* Ambient light level.
|
|
24
|
+
*/
|
|
25
|
+
this.lux = 0;
|
|
26
|
+
const hap = this.platform.api.hap;
|
|
27
|
+
this.log.debug(`Creating light "${this.name}"`);
|
|
28
|
+
this.lightService = new hap.Service.LightSensor(name);
|
|
29
|
+
this.lightService
|
|
30
|
+
.getCharacteristic(hap.Characteristic.CurrentAmbientLightLevel)
|
|
31
|
+
.on("get" /* GET */, this.getAmbientLightLevel.bind(this));
|
|
32
|
+
log.info(`Solax light (watts reader) ${name} created!`);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Gets the current ambient light level (power consumpion in Watts).
|
|
36
|
+
*/
|
|
37
|
+
getAmbientLightLevel(callback) {
|
|
38
|
+
this.log.debug(`${this.name}: GET Ambient Light Level (lux=${this.lux})`);
|
|
39
|
+
callback(null, this.lux);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Sets the current ambient light level (power consumption in Watts).
|
|
43
|
+
* @param {number} lux The lux (power consumption) value to set.
|
|
44
|
+
*/
|
|
45
|
+
setAmbientLightLevel(lux) {
|
|
46
|
+
this.log.debug(`${this.name}: SET Ambient Light Level (lux=${lux})`);
|
|
47
|
+
// Minimum value allowed for light sensor is 0.1
|
|
48
|
+
this.lux = Math.max(0.1, lux);
|
|
49
|
+
this.lightService.updateCharacteristic(this.platform.api.hap.Characteristic.CurrentAmbientLightLevel, this.lux);
|
|
50
|
+
}
|
|
51
|
+
/*
|
|
52
|
+
* This method is called directly after creation of this instance.
|
|
53
|
+
* It should return all services which should be added to the accessory.
|
|
54
|
+
*/
|
|
55
|
+
getServices() {
|
|
56
|
+
return [this.informationService, this.lightService];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.SolaxLightSensorAccessory = SolaxLightSensorAccessory;
|
|
60
|
+
//# sourceMappingURL=lightSensorAccessory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lightSensorAccessory.js","sourceRoot":"","sources":["../src/lightSensorAccessory.ts"],"names":[],"mappings":";;;AAGA,2DAA6D;AAE7D;;;;;GAKG;AACH,MAAa,yBAA0B,SAAQ,0CAAsB;IAQnE;;;;;;;OAOG;IACH,YAAY,QAA+B,EAAE,GAAY,EAAE,IAAY,EAAE,MAAc,EAAE,KAAa;QACpG,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAd5C;;WAEG;QACK,QAAG,GAAG,CAAC,CAAC;QAad,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;QAElC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAEhD,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAEtD,IAAI,CAAC,YAAY;aACd,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,wBAAwB,CAAC;aAC9D,EAAE,kBAA+B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAE1E,GAAG,CAAC,IAAI,CAAC,8BAA8B,IAAI,WAAW,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACI,oBAAoB,CAAC,QAAmC;QAC7D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,kCAAkC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QAE1E,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACI,oBAAoB,CAAC,GAAW;QACrC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,kCAAkC,GAAG,GAAG,CAAC,CAAC;QAErE,gDAAgD;QAChD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAE9B,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,wBAAwB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAClH,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,OAAO,CAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,YAAY,CAAE,CAAC;IACxD,CAAC;CAEF;AA9DD,8DA8DC"}
|
|
@@ -23,6 +23,10 @@ export declare class SolaxOutletAccessory extends SolaxPlatformAccessory impleme
|
|
|
23
23
|
* Elgato Eve fake history service for energy and status.
|
|
24
24
|
*/
|
|
25
25
|
private readonly loggingService;
|
|
26
|
+
/**
|
|
27
|
+
* Power series for smoothing operations.
|
|
28
|
+
* */
|
|
29
|
+
private readonly powerSeries;
|
|
26
30
|
/**
|
|
27
31
|
* Solax virtual outlet class constructor.
|
|
28
32
|
* @param {SolaxCloudApiPlatform} platform The API Platform for Solax Cloud.
|
|
@@ -33,11 +37,22 @@ export declare class SolaxOutletAccessory extends SolaxPlatformAccessory impleme
|
|
|
33
37
|
*/
|
|
34
38
|
constructor(platform: SolaxCloudAPIPlatform, log: Logging, name: string, serial: string, model: string);
|
|
35
39
|
/**
|
|
36
|
-
*
|
|
37
|
-
* @param {
|
|
38
|
-
|
|
40
|
+
* Adds new power entry to series array of power values.
|
|
41
|
+
* @param {number} powerConsumption Power value to add (in Watts).
|
|
42
|
+
*/
|
|
43
|
+
private addPowerEntry;
|
|
44
|
+
/**
|
|
45
|
+
* Gets array series with power consumption values.
|
|
46
|
+
* @returns {number[]} Array with power consumption values.
|
|
47
|
+
*/
|
|
48
|
+
getPowerSeries(): number[];
|
|
49
|
+
/**
|
|
50
|
+
* Get outlet power from power series by smoothing data using the desired method and window size.
|
|
51
|
+
* @param {string} method Method to smooth data ('SMA' or 'EMA').
|
|
52
|
+
* @param {number} windowSize Window size for SMA or EMA.
|
|
53
|
+
* @returns {number} Power value after smoothing (rounded to nearest integer number).
|
|
39
54
|
*/
|
|
40
|
-
|
|
55
|
+
getSmoothPowerConsumption(method: string, windowSize: number): number;
|
|
41
56
|
/**
|
|
42
57
|
* Gets the current power consumpion.
|
|
43
58
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outletAccessory.d.ts","sourceRoot":"","sources":["../src/outletAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,yBAAyB,
|
|
1
|
+
{"version":3,"file":"outletAccessory.d.ts","sourceRoot":"","sources":["../src/outletAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAW7D;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,sBAAuB,YAAW,eAAe;IAEzF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;IAExC;;OAEG;IACH,OAAO,CAAC,gBAAgB,CAAK;IAE7B;;OAEG;IACH,OAAO,CAAC,sBAAsB,CAAO;IAErC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IAExD;;SAEK;IACL,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAE5C;;;;;;;OAOG;gBACS,QAAQ,EAAE,qBAAqB,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IA8BtG;;;OAGG;IACH,OAAO,CAAC,aAAa;IAWrB;;;OAGG;IACI,cAAc,IAAI,MAAM,EAAE;IAIjC;;;;;OAKG;IACI,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IA4B5E;;OAEG;IACI,mBAAmB,CAAC,QAAQ,EAAE,yBAAyB,GAAG,IAAI;IAMrE;;wEAEoE;IAC7D,mBAAmB,CAAC,gBAAgB,EAAE,MAAM;IAcnD;;OAEG;IACI,yBAAyB,CAAC,QAAQ,EAAE,yBAAyB,GAAG,IAAI;IAM3E;;;OAGG;IACI,yBAAyB,CAAC,sBAAsB,EAAE,MAAM;IAQ/D;;;OAGG;IACI,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,GAAG,IAAI;IAU1D,WAAW,IAAI,OAAO,EAAE;CAIzB"}
|
package/dist/outletAccessory.js
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SolaxOutletAccessory = void 0;
|
|
4
4
|
const platformAccessory_1 = require("./platformAccessory");
|
|
5
|
+
const statistics_1 = require("./statistics");
|
|
6
|
+
/**
|
|
7
|
+
* Maximum size for the outlet power series.
|
|
8
|
+
*/
|
|
9
|
+
const MAX_POWER_SERIES_SIZE = 1024;
|
|
5
10
|
/**
|
|
6
11
|
* Solax Outlet Accessory.
|
|
7
12
|
* Virtual outlet used to monitor and measure both power and total energy consumption from Solax devices.
|
|
@@ -26,6 +31,10 @@ class SolaxOutletAccessory extends platformAccessory_1.SolaxPlatformAccessory {
|
|
|
26
31
|
* Total energy readings in KWh.
|
|
27
32
|
*/
|
|
28
33
|
this.totalEnergyConsumption = 0.0;
|
|
34
|
+
/**
|
|
35
|
+
* Power series for smoothing operations.
|
|
36
|
+
* */
|
|
37
|
+
this.powerSeries = [];
|
|
29
38
|
const hap = this.platform.api.hap;
|
|
30
39
|
this.log.debug(`Creating outlet "${this.name}"`);
|
|
31
40
|
// create power meter service
|
|
@@ -41,20 +50,53 @@ class SolaxOutletAccessory extends platformAccessory_1.SolaxPlatformAccessory {
|
|
|
41
50
|
this.outletService.getCharacteristic(this.platform.eve.Characteristics.TotalConsumption)
|
|
42
51
|
.on("get" /* GET */, this.getTotalEnergyConsumption.bind(this));
|
|
43
52
|
// history logging services
|
|
44
|
-
this.loggingService = new this.platform.eveService('energy', this, { storage: 'fs', log: this.log });
|
|
53
|
+
this.loggingService = new this.platform.eveService('energy', this, { storage: 'fs', log: this.log, disableRepeatLastData: true });
|
|
45
54
|
log.info(`Outlet "${name}" created!`);
|
|
46
55
|
}
|
|
47
56
|
/**
|
|
48
|
-
*
|
|
49
|
-
* @param {
|
|
50
|
-
|
|
57
|
+
* Adds new power entry to series array of power values.
|
|
58
|
+
* @param {number} powerConsumption Power value to add (in Watts).
|
|
59
|
+
*/
|
|
60
|
+
addPowerEntry(powerConsumption) {
|
|
61
|
+
// check if we reached the limit
|
|
62
|
+
if (this.powerSeries.length === MAX_POWER_SERIES_SIZE) {
|
|
63
|
+
// remove first element
|
|
64
|
+
this.powerSeries.shift();
|
|
65
|
+
}
|
|
66
|
+
// add new element
|
|
67
|
+
this.powerSeries.push(powerConsumption);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Gets array series with power consumption values.
|
|
71
|
+
* @returns {number[]} Array with power consumption values.
|
|
72
|
+
*/
|
|
73
|
+
getPowerSeries() {
|
|
74
|
+
return this.powerSeries;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get outlet power from power series by smoothing data using the desired method and window size.
|
|
78
|
+
* @param {string} method Method to smooth data ('SMA' or 'EMA').
|
|
79
|
+
* @param {number} windowSize Window size for SMA or EMA.
|
|
80
|
+
* @returns {number} Power value after smoothing (rounded to nearest integer number).
|
|
51
81
|
*/
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
if
|
|
56
|
-
|
|
82
|
+
getSmoothPowerConsumption(method, windowSize) {
|
|
83
|
+
this.log.debug(`${this.name}: GET Power Smooth (method=${method}, window=${windowSize})`);
|
|
84
|
+
let result = 0;
|
|
85
|
+
// check if we have enough data for averaging
|
|
86
|
+
switch (method) {
|
|
87
|
+
case 'sma':
|
|
88
|
+
// get power series for window size
|
|
89
|
+
// eslint-disable-next-line no-case-declarations
|
|
90
|
+
const series = this.getPowerSeries().slice(-windowSize);
|
|
91
|
+
// calculate simple moving average from given window size
|
|
92
|
+
// eslint-disable-next-line no-case-declarations
|
|
93
|
+
const [sma] = statistics_1.Statistics.simpleMovingAverage(series, Math.min(windowSize, series.length));
|
|
94
|
+
this.log.debug(`${this.name}: simple moving average (window data=[${series}], power=${sma}W)`);
|
|
95
|
+
result = sma;
|
|
96
|
+
break;
|
|
97
|
+
case 'ema':
|
|
57
98
|
}
|
|
99
|
+
return result;
|
|
58
100
|
}
|
|
59
101
|
/**
|
|
60
102
|
* Gets the current power consumpion.
|
|
@@ -69,10 +111,11 @@ class SolaxOutletAccessory extends platformAccessory_1.SolaxPlatformAccessory {
|
|
|
69
111
|
setPowerConsumption(powerConsumption) {
|
|
70
112
|
this.log.debug(`${this.name}: SET Power (power=${powerConsumption}W)`);
|
|
71
113
|
this.powerConsumption = powerConsumption >= 0 ? powerConsumption : 0;
|
|
72
|
-
this.
|
|
114
|
+
this.outletService.getCharacteristic(this.platform.eve.Characteristics.CurrentConsumption).updateValue(this.powerConsumption);
|
|
73
115
|
// add entries to history
|
|
74
|
-
this.loggingService.
|
|
75
|
-
|
|
116
|
+
this.loggingService.addEntry({ time: Math.round(new Date().valueOf() / 1000), power: this.powerConsumption });
|
|
117
|
+
// add new value to power series
|
|
118
|
+
this.addPowerEntry(this.powerConsumption);
|
|
76
119
|
}
|
|
77
120
|
/**
|
|
78
121
|
* Gets the total energy consumpion.
|
|
@@ -88,7 +131,7 @@ class SolaxOutletAccessory extends platformAccessory_1.SolaxPlatformAccessory {
|
|
|
88
131
|
setTotalEnergyConsumption(totalEnergyConsumption) {
|
|
89
132
|
this.log.debug(`${this.name}: SET Total Energy (energy=${totalEnergyConsumption}kWh)`);
|
|
90
133
|
this.totalEnergyConsumption = totalEnergyConsumption;
|
|
91
|
-
this.
|
|
134
|
+
this.outletService.getCharacteristic(this.platform.eve.Characteristics.TotalConsumption).updateValue(this.totalEnergyConsumption);
|
|
92
135
|
}
|
|
93
136
|
/**
|
|
94
137
|
* Gets the outlet state Characteristic based on its consumed power.
|
|
@@ -103,11 +146,7 @@ class SolaxOutletAccessory extends platformAccessory_1.SolaxPlatformAccessory {
|
|
|
103
146
|
* It should return all services which should be added to the accessory.
|
|
104
147
|
*/
|
|
105
148
|
getServices() {
|
|
106
|
-
return [
|
|
107
|
-
this.informationService,
|
|
108
|
-
this.outletService,
|
|
109
|
-
this.loggingService,
|
|
110
|
-
];
|
|
149
|
+
return [this.informationService, this.outletService, this.loggingService];
|
|
111
150
|
}
|
|
112
151
|
}
|
|
113
152
|
exports.SolaxOutletAccessory = SolaxOutletAccessory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outletAccessory.js","sourceRoot":"","sources":["../src/outletAccessory.ts"],"names":[],"mappings":";;;AAGA,2DAA6D;
|
|
1
|
+
{"version":3,"file":"outletAccessory.js","sourceRoot":"","sources":["../src/outletAccessory.ts"],"names":[],"mappings":"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"}
|
package/dist/platform.d.ts
CHANGED
|
@@ -14,31 +14,36 @@ export declare class SolaxCloudAPIPlatform implements StaticPlatformPlugin {
|
|
|
14
14
|
readonly eve: EveHomeKitTypes;
|
|
15
15
|
eveService: fakegato;
|
|
16
16
|
private readonly solaxCloudAPI;
|
|
17
|
-
private apiData;
|
|
18
17
|
/**
|
|
19
|
-
*
|
|
20
|
-
|
|
21
|
-
private
|
|
18
|
+
* Numeber of periods to use for data smoothing.
|
|
19
|
+
*/
|
|
20
|
+
private smoothingWindow;
|
|
22
21
|
/**
|
|
23
|
-
*
|
|
22
|
+
* Outlets with raw data gather.
|
|
24
23
|
*/
|
|
25
|
-
private
|
|
24
|
+
private rawOutlets;
|
|
26
25
|
/**
|
|
27
|
-
*
|
|
26
|
+
* Smooth data outlets.
|
|
27
|
+
* These outlets present smoothed values based on the raw data figures to
|
|
28
|
+
* prevent events like the temporary passage of a cloud to directly affect values.
|
|
28
29
|
*/
|
|
29
|
-
private
|
|
30
|
+
private smoothOutlets;
|
|
30
31
|
/**
|
|
31
|
-
* Virtual
|
|
32
|
+
* Virtual motion sensor triggered by data updates from Solax Cloud.
|
|
32
33
|
*/
|
|
33
|
-
private
|
|
34
|
+
private motionUpdate;
|
|
34
35
|
/**
|
|
35
|
-
*
|
|
36
|
+
* Ambient light sensors for Power Consumption (pure Home App config)
|
|
36
37
|
*/
|
|
37
|
-
private
|
|
38
|
+
private rawLightSensors;
|
|
38
39
|
/**
|
|
39
|
-
*
|
|
40
|
+
* Ambient light sensors for smooth power consumption lights.
|
|
41
|
+
* These lights present smoothed values based on the raw data figures to
|
|
42
|
+
* prevent events like the temporary passage of a cloud to directly affect values.
|
|
40
43
|
*/
|
|
41
|
-
private
|
|
44
|
+
private smoothLightSensors;
|
|
45
|
+
/** Array with all accessories */
|
|
46
|
+
private solaxAccessories;
|
|
42
47
|
/**
|
|
43
48
|
* Platform constructor.
|
|
44
49
|
* @param log
|
|
@@ -52,6 +57,34 @@ export declare class SolaxCloudAPIPlatform implements StaticPlatformPlugin {
|
|
|
52
57
|
* Periodically retrieves inverter data from Solax Cloud API using configured tokenID and SN.
|
|
53
58
|
*/
|
|
54
59
|
private fetchDataPeriodically;
|
|
60
|
+
/**
|
|
61
|
+
* Update all platform accessory status based on the values read from the API.
|
|
62
|
+
* @param {SolaxCloudAPIResponse} apiData API data from Solax Cloud.
|
|
63
|
+
*/
|
|
64
|
+
private updateAccessories;
|
|
65
|
+
/**
|
|
66
|
+
* Updates smooth ambient light sensors data from raw outlet data by applying configured smoothing function.
|
|
67
|
+
*/
|
|
68
|
+
private updateSmoothLightSensors;
|
|
69
|
+
/**
|
|
70
|
+
* Update raw ambient light sensors with power consumption data from Solax Cloud API.
|
|
71
|
+
* @param {SolaxCloudAPIResponse} apiData API data retrieved from Solax Cloud.
|
|
72
|
+
*/
|
|
73
|
+
private updateRawLightSensors;
|
|
74
|
+
/**
|
|
75
|
+
* Updates smooth outlet data from raw outlet data by applying configured smoothing function.
|
|
76
|
+
*/
|
|
77
|
+
private updateSmoothOutlets;
|
|
78
|
+
/**
|
|
79
|
+
* Update raw outlet data from API data read from Solax Cloud.
|
|
80
|
+
* @param {SolaxCloudAPIResponse} apiData Solax Cloud API data.
|
|
81
|
+
* */
|
|
82
|
+
private updateRawOutlets;
|
|
83
|
+
/**
|
|
84
|
+
* Checks platform config validity and sets defaults whenever needed.
|
|
85
|
+
* @returns {boolean} Whether the config is valid.
|
|
86
|
+
*/
|
|
87
|
+
private checkConfig;
|
|
55
88
|
accessories(callback: (foundAccessories: AccessoryPlugin[]) => void): void;
|
|
56
89
|
}
|
|
57
90
|
//# sourceMappingURL=platform.d.ts.map
|
package/dist/platform.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,oBAAoB,EAAE,OAAO,EAAE,cAAc,EAAY,MAAM,YAAY,CAAC;AAE3G,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,QAAQ,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,oBAAoB,EAAE,OAAO,EAAE,cAAc,EAAY,MAAM,YAAY,CAAC;AAE3G,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,QAAQ,MAAM,kBAAkB,CAAC;AAmDxC;;;;GAIG;AACH,qBAAa,qBAAsB,YAAW,oBAAoB;IAChE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAU;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,SAAgB,GAAG,EAAE,GAAG,CAAC;IAEzB,SAAgB,GAAG,EAAE,eAAe,CAAC;IAC9B,UAAU,EAAE,QAAQ,CAAC;IAE5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiB;IAE/C;;OAEG;IACH,OAAO,CAAC,eAAe,CAAK;IAE5B;;OAEG;IACH,OAAO,CAAC,UAAU,CAAwB;IAE1C;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAAwB;IAE7C;;OAEG;IACH,OAAO,CAAC,YAAY,CAAwB;IAE5C;;OAEG;IACH,OAAO,CAAC,eAAe,CAA6B;IAEpD;;;;OAIG;IACH,OAAO,CAAC,kBAAkB,CAA6B;IAEvD,iCAAiC;IACjC,OAAO,CAAC,gBAAgB,CAAyB;IAEjD;;;;;;OAMG;gBACU,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG;IA4J3D,KAAK,8CAA8B;IAEnC;;OAEG;YACW,qBAAqB;IAuBnC;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAuBzB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAkBhC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;SAGK;IACL,OAAO,CAAC,gBAAgB;IASxB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAiFnB,WAAW,CAAC,QAAQ,EAAE,CAAC,gBAAgB,EAAE,eAAe,EAAE,KAAK,IAAI,GAAG,IAAI;CAG3E"}
|