itender/src/SensorHelper.ts
2023-01-24 00:34:41 +01:00

101 lines
3.5 KiB
TypeScript

import {IContainer} from "./database/IContainer";
import {SensorType} from "./SensorType";
import debug from "debug";
import {ArduinoProxyPayload} from "./ArduinoProxyPayload";
import {ArduinoProxyPayloadType} from "./ArduinoProxyPayloadType";
import {ArduinoProxy} from "./ArduinoProxy";
import Container from "./database/Container";
import {HCSR04} from "hc-sr04";
const HX711 = require("pi-hx711");
const log = debug("itender:sensor");
export class SensorHelper {
/**
* Returns the current raw container weight
* @param container
*/
static measureRaw(container: IContainer): Promise<number> {
return new Promise(async (resolve, reject) => {
if (container.sensorType == SensorType.LOADCELL) {
try {
if (container.sensorProxy) {
let payload = new ArduinoProxyPayload(ArduinoProxyPayloadType.GET_SENSOR, {
pin_data: container.sensorPin1,
pin_clock: container.sensorPin2
});
let val = await ArduinoProxy.sendRequest(payload);
if (!val.data.value)
return reject("");
container.rawData = val.data.value;
} else {
let sensor = new HX711(container.sensorPin1, container.sensorPin2);
container.rawData = await sensor.readRaw();
}
} catch (e) {
log("Sensor (Weight cell) of container " + container._id + " is broken or has malfunction - Removing it!");
container.sensorType = SensorType.NONE;
await container.save();
return reject();
}
} else if (container.sensorType == SensorType.ULTRASOUND) {
try {
// V2: Measure weight
let sensor = new HCSR04(container.sensorPin1, container.sensorPin2);
// container.rawData = sensor.measure(); ToDo
} catch (e) {
log("Sensor (Ultrasound) of container " + container._id + " is broken or has malfunction - Removing it!");
container.sensorType = SensorType.NONE;
await container.save();
return reject();
}
}
resolve(container.rawData);
});
}
/**
* All raw values from the measurements get cleared
*/
public static clearAllRawMeasurements() {
return new Promise<void>(async (resolve, reject) => {
for (let c of (await Container.find({}))) {
if (c.sensorType != SensorType.NONE) {
c.rawData = -1;
await c.save();
}
}
resolve();
})
}
/**
* All containers will be measured
*/
public static measureAllRaw() {
return new Promise<void>(async (resolve, reject) => {
for (let c of (await Container.find({}))) {
if (c.sensorType != SensorType.NONE) {
let weight: number | null = c.rawData;
try {
weight = await SensorHelper.measureRaw(c);
} catch (e) {
return reject("Fehler Sensor (" + c.sensorPin1 + ", " + c.sensorPin2 + ") - Container " + c.slot + 1);
}
}
}
resolve();
})
}
}