itender/server/src/ContainerHelper.ts
2025-05-21 10:27:20 +02:00

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();
}
}
}
}