homebridge-nuheat2 1.2.10 → 1.2.11
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/CHANGELOG.md +7 -0
- package/README.md +5 -3
- package/config.schema.json +2 -6
- package/index.js +6 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,13 @@ All notable changes to this project should be documented in this file
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [1.2.11] - 2026-04-21
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Relax the optional `devices` and `groups` array item schema so Homebridge Config UI no longer shows validation errors for blank rows
|
|
12
|
+
- Ignore blank `devices` rows at runtime so they do not interfere with thermostat auto-discovery
|
|
13
|
+
|
|
7
14
|
## [1.2.10] - 2026-04-21
|
|
8
15
|
|
|
9
16
|
### Added
|
package/README.md
CHANGED
|
@@ -67,11 +67,11 @@ Most users should configure the plugin through Homebridge Config UI X, but the e
|
|
|
67
67
|
- `email`: MyNuheat account email address
|
|
68
68
|
- `Email`: Legacy alias still accepted for backward compatibility, but `email` is the preferred documented field
|
|
69
69
|
- `password`: MyNuheat account password
|
|
70
|
-
- `devices`: Optional list of thermostats to expose. If omitted or empty, every thermostat on the account will be discovered automatically
|
|
70
|
+
- `devices`: Optional list of thermostats to expose. If omitted or empty, every thermostat on the account will be discovered automatically. Blank rows in the UI are ignored
|
|
71
71
|
- `serialNumber`: Thermostat serial number from MyNuheat
|
|
72
72
|
- `autoPopulateAwayModeSwitches`: Automatically expose away-mode switches for all groups on the account
|
|
73
73
|
- `exposeScheduleSwitches`: Optionally expose a switch per thermostat that reflects whether the thermostat is following its schedule and can be turned on to resume the schedule
|
|
74
|
-
- `groups`: Optional allow-list of groups to expose as away-mode switches. This only affects group/away-mode accessories
|
|
74
|
+
- `groups`: Optional allow-list of groups to expose as away-mode switches. This only affects group/away-mode accessories. Blank rows in the UI are ignored
|
|
75
75
|
- `groupName`: Group name as shown in MyNuheat
|
|
76
76
|
- `holdLength`: Hold duration in minutes
|
|
77
77
|
- `refresh`: Poll interval in seconds, default `60`
|
|
@@ -138,10 +138,12 @@ npm test
|
|
|
138
138
|
GitHub Actions now handles two jobs for this repository:
|
|
139
139
|
|
|
140
140
|
- `.github/workflows/ci.yml` runs `npm ci`, `npm run typecheck`, and `npm test` on pushes and pull requests across Node 20, 22, and 24
|
|
141
|
-
- `.github/workflows/publish.yml` runs on pushes to `master` when `package.json` changes, re-runs the checks on Node 24,
|
|
141
|
+
- `.github/workflows/publish.yml` runs on pushes to `master` when `package.json` changes, re-runs the checks on Node 24, publishes to npm only when the `package.json` version is not already on the registry, and creates or updates the matching GitHub Release
|
|
142
142
|
|
|
143
143
|
The publish workflow also maps prerelease versions to npm dist-tags automatically. For example, `1.2.7-beta.1` publishes with the `beta` tag, while stable versions publish to `latest`.
|
|
144
144
|
|
|
145
|
+
Release notes are expected in `docs/release-notes/<version>.md`. The publish workflow will fail if that file is missing for the version in `package.json`, which makes the GitHub Release step part of the normal release checklist instead of a manual follow-up.
|
|
146
|
+
|
|
145
147
|
### Recommended npm Setup
|
|
146
148
|
|
|
147
149
|
Use npm trusted publishing rather than a long-lived automation token.
|
package/config.schema.json
CHANGED
|
@@ -43,11 +43,9 @@
|
|
|
43
43
|
"devices": {
|
|
44
44
|
"title": "Devices",
|
|
45
45
|
"type": "array",
|
|
46
|
+
"description": "Optional allow-list of thermostats to expose. Leave empty to auto-discover all thermostats on the account.",
|
|
46
47
|
"items": {
|
|
47
48
|
"type": "object",
|
|
48
|
-
"required": [
|
|
49
|
-
"serialNumber"
|
|
50
|
-
],
|
|
51
49
|
"properties": {
|
|
52
50
|
"serialNumber": {
|
|
53
51
|
"title": "Serial Number",
|
|
@@ -72,11 +70,9 @@
|
|
|
72
70
|
"groups": {
|
|
73
71
|
"title": "Groups",
|
|
74
72
|
"type": "array",
|
|
73
|
+
"description": "Optional allow-list of groups to expose as away-mode switches. Leave empty unless you want to add specific groups manually.",
|
|
75
74
|
"items": {
|
|
76
75
|
"type": "object",
|
|
77
|
-
"required": [
|
|
78
|
-
"groupName"
|
|
79
|
-
],
|
|
80
76
|
"properties": {
|
|
81
77
|
"groupName": {
|
|
82
78
|
"title": "Group Name",
|
package/index.js
CHANGED
|
@@ -74,6 +74,11 @@ class NuHeatPlatform {
|
|
|
74
74
|
typeof group.groupName === "string" &&
|
|
75
75
|
group.groupName.trim().length > 0);
|
|
76
76
|
}
|
|
77
|
+
getConfiguredDevices() {
|
|
78
|
+
return (this.config.devices || []).filter((device) => !!device &&
|
|
79
|
+
typeof device.serialNumber === "string" &&
|
|
80
|
+
device.serialNumber.trim().length > 0);
|
|
81
|
+
}
|
|
77
82
|
shouldManageGroups() {
|
|
78
83
|
return (!!this.config.autoPopulateAwayModeSwitches ||
|
|
79
84
|
this.getConfiguredGroups().length > 0);
|
|
@@ -154,7 +159,7 @@ class NuHeatPlatform {
|
|
|
154
159
|
}));
|
|
155
160
|
}
|
|
156
161
|
async setupThermostats() {
|
|
157
|
-
const deviceArray = this.
|
|
162
|
+
const deviceArray = this.getConfiguredDevices();
|
|
158
163
|
const response = await this.NuHeatAPI.refreshThermostats();
|
|
159
164
|
if (!response || !Array.isArray(response)) {
|
|
160
165
|
this.log.error("Error getting data from NuHeatAPI");
|