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.
- package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
- package/Changelog +13 -0
- package/Dockerfile +1 -0
- package/README.md +5 -5
- package/app.ts +11 -0
- package/config/Config.ts +3 -0
- package/config/VersionCheck.ts +8 -4
- package/controller/Constants.ts +165 -9
- package/controller/Equipment.ts +186 -65
- package/controller/Errors.ts +22 -1
- package/controller/State.ts +273 -57
- package/controller/boards/EasyTouchBoard.ts +194 -95
- package/controller/boards/IntelliCenterBoard.ts +115 -42
- package/controller/boards/IntelliTouchBoard.ts +104 -30
- package/controller/boards/NixieBoard.ts +155 -53
- package/controller/boards/SystemBoard.ts +1529 -514
- package/controller/comms/Comms.ts +219 -42
- package/controller/comms/messages/Messages.ts +16 -4
- package/controller/comms/messages/config/ChlorinatorMessage.ts +13 -3
- package/controller/comms/messages/config/CircuitGroupMessage.ts +6 -0
- package/controller/comms/messages/config/CircuitMessage.ts +1 -1
- package/controller/comms/messages/config/CoverMessage.ts +1 -0
- package/controller/comms/messages/config/EquipmentMessage.ts +4 -0
- package/controller/comms/messages/config/ExternalMessage.ts +43 -25
- package/controller/comms/messages/config/FeatureMessage.ts +8 -1
- package/controller/comms/messages/config/GeneralMessage.ts +8 -0
- package/controller/comms/messages/config/HeaterMessage.ts +15 -9
- package/controller/comms/messages/config/IntellichemMessage.ts +4 -1
- package/controller/comms/messages/config/OptionsMessage.ts +13 -1
- package/controller/comms/messages/config/PumpMessage.ts +4 -20
- package/controller/comms/messages/config/RemoteMessage.ts +4 -0
- package/controller/comms/messages/config/ScheduleMessage.ts +11 -0
- package/controller/comms/messages/config/SecurityMessage.ts +1 -0
- package/controller/comms/messages/config/ValveMessage.ts +12 -2
- package/controller/comms/messages/status/ChlorinatorStateMessage.ts +14 -6
- package/controller/comms/messages/status/EquipmentStateMessage.ts +78 -24
- package/controller/comms/messages/status/HeaterStateMessage.ts +25 -5
- package/controller/comms/messages/status/IntelliChemStateMessage.ts +55 -26
- package/controller/nixie/Nixie.ts +18 -16
- package/controller/nixie/NixieEquipment.ts +6 -6
- package/controller/nixie/bodies/Body.ts +7 -4
- package/controller/nixie/bodies/Filter.ts +7 -4
- package/controller/nixie/chemistry/ChemController.ts +800 -283
- package/controller/nixie/chemistry/Chlorinator.ts +22 -14
- package/controller/nixie/circuits/Circuit.ts +42 -7
- package/controller/nixie/heaters/Heater.ts +303 -30
- package/controller/nixie/pumps/Pump.ts +57 -30
- package/controller/nixie/schedules/Schedule.ts +10 -7
- package/controller/nixie/valves/Valve.ts +7 -5
- package/defaultConfig.json +32 -1
- package/issue_template.md +1 -1
- package/logger/DataLogger.ts +37 -22
- package/package.json +20 -18
- package/web/Server.ts +529 -31
- package/web/bindings/influxDB.json +157 -5
- package/web/bindings/mqtt.json +112 -13
- package/web/bindings/mqttAlt.json +109 -11
- package/web/interfaces/baseInterface.ts +2 -1
- package/web/interfaces/httpInterface.ts +2 -0
- package/web/interfaces/influxInterface.ts +103 -54
- package/web/interfaces/mqttInterface.ts +16 -5
- package/web/services/config/Config.ts +179 -43
- package/web/services/state/State.ts +51 -5
- 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.
|
|
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)).
|
|
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
|
-
|
|
167
|
-
|
|
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.
|
|
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
|
|
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) {
|