97 lines
3.6 KiB
TypeScript
97 lines
3.6 KiB
TypeScript
import Container from "./database/Container";
|
|
import {SensorType} from "./SensorType";
|
|
import {SensorHelper} from "./SensorHelper";
|
|
import {WebSocketHandler} from "./WebSocketHandler";
|
|
import {WebSocketPayload} from "./WebSocketPayload";
|
|
import {WebSocketEvent} from "./WebSocketEvent";
|
|
import debug from "debug";
|
|
import {iTender} from "./iTender";
|
|
|
|
const log = debug("itender:container");
|
|
|
|
export class ContainerHelper {
|
|
|
|
/**
|
|
* Measure all containers based on their sensor values
|
|
*/
|
|
static async measureContainers() {
|
|
log("Measuring containers...");
|
|
|
|
for (let c of (await Container.find({}))) {
|
|
if (c.sensorType != SensorType.NONE) {
|
|
|
|
let weight: number;
|
|
try {
|
|
weight = await SensorHelper.measureRaw(c);
|
|
} catch (e) {
|
|
log(e);
|
|
await WebSocketHandler.send(new WebSocketPayload(WebSocketEvent.ERROR, "Ein Sensor hat beim Austarieren einen ungültigen Wert zurückgegeben.<br>Dies weist auf eine Fehlkonfiguration oder kaputten Sensor hin.<br>Aus Sicherheitsgründen wurde der Sensor für diesen Behälter deaktiviert."));
|
|
continue;
|
|
}
|
|
|
|
|
|
// V2: New calculation method
|
|
/*
|
|
(WEIGHT_VAL - NO_WEIGHT_VAL) / Sensitivitätsfaktor = Gewicht in Gramm
|
|
(WEIGHT_VAL - NO_WEIGHT_VAL) / (100g_val /100) ist die Formel zur Berechnung des Gewichts in Gramm nach der Kalibrierung mit einem 100 Gramm Gewicht.
|
|
100g_val /100 gibt den Sensitivitätsfaktor an, der angibt, wie viel sich der Sensorwert ändert, wenn sich das Gewicht um ein Gramm ändert.
|
|
Durch die Division von 100g_val durch 100 wird der Sensitivitätsfaktor berechnet, und durch die Division von (WEIGHT_VAL - NO_WEIGHT_VAL) durch den Sensitivitätsfaktor wird das Gewicht in Gramm berechnet.
|
|
|
|
Beispiel:
|
|
(WEIGHT_VAL - NO_WEIGHT_VAL) / (100g_val /100) = Gewicht in Gramm
|
|
(2400 - 2000) / (2450 /100) = 80 Gramm
|
|
*/
|
|
let newFilled = weight - c.sensorDelta / iTender.sensitivityFactor;
|
|
|
|
if (newFilled <= 3 && c.filled != -1) {
|
|
c.filled = -1;
|
|
// Container is empty!
|
|
} else {
|
|
// Container > 2
|
|
c.filled = newFilled;
|
|
}
|
|
|
|
await c.save();
|
|
}
|
|
|
|
}
|
|
await WebSocketHandler.sendContainers();
|
|
log("Containers measured!");
|
|
|
|
}
|
|
|
|
static async tare() {
|
|
// Start TARE
|
|
|
|
for (let c of await Container.find({})) {
|
|
if (c.sensorType != SensorType.NONE) {
|
|
c.sensorTare = 0;
|
|
await c.save();
|
|
}
|
|
}
|
|
|
|
let timeouts: Array<NodeJS.Timeout> = [];
|
|
|
|
async function measureAndSave() {
|
|
await SensorHelper.measureAllRaw();
|
|
for (let c of await Container.find({})) {
|
|
if (c.sensorType != SensorType.NONE) {
|
|
c.sensorTare += c.rawData;
|
|
}
|
|
}
|
|
}
|
|
|
|
timeouts.push(setTimeout(measureAndSave, 500));
|
|
timeouts.push(setTimeout(measureAndSave, 1000));
|
|
timeouts.push(setTimeout(measureAndSave, 2000));
|
|
timeouts.push(setTimeout(measureAndSave, 3000));
|
|
|
|
await Promise.all(timeouts);
|
|
for (let c of await Container.find({})) {
|
|
if (c.sensorType != SensorType.NONE) {
|
|
c.sensorTare = c.sensorTare / 4;
|
|
await c.save();
|
|
}
|
|
}
|
|
}
|
|
} |