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.
- package/.eslintrc.json +26 -35
- package/Changelog +22 -0
- package/README.md +7 -3
- package/anslq25/MessagesMock.ts +218 -0
- package/anslq25/boards/MockBoardFactory.ts +50 -0
- package/anslq25/boards/MockEasyTouchBoard.ts +696 -0
- package/anslq25/boards/MockSystemBoard.ts +217 -0
- package/anslq25/chemistry/MockChlorinator.ts +75 -0
- package/anslq25/pumps/MockPump.ts +84 -0
- package/app.ts +10 -14
- package/config/Config.ts +13 -9
- package/config/VersionCheck.ts +6 -2
- package/controller/Constants.ts +58 -25
- package/controller/Equipment.ts +224 -41
- package/controller/Errors.ts +2 -1
- package/controller/Lockouts.ts +34 -2
- package/controller/State.ts +491 -48
- package/controller/boards/AquaLinkBoard.ts +6 -3
- package/controller/boards/BoardFactory.ts +5 -1
- package/controller/boards/EasyTouchBoard.ts +1971 -1751
- package/controller/boards/IntelliCenterBoard.ts +1311 -1688
- package/controller/boards/IntelliComBoard.ts +7 -1
- package/controller/boards/IntelliTouchBoard.ts +153 -42
- package/controller/boards/NixieBoard.ts +209 -66
- package/controller/boards/SunTouchBoard.ts +393 -0
- package/controller/boards/SystemBoard.ts +1862 -1543
- package/controller/comms/Comms.ts +539 -138
- package/controller/comms/ScreenLogic.ts +1663 -0
- package/controller/comms/messages/Messages.ts +242 -60
- package/controller/comms/messages/config/ChlorinatorMessage.ts +4 -3
- package/controller/comms/messages/config/CircuitGroupMessage.ts +5 -2
- package/controller/comms/messages/config/CircuitMessage.ts +81 -13
- package/controller/comms/messages/config/ConfigMessage.ts +3 -1
- package/controller/comms/messages/config/CoverMessage.ts +2 -1
- package/controller/comms/messages/config/CustomNameMessage.ts +2 -1
- package/controller/comms/messages/config/EquipmentMessage.ts +5 -1
- package/controller/comms/messages/config/ExternalMessage.ts +33 -3
- package/controller/comms/messages/config/FeatureMessage.ts +2 -1
- package/controller/comms/messages/config/GeneralMessage.ts +2 -1
- package/controller/comms/messages/config/HeaterMessage.ts +3 -1
- package/controller/comms/messages/config/IntellichemMessage.ts +2 -1
- package/controller/comms/messages/config/OptionsMessage.ts +12 -6
- package/controller/comms/messages/config/PumpMessage.ts +9 -12
- package/controller/comms/messages/config/RemoteMessage.ts +80 -13
- package/controller/comms/messages/config/ScheduleMessage.ts +43 -3
- package/controller/comms/messages/config/SecurityMessage.ts +2 -1
- package/controller/comms/messages/config/ValveMessage.ts +43 -26
- package/controller/comms/messages/status/ChlorinatorStateMessage.ts +8 -7
- package/controller/comms/messages/status/EquipmentStateMessage.ts +93 -20
- package/controller/comms/messages/status/HeaterStateMessage.ts +24 -5
- package/controller/comms/messages/status/IntelliChemStateMessage.ts +7 -4
- package/controller/comms/messages/status/IntelliValveStateMessage.ts +2 -1
- package/controller/comms/messages/status/PumpStateMessage.ts +72 -4
- package/controller/comms/messages/status/VersionMessage.ts +2 -1
- package/controller/nixie/Nixie.ts +15 -4
- package/controller/nixie/NixieEquipment.ts +1 -0
- package/controller/nixie/chemistry/ChemController.ts +300 -129
- package/controller/nixie/chemistry/ChemDoser.ts +806 -0
- package/controller/nixie/chemistry/Chlorinator.ts +133 -129
- package/controller/nixie/circuits/Circuit.ts +171 -30
- package/controller/nixie/heaters/Heater.ts +337 -173
- package/controller/nixie/pumps/Pump.ts +264 -236
- package/controller/nixie/schedules/Schedule.ts +9 -3
- package/defaultConfig.json +45 -5
- package/logger/Logger.ts +38 -9
- package/package.json +13 -9
- package/web/Server.ts +235 -122
- package/web/bindings/aqualinkD.json +114 -59
- package/web/bindings/homeassistant.json +437 -0
- package/web/bindings/influxDB.json +15 -0
- package/web/bindings/mqtt.json +28 -9
- package/web/bindings/mqttAlt.json +15 -0
- package/web/interfaces/baseInterface.ts +58 -7
- package/web/interfaces/httpInterface.ts +5 -2
- package/web/interfaces/influxInterface.ts +9 -2
- package/web/interfaces/mqttInterface.ts +234 -74
- package/web/interfaces/ruleInterface.ts +87 -0
- package/web/services/config/Config.ts +140 -33
- package/web/services/config/ConfigSocket.ts +2 -1
- package/web/services/state/State.ts +144 -3
- package/web/services/state/StateSocket.ts +65 -14
- 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
|
-
|
|
212
|
-
|
|
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) {
|
package/defaultConfig.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"portId": 0,
|
|
5
5
|
"enabled": true,
|
|
6
6
|
"rs485Port": "/dev/ttyUSB0",
|
|
7
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
|
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
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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": "
|
|
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.
|
|
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.
|
|
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": "^
|
|
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": "^
|
|
42
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
43
|
-
"@typescript-eslint/parser": "^5.
|
|
44
|
-
"eslint": "^8.
|
|
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",
|