nodejs-poolcontroller 7.6.1 → 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 (102) hide show
  1. package/.eslintrc.json +36 -45
  2. package/.github/ISSUE_TEMPLATE/1-bug-report.yml +84 -0
  3. package/.github/ISSUE_TEMPLATE/2-docs.md +12 -0
  4. package/.github/ISSUE_TEMPLATE/3-proposal.md +28 -0
  5. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  6. package/CONTRIBUTING.md +74 -74
  7. package/Changelog +242 -215
  8. package/Dockerfile +17 -17
  9. package/Gruntfile.js +40 -40
  10. package/LICENSE +661 -661
  11. package/README.md +195 -191
  12. package/anslq25/MessagesMock.ts +218 -0
  13. package/anslq25/boards/MockBoardFactory.ts +50 -0
  14. package/anslq25/boards/MockEasyTouchBoard.ts +696 -0
  15. package/anslq25/boards/MockSystemBoard.ts +217 -0
  16. package/anslq25/chemistry/MockChlorinator.ts +75 -0
  17. package/anslq25/pumps/MockPump.ts +84 -0
  18. package/app.ts +10 -14
  19. package/config/Config.ts +26 -8
  20. package/config/VersionCheck.ts +8 -4
  21. package/controller/Constants.ts +59 -25
  22. package/controller/Equipment.ts +2667 -2459
  23. package/controller/Errors.ts +181 -180
  24. package/controller/Lockouts.ts +534 -436
  25. package/controller/State.ts +596 -77
  26. package/controller/boards/AquaLinkBoard.ts +1003 -0
  27. package/controller/boards/BoardFactory.ts +53 -45
  28. package/controller/boards/EasyTouchBoard.ts +3079 -2653
  29. package/controller/boards/IntelliCenterBoard.ts +3821 -4230
  30. package/controller/boards/IntelliComBoard.ts +69 -63
  31. package/controller/boards/IntelliTouchBoard.ts +384 -241
  32. package/controller/boards/NixieBoard.ts +1871 -1675
  33. package/controller/boards/SunTouchBoard.ts +393 -0
  34. package/controller/boards/SystemBoard.ts +5244 -4697
  35. package/controller/comms/Comms.ts +905 -541
  36. package/controller/comms/ScreenLogic.ts +1663 -0
  37. package/controller/comms/messages/Messages.ts +382 -54
  38. package/controller/comms/messages/config/ChlorinatorMessage.ts +8 -4
  39. package/controller/comms/messages/config/CircuitGroupMessage.ts +5 -2
  40. package/controller/comms/messages/config/CircuitMessage.ts +82 -13
  41. package/controller/comms/messages/config/ConfigMessage.ts +3 -1
  42. package/controller/comms/messages/config/CoverMessage.ts +2 -1
  43. package/controller/comms/messages/config/CustomNameMessage.ts +31 -30
  44. package/controller/comms/messages/config/EquipmentMessage.ts +5 -1
  45. package/controller/comms/messages/config/ExternalMessage.ts +33 -3
  46. package/controller/comms/messages/config/FeatureMessage.ts +2 -1
  47. package/controller/comms/messages/config/GeneralMessage.ts +2 -1
  48. package/controller/comms/messages/config/HeaterMessage.ts +145 -11
  49. package/controller/comms/messages/config/IntellichemMessage.ts +2 -1
  50. package/controller/comms/messages/config/OptionsMessage.ts +16 -27
  51. package/controller/comms/messages/config/PumpMessage.ts +62 -47
  52. package/controller/comms/messages/config/RemoteMessage.ts +80 -13
  53. package/controller/comms/messages/config/ScheduleMessage.ts +390 -347
  54. package/controller/comms/messages/config/SecurityMessage.ts +2 -1
  55. package/controller/comms/messages/config/ValveMessage.ts +44 -27
  56. package/controller/comms/messages/status/ChlorinatorStateMessage.ts +44 -91
  57. package/controller/comms/messages/status/EquipmentStateMessage.ts +139 -30
  58. package/controller/comms/messages/status/HeaterStateMessage.ts +135 -86
  59. package/controller/comms/messages/status/IntelliChemStateMessage.ts +448 -445
  60. package/controller/comms/messages/status/IntelliValveStateMessage.ts +36 -35
  61. package/controller/comms/messages/status/PumpStateMessage.ts +92 -2
  62. package/controller/comms/messages/status/VersionMessage.ts +2 -1
  63. package/controller/nixie/Nixie.ts +173 -162
  64. package/controller/nixie/NixieEquipment.ts +104 -103
  65. package/controller/nixie/bodies/Body.ts +120 -120
  66. package/controller/nixie/bodies/Filter.ts +135 -135
  67. package/controller/nixie/chemistry/ChemController.ts +2682 -2498
  68. package/controller/nixie/chemistry/ChemDoser.ts +806 -0
  69. package/controller/nixie/chemistry/Chlorinator.ts +367 -314
  70. package/controller/nixie/circuits/Circuit.ts +402 -248
  71. package/controller/nixie/heaters/Heater.ts +815 -649
  72. package/controller/nixie/pumps/Pump.ts +934 -661
  73. package/controller/nixie/schedules/Schedule.ts +319 -257
  74. package/controller/nixie/valves/Valve.ts +170 -170
  75. package/defaultConfig.json +346 -286
  76. package/logger/DataLogger.ts +448 -448
  77. package/logger/Logger.ts +38 -9
  78. package/package.json +60 -56
  79. package/tsconfig.json +25 -25
  80. package/web/Server.ts +275 -117
  81. package/web/bindings/aqualinkD.json +560 -0
  82. package/web/bindings/homeassistant.json +437 -0
  83. package/web/bindings/influxDB.json +1066 -1021
  84. package/web/bindings/mqtt.json +721 -654
  85. package/web/bindings/mqttAlt.json +746 -684
  86. package/web/bindings/rulesManager.json +54 -54
  87. package/web/bindings/smartThings-Hubitat.json +31 -31
  88. package/web/bindings/valveRelays.json +20 -20
  89. package/web/bindings/vera.json +25 -25
  90. package/web/interfaces/baseInterface.ts +188 -136
  91. package/web/interfaces/httpInterface.ts +148 -124
  92. package/web/interfaces/influxInterface.ts +283 -245
  93. package/web/interfaces/mqttInterface.ts +695 -475
  94. package/web/interfaces/ruleInterface.ts +87 -0
  95. package/web/services/config/Config.ts +177 -49
  96. package/web/services/config/ConfigSocket.ts +2 -1
  97. package/web/services/state/State.ts +154 -3
  98. package/web/services/state/StateSocket.ts +69 -18
  99. package/web/services/utilities/Utilities.ts +232 -42
  100. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -52
  101. package/config copy.json +0 -300
  102. package/issue_template.md +0 -52
@@ -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
@@ -177,6 +178,8 @@ export class Heliotrope {
177
178
  public get calculatedTimes(): any { return { sunrise: this.sunrise, sunset: this.sunset, isValid: this.isValid }; }
178
179
  }
179
180
  export class Timestamp {
181
+ private static dateTextISO = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$/;
182
+ private static dateTextAjax = /^\/Date\((d|-|.*)\)[\/|\\]$/;
180
183
  private _dt: Date;
181
184
  public emitter: EventEmitter;
182
185
  constructor(dt?: Date | string) {
@@ -187,8 +190,8 @@ export class Timestamp {
187
190
  private _isUpdating: boolean = false;
188
191
  public static get now(): Timestamp { return new Timestamp(); }
189
192
  public toDate() { return this._dt; }
190
- public set isUpdating(val:boolean) {this._isUpdating = val;}
191
- public get isUpdating(): boolean { return this._isUpdating;}
193
+ public set isUpdating(val: boolean) { this._isUpdating = val; }
194
+ public get isUpdating(): boolean { return this._isUpdating; }
192
195
  public get hours(): number { return this._dt.getHours(); }
193
196
  public set hours(val: number) {
194
197
  if (this.hours !== val) {
@@ -261,8 +264,8 @@ export class Timestamp {
261
264
  dt.getFullYear() !== this._dt.getFullYear())
262
265
  this.emitter.emit('change');
263
266
  }
264
- public calcTZOffset(): {tzOffset:number, adjustDST:boolean}{
265
- let obj = {tzOffset: 0, adjustDST: false};
267
+ public calcTZOffset(): { tzOffset: number, adjustDST: boolean } {
268
+ let obj = { tzOffset: 0, adjustDST: false };
266
269
  let dateJan = new Date(this._dt.getFullYear(), 0, 1, 2);
267
270
  let dateJul = new Date(this._dt.getFullYear(), 6, 1, 2);
268
271
  obj.tzOffset = dateJan.getTimezoneOffset() / 60 * -1;
@@ -293,6 +296,15 @@ export class Timestamp {
293
296
  }
294
297
  public clone() { return new Timestamp(new Date(this._dt)); }
295
298
  public static locale() { return Intl.DateTimeFormat().resolvedOptions().locale; }
299
+ public static parseISO(val: string): RegExpExecArray { return typeof val !== 'undefined' && val ? Timestamp.dateTextISO.exec(val) : null; }
300
+ public static parseAjax(val: string): RegExpExecArray { return typeof val !== 'undefined' && val ? Timestamp.dateTextAjax.exec(val) : null; }
301
+ public static dayOfWeek(time: Timestamp): number {
302
+ // for IntelliTouch set date/time
303
+ if (time.toDate().getUTCDay() === 0)
304
+ return 0;
305
+ else
306
+ return Math.pow(2, time.toDate().getUTCDay() - 1);
307
+ }
296
308
  }
297
309
  export enum ControllerType {
298
310
  IntelliCenter = 'intellicenter',
@@ -300,26 +312,12 @@ export enum ControllerType {
300
312
  IntelliCom = 'intellicom',
301
313
  EasyTouch = 'easytouch',
302
314
  Unknown = 'unknown',
303
- Virtual = 'virtual',
304
- Nixie = 'nixie'
315
+ // Virtual = 'virtual',
316
+ Nixie = 'nixie',
317
+ AquaLink = 'aqualink',
318
+ SunTouch = 'suntouch',
319
+ None = 'none'
305
320
  }
306
- // export enum VirtualDeviceType {
307
- // Pump = 'pump',
308
- // Chlorinator = 'chlorinator'
309
- // }
310
- //export class Enums {
311
- // public static Addresses = {
312
- // 2: { val: 2, name: 'chlorinator', desc: 'Chlorinator' },
313
- // 15: { val: 15, name: 'outdoor', desc: 'Main outdoor panel' },
314
- // 16: { val: 16, name: 'broadcast', desc: 'Broadcast' },
315
- // 33: { val: 33, name: 'intellitouch', desc: 'Intellitouch Plugin' },
316
- // 34: { val: 34, name: 'mobi', desc: 'Wireless controller' },
317
- // 36: { val: 36, name: 'intellicenter', desc: 'Intellicenter Plugin' },
318
- // 37: { val: 37, name: 'indoor2', desc: 'Indoor panel #2' },
319
- // 144: { val: 144, name: 'intellichem', desc: 'Intellichem' },
320
- // transform: function (byte) { return extend(true, {}, this[byte] || this[0]); }
321
- // }
322
- //}
323
321
 
324
322
  export class Utils {
325
323
  public makeBool(val) {
@@ -344,6 +342,32 @@ export class Utils {
344
342
  }
345
343
  return false;
346
344
  }
345
+ public static jsonReviver = (key, value) => {
346
+ if (typeof value === 'string') {
347
+ let d = Timestamp.parseISO(value);
348
+ // By parsing the date and then creating a new date from that we will get
349
+ // the date in the proper timezone.
350
+ if (d) return new Date(Date.parse(value));
351
+ d = Timestamp.parseAjax(value);
352
+ if (d) {
353
+ // Not sure we will be seeing ajax dates but this is
354
+ // something that we may see from external sources.
355
+ let a = d[1].split(/[-+,.]/);
356
+ return new Date(a[0] ? +a[0] : 0 - +a[1]);
357
+ }
358
+ }
359
+ return value;
360
+ }
361
+ public static jsonReplacer = (key, value) => {
362
+ // Add in code to change Timestamp into a string.
363
+ if (typeof value !== 'undefined' && value) {
364
+ if (typeof value.format === 'function') return value.format();
365
+ else if (typeof value.getTime === 'function') return Timestamp.toISOLocal(value);
366
+ }
367
+ return value;
368
+ }
369
+ public static parseJSON(json: string) { return JSON.parse(json, Utils.jsonReviver); }
370
+ public static stringifyJSON(obj: any) { return JSON.stringify(obj, Utils.jsonReplacer); }
347
371
  public uuid(a?, b?) { for (b = a = ''; a++ < 36; b += a * 51 & 52 ? (a ^ 15 ? 8 ^ Math.random() * (a ^ 20 ? 16 : 4) : 4).toString(16) : '-'); return b }
348
372
  public convert = {
349
373
  temperature: {
@@ -569,7 +593,7 @@ export class Utils {
569
593
  return seconds;
570
594
  }
571
595
  public isNullOrEmpty(val: any) { return (typeof val === 'string') ? val === null || val === '' : typeof val === 'undefined' || val === null; }
572
- public sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
596
+ // public sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
573
597
  // Use this method to get around the circular references for the toJSON function.
574
598
  public serialize(obj, fn?: (key, value) => any): string {
575
599
  let op = Object.getOwnPropertyNames(obj);
@@ -670,6 +694,16 @@ export class Utils {
670
694
  let slope = (points_y[0] - points_y[points_y.length - 1]) / (points_x[0] - points_x[points_x.length - 1]);
671
695
  return slope;
672
696
  }
697
+ private random(bounds: number, onlyPositive: boolean = false) {
698
+ let rand = Math.random() * bounds;
699
+ if (!onlyPositive) {
700
+ if (Math.random() <= .5) rand = rand * -1;
701
+ }
702
+ return rand;
703
+ }
704
+ public dec2bin(dec) {
705
+ return (dec >>> 0).toString(2).padStart(8, '0');
706
+ }
673
707
  }
674
708
 
675
709
  export const utils = new Utils();