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
@@ -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) {
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "controller": {
3
3
  "comms": {
4
+ "type": "local",
4
5
  "portId": 0,
5
6
  "enabled": true,
6
7
  "rs485Port": "/dev/ttyUSB0",
7
- "mockPort": false,
8
+ "mock": false,
8
9
  "netConnect": false,
9
10
  "netHost": "raspberrypi",
10
11
  "netPort": 9801,
@@ -14,9 +15,19 @@
14
15
  "dataBits": 8,
15
16
  "parity": "none",
16
17
  "stopBits": 1,
17
- "flowControl": false,
18
+ "rtscts": false,
18
19
  "autoOpen": false,
19
20
  "lock": false
21
+ },
22
+ "netSettings": {
23
+ "allowHalfOpen": false,
24
+ "keepAlive": false,
25
+ "keepAliveInitialDelay": 5
26
+ },
27
+ "screenlogic": {
28
+ "connectionType": "local",
29
+ "systemName": "Pentair: 00-00-00",
30
+ "password": 1234
20
31
  }
21
32
  },
22
33
  "backups": {
@@ -29,7 +40,6 @@
29
40
  "njsPC": true,
30
41
  "servers": []
31
42
  }
32
-
33
43
  },
34
44
  "web": {
35
45
  "servers": {
@@ -176,8 +186,11 @@
176
186
  "retain": true,
177
187
  "qos": 0,
178
188
  "changesOnly": true
189
+ },
190
+ "vars": {
191
+ "tempPrecision": 2,
192
+ "tempUnits": "@bind=sys.board.valueMaps.tempUnits.getName(state.temps.units);"
179
193
  }
180
-
181
194
  },
182
195
  "mqttAlt": {
183
196
  "name": "MQTTAlt",
@@ -197,6 +210,29 @@
197
210
  "changesOnly": true
198
211
  }
199
212
  },
213
+ "homeAssistant": {
214
+ "name": "Home Assistant",
215
+ "type": "mqtt",
216
+ "enabled": false,
217
+ "fileName": "homeassistant.json",
218
+ "globals": {},
219
+ "options": {
220
+ "protocol": "mqtt://",
221
+ "host": "192.168.0.1",
222
+ "port": 1883,
223
+ "username": "",
224
+ "password": "",
225
+ "selfSignedCertificate": false,
226
+ "retain": true,
227
+ "qos": 0,
228
+ "changesOnly": true
229
+ },
230
+ "vars": {
231
+ "_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).",
232
+ "hassTopic": "homeassistant",
233
+ "mqttTopic": "@bind=(state.equipment.model).replace(' ','-').replace('/','').toLowerCase();"
234
+ }
235
+ },
200
236
  "rem": {
201
237
  "name": "Relay Equipment Manager",
202
238
  "type": "rem",
@@ -222,10 +258,15 @@
222
258
  }
223
259
  },
224
260
  "log": {
225
- "packet": {
261
+ "screenlogic": {
226
262
  "enabled": false,
263
+ "logToConsole": false,
264
+ "logToFile": false
265
+ },
266
+ "packet": {
227
267
  "logToConsole": false,
228
268
  "logToFile": false,
269
+ "enabled": false,
229
270
  "filename": "packetLog",
230
271
  "invalid": true,
231
272
  "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.1",
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": "^2.0.0",
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",