Skip to content

Commit ad45242

Browse files
committed
docs(changelog): update changelog and readme for v9.1 release. Refactor config queue.
1 parent 8222d92 commit ad45242

8 files changed

Lines changed: 166 additions & 62 deletions

File tree

Changelog

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ IntelliCenter security rationalization, JXi/LXi heater support, virtual IntelliC
1717
9. IntelliBrite light sequencing delay detection: OCP/ICP "gray-out" state now propagates to dashPanel via inbound A184 channel 0x94AF decode. Circuit button dims and disables clicks during theme sequencing.
1818
10. v3 light group Swim/Set/Sync commands: dashPanel triggers via v3 A184 protocol (channel 0x58A3, target 0x8AB1) instead of v1 rapid-toggle sequencing. Group and member circuits show disabled state until OCP confirms completion.
1919
11. Automatic lat/lon resolution from zip code: heliotrope sunrise/sunset calculations now fall back to a bundled US zip code coordinate table when latitude/longitude are not explicitly configured or provided via environment variables.
20-
21-
### New Features (continued)
2220
12. Alert notification management: full PUT `/config/alerts` endpoint for all 7 alert categories (circuits, pumps, ultratemp, chlorinator, intellichem, hybrid, connected gas) with Select All / Select None support. dashPanel pnlAlerts config UI with per-category accordion, checkbox list, and real-time selected/total counts.
2321
13. ICP→dashPanel alert sync: alert notification changes made on ICP now propagate to dashPanel in real-time via A168 cat=13 piggyback handler in the v3 early-return guard (same pattern as ISSUE-073 body capacity).
2422
14. v3 delay configuration: freeze cycle time, valve delay, and cooldown delay now decoded from A30 cat=0 sub=0 and writable via A168. dashPanel Delays panel binds `valveDelay` for ICv3 (was `pumpDelay`). Cancel delay endpoint added (`PUT /state/cancelDelay`).
@@ -30,22 +28,23 @@ IntelliCenter security rationalization, JXi/LXi heater support, virtual IntelliC
3028
20. dashPanel freeze protection UI: green indicator for freeze cycle, blue for manual override, subtitle text ("Freeze Cycle" / "Manual Override"), enhanced banner with per-body override detail.
3129

3230
### Bug Fixes
33-
10. IntelliCenter v3 circuit/light group eggTimer offset regression: outbound A168 cat=6 now sends 45-byte payload with eggTimer at bytes 40-41 (was incorrectly at 38-39). Inbound ExternalMessage.processGroupSettings also reads v3 offset. Added processEggTimer protection guard against OCP overwriting valid local values with 0.
34-
11. IntelliCenter V3 chlorinator: fixed payload format, improved superChlor handling, debounced spurious 255 values.
35-
12. JXi burner-on status: use bitmask check instead of equality for reliable detection.
36-
13. JXi/LXi heater: default RS485 address to 0x68/0x38.
37-
14. EquipmentStateMessage: header byte check to disambiguate IntelliCenter from IntelliTouch i9+3 (#1179).
38-
15. IntelliCenterBoard: process 3rd power center expansion modules correctly (#1171).
39-
16. Chlorinator ID fallback when `useChlorinator` is true in `setORPAsync`. Thanks to @johnny2678 — [PR #1178](https://github.com/tagyoureit/nodejs-poolController/pull/1178).
40-
17. Hayward remote control handler: fix no-op catch (#1182).
41-
18. ChemDoser: simplify singleMixPeriod loop.
42-
19. IntelliCenter v3 expansion panel decoding and plugin address management improvements.
43-
20. Schedule calculation crash when heliotrope invalid: `calcAdjustedTimes` now guards against undefined `dt` and missing lat/lon; `calcSchedule` null-checks `endTime` before calling `.getTime()`.
44-
21. Schedule `nsod` (tomorrow start-of-day) was calculated as yesterday due to copy-paste typo (`addHours(-24)` → `addHours(24)`).
45-
22. Alert bitmask mixed endianness: 4-byte selectors (IntelliChem, Hybrid) use little-endian while 1-2 byte selectors use big-endian. Encode (`maskToBytes`), decode (`extractAlertMask`), and piggyback decode (`applyAlertNotificationFromExternal`) all branch on byte count.
46-
23. A168 cat=11 security role write: fixed phantom duplicate creation from incorrect byte[2] and trailing bytes.
47-
24. dashPanel Save Remote response wrapper not unwrapped — `dataBind` crash on `type.desc` fixed.
48-
25. dashPanel freeze state race condition: body socket event fires before A204 byte[47] decode completes. Controller `state/all` handler now updates body labels and indicators atomically from the authoritative snapshot data.
31+
21. IntelliCenter v3 circuit/light group eggTimer offset regression: outbound A168 cat=6 now sends 45-byte payload with eggTimer at bytes 40-41 (was incorrectly at 38-39). Inbound ExternalMessage.processGroupSettings also reads v3 offset. Added processEggTimer protection guard against OCP overwriting valid local values with 0.
32+
22. IntelliCenter V3 chlorinator: fixed payload format, improved superChlor handling, debounced spurious 255 values.
33+
23. JXi burner-on status: use bitmask check instead of equality for reliable detection.
34+
24. JXi/LXi heater: default RS485 address to 0x68/0x38.
35+
25. EquipmentStateMessage: header byte check to disambiguate IntelliCenter from IntelliTouch i9+3 (#1179).
36+
26. IntelliCenterBoard: process 3rd power center expansion modules correctly (#1171).
37+
27. Chlorinator ID fallback when `useChlorinator` is true in `setORPAsync`. Thanks to @johnny2678 — [PR #1178](https://github.com/tagyoureit/nodejs-poolController/pull/1178).
38+
28. Hayward remote control handler: fix no-op catch (#1182).
39+
29. ChemDoser: simplify singleMixPeriod loop.
40+
30. IntelliCenter v3 expansion panel decoding and plugin address management improvements.
41+
31. Schedule calculation crash when heliotrope invalid: `calcAdjustedTimes` now guards against undefined `dt` and missing lat/lon; `calcSchedule` null-checks `endTime` before calling `.getTime()`.
42+
32. Schedule `nsod` (tomorrow start-of-day) was calculated as yesterday due to copy-paste typo (`addHours(-24)` → `addHours(24)`).
43+
33. Alert bitmask mixed endianness: 4-byte selectors (IntelliChem, Hybrid) use little-endian while 1-2 byte selectors use big-endian. Encode (`maskToBytes`), decode (`extractAlertMask`), and piggyback decode (`applyAlertNotificationFromExternal`) all branch on byte count.
44+
34. A168 cat=11 security role write: fixed phantom duplicate creation from incorrect byte[2] and trailing bytes.
45+
35. dashPanel Save Remote response wrapper not unwrapped — `dataBind` crash on `type.desc` fixed.
46+
36. dashPanel freeze state race condition: body socket event fires before A204 byte[47] decode completes. Controller `state/all` handler now updates body labels and indicators atomically from the authoritative snapshot data.
47+
37. RunOnce schedule type: skip `recalc` check that incorrectly expired one-shot schedules.
4948

5049
## 9.0.0
5150
Focused release on IntelliCenter v3.008 firmware compatibility, finishing the v3 work started in 8.4.1, plus the Regal Century pump Modbus fixes.

README.md

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
> **In the wild:** featured in the [TroubleFreePool IntelliCenter walk-through guide](https://www.troublefreepool.com/threads/pentair-intellicenter-pool-control-dashboard-instructional-guide.218514/) (thanks @MyAZPool). Actively maintained — questions welcome in [GitHub Discussions](https://github.com/tagyoureit/nodejs-poolController/discussions).
2727
2828
```diff
29-
+ Running IntelliCenter v3.008+? It's fully supported as of 9.0.
29+
+ Running IntelliCenter v3.008+? Fully supported as of 9.0, with security,
30+
+ heater, and chemistry improvements in 9.1.
3031
+ If anything looks off, please open a discussion with a replay capture.
31-
+ See discussion #1171 for ongoing v3 updates.
3232
```
3333

3434
## What is njsPC?
@@ -47,18 +47,38 @@ njsPC is a Node.js service that talks to your pool controller over RS-485 (or Sc
4747
|---|---|---|
4848
| **Controllers** | IntelliCenter, IntelliTouch, EasyTouch, SunTouch, Aqualink, IntelliCom, Nixie (standalone) | RS-485 (preferred) or ScreenLogic (network) |
4949
| **Pumps** | IntelliFlo VS / VSF / VF, IntelliFlo VS+SVRS, SuperFlo VS, Hayward Eco/TriStar VS, Hayward Relay VS, Whisperflo, single/two-speed, relay-controlled, Neptune Modbus, Regal (Century) Modbus | Regal added in 9.0 — [PR #1169](https://github.com/tagyoureit/nodejs-poolController/pull/1169) |
50-
| **Heaters** | Gas, solar, heat pump, hybrid (ETi / ETi250), MasterTemp, Max-E-Therm, UltraTemp / UltraTempDirect | |
51-
| **Chlorinators** | IntelliChlor, Aqua-Rite, OEM brands | Dual chlorinators supported via REM |
50+
| **Heaters** | Gas, solar, heat pump, hybrid (ETi / ETi250), MasterTemp, Max-E-Therm, UltraTemp / UltraTempDirect, Jandy JXi / LXi | JXi/LXi added in 9.1 — [discussion #1128](https://github.com/tagyoureit/nodejs-poolController/discussions/1128) |
51+
| **Chlorinators** | IntelliChlor, Aqua-Rite, OEM brands (physical and virtual) | Dual chlorinators supported via REM. Virtual chlorinator added in 9.1 |
5252
| **Lights** | IntelliBrite, MagicStream, Jandy WaterColors, Hayward ColorLogic, Pooltone (Florida Sunseeker), plus legacy SAM / SAL / Color Wheel / Photon Gen | |
53-
| **Chemistry** | IntelliChem (OCP-paired and standalone), Relay Equipment Manager (REM) | Atlas Scientific pH / ORP / EC probes, flow, pressure, temperature via REM |
53+
| **Chemistry** | IntelliChem (OCP-paired, standalone, and virtual), Relay Equipment Manager (REM) | Atlas Scientific pH / ORP / EC probes, flow, pressure, temperature via REM. Virtual IntelliChem added in 9.1 |
5454
| **Covers** | IntelliCenter cover configuration & control | Live-state feedback is limited on ICv3 |
5555
| **Filters** | Configuration, pressure monitoring, clean/dirty thresholds | |
5656
| **Valves** | Standard intake/return with diverted status | Intellivalve planned |
5757
| **Home Automation** | HomeKit/Siri (Homebridge), Home Assistant (via MQTT), Hubitat, SmartThings, MQTT, InfluxDB, ISY, Vera, Alexa | See [Home Automation Bindings](#home-automation-bindings) |
5858

59-
## What's new in 9.0
59+
## What's new in 9.1
6060

61-
9.0 focuses on IntelliCenter v3.008 firmware compatibility and finishes the v3 work started in 8.4.1.
61+
9.1 adds IntelliCenter security, Jandy JXi/LXi heater support, virtual chemistry equipment, and a batch of v3.008 refinements.
62+
63+
1. **IntelliCenter security** — full PIN-based role management (up to 9 roles, 22-section granular permissions) with session timeout, server-side write protection, and dashPanel integration (guest mode, lock icon, per-widget gating).
64+
2. **Jandy JXi / LXi heater protocol** — RS-485 support with fault message handling, bitmask burner-on detection, and correct default addresses ([discussion #1128](https://github.com/tagyoureit/nodejs-poolController/discussions/1128)).
65+
3. **Virtual IntelliChem** — alarm sync and API routes for testing chemistry without hardware.
66+
4. **Virtual chlorinator** — full emulation of chlorinator protocol responses.
67+
5. **Alert notification management** — PUT `/config/alerts` endpoint for all 7 alert categories with dashPanel accordion UI and ICP→dashPanel real-time sync.
68+
6. **v3 light sequencing** — IntelliBrite gray-out state propagates to dashPanel during theme changes; light group Swim/Set/Sync uses v3 A184 protocol.
69+
7. **Freeze protection** — manual override detection (per-body bitmask), smart body toggle, and dashPanel freeze/override indicators.
70+
8. **v3 delay configuration** — freeze cycle time, valve delay, and cooldown delay decoded and writable; cancel delay endpoint added.
71+
9. **Remote control & cover configuration** — virtualCircuits byteValueMap corrected, cover circuit IDs fixed, homepage Covers section added.
72+
10. **Zip-to-coordinates fallback** — heliotrope sunrise/sunset calculations now resolve lat/lon from zip code when not explicitly configured.
73+
11. Configurable single mixing period for chemistry controllers — thanks to @johnny2678 ([PR #1181](https://github.com/tagyoureit/nodejs-poolController/pull/1181)).
74+
12. IntelliCenter/IntelliTouch i9+3 disambiguation fix ([#1179](https://github.com/tagyoureit/nodejs-poolController/issues/1179)), 3rd power center expansion fix ([#1171](https://github.com/tagyoureit/nodejs-poolController/issues/1171)), chlorinator ID fallback fix — thanks to @johnny2678 ([PR #1178](https://github.com/tagyoureit/nodejs-poolController/pull/1178)).
75+
76+
See the full [Changelog](https://github.com/tagyoureit/nodejs-poolController/blob/master/Changelog) for all 37 items in 9.1.
77+
78+
<details>
79+
<summary>What was new in 9.0</summary>
80+
81+
9.0 focused on IntelliCenter v3.008 firmware compatibility and finished the v3 work started in 8.4.1.
6282

6383
1. IntelliCenter v3.008 chlorinator support, including live-edit changes coming back from the panel.
6484
2. Faster state updates on v3 — circuit, feature, and body changes made at the panel now appear in dashPanel within seconds.
@@ -68,8 +88,9 @@ njsPC is a Node.js service that talks to your pool controller over RS-485 (or Sc
6888
6. Firmware change detection — njsPC reloads its configuration automatically when the OCP firmware version changes.
6989
7. Virtual equipment management with new REST endpoints.
7090
8. Regal (Century) Modbus pump added, with collision detection and NACK/fault handling on Go/Stop commands — thanks to @celestinjr ([PR #1169](https://github.com/tagyoureit/nodejs-poolController/pull/1169)).
91+
</details>
7192

72-
For previous releases (8.4.x, 8.3, 8.1, 8.0, 7.x and earlier), see the [Changelog](https://github.com/tagyoureit/nodejs-poolController/blob/master/Changelog).
93+
For earlier releases (8.4.x, 8.3, 8.1, 8.0, 7.x and before), see the [Changelog](https://github.com/tagyoureit/nodejs-poolController/blob/master/Changelog).
7394

7495
<a name="module_nodejs-poolController--install"></a>
7596

controller/Equipment.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,10 @@ export class Options extends EqItem {
879879
public set freezeCycleTime(val: number) { this.setDataVal('freezeCycleTime', val); }
880880
public get freezeOverride(): number { return this.data.freezeOverride; }
881881
public set freezeOverride(val: number) { this.setDataVal('freezeOverride', val); }
882+
public get solarAsHeatPump(): boolean { return this.data.solarAsHeatPump; }
883+
public set solarAsHeatPump(val: boolean) { this.setDataVal('solarAsHeatPump', val); }
884+
public get showBadgeColors(): boolean { return this.data.showBadgeColors; }
885+
public set showBadgeColors(val: boolean) { this.setDataVal('showBadgeColors', val); }
882886
public get heaterStartDelay(): boolean { return this.data.heaterStartDelay; }
883887
public set heaterStartDelay(val: boolean) { this.setDataVal('heaterStartDelay', val); }
884888
public get heaterStartDelayTime(): number { return this.data.heaterStartDelayTime; }

0 commit comments

Comments
 (0)