nodejs-poolcontroller 7.7.0 → 8.0.1

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.
Files changed (82) hide show
  1. package/.eslintrc.json +26 -35
  2. package/Changelog +22 -0
  3. package/README.md +7 -3
  4. package/anslq25/MessagesMock.ts +218 -0
  5. package/anslq25/boards/MockBoardFactory.ts +50 -0
  6. package/anslq25/boards/MockEasyTouchBoard.ts +696 -0
  7. package/anslq25/boards/MockSystemBoard.ts +217 -0
  8. package/anslq25/chemistry/MockChlorinator.ts +75 -0
  9. package/anslq25/pumps/MockPump.ts +84 -0
  10. package/app.ts +10 -14
  11. package/config/Config.ts +13 -9
  12. package/config/VersionCheck.ts +6 -2
  13. package/controller/Constants.ts +58 -25
  14. package/controller/Equipment.ts +225 -41
  15. package/controller/Errors.ts +2 -1
  16. package/controller/Lockouts.ts +34 -2
  17. package/controller/State.ts +491 -48
  18. package/controller/boards/AquaLinkBoard.ts +6 -3
  19. package/controller/boards/BoardFactory.ts +5 -1
  20. package/controller/boards/EasyTouchBoard.ts +1971 -1751
  21. package/controller/boards/IntelliCenterBoard.ts +1311 -1688
  22. package/controller/boards/IntelliComBoard.ts +7 -1
  23. package/controller/boards/IntelliTouchBoard.ts +153 -42
  24. package/controller/boards/NixieBoard.ts +209 -66
  25. package/controller/boards/SunTouchBoard.ts +393 -0
  26. package/controller/boards/SystemBoard.ts +1862 -1543
  27. package/controller/comms/Comms.ts +539 -138
  28. package/controller/comms/ScreenLogic.ts +1663 -0
  29. package/controller/comms/messages/Messages.ts +242 -60
  30. package/controller/comms/messages/config/ChlorinatorMessage.ts +4 -3
  31. package/controller/comms/messages/config/CircuitGroupMessage.ts +5 -2
  32. package/controller/comms/messages/config/CircuitMessage.ts +81 -13
  33. package/controller/comms/messages/config/ConfigMessage.ts +3 -1
  34. package/controller/comms/messages/config/CoverMessage.ts +2 -1
  35. package/controller/comms/messages/config/CustomNameMessage.ts +2 -1
  36. package/controller/comms/messages/config/EquipmentMessage.ts +5 -1
  37. package/controller/comms/messages/config/ExternalMessage.ts +33 -3
  38. package/controller/comms/messages/config/FeatureMessage.ts +2 -1
  39. package/controller/comms/messages/config/GeneralMessage.ts +2 -1
  40. package/controller/comms/messages/config/HeaterMessage.ts +3 -1
  41. package/controller/comms/messages/config/IntellichemMessage.ts +2 -1
  42. package/controller/comms/messages/config/OptionsMessage.ts +12 -6
  43. package/controller/comms/messages/config/PumpMessage.ts +9 -12
  44. package/controller/comms/messages/config/RemoteMessage.ts +80 -13
  45. package/controller/comms/messages/config/ScheduleMessage.ts +43 -3
  46. package/controller/comms/messages/config/SecurityMessage.ts +2 -1
  47. package/controller/comms/messages/config/ValveMessage.ts +43 -26
  48. package/controller/comms/messages/status/ChlorinatorStateMessage.ts +8 -7
  49. package/controller/comms/messages/status/EquipmentStateMessage.ts +93 -20
  50. package/controller/comms/messages/status/HeaterStateMessage.ts +24 -5
  51. package/controller/comms/messages/status/IntelliChemStateMessage.ts +7 -4
  52. package/controller/comms/messages/status/IntelliValveStateMessage.ts +2 -1
  53. package/controller/comms/messages/status/PumpStateMessage.ts +72 -4
  54. package/controller/comms/messages/status/VersionMessage.ts +2 -1
  55. package/controller/nixie/Nixie.ts +15 -4
  56. package/controller/nixie/NixieEquipment.ts +1 -0
  57. package/controller/nixie/chemistry/ChemController.ts +300 -129
  58. package/controller/nixie/chemistry/ChemDoser.ts +806 -0
  59. package/controller/nixie/chemistry/Chlorinator.ts +133 -129
  60. package/controller/nixie/circuits/Circuit.ts +171 -30
  61. package/controller/nixie/heaters/Heater.ts +337 -173
  62. package/controller/nixie/pumps/Pump.ts +264 -236
  63. package/controller/nixie/schedules/Schedule.ts +9 -3
  64. package/defaultConfig.json +46 -5
  65. package/logger/Logger.ts +38 -9
  66. package/package.json +13 -9
  67. package/web/Server.ts +235 -122
  68. package/web/bindings/aqualinkD.json +114 -59
  69. package/web/bindings/homeassistant.json +437 -0
  70. package/web/bindings/influxDB.json +15 -0
  71. package/web/bindings/mqtt.json +28 -9
  72. package/web/bindings/mqttAlt.json +15 -0
  73. package/web/interfaces/baseInterface.ts +58 -7
  74. package/web/interfaces/httpInterface.ts +5 -2
  75. package/web/interfaces/influxInterface.ts +9 -2
  76. package/web/interfaces/mqttInterface.ts +234 -74
  77. package/web/interfaces/ruleInterface.ts +87 -0
  78. package/web/services/config/Config.ts +140 -33
  79. package/web/services/config/ConfigSocket.ts +2 -1
  80. package/web/services/state/State.ts +144 -3
  81. package/web/services/state/StateSocket.ts +65 -14
  82. package/web/services/utilities/Utilities.ts +189 -1
package/.eslintrc.json CHANGED
@@ -1,45 +1,36 @@
1
1
  {
2
- /* See all the pre-defined configs here: https://www.npmjs.com/package/eslint-config-defaults */
2
+ "env": {
3
+ "es2021": true,
4
+ "node": true
5
+ },
3
6
  "extends": [
4
- "eslint:recommended"
7
+ "eslint:recommended",
8
+ "plugin:@typescript-eslint/recommended"
5
9
  ],
6
10
  "parser": "@typescript-eslint/parser",
7
11
  "parserOptions": {
8
- "ecmaVersion": 6,
9
- "ecmaFeatures": {
10
- "jsx": true
11
- },
12
+ "ecmaVersion": "latest",
12
13
  "sourceType": "module"
13
14
  },
14
- "env": {
15
- "amd": true,
16
- "browser": true,
17
- "jquery": true,
18
- "node": true,
19
- "es6": true,
20
- "worker": true
21
- },
15
+ "plugins": [
16
+ "@typescript-eslint"
17
+ ],
22
18
  "rules": {
23
- "eqeqeq": 2,
24
- "comma-dangle": 1,
25
- "no-console": 0,
26
- "no-debugger": 1,
27
- "no-extra-semi": 1,
28
- "no-extra-parens": 0,
29
- "no-irregular-whitespace": 0,
30
- "no-undef": 0,
31
- "no-unused-vars": 0,
32
- "no-case-declaration": 0,
33
- "no-prototype-builtins": 0,
34
- "semi": 1,
35
- "semi-spacing": 1,
36
- "valid-jsdoc": [
37
- 2,
38
- {
39
- "requireReturn": false
40
- }
19
+ "indent": [
20
+ "error",
21
+ "tab"
22
+ ],
23
+ "linebreak-style": [
24
+ "error",
25
+ "windows"
26
+ ],
27
+ "quotes": [
28
+ "error",
29
+ "single"
41
30
  ],
42
- "space-infix-ops": 2,
43
- "keyword-spacing": ["error",{"before": true, "after": true}]
31
+ "semi": [
32
+ "error",
33
+ "always"
34
+ ]
44
35
  }
45
- }
36
+ }
package/Changelog CHANGED
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## 8.0.0
4
+ 1. Refactor comms code to Async
5
+ 2. Update dependencies and Node >16
6
+ 3. EasyTouch v1 support
7
+ 4. Screenlogic support
8
+ 5. Anslq25 (Mock controller)
9
+
10
+ ## 7.7.0
11
+ 1. Aqualink-D MQTT Interface
12
+ 2. Manual Priority for Schedules
13
+ 3. Add multiple RS-485 ports
14
+ 4. Support for Hayward Pumps
15
+ 5. Display remote chlorinators
16
+ 6. Updates for ETi hybrid
17
+ 7. Stop temp deltas for Nixie
18
+ 8. Batch write influx points
19
+ 9. MQTT & Influx updates
20
+ 10. Ability to hide bodies in dashPanel
21
+ 11. Florida Sunseeker Pooltone lighting
22
+ 12. Proper uPNP formatting
23
+
24
+
3
25
  ## 7.6.1
4
26
  1. Many bugfixes: Intellichem, Touch body capacities, Ultratemp heaters, Nixie, more...
5
27
  2. Add env variables for Docker setup: POOL_RS485_PORT, POOL_NET_CONNECT, POOL_NET_HOST, POOL_NET_PORT, SOURCE_COMMIT, SOURCE_BRANCH
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # nodejs-poolController - Version 7.6
1
+ # nodejs-poolController - Version 8.0
2
2
 
3
3
  ## What is nodejs-poolController
4
4
 
@@ -11,8 +11,8 @@ nodejs-poolController is an application to communicate and control your Pentair
11
11
  * Want to control your pumps or chlorinator without a pool controller?
12
12
 
13
13
  Equipment supported
14
- 1. Controllers: IntelliCenter, Intellitouch, EasyTouch, No controller (standalone equimpent)
15
- 1. Pumps: Intelliflow VS/VSF/VF, older models
14
+ 1. Controllers: IntelliCenter, Intellitouch, EasyTouch, Nixie (standalone equimpent), Aqualink
15
+ 1. Pumps: Intelliflow VS/VSF/VF, older models, relay controlled pumps, Whisperflo
16
16
  1. Chlorinators: Intellichlor, Aqua-Rite and OEM brands
17
17
  1. Heaters: Gas, solar, heatpump
18
18
  1. Intellichem and Relay Equipment Manager (REM) chemical controllers
@@ -23,6 +23,10 @@ Equipment supported
23
23
  ## Latest Changes
24
24
  See [Changelog](https://github.com/tagyoureit/nodejs-poolController/blob/master/Changelog)
25
25
 
26
+ ## What's new in 8.0?
27
+
28
+ Screenlogic can now be used as a direct connection point. If you feel that integrating an RS-485 adapter is a bit too much, then this is an option for you. The preferred method is still RS-485 as it is more fully featured.
29
+
26
30
  ## What's new in 7.0?
27
31
 
28
32
  The current version includes very tight intergation with [relayEquipmentManager](https://github.com/rstrouse/relayEquipmentManager) which allows for hardware control over your ancillary pool equipment (chemical probes, pumps, tanks, heaters, pumps, etc).
@@ -0,0 +1,218 @@
1
+ import { Inbound, Message, Outbound, Protocol } from "../controller/comms/messages/Messages";
2
+ import { ControllerType } from "../controller/Constants";
3
+ import { sys } from "../controller/Equipment";
4
+ import { logger } from "../logger/Logger";
5
+ import { MockSystemBoard } from "./boards/MockSystemBoard";
6
+ import { mockChlor } from "./chemistry/MockChlorinator";
7
+ import { mockPump, MockPump } from "./pumps/MockPump";
8
+
9
+
10
+ export class MessagesMock {
11
+ constructor() { }
12
+
13
+ public static process(msg: Inbound) {
14
+ switch (msg. protocol) {
15
+ case Protocol.Broadcast: {
16
+ switch (sys.controllerType) {
17
+ case ControllerType.IntelliCenter:
18
+ switch (msg.action) {
19
+ /* case xyz:
20
+ */
21
+ default:
22
+ logger.info(`An unprocessed message was received ${msg.toPacket()}`)
23
+ break;
24
+
25
+ }
26
+ default:
27
+ {
28
+
29
+ switch (msg.action) {
30
+ /* SET COMMANDS */
31
+ case 133: // set date/time
32
+ case 134: // set circuit
33
+ case 136: // set heat/temperature
34
+ case 138: // set custom names
35
+ case 139: // set circuit names/functions
36
+ case 144: // set heat pump status
37
+ case 145: // set schedule
38
+ case 146: // set intellichem
39
+ case 147: // set intellichem
40
+ case 150: // set intellflo spa side controllers
41
+ case 152: // set pump config
42
+ case 155: // set pump config extended
43
+ case 153: // set intellichlor
44
+ case 157: // set valve
45
+ case 158: // set high speed circuits
46
+ case 160: // set is4/is10 high speed circuits
47
+ case 161: // set quicktouch remote
48
+ case 162: // set solar/heat pump config
49
+ case 131: // set delay
50
+ case 163: // set delay
51
+ case 167: // set light group
52
+ case 168: // set settings
53
+ sys.anslq25Board.system.sendAck(msg);
54
+ break;
55
+ /* GET COMMANDS */
56
+ case 194: // get controller status
57
+ break;
58
+ case 197: // get date time
59
+ sys.anslq25Board.system.processDateTimeAsync(msg);
60
+ break;
61
+ case 198: // get circuit state
62
+ break;
63
+ case 200: // get heat/status
64
+ sys.anslq25Board.heaters.processHeatModesAsync(msg);
65
+ break;
66
+ case 202: // get custom names
67
+ sys.anslq25Board.system.processCustomNameAsync(msg);
68
+ break;
69
+ case 203: //get circuit functions
70
+ sys.anslq25Board.circuits.processCircuitAsync(msg);
71
+ break;
72
+ case 208: // get heat pump status
73
+ break;
74
+ case 209: // get schedule
75
+ sys.anslq25Board.schedules.processScheduleAsync(msg);
76
+ break;
77
+
78
+ case 210: // get intellichem
79
+ case 211: // get intellichem
80
+ logger.error(`mock packet ${msg.action} not programmed yet.`)
81
+ break;
82
+ case 214: // get intelliflo spa side
83
+ sys.anslq25Board.remotes.processSpaCommandRemoteAsync(msg);
84
+ break;
85
+ case 215: // get pump status
86
+ break;
87
+ case 216: // get pump config
88
+ sys.anslq25Board.pumps.processPumpConfigAsync(msg);
89
+ break
90
+ case 217: // get intellichlor
91
+ case 219: // get pump config
92
+ logger.error(`mock packet ${msg.action} not programmed yet.`)
93
+ break;
94
+ case 221: // get valve
95
+ sys.anslq25Board.valves.processValveAssignmentsAsync(msg);
96
+ break;
97
+ case 222: // get high speed circuits
98
+ sys.anslq25Board.pumps.processHighSpeedCircuitsAsync(msg);
99
+ break;
100
+ case 224: // get is4/is10
101
+ sys.anslq25Board.remotes.processIS4IS10RemoteAsync(msg);
102
+ break;
103
+ case 225: //get quicktouch
104
+ sys.anslq25Board.remotes.processQuickTouchRemoteAsync(msg);
105
+ break;
106
+ case 226: // get solar/heat pump
107
+ sys.anslq25Board.heaters.processHeaterConfigAsync(msg);
108
+ break;
109
+ case 227: // get delays
110
+ sys.anslq25Board.valves.processValveOptionsAsync(msg);
111
+ break;
112
+ case 231: // get light groups
113
+ sys.anslq25Board.circuits.processLightGroupAsync(msg);
114
+ break;
115
+ case 239: // get unknown
116
+ break;
117
+ case 232: // get settings
118
+ sys.anslq25Board.system.processSettingsAsync(msg);
119
+ break;
120
+ case 253: // get sw version
121
+ logger.info(`Mock EasyTouch OCP - Packet ${msg.toShortPacket()} request not programmed yet.`)
122
+ break;
123
+ case 1: // Ack
124
+ case 2: // Shared IntelliCenter/IntelliTouch
125
+ case 5:
126
+ case 8:
127
+ case 96: // EquipmentStateMessage.process(this);
128
+ case 10: // CustomNameMessage.process(this);
129
+ case 11: // CircuitMessage.processTouch(this);
130
+ case 25: // ChlorinatorMessage.processTouch(this);
131
+ case 153: // ExternalMessage.processTouchChlorinator(this);
132
+ case 17:
133
+ case 145: // ScheduleMessage.process(this);
134
+ case 18: // IntellichemMessage.process(this);
135
+ break;
136
+ case 24:
137
+ case 27:
138
+
139
+ break;
140
+ case 152:
141
+ case 155: // PumpMessage.process(this);
142
+ case 30:
143
+ // switch (sys.controllerType) {
144
+ // case ControllerType.Unknown:
145
+ // break;
146
+ // case ControllerType.SunTouch:
147
+ // ScheduleMessage.processSunTouch(this);
148
+ // break;
149
+ // default:
150
+ // OptionsMessage.process(this);
151
+ // break;
152
+ // }
153
+ case 22:
154
+ case 32:
155
+ case 33: // RemoteMessage.process(this);
156
+ case 29:
157
+ case 35: // ValveMessage.process(this);
158
+ case 39:
159
+ case 167: // CircuitMessage.processTouch(this);
160
+ case 40:
161
+ case 168: // OptionsMessage.process(this);
162
+ case 41: // CircuitGroupMessage.process(this);
163
+ case 197: // EquipmentStateMessage.process(this); // Date/Time request
164
+ case 252: // EquipmentMessage.process(this);
165
+ case 9:
166
+ case 16:
167
+ case 34:
168
+ case 137:
169
+ case 144:
170
+ case 162: // HeaterMessage.process(this);
171
+ case 114:
172
+ case 115: // HeaterStateMessage.process(this);
173
+ case 147: // IntellichemMessage.process(this);
174
+ logger.info(`Mock EasyTouch OCP - Packet ${msg.toShortPacket()} should be coming to the OCP, not from it.`);
175
+ break;
176
+ default:
177
+ logger.info(`No mock EasyTouch response for ${msg.toShortPacket()} `);
178
+ }
179
+ }
180
+ }
181
+ break;
182
+ }
183
+ /*
184
+ case Protocol.IntelliValve:
185
+ IntelliValveStateMessage.process(outboundMsg);
186
+ break;
187
+ case Protocol.IntelliChem:
188
+ IntelliChemStateMessage.process(outboundMsg);
189
+ break; */
190
+ // case Protocol.Pump:
191
+ // if ((msg.source >= 96 && msg.source <= 111) || (msg.dest >= 96 && msg.dest <= 111))
192
+ // mockPump.process(msg);
193
+ // else
194
+ // MockSystemBoard.convertOutbound(msg);
195
+ /* case Protocol.Heater:
196
+ HeaterStateMessage.process(outboundMsg);
197
+ break;*/
198
+ case Protocol.Chlorinator:
199
+ mockChlor.process(msg);
200
+ /*
201
+ case Protocol.Hayward:
202
+ PumpStateMessage.processHayward(msg);
203
+ break; */
204
+ default:
205
+ logger.debug(`Unprocessed Message ${msg.toPacket()}`)
206
+ // return new Outbound(Protocol.Broadcast, 0, 0, 0, []);
207
+ }
208
+ }
209
+
210
+ // public static processOutbound(outboundMsg: Outbound) {
211
+ // // outbound mock messages will be sent here instead of to the comms port
212
+ // let inbound = Message.convertOutboundToInbound(outboundMsg);
213
+ // let newOut = MessagesMock.processInbound(inbound);
214
+ // return newOut;
215
+
216
+ // }
217
+ }
218
+ export var messagesMock = new MessagesMock();
@@ -0,0 +1,50 @@
1
+ /* nodejs-poolController. An application to control pool equipment.
2
+ Copyright (C) 2016, 2017, 2018, 2019, 2020, 2021, 2022.
3
+ Russell Goldin, tagyoureit. russ.goldin@gmail.com
4
+
5
+ This program is free software: you can redistribute it and/or modify
6
+ it under the terms of the GNU Affero General Public License as
7
+ published by the Free Software Foundation, either version 3 of the
8
+ License, or (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU Affero General Public License for more details.
14
+
15
+ You should have received a copy of the GNU Affero General Public License
16
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ // import { MockIntelliCenterBoard } from './MockIntelliCenterBoard';
19
+ // import { MockIntelliTouchBoard } from './MockIntelliTouchBoard';
20
+ // import { MockIntelliComBoard } from './MockIntelliComBoard';
21
+ import { MockEasyTouch } from './MockEasyTouchBoard';
22
+ import { MockSystemBoard } from './MockSystemBoard';
23
+ import { ControllerType } from '../../controller/Constants';
24
+ import { PoolSystem } from 'controller/Equipment';
25
+ // import { MockAquaLinkBoard } from './MockAquaLinkBoard';
26
+ // import { MockSunTouchBoard } from "./MockSunTouchBoard";
27
+
28
+
29
+ export class MockBoardFactory {
30
+ // Factory create the system board from the controller type. Resist storing
31
+ // the pool system as this can cause a leak. The PoolSystem object already has a reference to this.
32
+ public static fromControllerType(ct: ControllerType, system: PoolSystem) {
33
+ switch (ct) {
34
+ // case ControllerType.IntelliCenter:
35
+ // return new MockIntelliCenterBoard(system);
36
+ // case ControllerType.IntelliTouch:
37
+ // return new MockIntelliTouchBoard(system);
38
+ // case ControllerType.IntelliCom:
39
+ // return new MockIntelliComBoard(system);
40
+ case ControllerType.EasyTouch:
41
+ return new MockEasyTouch(system);
42
+ // case ControllerType.AquaLink:
43
+ // return new MockAquaLinkBoard(system);
44
+ // case ControllerType.SunTouch:
45
+ // return new MockSunTouchBoard(system);
46
+ }
47
+ return new MockSystemBoard(system);
48
+ }
49
+
50
+ }