homebridge-pvs6 1.0.0 → 1.2.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 +81 -22
- package/config.schema.json +22 -4
- package/dist/homeConsumptionAccessory.d.ts +13 -0
- package/dist/homeConsumptionAccessory.d.ts.map +1 -0
- package/dist/homeConsumptionAccessory.js +59 -0
- package/dist/homeConsumptionAccessory.js.map +1 -0
- package/dist/platform.d.ts +10 -1
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +115 -14
- package/dist/platform.js.map +1 -1
- package/dist/pvs6Client.d.ts +2 -0
- package/dist/pvs6Client.d.ts.map +1 -1
- package/dist/pvs6Client.js +11 -3
- package/dist/pvs6Client.js.map +1 -1
- package/dist/pvs6Discovery.d.ts +7 -0
- package/dist/pvs6Discovery.d.ts.map +1 -0
- package/dist/pvs6Discovery.js +95 -0
- package/dist/pvs6Discovery.js.map +1 -0
- package/dist/settings.d.ts +5 -2
- package/dist/settings.d.ts.map +1 -1
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -1,16 +1,30 @@
|
|
|
1
1
|
# homebridge-pvs6
|
|
2
2
|
|
|
3
|
-
A [Homebridge](https://homebridge.io) plugin for the [SunStrong PVS6](https://sunstrong.com) solar monitoring system. Exposes solar production and grid metering as **Eve Energy** accessories in Apple HomeKit, with real-time power, cumulative energy,
|
|
3
|
+
A [Homebridge](https://homebridge.io) plugin for the [SunStrong PVS6](https://sunstrong.com) solar monitoring system. Exposes solar production and grid metering as **Eve Energy** accessories in Apple HomeKit, with real-time power, cumulative energy, and native Eve app history.
|
|
4
|
+
|
|
5
|
+
<table>
|
|
6
|
+
<tr>
|
|
7
|
+
<td align="center" valign="middle">
|
|
8
|
+
<img width="300" alt="Eve Energy view" src="https://github.com/user-attachments/assets/f85d2e28-b419-4c41-a651-cbb88c011c79" />
|
|
9
|
+
<br><sub>Eve Energy view</sub>
|
|
10
|
+
</td>
|
|
11
|
+
<td align="center" valign="middle">
|
|
12
|
+
<img width="600" alt="Total Consumption landscape" src="https://github.com/user-attachments/assets/76332baa-e1a2-45dd-a4ee-4dffac008ab8" />
|
|
13
|
+
<br><sub>Total Consumption landscape</sub>
|
|
14
|
+
</td>
|
|
15
|
+
</tr>
|
|
16
|
+
</table>
|
|
4
17
|
|
|
5
18
|
---
|
|
6
|
-
|
|
7
19
|
## Features
|
|
8
20
|
|
|
9
|
-
- **Solar Production** accessory — always registered; real-time PV output (W), lifetime generation (kWh)
|
|
21
|
+
- **Solar Production** accessory — always registered; real-time PV output (W), lifetime generation (kWh)
|
|
10
22
|
- **Grid Import + Grid Export** accessory pair — optional (default enabled); each shows non-negative watts and its own Eve app history
|
|
23
|
+
- **Home Consumption** accessory — optional (default disabled); real-time site load (W) and derived lifetime consumption (kWh)
|
|
11
24
|
- Import and Export accessories are always registered together as a pair, making import/export history immediately readable as separate graphs
|
|
12
25
|
- Up to 7 days of native power history in the Eve app via [fakegato-history](https://github.com/simont77/fakegato-history)
|
|
13
26
|
- Polls the PVS6 **local** FCGI API — no SunStrong Connect, no cloud dependency
|
|
27
|
+
- **Auto-discovers** the PVS6 on your local network via mDNS — no IP address or serial number required in config
|
|
14
28
|
- Automatically identifies production and consumption CT meters from the PVS6 device list
|
|
15
29
|
- Designed to complement [homebridge-rainforest-eagle3](https://github.com/dacarson/homebridge-rainforest-eagle3) for a complete solar + grid picture in Apple Home
|
|
16
30
|
|
|
@@ -31,7 +45,7 @@ A [Homebridge](https://homebridge.io) plugin for the [SunStrong PVS6](https://su
|
|
|
31
45
|
The PVS6 exposes a local HTTPS varserver API that this plugin polls on a configurable interval. It reads two data streams:
|
|
32
46
|
|
|
33
47
|
- **Livedata** — aggregate solar production and net grid power computed by the PVS6
|
|
34
|
-
- **Meter data** — per-phase detail from the CT meters (
|
|
48
|
+
- **Meter data** — per-phase detail from the CT meters (cumulative energy)
|
|
35
49
|
|
|
36
50
|
The plugin automatically identifies the production meter (model suffix `p`, e.g. `PVS6M0400p`) and consumption meter (model suffix `c`, e.g. `PVS6M0400c`) from the device list.
|
|
37
51
|
|
|
@@ -40,17 +54,17 @@ All accessories render as **smart plugs** in Apple Home:
|
|
|
40
54
|
- **Solar Production** — always registered; `On` when the panels are producing power
|
|
41
55
|
- **Grid Import** — `On` when importing from the grid; zero watts when net-exporting
|
|
42
56
|
- **Grid Export** — `On` when net-exporting solar to the grid; zero watts when importing
|
|
57
|
+
- **Home Consumption** — optional; `On` when the house is drawing power (always true in practice); shows total site load and derived lifetime consumption energy
|
|
43
58
|
|
|
44
|
-
Grid Import and Grid Export are always registered together — enabling `accessories.grid` creates both.
|
|
59
|
+
Grid Import and Grid Export are always registered together — enabling `accessories.grid` creates both. Home Consumption is opt-in via `accessories.homeConsumption: true`.
|
|
45
60
|
|
|
46
61
|
---
|
|
47
62
|
|
|
48
63
|
## Requirements
|
|
49
64
|
|
|
50
|
-
- [Homebridge](https://homebridge.io)
|
|
65
|
+
- [Homebridge](https://homebridge.io) v2.0 or later
|
|
51
66
|
- Node.js 18 or later
|
|
52
67
|
- SunStrong PVS6 on the same local network as your Homebridge host
|
|
53
|
-
- The PVS6's **full serial number** (printed on the unit label)
|
|
54
68
|
|
|
55
69
|
---
|
|
56
70
|
|
|
@@ -66,9 +80,11 @@ npm install -g homebridge-pvs6
|
|
|
66
80
|
|
|
67
81
|
## Configuration
|
|
68
82
|
|
|
69
|
-
|
|
83
|
+
The Homebridge UI exposes an **Auto Discover** checkbox (on by default). When checked, the plugin finds the PVS6 on your local network automatically via mDNS — Host and Serial Number fields are ignored even if filled in. When unchecked, Host and Serial Number are used directly. Either way, both fields are always visible and their values are preserved in `config.json`.
|
|
84
|
+
|
|
85
|
+
### Auto Discover (default)
|
|
70
86
|
|
|
71
|
-
|
|
87
|
+
The checkbox is on by default. No other fields are required:
|
|
72
88
|
|
|
73
89
|
```json
|
|
74
90
|
{
|
|
@@ -76,15 +92,35 @@ Minimal config (solar only — grid disabled):
|
|
|
76
92
|
{
|
|
77
93
|
"platform": "PVS6",
|
|
78
94
|
"name": "PVS6",
|
|
79
|
-
"
|
|
80
|
-
|
|
81
|
-
|
|
95
|
+
"autoDiscover": true
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
At startup the plugin scans for `_pvs6._tcp` on the local network. The PVS6 broadcasts its hostname (`pvs.local`) and serial number via mDNS, so both are discovered automatically. Discovery times out after 30 seconds with an actionable error if no device is found.
|
|
102
|
+
|
|
103
|
+
If the device becomes unreachable for 2 hours (e.g. the router assigned it a new IP), the plugin runs mDNS discovery again automatically and reconnects.
|
|
104
|
+
|
|
105
|
+
### Manual config
|
|
106
|
+
|
|
107
|
+
Uncheck **Auto Discover** and supply the host and serial number directly. This skips mDNS entirely and is useful if you assign the PVS6 a static IP or DHCP reservation:
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"platforms": [
|
|
112
|
+
{
|
|
113
|
+
"platform": "PVS6",
|
|
114
|
+
"name": "PVS6",
|
|
115
|
+
"autoDiscover": false,
|
|
116
|
+
"host": "pvs.local",
|
|
117
|
+
"serialNumber": "ZT231385000549A1234"
|
|
82
118
|
}
|
|
83
119
|
]
|
|
84
120
|
}
|
|
85
121
|
```
|
|
86
122
|
|
|
87
|
-
|
|
123
|
+
### Full config (all options)
|
|
88
124
|
|
|
89
125
|
```json
|
|
90
126
|
{
|
|
@@ -92,12 +128,18 @@ Standard config (solar + grid import/export pair):
|
|
|
92
128
|
{
|
|
93
129
|
"platform": "PVS6",
|
|
94
130
|
"name": "PVS6",
|
|
95
|
-
"
|
|
131
|
+
"autoDiscover": true,
|
|
132
|
+
"host": "pvs.local",
|
|
96
133
|
"serialNumber": "ZT231385000549A1234",
|
|
97
134
|
"pollInterval": 10,
|
|
135
|
+
"accessories": {
|
|
136
|
+
"grid": true,
|
|
137
|
+
"homeConsumption": true
|
|
138
|
+
},
|
|
98
139
|
"solarName": "Solar Production",
|
|
99
140
|
"gridName": "Grid Meter - Import",
|
|
100
|
-
"gridExportName": "Grid Meter - Export"
|
|
141
|
+
"gridExportName": "Grid Meter - Export",
|
|
142
|
+
"homeConsumptionName": "Home Consumption"
|
|
101
143
|
}
|
|
102
144
|
]
|
|
103
145
|
}
|
|
@@ -108,17 +150,22 @@ Standard config (solar + grid import/export pair):
|
|
|
108
150
|
| Field | Type | Required | Default | Description |
|
|
109
151
|
|---|---|---|---|---|
|
|
110
152
|
| `platform` | string | yes | — | Must be `PVS6` |
|
|
111
|
-
| `
|
|
112
|
-
| `
|
|
153
|
+
| `autoDiscover` | boolean | no | `true` | When `true`, find the PVS6 via mDNS — `host` and `serialNumber` are ignored. Re-discovers automatically after 2 hours of unreachability |
|
|
154
|
+
| `host` | string | no* | — | IP address or hostname of the PVS6. Used only when `autoDiscover` is `false` |
|
|
155
|
+
| `serialNumber` | string | no* | — | Full PVS6 serial number. The last 5 characters are used as the API password. Used only when `autoDiscover` is `false` |
|
|
113
156
|
| `pollInterval` | integer | no | `10` | Seconds between polls. Minimum enforced: `5` |
|
|
114
157
|
| `accessories.grid` | boolean | no | `true` | Enable the Grid Import + Grid Export accessory pair. Set `false` to disable both |
|
|
158
|
+
| `accessories.homeConsumption` | boolean | no | `false` | Enable the Home Consumption accessory. Opt-in; off by default |
|
|
115
159
|
| `solarName` | string | no | `"Solar Production"` | HomeKit display name for the Solar Production accessory |
|
|
116
160
|
| `gridName` | string | no | `"Grid Meter - Import"` | HomeKit display name for the Grid Import accessory |
|
|
117
161
|
| `gridExportName` | string | no | `"Grid Meter - Export"` | HomeKit display name for the Grid Export accessory |
|
|
162
|
+
| `homeConsumptionName` | string | no | `"Home Consumption"` | HomeKit display name for the Home Consumption accessory |
|
|
163
|
+
|
|
164
|
+
\* Required when `autoDiscover` is `false`.
|
|
118
165
|
|
|
119
166
|
### Finding Your Serial Number
|
|
120
167
|
|
|
121
|
-
The serial number is printed on the label on the PVS6 unit (format: `ZT...`). It is also visible in the SunStrong Connect app. The last 5 characters
|
|
168
|
+
The serial number is printed on the label on the PVS6 unit (format: `ZT...`). It is also visible in the SunStrong Connect app and is broadcast by the PVS6 itself via mDNS (which is how Auto Discover retrieves it). The last 5 characters are used as the local API login password — no separate password configuration is required.
|
|
122
169
|
|
|
123
170
|
---
|
|
124
171
|
|
|
@@ -132,7 +179,6 @@ The serial number is printed on the label on the PVS6 unit (format: `ZT...`). It
|
|
|
132
179
|
| OutletInUse | Always `true` | Required by Eve Energy |
|
|
133
180
|
| Eve Watts | `pv_p × 1000` | Real-time solar output in Watts |
|
|
134
181
|
| Eve kWh | `pv_en` | Lifetime generation in kWh |
|
|
135
|
-
| Eve Voltage | Production meter `v12V` | AC line voltage |
|
|
136
182
|
|
|
137
183
|
### Grid Import
|
|
138
184
|
|
|
@@ -142,9 +188,8 @@ The serial number is printed on the label on the PVS6 unit (format: `ZT...`). It
|
|
|
142
188
|
| OutletInUse | Always `true` | Required by Eve Energy |
|
|
143
189
|
| Eve Watts | `max(0, net_p) × 1000` | Import watts; zero when net-exporting |
|
|
144
190
|
| Eve kWh | `posLtea3phsumKwh` | Lifetime imported energy from consumption CT meter |
|
|
145
|
-
| Eve Voltage | Consumption meter `v12V` | AC line voltage |
|
|
146
191
|
|
|
147
|
-
### Grid Export *(optional — enabled with `
|
|
192
|
+
### Grid Export *(optional — enabled with `accessories.grid: true`)*
|
|
148
193
|
|
|
149
194
|
| Characteristic | Source | Notes |
|
|
150
195
|
|---|---|---|
|
|
@@ -152,7 +197,19 @@ The serial number is printed on the label on the PVS6 unit (format: `ZT...`). It
|
|
|
152
197
|
| OutletInUse | Always `true` | Required by Eve Energy |
|
|
153
198
|
| Eve Watts | `max(0, −net_p) × 1000` | Export watts; zero when importing |
|
|
154
199
|
| Eve kWh | `negLtea3phsumKwh` | Lifetime exported energy from consumption CT meter |
|
|
155
|
-
|
|
200
|
+
|
|
201
|
+
### Home Consumption *(optional — enable with `accessories.homeConsumption: true`)*
|
|
202
|
+
|
|
203
|
+
Shows the total real-time load of the home and a derived lifetime consumption figure. Enable via `accessories.homeConsumption: true` in config.
|
|
204
|
+
|
|
205
|
+
| Characteristic | Source | Notes |
|
|
206
|
+
|---|---|---|
|
|
207
|
+
| On | `site_load_p > 0` | True when the house is drawing power (always true in practice) |
|
|
208
|
+
| OutletInUse | Always `true` | Required by Eve Energy |
|
|
209
|
+
| Eve Watts | `site_load_p × 1000` | Real-time site load in Watts |
|
|
210
|
+
| Eve kWh | `pv_en + posLtea3phsumKwh − negLtea3phsumKwh` | Derived lifetime consumption — all solar generated, plus grid imported, minus grid exported |
|
|
211
|
+
|
|
212
|
+
The derived kWh formula is exact without a battery: solar energy either goes to the home or the grid, so `pv_en − negLtea3phsumKwh` is the on-site solar consumed and `posLtea3phsumKwh` is the grid energy consumed. All three values already come from the existing livedata and meter caches — no additional API calls are required.
|
|
156
213
|
|
|
157
214
|
---
|
|
158
215
|
|
|
@@ -161,6 +218,8 @@ The serial number is printed on the label on the PVS6 unit (format: `ZT...`). It
|
|
|
161
218
|
The plugin is designed to be resilient to transient PVS6 failures:
|
|
162
219
|
|
|
163
220
|
- If the PVS6 is unreachable at startup, authentication retries every 30 seconds
|
|
221
|
+
- If mDNS discovery times out (30 s) at startup, the platform logs an error and does not start — set `host` and `serialNumber` with `autoDiscover: false` to bypass discovery
|
|
222
|
+
- If the device is unreachable for 2 hours and `autoDiscover` is not `false`, mDNS re-discovery runs automatically to pick up a changed IP or serial
|
|
164
223
|
- Overlapping poll cycles are skipped — only one request is in flight at a time
|
|
165
224
|
- Poll cycles are skipped (not fatal) on timeout (>10 s), JSON parse errors, or HTTP 5xx responses
|
|
166
225
|
- HTTP 5xx triggers a short backoff to avoid overwhelming the PVS6's embedded HTTP server
|
package/config.schema.json
CHANGED
|
@@ -10,17 +10,23 @@
|
|
|
10
10
|
"type": "string",
|
|
11
11
|
"default": "PVS6"
|
|
12
12
|
},
|
|
13
|
+
"autoDiscover": {
|
|
14
|
+
"title": "Auto Discover",
|
|
15
|
+
"type": "boolean",
|
|
16
|
+
"default": true,
|
|
17
|
+
"description": "Automatically find the PVS6 on your local network via mDNS. When enabled, Host and Serial Number are ignored. If the device becomes unreachable for 2 hours, discovery runs again automatically."
|
|
18
|
+
},
|
|
13
19
|
"host": {
|
|
14
20
|
"title": "Host",
|
|
15
21
|
"type": "string",
|
|
16
|
-
"placeholder": "
|
|
17
|
-
"description": "IP address or hostname of the PVS6
|
|
22
|
+
"placeholder": "pvs.local",
|
|
23
|
+
"description": "IP address or hostname of the PVS6. Ignored when Auto Discover is enabled."
|
|
18
24
|
},
|
|
19
25
|
"serialNumber": {
|
|
20
26
|
"title": "Serial Number",
|
|
21
27
|
"type": "string",
|
|
22
28
|
"placeholder": "ZT231385000549F1084",
|
|
23
|
-
"description": "Full PVS6 serial number. The last 5 characters are used as the login password."
|
|
29
|
+
"description": "Full PVS6 serial number. The last 5 characters are used as the login password. Ignored when Auto Discover is enabled."
|
|
24
30
|
},
|
|
25
31
|
"pollInterval": {
|
|
26
32
|
"title": "Poll Interval (seconds)",
|
|
@@ -37,6 +43,12 @@
|
|
|
37
43
|
"title": "Enable Grid Meter accessories (Import + Export pair)",
|
|
38
44
|
"type": "boolean",
|
|
39
45
|
"default": true
|
|
46
|
+
},
|
|
47
|
+
"homeConsumption": {
|
|
48
|
+
"title": "Enable Home Consumption accessory",
|
|
49
|
+
"type": "boolean",
|
|
50
|
+
"default": false,
|
|
51
|
+
"description": "Shows real-time site load and derived lifetime consumption energy."
|
|
40
52
|
}
|
|
41
53
|
}
|
|
42
54
|
},
|
|
@@ -57,8 +69,14 @@
|
|
|
57
69
|
"type": "string",
|
|
58
70
|
"default": "Grid Meter - Export",
|
|
59
71
|
"description": "HomeKit display name for the Grid Export accessory."
|
|
72
|
+
},
|
|
73
|
+
"homeConsumptionName": {
|
|
74
|
+
"title": "Home Consumption Accessory Display Name",
|
|
75
|
+
"type": "string",
|
|
76
|
+
"default": "Home Consumption",
|
|
77
|
+
"description": "HomeKit display name for the Home Consumption accessory."
|
|
60
78
|
}
|
|
61
79
|
},
|
|
62
|
-
"required": [
|
|
80
|
+
"required": []
|
|
63
81
|
}
|
|
64
82
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PlatformAccessory } from 'homebridge';
|
|
2
|
+
import { PVS6Platform } from './platform';
|
|
3
|
+
import { PVS6Reading } from './pvs6Client';
|
|
4
|
+
export declare class HomeConsumptionAccessory {
|
|
5
|
+
private readonly platform;
|
|
6
|
+
private readonly service;
|
|
7
|
+
private readonly historyService;
|
|
8
|
+
private lastPowerW;
|
|
9
|
+
private lastEnergyKWh;
|
|
10
|
+
constructor(platform: PVS6Platform, accessory: PlatformAccessory, FakeGatoHistoryService: any, displayName: string, serialNumber: string);
|
|
11
|
+
updateValues(reading: PVS6Reading): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=homeConsumptionAccessory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"homeConsumptionAccessory.d.ts","sourceRoot":"","sources":["../src/homeConsumptionAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAW,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,qBAAa,wBAAwB;IASjC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAR3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAM;IAErC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAK;gBAGP,QAAQ,EAAE,YAAY,EACvC,SAAS,EAAE,iBAAiB,EAE5B,sBAAsB,EAAE,GAAG,EAC3B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM;IA2CtB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;CAmBzC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HomeConsumptionAccessory = void 0;
|
|
4
|
+
const eveCharacteristics_1 = require("./eveCharacteristics");
|
|
5
|
+
class HomeConsumptionAccessory {
|
|
6
|
+
constructor(platform, accessory,
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
+
FakeGatoHistoryService, displayName, serialNumber) {
|
|
9
|
+
this.platform = platform;
|
|
10
|
+
this.lastPowerW = 0;
|
|
11
|
+
this.lastEnergyKWh = 0;
|
|
12
|
+
const { Characteristic } = platform;
|
|
13
|
+
const { EveWatts, EveKWh } = platform.eveChars;
|
|
14
|
+
const infoService = accessory.getService(platform.Service.AccessoryInformation) ??
|
|
15
|
+
accessory.addService(platform.Service.AccessoryInformation);
|
|
16
|
+
infoService
|
|
17
|
+
.setCharacteristic(Characteristic.Manufacturer, 'SunStrong')
|
|
18
|
+
.setCharacteristic(Characteristic.Model, 'PVS6')
|
|
19
|
+
.setCharacteristic(Characteristic.SerialNumber, `${serialNumber}-home`);
|
|
20
|
+
const existingService = accessory.services.find(s => s.UUID === eveCharacteristics_1.EVE_ENERGY_SERVICE_UUID);
|
|
21
|
+
this.service = existingService ??
|
|
22
|
+
accessory.addService(new platform.api.hap.Service(displayName, eveCharacteristics_1.EVE_ENERGY_SERVICE_UUID));
|
|
23
|
+
this.service.setCharacteristic(Characteristic.Name, displayName);
|
|
24
|
+
// On = true when site is drawing power (always true in practice).
|
|
25
|
+
this.service
|
|
26
|
+
.getCharacteristic(Characteristic.On)
|
|
27
|
+
.onGet(() => this.lastPowerW > 0)
|
|
28
|
+
.onSet(async () => {
|
|
29
|
+
this.service.updateCharacteristic(Characteristic.On, this.lastPowerW > 0);
|
|
30
|
+
});
|
|
31
|
+
this.service
|
|
32
|
+
.getCharacteristic(Characteristic.OutletInUse)
|
|
33
|
+
.onGet(() => true);
|
|
34
|
+
this.service
|
|
35
|
+
.getCharacteristic(EveWatts)
|
|
36
|
+
.onGet(() => this.lastPowerW);
|
|
37
|
+
this.service
|
|
38
|
+
.getCharacteristic(EveKWh)
|
|
39
|
+
.onGet(() => this.lastEnergyKWh);
|
|
40
|
+
this.historyService = new FakeGatoHistoryService('energy', accessory, { storage: 'fs' });
|
|
41
|
+
}
|
|
42
|
+
updateValues(reading) {
|
|
43
|
+
const { Characteristic } = this.platform;
|
|
44
|
+
const { EveWatts, EveKWh } = this.platform.eveChars;
|
|
45
|
+
this.lastPowerW = reading.siteLoadPowerW;
|
|
46
|
+
this.lastEnergyKWh = reading.homeConsumptionKWh;
|
|
47
|
+
this.service.updateCharacteristic(Characteristic.On, this.lastPowerW > 0);
|
|
48
|
+
this.service.updateCharacteristic(Characteristic.OutletInUse, true);
|
|
49
|
+
this.service.updateCharacteristic(EveWatts, this.lastPowerW);
|
|
50
|
+
this.service.updateCharacteristic(EveKWh, this.lastEnergyKWh);
|
|
51
|
+
this.historyService.addEntry({
|
|
52
|
+
time: Math.round(Date.now() / 1000),
|
|
53
|
+
power: this.lastPowerW,
|
|
54
|
+
});
|
|
55
|
+
this.platform.log.debug(`Home Consumption: ${this.lastPowerW}W ${this.lastEnergyKWh.toFixed(3)}kWh`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.HomeConsumptionAccessory = HomeConsumptionAccessory;
|
|
59
|
+
//# sourceMappingURL=homeConsumptionAccessory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"homeConsumptionAccessory.js","sourceRoot":"","sources":["../src/homeConsumptionAccessory.ts"],"names":[],"mappings":"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"}
|
package/dist/platform.d.ts
CHANGED
|
@@ -7,19 +7,28 @@ export declare class PVS6Platform implements DynamicPlatformPlugin {
|
|
|
7
7
|
readonly eveChars: EveChars;
|
|
8
8
|
readonly log: Logger;
|
|
9
9
|
readonly accessories: PlatformAccessory[];
|
|
10
|
-
private
|
|
10
|
+
private client;
|
|
11
11
|
private readonly config;
|
|
12
12
|
private readonly pollIntervalMs;
|
|
13
13
|
private solarAccessory?;
|
|
14
14
|
private gridImportAccessory?;
|
|
15
15
|
private gridExportAccessory?;
|
|
16
|
+
private homeConsumptionAccessory?;
|
|
16
17
|
private pollTimer?;
|
|
17
18
|
private pollInFlight;
|
|
18
19
|
private backedOff;
|
|
20
|
+
private authGeneration;
|
|
21
|
+
private lastSuccessfulPollTime;
|
|
22
|
+
private rediscovering;
|
|
19
23
|
constructor(log: Logger, config: PlatformConfig, api: API);
|
|
20
24
|
configureAccessory(accessory: PlatformAccessory): void;
|
|
25
|
+
private resolveConfig;
|
|
21
26
|
private setupAccessories;
|
|
22
27
|
private getOrCreateAccessory;
|
|
28
|
+
private get discoveryEnabled();
|
|
29
|
+
private checkRediscovery;
|
|
30
|
+
private triggerRediscovery;
|
|
31
|
+
private stopPolling;
|
|
23
32
|
private startAuthAndPolling;
|
|
24
33
|
private startPolling;
|
|
25
34
|
private enterBackoff;
|
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,EACL,GAAG,EACH,cAAc,EACd,qBAAqB,EACrB,MAAM,EACN,iBAAiB,EACjB,cAAc,EACd,OAAO,EACR,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EACH,cAAc,EACd,qBAAqB,EACrB,MAAM,EACN,iBAAiB,EACjB,cAAc,EACd,OAAO,EACR,MAAM,YAAY,CAAC;AAQpB,OAAO,EAA4B,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAS1E,qBAAa,YAAa,YAAW,qBAAqB;IACxD,SAAgB,OAAO,EAAE,OAAO,OAAO,CAAC;IACxC,SAAgB,cAAc,EAAE,OAAO,cAAc,CAAC;IACtD,SAAgB,GAAG,EAAE,GAAG,CAAC;IACzB,SAAgB,QAAQ,EAAE,QAAQ,CAAC;IACnC,SAAgB,GAAG,EAAE,MAAM,CAAC;IAE5B,SAAgB,WAAW,EAAE,iBAAiB,EAAE,CAAM;IAGtD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,mBAAmB,CAAC,CAAsB;IAClD,OAAO,CAAC,mBAAmB,CAAC,CAAsB;IAClD,OAAO,CAAC,wBAAwB,CAAC,CAA2B;IAE5D,OAAO,CAAC,SAAS,CAAC,CAAiC;IACnD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;IAG1B,OAAO,CAAC,cAAc,CAAK;IAG3B,OAAO,CAAC,sBAAsB,CAAc;IAC5C,OAAO,CAAC,aAAa,CAAS;gBAG5B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,GAAG;IA2CV,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;YAUxC,aAAa;IAyB3B,OAAO,CAAC,gBAAgB;IAqDxB,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,KAAK,gBAAgB,GAE3B;IAID,OAAO,CAAC,gBAAgB;YAQV,kBAAkB;IAwBhC,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,YAAY;IAuDpB,OAAO,CAAC,YAAY;CAOrB"}
|
package/dist/platform.js
CHANGED
|
@@ -6,16 +6,24 @@ const pvs6Client_1 = require("./pvs6Client");
|
|
|
6
6
|
const solarAccessory_1 = require("./solarAccessory");
|
|
7
7
|
const gridImportAccessory_1 = require("./gridImportAccessory");
|
|
8
8
|
const gridExportAccessory_1 = require("./gridExportAccessory");
|
|
9
|
+
const homeConsumptionAccessory_1 = require("./homeConsumptionAccessory");
|
|
9
10
|
const eveCharacteristics_1 = require("./eveCharacteristics");
|
|
11
|
+
const pvs6Discovery_1 = require("./pvs6Discovery");
|
|
10
12
|
const MIN_POLL_INTERVAL = 5;
|
|
11
13
|
const AUTH_RETRY_MS = 30000;
|
|
12
14
|
const AUTH_BACKOFF_MS = 60000;
|
|
13
15
|
const OVERLOAD_BACKOFF_MS = 15000;
|
|
16
|
+
const REDISCOVERY_THRESHOLD_MS = 2 * 60 * 60 * 1000; // 2 hours
|
|
14
17
|
class PVS6Platform {
|
|
15
18
|
constructor(log, config, api) {
|
|
16
19
|
this.accessories = [];
|
|
17
20
|
this.pollInFlight = false;
|
|
18
21
|
this.backedOff = false;
|
|
22
|
+
// Incremented when re-discovery fires so stale auth-retry timeouts know to abort.
|
|
23
|
+
this.authGeneration = 0;
|
|
24
|
+
// Tracks when the last successful poll data was received, for re-discovery gating.
|
|
25
|
+
this.lastSuccessfulPollTime = Date.now();
|
|
26
|
+
this.rediscovering = false;
|
|
19
27
|
this.log = log;
|
|
20
28
|
this.api = api;
|
|
21
29
|
this.Service = api.hap.Service;
|
|
@@ -23,27 +31,26 @@ class PVS6Platform {
|
|
|
23
31
|
this.eveChars = (0, eveCharacteristics_1.createEveCharacteristics)(api);
|
|
24
32
|
const pvs6Config = config;
|
|
25
33
|
this.config = pvs6Config;
|
|
26
|
-
if (!pvs6Config.host || !pvs6Config.serialNumber) {
|
|
27
|
-
this.log.error('Missing required config: host and serialNumber are required.');
|
|
28
|
-
this.client = new pvs6Client_1.PVS6Client('', '', log);
|
|
29
|
-
this.pollIntervalMs = MIN_POLL_INTERVAL * 1000;
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
34
|
let pollInterval = pvs6Config.pollInterval ?? 10;
|
|
33
35
|
if (pollInterval < MIN_POLL_INTERVAL) {
|
|
34
36
|
this.log.warn(`pollInterval ${pollInterval}s is below minimum; clamping to ${MIN_POLL_INTERVAL}s`);
|
|
35
37
|
pollInterval = MIN_POLL_INTERVAL;
|
|
36
38
|
}
|
|
37
39
|
this.pollIntervalMs = pollInterval * 1000;
|
|
38
|
-
this.client = new pvs6Client_1.PVS6Client(pvs6Config.host, pvs6Config.serialNumber, log);
|
|
39
40
|
this.log.info('Finished initializing platform:', config.name ?? settings_1.PLATFORM_NAME);
|
|
40
41
|
this.api.on('didFinishLaunching', () => {
|
|
41
|
-
this.log.debug('didFinishLaunching — setting up accessories
|
|
42
|
-
// fakegato-history must be loaded after the api is fully initialised
|
|
42
|
+
this.log.debug('didFinishLaunching — resolving config, setting up accessories');
|
|
43
43
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
44
44
|
const FakeGatoHistoryService = require('fakegato-history')(this.api);
|
|
45
|
-
this.
|
|
46
|
-
|
|
45
|
+
this.resolveConfig()
|
|
46
|
+
.then(({ host, serialNumber }) => {
|
|
47
|
+
this.client = new pvs6Client_1.PVS6Client(host, serialNumber, this.log);
|
|
48
|
+
this.setupAccessories(FakeGatoHistoryService, serialNumber);
|
|
49
|
+
this.startAuthAndPolling();
|
|
50
|
+
})
|
|
51
|
+
.catch((err) => {
|
|
52
|
+
this.log.error(`Cannot start PVS6 platform: ${err.message}`);
|
|
53
|
+
});
|
|
47
54
|
});
|
|
48
55
|
this.api.on('shutdown', () => {
|
|
49
56
|
if (this.pollTimer) {
|
|
@@ -56,10 +63,35 @@ class PVS6Platform {
|
|
|
56
63
|
this.log.info('Loading accessory from cache:', accessory.displayName);
|
|
57
64
|
this.accessories.push(accessory);
|
|
58
65
|
}
|
|
66
|
+
// Determines host + serialNumber from config or mDNS discovery.
|
|
67
|
+
//
|
|
68
|
+
// autoDiscover: true → always run mDNS discovery; host/serialNumber in config are ignored.
|
|
69
|
+
// autoDiscover: false → must supply both host and serialNumber manually; no mDNS.
|
|
70
|
+
// autoDiscover: unset → use config values if both are present, otherwise discover what's missing.
|
|
71
|
+
async resolveConfig() {
|
|
72
|
+
const { host, serialNumber, autoDiscover } = this.config;
|
|
73
|
+
if (autoDiscover === false) {
|
|
74
|
+
if (!host || !serialNumber) {
|
|
75
|
+
throw new Error('host and serialNumber are required when Auto Discover is disabled');
|
|
76
|
+
}
|
|
77
|
+
return { host, serialNumber };
|
|
78
|
+
}
|
|
79
|
+
if (autoDiscover === true) {
|
|
80
|
+
return (0, pvs6Discovery_1.discoverPVS6)(this.log);
|
|
81
|
+
}
|
|
82
|
+
// autoDiscover not set: use config if complete, otherwise discover what's missing.
|
|
83
|
+
if (host && serialNumber) {
|
|
84
|
+
return { host, serialNumber };
|
|
85
|
+
}
|
|
86
|
+
const discovered = await (0, pvs6Discovery_1.discoverPVS6)(this.log);
|
|
87
|
+
return {
|
|
88
|
+
host: host ?? discovered.host,
|
|
89
|
+
serialNumber: serialNumber ?? discovered.serialNumber,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
59
92
|
setupAccessories(
|
|
60
93
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
61
|
-
FakeGatoHistoryService) {
|
|
62
|
-
const { serialNumber } = this.config;
|
|
94
|
+
FakeGatoHistoryService, serialNumber) {
|
|
63
95
|
// Solar Production is always registered.
|
|
64
96
|
const solarName = this.config.solarName ?? 'Solar Production';
|
|
65
97
|
const solarUuid = this.api.hap.uuid.generate(`${serialNumber}-solar`);
|
|
@@ -73,6 +105,12 @@ class PVS6Platform {
|
|
|
73
105
|
const exportUuid = this.api.hap.uuid.generate(`${serialNumber}-grid-export`);
|
|
74
106
|
this.gridExportAccessory = new gridExportAccessory_1.GridExportAccessory(this, this.getOrCreateAccessory(exportUuid, exportName), FakeGatoHistoryService, exportName, serialNumber);
|
|
75
107
|
}
|
|
108
|
+
// Home Consumption is optional (default: disabled).
|
|
109
|
+
if (this.config.accessories?.homeConsumption === true) {
|
|
110
|
+
const homeName = this.config.homeConsumptionName ?? 'Home Consumption';
|
|
111
|
+
const homeUuid = this.api.hap.uuid.generate(`${serialNumber}-home`);
|
|
112
|
+
this.homeConsumptionAccessory = new homeConsumptionAccessory_1.HomeConsumptionAccessory(this, this.getOrCreateAccessory(homeUuid, homeName), FakeGatoHistoryService, homeName, serialNumber);
|
|
113
|
+
}
|
|
76
114
|
}
|
|
77
115
|
getOrCreateAccessory(uuid, displayName) {
|
|
78
116
|
const existing = this.accessories.find(a => a.UUID === uuid);
|
|
@@ -88,20 +126,81 @@ class PVS6Platform {
|
|
|
88
126
|
this.accessories.push(accessory);
|
|
89
127
|
return accessory;
|
|
90
128
|
}
|
|
129
|
+
// autoDiscover === false means the user pinned specific host/serial — never re-discover.
|
|
130
|
+
get discoveryEnabled() {
|
|
131
|
+
return this.config.autoDiscover !== false;
|
|
132
|
+
}
|
|
133
|
+
// If the device has been unreachable for 2 hours, attempt mDNS re-discovery.
|
|
134
|
+
// Not triggered when autoDiscover is explicitly false.
|
|
135
|
+
checkRediscovery() {
|
|
136
|
+
if (!this.discoveryEnabled)
|
|
137
|
+
return;
|
|
138
|
+
if (this.rediscovering)
|
|
139
|
+
return;
|
|
140
|
+
if (Date.now() - this.lastSuccessfulPollTime > REDISCOVERY_THRESHOLD_MS) {
|
|
141
|
+
void this.triggerRediscovery();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async triggerRediscovery() {
|
|
145
|
+
if (this.rediscovering)
|
|
146
|
+
return;
|
|
147
|
+
this.rediscovering = true;
|
|
148
|
+
this.log.warn('PVS6 unreachable for 2+ hours — attempting mDNS re-discovery...');
|
|
149
|
+
try {
|
|
150
|
+
const { host, serialNumber } = await (0, pvs6Discovery_1.discoverPVS6)(this.log);
|
|
151
|
+
this.log.info(`Re-discovery found PVS6 at ${host} (serial: ${serialNumber}) — reconnecting`);
|
|
152
|
+
// Increment generation to cancel any pending auth-retry timeouts.
|
|
153
|
+
this.authGeneration++;
|
|
154
|
+
this.stopPolling();
|
|
155
|
+
this.client = new pvs6Client_1.PVS6Client(host, serialNumber, this.log);
|
|
156
|
+
this.lastSuccessfulPollTime = Date.now();
|
|
157
|
+
this.startAuthAndPolling();
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
161
|
+
this.log.warn(`mDNS re-discovery failed: ${msg} — will try again in 2 hours`);
|
|
162
|
+
// Reset the clock so the next attempt is 2 hours from now, not immediately.
|
|
163
|
+
this.lastSuccessfulPollTime = Date.now();
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
this.rediscovering = false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
stopPolling() {
|
|
170
|
+
if (this.pollTimer) {
|
|
171
|
+
clearInterval(this.pollTimer);
|
|
172
|
+
this.pollTimer = undefined;
|
|
173
|
+
}
|
|
174
|
+
this.pollInFlight = false;
|
|
175
|
+
this.backedOff = false;
|
|
176
|
+
}
|
|
91
177
|
startAuthAndPolling() {
|
|
178
|
+
if (this.rediscovering)
|
|
179
|
+
return;
|
|
180
|
+
const generation = this.authGeneration;
|
|
92
181
|
this.client
|
|
93
182
|
.authenticate()
|
|
94
183
|
.then(() => {
|
|
184
|
+
if (generation !== this.authGeneration)
|
|
185
|
+
return;
|
|
95
186
|
this.log.info('Authenticated with PVS6 — starting polling');
|
|
96
187
|
this.startPolling();
|
|
97
188
|
})
|
|
98
189
|
.catch((err) => {
|
|
190
|
+
if (generation !== this.authGeneration)
|
|
191
|
+
return;
|
|
192
|
+
this.checkRediscovery();
|
|
99
193
|
this.log.error(`Authentication failed: ${err.message}. Retrying in ${AUTH_RETRY_MS / 1000}s`);
|
|
100
|
-
setTimeout(() =>
|
|
194
|
+
setTimeout(() => {
|
|
195
|
+
if (generation !== this.authGeneration)
|
|
196
|
+
return;
|
|
197
|
+
this.startAuthAndPolling();
|
|
198
|
+
}, AUTH_RETRY_MS);
|
|
101
199
|
});
|
|
102
200
|
}
|
|
103
201
|
startPolling() {
|
|
104
202
|
this.pollTimer = setInterval(async () => {
|
|
203
|
+
this.checkRediscovery();
|
|
105
204
|
if (this.pollInFlight) {
|
|
106
205
|
this.log.debug('Poll skipped — previous request still in flight');
|
|
107
206
|
return;
|
|
@@ -113,9 +212,11 @@ class PVS6Platform {
|
|
|
113
212
|
this.pollInFlight = true;
|
|
114
213
|
try {
|
|
115
214
|
const reading = await this.client.poll();
|
|
215
|
+
this.lastSuccessfulPollTime = Date.now();
|
|
116
216
|
this.solarAccessory?.updateValues(reading);
|
|
117
217
|
this.gridImportAccessory?.updateValues(reading);
|
|
118
218
|
this.gridExportAccessory?.updateValues(reading);
|
|
219
|
+
this.homeConsumptionAccessory?.updateValues(reading);
|
|
119
220
|
}
|
|
120
221
|
catch (err) {
|
|
121
222
|
if (err instanceof pvs6Client_1.HttpError) {
|
package/dist/platform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":";;;AAUA,yCAAoE;AACpE,6CAAqD;AACrD,qDAAkD;AAClD,+DAA4D;AAC5D,+DAA4D;AAC5D,6DAA0E;
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|
package/dist/pvs6Client.d.ts
CHANGED
package/dist/pvs6Client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pvs6Client.d.ts","sourceRoot":"","sources":["../src/pvs6Client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"pvs6Client.d.ts","sourceRoot":"","sources":["../src/pvs6Client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,SAAU,SAAQ,KAAK;aAEhB,UAAU,EAAE,MAAM;gBAAlB,UAAU,EAAE,MAAM,EAClC,OAAO,EAAE,MAAM;CAKlB;AAKD,qBAAa,UAAU;IAsBnB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAvBtB,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,eAAe,CAAK;IAG5B,OAAO,CAAC,WAAW,CAQjB;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAQ;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAGxB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM;IAG9B,OAAO,KAAK,QAAQ,GAEnB;IAIK,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB7B,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;YAMpB,UAAU;IAgExB,OAAO,CAAC,YAAY;IAqCpB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,GAAG;IAeX,OAAO,CAAC,UAAU;CAsDnB"}
|
package/dist/pvs6Client.js
CHANGED
|
@@ -60,6 +60,8 @@ class PVS6Client {
|
|
|
60
60
|
netPowerW: 0,
|
|
61
61
|
gridImportKWh: 0,
|
|
62
62
|
gridExportKWh: 0,
|
|
63
|
+
siteLoadPowerW: 0,
|
|
64
|
+
homeConsumptionKWh: 0,
|
|
63
65
|
};
|
|
64
66
|
}
|
|
65
67
|
get password() {
|
|
@@ -162,18 +164,24 @@ class PVS6Client {
|
|
|
162
164
|
const pvPowerKW = this.num(livedata['/sys/livedata/pv_p'], 'pv_p');
|
|
163
165
|
const pvEnergyKWh = this.num(livedata['/sys/livedata/pv_en'], 'pv_en');
|
|
164
166
|
const netPowerKW = this.num(livedata['/sys/livedata/net_p'], 'net_p');
|
|
167
|
+
const siteLoadPowerKW = this.num(livedata['/sys/livedata/site_load_p'], 'site_load_p');
|
|
165
168
|
const gridImportKWhRaw = consIdx !== null
|
|
166
169
|
? this.num(mdata[`/sys/devices/meter/${consIdx}/posLtea3phsumKwh`], 'cons.posLtea3phsumKwh')
|
|
167
170
|
: null;
|
|
168
171
|
const gridExportKWhRaw = consIdx !== null
|
|
169
172
|
? this.num(mdata[`/sys/devices/meter/${consIdx}/negLtea3phsumKwh`], 'cons.negLtea3phsumKwh')
|
|
170
173
|
: null;
|
|
174
|
+
const resolvedPvEnergyKWh = pvEnergyKWh ?? last.pvEnergyKWh;
|
|
175
|
+
const resolvedGridImportKWh = gridImportKWhRaw ?? last.gridImportKWh;
|
|
176
|
+
const resolvedGridExportKWh = gridExportKWhRaw ?? last.gridExportKWh;
|
|
171
177
|
const reading = {
|
|
172
178
|
pvPowerW: pvPowerKW !== null ? Math.round(pvPowerKW * 1000 * 10) / 10 : last.pvPowerW,
|
|
173
|
-
pvEnergyKWh:
|
|
179
|
+
pvEnergyKWh: resolvedPvEnergyKWh,
|
|
174
180
|
netPowerW: netPowerKW !== null ? Math.round(netPowerKW * 1000 * 10) / 10 : last.netPowerW,
|
|
175
|
-
gridImportKWh:
|
|
176
|
-
gridExportKWh:
|
|
181
|
+
gridImportKWh: resolvedGridImportKWh,
|
|
182
|
+
gridExportKWh: resolvedGridExportKWh,
|
|
183
|
+
siteLoadPowerW: siteLoadPowerKW !== null ? Math.round(siteLoadPowerKW * 1000 * 10) / 10 : last.siteLoadPowerW,
|
|
184
|
+
homeConsumptionKWh: resolvedPvEnergyKWh + resolvedGridImportKWh - resolvedGridExportKWh,
|
|
177
185
|
};
|
|
178
186
|
this.lastReading = reading;
|
|
179
187
|
return reading;
|
package/dist/pvs6Client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pvs6Client.js","sourceRoot":"","sources":["../src/pvs6Client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA+B;
|
|
1
|
+
{"version":3,"file":"pvs6Client.js","sourceRoot":"","sources":["../src/pvs6Client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pvs6Discovery.d.ts","sourceRoot":"","sources":["../src/pvs6Discovery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AA2GD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAEtE"}
|
|
@@ -0,0 +1,95 @@
|
|
|
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
|
+
exports.discoverPVS6 = discoverPVS6;
|
|
7
|
+
const bonjour_hap_1 = __importDefault(require("bonjour-hap"));
|
|
8
|
+
const child_process_1 = require("child_process");
|
|
9
|
+
const DISCOVERY_TIMEOUT_MS = 30000;
|
|
10
|
+
const PVS6_SERVICE_TYPE = 'pvs6';
|
|
11
|
+
function discoverPVS6Bonjour(log) {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
log.info(`mDNS: scanning for _${PVS6_SERVICE_TYPE}._tcp — will time out in ${DISCOVERY_TIMEOUT_MS / 1000}s`);
|
|
14
|
+
const bonjour = (0, bonjour_hap_1.default)();
|
|
15
|
+
const browser = bonjour.find({ type: PVS6_SERVICE_TYPE });
|
|
16
|
+
const cleanup = (cb) => {
|
|
17
|
+
browser.stop();
|
|
18
|
+
bonjour.destroy(cb);
|
|
19
|
+
};
|
|
20
|
+
const timer = setTimeout(() => {
|
|
21
|
+
cleanup(() => {
|
|
22
|
+
reject(new Error(`mDNS discovery timed out after ${DISCOVERY_TIMEOUT_MS / 1000}s — ` +
|
|
23
|
+
'set host and serialNumber in config to skip auto-discovery'));
|
|
24
|
+
});
|
|
25
|
+
}, DISCOVERY_TIMEOUT_MS);
|
|
26
|
+
browser.on('up', (service) => {
|
|
27
|
+
// Strip trailing dot that mDNS hostnames include (e.g. "pvs.local." → "pvs.local")
|
|
28
|
+
const host = service.host?.replace(/\.$/, '');
|
|
29
|
+
const serialNumber = service.txt?.serialnum;
|
|
30
|
+
if (!host || !serialNumber) {
|
|
31
|
+
log.warn(`mDNS: PVS6 service found but missing host or serialnum — host=${host}, txt=${JSON.stringify(service.txt)}`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
clearTimeout(timer);
|
|
35
|
+
cleanup(() => {
|
|
36
|
+
log.info(`mDNS: discovered PVS6 at ${host} (serial: ${serialNumber})`);
|
|
37
|
+
resolve({ host, serialNumber });
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function discoverPVS6Avahi(log) {
|
|
43
|
+
return new Promise((resolve, reject) => {
|
|
44
|
+
log.info(`mDNS: using avahi-browse for Linux discovery — will time out in ${DISCOVERY_TIMEOUT_MS / 1000}s`);
|
|
45
|
+
const proc = (0, child_process_1.spawn)('avahi-browse', ['-r', '-p', `_${PVS6_SERVICE_TYPE}._tcp`]);
|
|
46
|
+
let resolved = false;
|
|
47
|
+
const timer = setTimeout(() => {
|
|
48
|
+
proc.kill();
|
|
49
|
+
reject(new Error(`mDNS discovery timed out after ${DISCOVERY_TIMEOUT_MS / 1000}s — ` +
|
|
50
|
+
'set host and serialNumber in config to skip auto-discovery'));
|
|
51
|
+
}, DISCOVERY_TIMEOUT_MS);
|
|
52
|
+
proc.stdout.on('data', (data) => {
|
|
53
|
+
if (resolved)
|
|
54
|
+
return;
|
|
55
|
+
for (const line of data.toString().split('\n')) {
|
|
56
|
+
if (resolved || !line.startsWith('='))
|
|
57
|
+
continue;
|
|
58
|
+
// Parseable resolved format: =;iface;proto;name;type;domain;hostname;address;port;txt...
|
|
59
|
+
const parts = line.split(';');
|
|
60
|
+
if (parts.length < 10)
|
|
61
|
+
continue;
|
|
62
|
+
const host = parts[6]?.replace(/\.$/, '');
|
|
63
|
+
const txtField = parts.slice(9).join(';');
|
|
64
|
+
const serialNumber = txtField.match(/"serialnum=([^"]+)"/)?.[1];
|
|
65
|
+
if (!host || !serialNumber) {
|
|
66
|
+
log.warn(`mDNS: PVS6 found but missing host or serialnum — host=${host}, txt=${txtField}`);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
resolved = true;
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
proc.kill();
|
|
72
|
+
log.info(`mDNS: discovered PVS6 at ${host} (serial: ${serialNumber})`);
|
|
73
|
+
resolve({ host, serialNumber });
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
proc.stderr.on('data', (data) => {
|
|
77
|
+
log.debug(`avahi-browse: ${data.toString().trim()}`);
|
|
78
|
+
});
|
|
79
|
+
proc.on('error', (err) => {
|
|
80
|
+
clearTimeout(timer);
|
|
81
|
+
reject(new Error(`avahi-browse failed: ${err.message}`));
|
|
82
|
+
});
|
|
83
|
+
proc.on('close', (code) => {
|
|
84
|
+
if (!resolved) {
|
|
85
|
+
clearTimeout(timer);
|
|
86
|
+
reject(new Error(`avahi-browse exited (code ${code}) without finding PVS6 — ` +
|
|
87
|
+
'set host and serialNumber in config to skip auto-discovery'));
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function discoverPVS6(log) {
|
|
93
|
+
return process.platform === 'linux' ? discoverPVS6Avahi(log) : discoverPVS6Bonjour(log);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=pvs6Discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pvs6Discovery.js","sourceRoot":"","sources":["../src/pvs6Discovery.ts"],"names":[],"mappings":";;;;;AAkHA,oCAEC;AApHD,8DAAsD;AACtD,iDAAsC;AAQtC,MAAM,oBAAoB,GAAG,KAAM,CAAC;AACpC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC,SAAS,mBAAmB,CAAC,GAAW;IACtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,GAAG,CAAC,IAAI,CAAC,uBAAuB,iBAAiB,4BAA4B,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC;QAE7G,MAAM,OAAO,GAAG,IAAA,qBAAO,GAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAE1D,MAAM,OAAO,GAAG,CAAC,EAAc,EAAE,EAAE;YACjC,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,OAAO,CAAC,GAAG,EAAE;gBACX,MAAM,CAAC,IAAI,KAAK,CACd,kCAAkC,oBAAoB,GAAG,IAAI,MAAM;oBACnE,4DAA4D,CAC7D,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAEzB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,OAAuB,EAAE,EAAE;YAC3C,mFAAmF;YACnF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC;YAE5C,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC3B,GAAG,CAAC,IAAI,CAAC,iEAAiE,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACtH,OAAO;YACT,CAAC;YAED,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,GAAG,EAAE;gBACX,GAAG,CAAC,IAAI,CAAC,4BAA4B,IAAI,aAAa,YAAY,GAAG,CAAC,CAAC;gBACvE,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,GAAG,CAAC,IAAI,CAAC,mEAAmE,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC;QAE5G,MAAM,IAAI,GAAG,IAAA,qBAAK,EAAC,cAAc,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,iBAAiB,OAAO,CAAC,CAAC,CAAC;QAE/E,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,KAAK,CACd,kCAAkC,oBAAoB,GAAG,IAAI,MAAM;gBACnE,4DAA4D,CAC7D,CAAC,CAAC;QACL,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAEzB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACtC,IAAI,QAAQ;gBAAE,OAAO;YACrB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/C,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAChD,yFAAyF;gBACzF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;oBAAE,SAAS;gBAEhC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAEhE,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBAC3B,GAAG,CAAC,IAAI,CAAC,yDAAyD,IAAI,SAAS,QAAQ,EAAE,CAAC,CAAC;oBAC3F,SAAS;gBACX,CAAC;gBAED,QAAQ,GAAG,IAAI,CAAC;gBAChB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,GAAG,CAAC,IAAI,CAAC,4BAA4B,IAAI,aAAa,YAAY,GAAG,CAAC,CAAC;gBACvE,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACtC,GAAG,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,MAAM,CAAC,IAAI,KAAK,CACd,6BAA6B,IAAI,2BAA2B;oBAC5D,4DAA4D,CAC7D,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,YAAY,CAAC,GAAW;IACtC,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;AAC1F,CAAC"}
|
package/dist/settings.d.ts
CHANGED
|
@@ -2,14 +2,17 @@ import { PlatformConfig } from 'homebridge';
|
|
|
2
2
|
export declare const PLATFORM_NAME = "PVS6";
|
|
3
3
|
export declare const PLUGIN_NAME = "homebridge-pvs6";
|
|
4
4
|
export interface PVS6Config extends PlatformConfig {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
autoDiscover?: boolean;
|
|
6
|
+
host?: string;
|
|
7
|
+
serialNumber?: string;
|
|
7
8
|
pollInterval?: number;
|
|
8
9
|
accessories?: {
|
|
9
10
|
grid?: boolean;
|
|
11
|
+
homeConsumption?: boolean;
|
|
10
12
|
};
|
|
11
13
|
solarName?: string;
|
|
12
14
|
gridName?: string;
|
|
13
15
|
gridExportName?: string;
|
|
16
|
+
homeConsumptionName?: string;
|
|
14
17
|
}
|
|
15
18
|
//# sourceMappingURL=settings.d.ts.map
|
package/dist/settings.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,aAAa,SAAS,CAAC;AACpC,eAAO,MAAM,WAAW,oBAAoB,CAAC;AAE7C,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,aAAa,SAAS,CAAC;AACpC,eAAO,MAAM,WAAW,oBAAoB,CAAC;AAE7C,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE;QACZ,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "homebridge-pvs6",
|
|
3
3
|
"displayName": "PVS6 Solar",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.2.0",
|
|
5
5
|
"description": "Homebridge plugin for SunStrong PVS6 solar monitoring — Eve Energy accessories with fakegato history.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "David Carson",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
},
|
|
19
19
|
"engines": {
|
|
20
20
|
"node": ">=18.0.0",
|
|
21
|
-
"homebridge": ">=
|
|
21
|
+
"homebridge": ">=2.0.0"
|
|
22
22
|
},
|
|
23
23
|
"main": "dist/index.js",
|
|
24
24
|
"files": [
|
|
@@ -39,9 +39,10 @@
|
|
|
39
39
|
"energy"
|
|
40
40
|
],
|
|
41
41
|
"peerDependencies": {
|
|
42
|
-
"homebridge": ">=
|
|
42
|
+
"homebridge": ">=2.0.0"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
+
"bonjour-hap": "^3.0.0",
|
|
45
46
|
"fakegato-history": "^0.6.7"
|
|
46
47
|
},
|
|
47
48
|
"devDependencies": {
|