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.
- 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 +225 -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 +46 -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
|
@@ -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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
|
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.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.
|
|
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": "^2.0.0",
|
|
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",
|