nodejs-poolcontroller 7.7.0 → 8.0.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.
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 +224 -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 +45 -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
@@ -157,7 +157,7 @@ export class NixieSchedule extends NixieEquipment {
157
157
  let shouldBeOn = this.shouldBeOn(); // This should also set the validity for the schedule if there are errors.
158
158
 
159
159
  let manualPriorityActive: boolean = shouldBeOn ? sys.board.schedules.manualPriorityActive(ssched) : false;
160
- console.log(`Processing schedule ${this.schedule.id} - ${circuit.name} : ShouldBeOn: ${shouldBeOn} ManualPriorityActive: ${manualPriorityActive} Running: ${this.running} Suspended: ${this.suspended} Resumed: ${this.resumed}`);
160
+ //console.log(`Processing schedule ${this.schedule.id} - ${circuit.name} : ShouldBeOn: ${shouldBeOn} ManualPriorityActive: ${manualPriorityActive} Running: ${this.running} Suspended: ${this.suspended} Resumed: ${this.resumed}`);
161
161
 
162
162
 
163
163
  // COND 1: The schedule should be on and the schedule is not yet on.
@@ -208,8 +208,14 @@ export class NixieSchedule extends NixieEquipment {
208
208
  this.resumed = true;
209
209
  }
210
210
  this.suspended = !cstate.isOn;
211
- ssched.isOn = cstate.isOn && !manualPriorityActive;
212
- if (this.suspended && !cstate.isOn) ssched.manualPriorityActive = false;
211
+ if (manualPriorityActive){
212
+ ssched.isOn = false;
213
+ ssched.manualPriorityActive = true;
214
+ }
215
+ else {
216
+ ssched.isOn = cstate.isOn;
217
+ ssched.manualPriorityActive = false;
218
+ }
213
219
  }
214
220
  // Our schedule has expired it is time to turn it off, but only if !manualPriorityActive.
215
221
  else if (!shouldBeOn) {
@@ -4,7 +4,7 @@
4
4
  "portId": 0,
5
5
  "enabled": true,
6
6
  "rs485Port": "/dev/ttyUSB0",
7
- "mockPort": false,
7
+ "mock": false,
8
8
  "netConnect": false,
9
9
  "netHost": "raspberrypi",
10
10
  "netPort": 9801,
@@ -14,9 +14,19 @@
14
14
  "dataBits": 8,
15
15
  "parity": "none",
16
16
  "stopBits": 1,
17
- "flowControl": false,
17
+ "rtscts": false,
18
18
  "autoOpen": false,
19
19
  "lock": false
20
+ },
21
+ "netSettings": {
22
+ "allowHalfOpen": false,
23
+ "keepAlive": false,
24
+ "keepAliveInitialDelay": 5
25
+ },
26
+ "screenlogic": {
27
+ "connectionType": "local",
28
+ "systemName": "Pentair: 00-00-00",
29
+ "password": 1234
20
30
  }
21
31
  },
22
32
  "backups": {
@@ -29,7 +39,6 @@
29
39
  "njsPC": true,
30
40
  "servers": []
31
41
  }
32
-
33
42
  },
34
43
  "web": {
35
44
  "servers": {
@@ -176,8 +185,11 @@
176
185
  "retain": true,
177
186
  "qos": 0,
178
187
  "changesOnly": true
188
+ },
189
+ "vars": {
190
+ "tempPrecision": 2,
191
+ "tempUnits": "@bind=sys.board.valueMaps.tempUnits.getName(state.temps.units);"
179
192
  }
180
-
181
193
  },
182
194
  "mqttAlt": {
183
195
  "name": "MQTTAlt",
@@ -197,6 +209,29 @@
197
209
  "changesOnly": true
198
210
  }
199
211
  },
212
+ "homeAssistant": {
213
+ "name": "Home Assistant",
214
+ "type": "mqtt",
215
+ "enabled": false,
216
+ "fileName": "homeassistant.json",
217
+ "globals": {},
218
+ "options": {
219
+ "protocol": "mqtt://",
220
+ "host": "192.168.0.1",
221
+ "port": 1883,
222
+ "username": "",
223
+ "password": "",
224
+ "selfSignedCertificate": false,
225
+ "retain": true,
226
+ "qos": 0,
227
+ "changesOnly": true
228
+ },
229
+ "vars": {
230
+ "_note": "hassTopic is the topic that HASS reads for configuration and should not be changed. mqttTopic should match the topic in the MQTT binding (do not use MQTTAlt for HASS).",
231
+ "hassTopic": "homeassistant",
232
+ "mqttTopic": "@bind=(state.equipment.model).replace(' ','-').replace('/','').toLowerCase();"
233
+ }
234
+ },
200
235
  "rem": {
201
236
  "name": "Relay Equipment Manager",
202
237
  "type": "rem",
@@ -222,10 +257,15 @@
222
257
  }
223
258
  },
224
259
  "log": {
225
- "packet": {
260
+ "screenlogic": {
226
261
  "enabled": false,
262
+ "logToConsole": false,
263
+ "logToFile": false
264
+ },
265
+ "packet": {
227
266
  "logToConsole": false,
228
267
  "logToFile": false,
268
+ "enabled": false,
229
269
  "filename": "packetLog",
230
270
  "invalid": true,
231
271
  "broadcast": {
package/logger/Logger.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  /* nodejs-poolController. An application to control pool equipment.
2
- Copyright (C) 2016, 2017, 2018, 2019, 2020. Russell Goldin, tagyoureit. russ.goldin@gmail.com
2
+ Copyright (C) 2016, 2017, 2018, 2019, 2020, 2021, 2022.
3
+ Russell Goldin, tagyoureit. russ.goldin@gmail.com
3
4
 
4
5
  This program is free software: you can redistribute it and/or modify
5
6
  it under the terms of the GNU Affero General Public License as
@@ -22,6 +23,7 @@ import { utils } from "../controller/Constants";
22
23
  import { Message } from '../controller/comms/messages/Messages';
23
24
  import { config } from '../config/Config';
24
25
  import { webApp } from '../web/Server';
26
+ import { sl } from '../controller/comms/ScreenLogic';
25
27
 
26
28
  const extend = require("extend");
27
29
 
@@ -32,9 +34,11 @@ class Logger {
32
34
  this.captureForReplayBaseDir = path.join(process.cwd(), '/logs/', this.getLogTimestamp());
33
35
  /* this.captureForReplayPath = path.join(this.captureForReplayBaseDir, '/packetCapture.json'); */
34
36
  this.pkts = [];
37
+ this.slMessages = [];
35
38
  }
36
39
  private cfg;
37
40
  private pkts: Message[];
41
+ private slMessages: any[];
38
42
  private pktPath: string;
39
43
  private consoleToFilePath: string;
40
44
  private transports: { console: winston.transports.ConsoleTransportInstance, file?: winston.transports.FileTransportInstance, consoleFile?: winston.transports.FileTransportInstance } = {
@@ -163,6 +167,25 @@ class Logger {
163
167
  else if (!msg.isValid) logger._logger.warn(msg.toLog());
164
168
  }
165
169
  }
170
+ public screenlogic(data: any){
171
+ if (logger.cfg.screenlogic.enabled || logger.cfg.app.captureForReplay){
172
+ if (logger.cfg.screenlogic.logToFile) {
173
+ logger.slMessages.push(data);
174
+ if (logger.slMessages.length > 5)
175
+ logger.flushSLLogs();
176
+ else {
177
+ // Attempt to ease up on the writes if we are logging a bunch of packets.
178
+ if (logger.pktTimer) clearTimeout(logger.pktTimer);
179
+ logger.pktTimer = setTimeout(logger.flushSLLogs, 1000);
180
+ }
181
+ }
182
+ webApp.emitToChannel('msgLogger', 'logMessage', data);
183
+
184
+ }
185
+ if (logger.cfg.screenlogic.logToConsole){
186
+ logger._logger.info(sl.toLog(data));
187
+ }
188
+ }
166
189
  public logAPI(apiReq:string){
167
190
  if (logger.cfg.app.captureForReplay){
168
191
  // TODO: buffer this
@@ -183,6 +206,7 @@ class Logger {
183
206
  var buf: string = '';
184
207
  if (logger.cfg.packet.enabled) {
185
208
  for (let i = 0; i < p.length; i++) {
209
+
186
210
  buf += (p[i].toLog() + os.EOL);
187
211
  }
188
212
  fs.appendFile(logger.pktPath, buf, function(err) {
@@ -190,14 +214,19 @@ class Logger {
190
214
  });
191
215
  }
192
216
  buf = '';
193
- /* if (logger.cfg.app.captureForReplay) {
194
- for (let i = 0; i < p.length; i++) {
195
- buf += (p[i].toReplay() + os.EOL);
196
- }
197
- fs.appendFile(logger.captureForReplayPath, buf, function (err) {
198
- if (err) logger.error('Error writing replay to %s: %s', logger.captureForReplayPath, err);
199
- });
200
- } */
217
+ }
218
+ public flushSLLogs() {
219
+ var p: any[] = logger.slMessages.splice(0, logger.slMessages.length);
220
+ var buf: string = '';
221
+
222
+ for (let i = 0; i < p.length; i++) {
223
+ buf += (p[i] + os.EOL);
224
+ }
225
+ fs.appendFile(logger.pktPath, buf, function(err) {
226
+ if (err) logger.error(`Error writing screenlogic message to ${logger.pktPath}: ${err.message}`);
227
+ });
228
+
229
+ buf = '';
201
230
  }
202
231
  public setOptions(opts, c?: any) {
203
232
  c = typeof c === 'undefined' ? this.cfg : c;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodejs-poolcontroller",
3
- "version": "7.7.0",
3
+ "version": "8.0.0",
4
4
  "description": "nodejs-poolController",
5
5
  "main": "app.js",
6
6
  "author": {
@@ -12,6 +12,10 @@
12
12
  "type": "git",
13
13
  "url": "https://github.com/tagyoureit/nodejs-poolController.git"
14
14
  },
15
+ "engines": {
16
+ "npm": ">=7.0.0",
17
+ "node": ">=16.0.0"
18
+ },
15
19
  "scripts": {
16
20
  "start": "npm run build && node dist/app.js",
17
21
  "start:cached": "node dist/app.js",
@@ -19,16 +23,17 @@
19
23
  "watch": "tsc -w"
20
24
  },
21
25
  "dependencies": {
22
- "@influxdata/influxdb-client": "^1.25.0",
26
+ "@influxdata/influxdb-client": "^1.32.0",
23
27
  "eslint-config-promise": "^2.0.2",
24
28
  "express": "^4.18.1",
25
29
  "extend": "^3.0.2",
26
30
  "jszip": "^3.9.1",
27
31
  "mqtt": "^4.3.7",
28
- "multer": "^1.4.4",
32
+ "multer": "^1.4.5-lts.1",
29
33
  "multicast-dns": "^7.2.4",
34
+ "node-screenlogic": "^1.10.1",
30
35
  "node-ssdp": "^4.0.1",
31
- "serialport": "^9.2.8",
36
+ "serialport": "^10.4.0",
32
37
  "socket.io": "^4.5.0",
33
38
  "socket.io-client": "^4.5.0",
34
39
  "source-map-support": "^0.5.21",
@@ -38,12 +43,11 @@
38
43
  "@types/express": "^4.17.13",
39
44
  "@types/extend": "^3.0.1",
40
45
  "@types/multer": "^1.4.7",
41
- "@types/node": "^12.20.52",
42
- "@typescript-eslint/eslint-plugin": "^5.23.0",
43
- "@typescript-eslint/parser": "^5.23.0",
44
- "eslint": "^8.15.0",
46
+ "@types/node": "^16.11.48",
47
+ "@typescript-eslint/eslint-plugin": "^5.33.0",
48
+ "@typescript-eslint/parser": "^5.33.0",
49
+ "eslint": "^8.21.0",
45
50
  "eslint-config-defaults": "^9.0.0",
46
- "eslint-config-standard": "^16.0.3",
47
51
  "eslint-plugin-import": "^2.26.0",
48
52
  "eslint-plugin-node": "^11.1.0",
49
53
  "eslint-plugin-promise": "^6.0.0",