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
|
@@ -1,9 +1,52 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
1
3
|
import extend = require("extend");
|
|
2
4
|
import { logger } from "../../logger/Logger";
|
|
3
5
|
import { sys as sysAlias } from "../../controller/Equipment";
|
|
4
6
|
import { state as stateAlias} from "../../controller/State";
|
|
5
7
|
import { webApp as webAppAlias } from '../Server';
|
|
6
|
-
import {
|
|
8
|
+
import { config } from "../../config/Config";
|
|
9
|
+
export class BindingsFile {
|
|
10
|
+
public static async fromBuffer(filename: string, buff: Buffer) {
|
|
11
|
+
try {
|
|
12
|
+
let bf = new BindingsFile();
|
|
13
|
+
bf.filename = filename;
|
|
14
|
+
bf.filePath = path.join(process.cwd(), 'web/bindings/custom', bf.filename);
|
|
15
|
+
bf.options = await bf.extractBindingOptions(buff);
|
|
16
|
+
return typeof bf.options !== 'undefined' ? bf : undefined;
|
|
17
|
+
} catch (err) { logger.error(`Error creating buffered backup file: ${filename}`); }
|
|
18
|
+
}
|
|
19
|
+
public static async fromFile(pathName: string, fileName: string) {
|
|
20
|
+
try {
|
|
21
|
+
let bf = new BindingsFile();
|
|
22
|
+
bf.filePath = path.posix.join(pathName, fileName);
|
|
23
|
+
bf.filename = fileName;
|
|
24
|
+
bf.options = await bf.extractBindingOptions(bf.filePath);
|
|
25
|
+
return typeof bf.options !== 'undefined' ? bf : undefined;
|
|
26
|
+
} catch (err) { logger.error(`Error creating bindings file from file ${pathName}${fileName}`); }
|
|
27
|
+
}
|
|
28
|
+
public filename: string;
|
|
29
|
+
public filePath: string;
|
|
30
|
+
public options: any;
|
|
31
|
+
protected async extractBindingOptions(file: string | Buffer) {
|
|
32
|
+
try {
|
|
33
|
+
let buff = Buffer.isBuffer(file) ? file.toString() : fs.readFileSync(file, 'utf8');
|
|
34
|
+
let bindings = JSON.parse(buff);
|
|
35
|
+
let interfaces = config.getSection('web.interfaces');
|
|
36
|
+
let ass = [];
|
|
37
|
+
for (let ifname in interfaces) {
|
|
38
|
+
let iface = interfaces[ifname]
|
|
39
|
+
if (typeof iface !== 'undefined' && typeof iface.fileName !== 'undefined')
|
|
40
|
+
if (iface.fileName.endsWith(`custom/${this.filename}`)) ass.push(ifname);
|
|
41
|
+
}
|
|
42
|
+
if (typeof bindings.context !== 'undefined')
|
|
43
|
+
return {
|
|
44
|
+
filename: this.filename, filepath: this.filePath, name: bindings.context.name || name, type: bindings.context.type || undefined, assoc: ass
|
|
45
|
+
};
|
|
46
|
+
return this.options;
|
|
47
|
+
} catch (err) { logger.error(`Error extracting binding options from ${Buffer.isBuffer(file) ? 'Buffer' : file}: ${err.message}`); }
|
|
48
|
+
}
|
|
49
|
+
}
|
|
7
50
|
|
|
8
51
|
export class BaseInterfaceBindings {
|
|
9
52
|
constructor(cfg) {
|
|
@@ -13,10 +56,10 @@ export class BaseInterfaceBindings {
|
|
|
13
56
|
public cfg;
|
|
14
57
|
public events: InterfaceEvent[];
|
|
15
58
|
public bindEvent(evt: string, ...data: any) { };
|
|
16
|
-
|
|
59
|
+
public bindVarTokens(e: IInterfaceEvent, evt: string, ...data: any) {
|
|
17
60
|
let v = {};
|
|
18
61
|
let toks = {};
|
|
19
|
-
let vars = extend(true, {}, this.
|
|
62
|
+
let vars = extend(true, {}, this.context.vars, typeof e !== 'undefined' && e.vars ? e.vars : {}, this.cfg.vars || {});
|
|
20
63
|
for (var s in vars) {
|
|
21
64
|
let ovalue = vars[s];
|
|
22
65
|
if (typeof ovalue === 'string') {
|
|
@@ -32,7 +75,7 @@ export class BaseInterfaceBindings {
|
|
|
32
75
|
//console.log(v);
|
|
33
76
|
return v;
|
|
34
77
|
}
|
|
35
|
-
protected matchTokens(input: string, eventName: string, toks: any, e:
|
|
78
|
+
protected matchTokens(input: string, eventName: string, toks: any, e: IInterfaceEvent, data, vars): any {
|
|
36
79
|
toks = toks || [];
|
|
37
80
|
let s = input;
|
|
38
81
|
let regx = /(?<=@bind\=\s*).*?(?=\;)/g;
|
|
@@ -58,7 +101,7 @@ export class BaseInterfaceBindings {
|
|
|
58
101
|
return toks;
|
|
59
102
|
|
|
60
103
|
}
|
|
61
|
-
protected buildTokens(input: string, eventName: string, toks: any, e:
|
|
104
|
+
protected buildTokens(input: string, eventName: string, toks: any, e: IInterfaceEvent, data): any {
|
|
62
105
|
toks = toks || [];
|
|
63
106
|
let s = input;
|
|
64
107
|
let regx = /(?<=@bind\=\s*).*?(?=\;)/g;
|
|
@@ -111,6 +154,7 @@ export class BaseInterfaceBindings {
|
|
|
111
154
|
else if (typeof tok.value === 'undefined') s = s.replace(tok.reg, 'null');
|
|
112
155
|
else return tok.value;
|
|
113
156
|
}
|
|
157
|
+
return s;
|
|
114
158
|
}
|
|
115
159
|
protected tokensReplacer(input: string, eventName: string, toks: any, e: InterfaceEvent, data): any{
|
|
116
160
|
this.buildTokens(input, eventName, toks, e, data);
|
|
@@ -118,8 +162,15 @@ export class BaseInterfaceBindings {
|
|
|
118
162
|
}
|
|
119
163
|
public async stopAsync() { }
|
|
120
164
|
}
|
|
121
|
-
|
|
122
|
-
|
|
165
|
+
export interface IInterfaceEvent {
|
|
166
|
+
enabled: boolean;
|
|
167
|
+
filter?: string;
|
|
168
|
+
options?: any;
|
|
169
|
+
body?: any;
|
|
170
|
+
vars?: any;
|
|
171
|
+
processor?: string[]
|
|
172
|
+
}
|
|
173
|
+
export class InterfaceEvent implements IInterfaceEvent {
|
|
123
174
|
public name: string;
|
|
124
175
|
public enabled: boolean = true;
|
|
125
176
|
public filter: string;
|
|
@@ -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
|
|
@@ -112,7 +113,9 @@ export class HttpInterfaceBindings extends BaseInterfaceBindings {
|
|
|
112
113
|
//console.log(response.statusCode);
|
|
113
114
|
});
|
|
114
115
|
}
|
|
115
|
-
req.on('error', (err, req, res) => {
|
|
116
|
+
req.on('error', (err, req, res) => {
|
|
117
|
+
logger.error(`Error sending request for event ${evt}: ${err.message}`);
|
|
118
|
+
});
|
|
116
119
|
if (typeof sbody !== 'undefined') {
|
|
117
120
|
req.write(sbody);
|
|
118
121
|
}
|
|
@@ -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
|
|
@@ -94,13 +95,19 @@ export class InfluxInterfaceBindings extends BaseInterfaceBindings {
|
|
|
94
95
|
writeFailed: function(error, lines, failedAttempts){
|
|
95
96
|
/** return promise or void */
|
|
96
97
|
logger.error(`InfluxDB batch write failed writing ${lines.length} lines with ${failedAttempts} failed attempts. ${error.message}`);
|
|
98
|
+
//console.log(lines);
|
|
97
99
|
},
|
|
98
100
|
writeSuccess: function(lines){
|
|
99
101
|
logger.silly(`InfluxDB successfully wrote ${lines.length} lines.`)
|
|
100
102
|
},
|
|
103
|
+
writeRetrySkipped: function(entry){
|
|
104
|
+
logger.silly(`Influx write retry skipped ${JSON.stringify(entry)}`);
|
|
105
|
+
},
|
|
101
106
|
maxRetryTime: DEFAULT_WriteOptions.maxRetryTime,
|
|
102
107
|
exponentialBase: DEFAULT_WriteOptions.exponentialBase,
|
|
103
|
-
randomRetry: DEFAULT_WriteOptions.randomRetry
|
|
108
|
+
randomRetry: DEFAULT_WriteOptions.randomRetry,
|
|
109
|
+
maxBatchBytes: 4096
|
|
110
|
+
|
|
104
111
|
}
|
|
105
112
|
this.writeApi = influxDB.getWriteApi(org, bucket, 'ms', writeOptions);
|
|
106
113
|
|