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
@@ -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 { utils, Timestamp } from "../../controller/Constants";
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
- protected bindVarTokens(e: InterfaceEvent, evt: string, ...data: any) {
59
+ public bindVarTokens(e: IInterfaceEvent, evt: string, ...data: any) {
17
60
  let v = {};
18
61
  let toks = {};
19
- let vars = extend(true, {}, this.cfg.vars, this.context.vars, typeof e !== 'undefined' && e.vars ? e.vars : {});
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: InterfaceEvent, data, vars): any {
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: InterfaceEvent, data): any {
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
- export class InterfaceEvent {
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. 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
@@ -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) => { logger.error(err); });
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. 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
@@ -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