nodejs-poolcontroller 7.2.0 → 7.5.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.
Files changed (64) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  2. package/Changelog +13 -0
  3. package/Dockerfile +1 -0
  4. package/README.md +5 -5
  5. package/app.ts +11 -0
  6. package/config/Config.ts +3 -0
  7. package/config/VersionCheck.ts +8 -4
  8. package/controller/Constants.ts +165 -9
  9. package/controller/Equipment.ts +186 -65
  10. package/controller/Errors.ts +22 -1
  11. package/controller/State.ts +273 -57
  12. package/controller/boards/EasyTouchBoard.ts +194 -95
  13. package/controller/boards/IntelliCenterBoard.ts +115 -42
  14. package/controller/boards/IntelliTouchBoard.ts +104 -30
  15. package/controller/boards/NixieBoard.ts +155 -53
  16. package/controller/boards/SystemBoard.ts +1529 -514
  17. package/controller/comms/Comms.ts +219 -42
  18. package/controller/comms/messages/Messages.ts +16 -4
  19. package/controller/comms/messages/config/ChlorinatorMessage.ts +13 -3
  20. package/controller/comms/messages/config/CircuitGroupMessage.ts +6 -0
  21. package/controller/comms/messages/config/CircuitMessage.ts +1 -1
  22. package/controller/comms/messages/config/CoverMessage.ts +1 -0
  23. package/controller/comms/messages/config/EquipmentMessage.ts +4 -0
  24. package/controller/comms/messages/config/ExternalMessage.ts +43 -25
  25. package/controller/comms/messages/config/FeatureMessage.ts +8 -1
  26. package/controller/comms/messages/config/GeneralMessage.ts +8 -0
  27. package/controller/comms/messages/config/HeaterMessage.ts +15 -9
  28. package/controller/comms/messages/config/IntellichemMessage.ts +4 -1
  29. package/controller/comms/messages/config/OptionsMessage.ts +13 -1
  30. package/controller/comms/messages/config/PumpMessage.ts +4 -20
  31. package/controller/comms/messages/config/RemoteMessage.ts +4 -0
  32. package/controller/comms/messages/config/ScheduleMessage.ts +11 -0
  33. package/controller/comms/messages/config/SecurityMessage.ts +1 -0
  34. package/controller/comms/messages/config/ValveMessage.ts +12 -2
  35. package/controller/comms/messages/status/ChlorinatorStateMessage.ts +14 -6
  36. package/controller/comms/messages/status/EquipmentStateMessage.ts +78 -24
  37. package/controller/comms/messages/status/HeaterStateMessage.ts +25 -5
  38. package/controller/comms/messages/status/IntelliChemStateMessage.ts +55 -26
  39. package/controller/nixie/Nixie.ts +18 -16
  40. package/controller/nixie/NixieEquipment.ts +6 -6
  41. package/controller/nixie/bodies/Body.ts +7 -4
  42. package/controller/nixie/bodies/Filter.ts +7 -4
  43. package/controller/nixie/chemistry/ChemController.ts +800 -283
  44. package/controller/nixie/chemistry/Chlorinator.ts +22 -14
  45. package/controller/nixie/circuits/Circuit.ts +42 -7
  46. package/controller/nixie/heaters/Heater.ts +303 -30
  47. package/controller/nixie/pumps/Pump.ts +57 -30
  48. package/controller/nixie/schedules/Schedule.ts +10 -7
  49. package/controller/nixie/valves/Valve.ts +7 -5
  50. package/defaultConfig.json +32 -1
  51. package/issue_template.md +1 -1
  52. package/logger/DataLogger.ts +37 -22
  53. package/package.json +20 -18
  54. package/web/Server.ts +529 -31
  55. package/web/bindings/influxDB.json +157 -5
  56. package/web/bindings/mqtt.json +112 -13
  57. package/web/bindings/mqttAlt.json +109 -11
  58. package/web/interfaces/baseInterface.ts +2 -1
  59. package/web/interfaces/httpInterface.ts +2 -0
  60. package/web/interfaces/influxInterface.ts +103 -54
  61. package/web/interfaces/mqttInterface.ts +16 -5
  62. package/web/services/config/Config.ts +179 -43
  63. package/web/services/state/State.ts +51 -5
  64. package/web/services/state/StateSocket.ts +19 -2
@@ -15,6 +15,8 @@ You should have received a copy of the GNU Affero General Public License
15
15
  along with this program. If not, see <http://www.gnu.org/licenses/>.
16
16
  */
17
17
  import * as express from "express";
18
+ import * as extend from "extend";
19
+
18
20
  import { state, ICircuitState, LightGroupState, ICircuitGroupState, ChemicalDoseState } from "../../../controller/State";
19
21
  import { sys } from "../../../controller/Equipment";
20
22
  import { utils } from '../../../controller/Constants';
@@ -44,7 +46,9 @@ export class StateRoute {
44
46
  });
45
47
  app.put('/state/chemController/manualMix', async (req, res, next) => {
46
48
  try {
49
+ logger.debug(`Starting manual mix`);
47
50
  let schem = await sys.board.chemControllers.manualMixAsync(req.body);
51
+ logger.debug(`Started manual mix`);
48
52
  return res.status(200).send(schem.getExtended());
49
53
  }
50
54
  catch (err) { next(err); }
@@ -77,7 +81,21 @@ export class StateRoute {
77
81
  catch (err) { next(err); }
78
82
 
79
83
  });
80
- app.search('/state/chemController/:id/doseHistory/ph', async (req, res, next) => {
84
+ app.get('/state/chemController/:id/doseLog/ph', async (req, res, next) => {
85
+ try {
86
+ let schem = state.chemControllers.getItemById(parseInt(req.params.id));
87
+ let filter = req.body || {};
88
+ let dh = await DataLogger.readFromEndAsync(`chemDosage_${schem.ph.chemType}.log`, ChemicalDoseState, (lineNumber: number, entry: ChemicalDoseState, arr: ChemicalDoseState[]): boolean => {
89
+ if (entry.id !== schem.id) return false;
90
+ if (typeof filter.lines !== 'undefined' && filter.lines <= arr.length) return false;
91
+ if (typeof filter.date !== 'undefined' && entry.end < filter.date) return false;
92
+ return true;
93
+ });
94
+ return res.status(200).send(dh);
95
+ }
96
+ catch (err) { next(err); }
97
+ });
98
+ app.search('/state/chemController/:id/doseLog/ph', async (req, res, next) => {
81
99
  try {
82
100
  let schem = state.chemControllers.getItemById(parseInt(req.params.id));
83
101
  let filter = req.body || {};
@@ -91,6 +109,34 @@ export class StateRoute {
91
109
  }
92
110
  catch (err) { next(err); }
93
111
  });
112
+ app.get('/state/chemController/:id/doseLog/orp', async (req, res, next) => {
113
+ try {
114
+ let schem = state.chemControllers.getItemById(parseInt(req.params.id));
115
+ let filter = req.body || {};
116
+ let dh = await DataLogger.readFromEndAsync(`chemDosage_orp.log`, ChemicalDoseState, (lineNumber: number, entry: ChemicalDoseState, arr: ChemicalDoseState[]): boolean => {
117
+ if (entry.id !== schem.id) return false;
118
+ if (typeof filter.lines !== 'undefined' && filter.lines <= arr.length) return false;
119
+ if (typeof filter.date !== 'undefined' && entry.end < filter.date) return false;
120
+ return true;
121
+ });
122
+ return res.status(200).send(dh);
123
+ }
124
+ catch (err) { next(err); }
125
+ });
126
+ app.search('/state/chemController/:id/doseLog/orp', async (req, res, next) => {
127
+ try {
128
+ let schem = state.chemControllers.getItemById(parseInt(req.params.id));
129
+ let filter = req.body || {};
130
+ let dh = DataLogger.readFromEnd(`chemDosage_orp.log`, ChemicalDoseState, (lineNumber: number, entry: ChemicalDoseState, arr: ChemicalDoseState[]): boolean => {
131
+ if (entry.id !== schem.id) return;
132
+ if (typeof filter.lines !== 'undefined' && filter.lines <= arr.length) return false;
133
+ if (typeof filter.date !== 'undefined' && entry.end < filter.date) return false;
134
+ return true;
135
+ });
136
+ return res.status(200).send(dh);
137
+ }
138
+ catch (err) { next(err); }
139
+ });
94
140
  app.put('/state/chemController/cancelDosing', async (req, res, next) => {
95
141
  try {
96
142
  let schem = await sys.board.chemControllers.cancelDosingAsync(req.body);
@@ -107,7 +153,7 @@ export class StateRoute {
107
153
  });
108
154
 
109
155
  app.get('/state/chlorinator/:id', (req, res) => {
110
- res.status(200).send(state.chlorinators.getItemById(parseInt(req.params.id, 10)).get());
156
+ res.status(200).send(state.chlorinators.getItemById(parseInt(req.params.id, 10), false).getExtended());
111
157
  });
112
158
  app.get('/state/circuit/:id', (req, res) => {
113
159
  res.status(200).send(state.circuits.getItemById(parseInt(req.params.id, 10)).get());
@@ -163,8 +209,8 @@ export class StateRoute {
163
209
  catch (err) {next(err);}
164
210
  });
165
211
  app.put('/state/circuit/setTheme', async (req, res, next) => {
166
- try {
167
- let theme = await state.circuits.setLightThemeAsync(parseInt(req.body.id, 10), parseInt(req.body.theme, 10));
212
+ try {
213
+ let theme = await state.circuits.setLightThemeAsync(parseInt(req.body.id, 10), sys.board.valueMaps.lightThemes.encode(req.body.theme));
168
214
  return res.status(200).send(theme.get(true));
169
215
  }
170
216
  catch (err) { next(err); }
@@ -227,7 +273,7 @@ export class StateRoute {
227
273
  if (typeof req.body.heatSetpoint !== 'undefined' && !isNaN(parseInt(req.body.heatSetpoint, 10)))
228
274
  await sys.board.bodies.setHeatSetpointAsync(body, parseInt(req.body.heatSetpoint, 10));
229
275
  else if (typeof req.body.setPoint !== 'undefined' && !isNaN(parseInt(req.body.setPoint, 10)))
230
- await sys.board.bodies.setHeatSetpointAsync(body, parseInt(req.body.heatSetpoint, 10));
276
+ await sys.board.bodies.setHeatSetpointAsync(body, parseInt(req.body.setpoint, 10));
231
277
  let tbody = state.temps.bodies.getItemById(body.id);
232
278
  return res.status(200).send(tbody.get(true));
233
279
  } catch (err) { next(err); }
@@ -74,6 +74,7 @@ export class StateSocket {
74
74
  }
75
75
  catch (err) { logger.error(err); }
76
76
  });
77
+
77
78
  sock.on('/chlorinator', async (data: any) => {
78
79
  try {
79
80
  data = JSON.parse(data);
@@ -99,6 +100,22 @@ export class StateSocket {
99
100
  }
100
101
  catch (err) { logger.error(err); }
101
102
  });
103
+ sock.on('/filter', async (data: any) => {
104
+ try {
105
+ data = JSON.parse(data);
106
+ let id = parseInt(data.id, 10);
107
+ let filter = sys.filters.find(elem => elem.id === id);
108
+ if (typeof filter !== 'undefined' && filter.isActive && !isNaN(filter.id)) {
109
+ let sfilter = state.filters.getItemById(filter.id, filter.isActive)
110
+ let pu = sys.board.valueMaps.pressureUnits.transform(filter.pressureUnits);
111
+ if (typeof data.pressure !== 'undefined')
112
+ await sys.board.filters.setFilterPressure(filter.id, data.pressure, data.pressureUnits || pu.name);
113
+ sfilter.emitEquipmentChange();
114
+ }
115
+
116
+
117
+ } catch (err) { logger.error(err); }
118
+ });
102
119
  sock.on('/chemController', async (data: any) => {
103
120
  try {
104
121
  //console.log(`chemController: ${data}`);
@@ -132,7 +149,7 @@ export class StateSocket {
132
149
  if (isBodyOn || !controller.orp.flowReadingsOnly) scontroller.orp.level = scontroller.orp.probe.level;
133
150
  }
134
151
  if (typeof data.temperature !== 'undefined') scontroller.ph.probe.temperature = data.temperauture;
135
- if (typeof data.tempUnits !== 'undefined') scontroller.ph.probe.tempUnits = data.tempUnits;
152
+ if (typeof data.tempUnits !== 'undefined') scontroller.ph.probe.tempUnits = sys.board.valueMaps.tempUnits.encode(data.tempUnits);
136
153
  if (typeof data.acidTank !== 'undefined') {
137
154
  if (!isNaN(parseFloat(data.acidTank.level))) scontroller.ph.tank.level = parseFloat(data.acidTank.level);
138
155
  if (!isNaN(parseFloat(data.acidTank.capacity))) scontroller.ph.tank.capacity = controller.ph.tank.capacity = parseFloat(data.acidTank.capacity);
@@ -144,7 +161,7 @@ export class StateSocket {
144
161
  if (typeof data.orpTank.units === 'string') scontroller.orp.tank.units = controller.orp.tank.units = data.orpTank.units;
145
162
  }
146
163
 
147
- // Need to build this out to include the type of controller. If this is Homegrown or REM Chem we
164
+ // Need to build this out to include the type of controller. If this is REM Chem we
148
165
  // will send the whole rest of the nut over to it. Intellichem will only let us
149
166
  // set specific values.
150
167
  if (controller.type === 3) {