update fix; etc. tag:V2 Updates

Took 1 hour 16 minutes
This commit is contained in:
Tobias Hopp 2023-01-09 23:07:13 +01:00
parent 9c63516ab8
commit c509fb2bf7
12 changed files with 137 additions and 74 deletions

View File

@ -20,3 +20,4 @@
- Wenn Sensorik für Behälter vorhanden ist, nutze Wägezelle des Containers und messe anhand dessen Inhaltsmenge - Wenn Sensorik für Behälter vorhanden ist, nutze Wägezelle des Containers und messe anhand dessen Inhaltsmenge
- 1G=1ML - 1G=1ML
- Bei Einstellung neues Inhalts wird das Gewicht als ml übersetzt, danach wird Gewicht-Eingestellte Millitier gerechnet, das Ergebnis ist das Gewicht des Behälters - Bei Einstellung neues Inhalts wird das Gewicht als ml übersetzt, danach wird Gewicht-Eingestellte Millitier gerechnet, das Ergebnis ist das Gewicht des Behälters
- Da nun generell eine Fehlermeldung erscheint, sobald eine Wägezelle inkorrekt läuft, muss vor dem Tarieren (also beim Drücken von Speichern) erst eine CHECK request gesendet werden, danach folgt dann bei erfolgreich die Tarierung

45
src/SensorHelper.ts Normal file
View File

@ -0,0 +1,45 @@
import {IContainer} from "./database/IContainer";
import {SensorType} from "./SensorType";
import {HX711} from "./HX711";
import debug from "debug";
const log = debug("itender:sensor");
export class SensorHelper {
/**
* Returns the current container weight
* @param container
*/
static measure(container: IContainer): number | null {
if (container.sensorType == SensorType.LOADCELL) {
try {
// V2: Measure weight
let sensor = new HX711(container.sensorPin1, container.sensorPin2);
container.rawData = sensor.measure();
} catch (e) {
log("Sensor (Weight cell) of container " + container._id + " is broken or has malfunction - Removing it!");
container.sensorType = SensorType.NONE;
container.save();
return null;
}
} else if (container.sensorType == SensorType.ULTRASOUND) {
try {
// V2: Measure weight
let sensor = new HX711(container.sensorPin1, container.sensorPin2);
container.rawData = sensor.measure();
} catch (e) {
log("Sensor (Ultrasound) of container " + container._id + " is broken or has malfunction - Removing it!");
container.sensorType = SensorType.NONE;
container.save();
return null;
}
}
// todo Überprüfen ob hier Umrechnungen nötig sind. Soll in Gramm zurück gegeben werden
return container.rawData;
}
}

View File

@ -38,21 +38,21 @@ export class WebSocketHandler {
} }
public static answerRequest(type: RequestType, content: any) { public static answerRequest(type: RequestType, content: any) {
WebSocketHandler.send(new WebSocketPayload(WebSocketEvent.RESPONSE, false, {type: type, content: content})); WebSocketHandler.send(new WebSocketPayload(WebSocketEvent.RESPONSE, {type: type, content: content}));
log("Answered " + type + " request"); log("Answered " + type + " request");
} }
public static sendStatus() { public static sendStatus() {
return new Promise(resolve => { return new Promise(resolve => {
let payload = new WebSocketPayload(WebSocketEvent.STATUS, false, {status: iTender.status}); let payload = new WebSocketPayload(WebSocketEvent.STATUS, {status: iTender.status});
WebSocketHandler.send(payload).then(resolve); WebSocketHandler.send(payload).then(resolve);
}); });
} }
static sendRunningConfig() { static sendRunningConfig() {
return new Promise(resolve => { return new Promise(resolve => {
let payload = new WebSocketPayload(WebSocketEvent.CONFIG, false, Settings.json); let payload = new WebSocketPayload(WebSocketEvent.CONFIG, Settings.json);
WebSocketHandler.send(payload).then(resolve); WebSocketHandler.send(payload).then(resolve);
}); });
} }
@ -82,7 +82,7 @@ export class WebSocketHandler {
"count_ingredients": (await Ingredient.countDocuments()), "count_ingredients": (await Ingredient.countDocuments()),
"count_cocktails": (await Drink.countDocuments()) "count_cocktails": (await Drink.countDocuments())
}; };
let payload = new WebSocketPayload(WebSocketEvent.RESPONSE, false, { let payload = new WebSocketPayload(WebSocketEvent.RESPONSE, {
type: RequestType.STATS, type: RequestType.STATS,
content: stats content: stats
}); });
@ -92,14 +92,14 @@ export class WebSocketHandler {
static sendContainers() { static sendContainers() {
return new Promise(async resolve => { return new Promise(async resolve => {
let payload = new WebSocketPayload(WebSocketEvent.CONTAINERS, false, (await Container.find())); let payload = new WebSocketPayload(WebSocketEvent.CONTAINERS, (await Container.find()));
WebSocketHandler.send(payload).then(resolve); WebSocketHandler.send(payload).then(resolve);
}) })
} }
static sendDrinks() { static sendDrinks() {
return new Promise(async resolve => { return new Promise(async resolve => {
let payload = new WebSocketPayload(WebSocketEvent.DRINKS, false, iTender.drinks); let payload = new WebSocketPayload(WebSocketEvent.DRINKS, iTender.drinks);
WebSocketHandler.send(payload).then(resolve); WebSocketHandler.send(payload).then(resolve);
}) })
} }

View File

@ -6,16 +6,12 @@ export class WebSocketPayload {
this._event = value; this._event = value;
} }
set error(value: boolean) {
this._error = value;
}
set data(value: any | undefined) { set data(value: any | undefined) {
this._data = value; this._data = value;
} }
private _event: WebSocketEvent; private _event: WebSocketEvent;
private _error: boolean;
private _data: any | undefined; private _data: any | undefined;
@ -23,24 +19,21 @@ export class WebSocketPayload {
return this._event; return this._event;
} }
get error(): boolean {
return this._error;
}
get data(): any | undefined { get data(): any | undefined {
return this._data; return this._data;
} }
constructor(event: WebSocketEvent, error: boolean = false, data?: any) { constructor(event: WebSocketEvent, data?: any) {
this._event = event; this._event = event;
this._error = error;
this._data = data; this._data = data;
} }
public static parseFromBase64Json(json: string): WebSocketPayload | null { public static parseFromBase64Json(json: string): WebSocketPayload | null {
//json = (typeof window != 'undefined') ? atob(json).toString() : Buffer.from(json, "base64").toString("utf-8"); //json = (typeof window != 'undefined') ? atob(json).toString() : Buffer.from(json, "base64").toString("utf-8");
json = Buffer.from(json, "base64").toString("utf-8"); json = Buffer.from(json, "base64").toString("utf-8");
let rawPayload: { event: string, error: boolean, data: any }; let rawPayload: { event: string, data: any };
try { try {
rawPayload = JSON.parse(json); rawPayload = JSON.parse(json);
} catch (e) { } catch (e) {
@ -49,14 +42,14 @@ export class WebSocketPayload {
let wsEvent = WebSocketEvent[<keyof typeof WebSocketEvent>rawPayload.event]; let wsEvent = WebSocketEvent[<keyof typeof WebSocketEvent>rawPayload.event];
return new WebSocketPayload(wsEvent, rawPayload.error, rawPayload.data); return new WebSocketPayload(wsEvent, rawPayload.data);
} }
/** /**
* Returns the payload as base64 encoded json string * Returns the payload as base64 encoded json string
*/ */
public toString(): string { public toString(): string {
let json = JSON.stringify({"event": this._event, status: this._error, data: this._data}); let json = JSON.stringify({"event": this._event, data: this._data});
json = ((typeof window != 'undefined') ? btoa(json) : Buffer.from(json).toString("base64")); json = ((typeof window != 'undefined') ? btoa(json) : Buffer.from(json).toString("base64"));
return json; return json;

View File

@ -11,8 +11,8 @@ export const ContainerSchema = new Mongoose.Schema<IContainer>({
rawData: Number, rawData: Number,
pumpPin: {type: Number, required: true}, pumpPin: {type: Number, required: true},
content: {type: mongoose.Types.ObjectId, ref: "Ingredient"}, content: {type: mongoose.Types.ObjectId, ref: "Ingredient"},
sensorFilledMax: Number, sensorDelta: Number, // V2: Now sensorDelta - Differenz, welche beim Einstellen der Zutat aus Gewicht(Sensor) - Volumen errechnet wird
sensorFilledMin: Number, sensorTare: Number, // V2: Now sensorTare
filled: Number, filled: Number,
enabled: {type: Boolean, default: false}, enabled: {type: Boolean, default: false},
}); });

View File

@ -6,8 +6,8 @@ export interface IContainer extends mongoose.Document {
slot: number; slot: number;
content: IIngredient | undefined; content: IIngredient | undefined;
volume: number; volume: number;
sensorFilledMin: number; sensorDelta: number;
sensorFilledMax: number; sensorTare: number;
// Sensor Type // Sensor Type
sensorType: SensorType; sensorType: SensorType;
sensorPin1: number; sensorPin1: number;

View File

@ -1,6 +1,5 @@
import {iTenderStatus} from "./iTenderStatus"; import {iTenderStatus} from "./iTenderStatus";
import Container from "./database/Container"; import Container from "./database/Container";
import {HCSR04} from "hc-sr04";
import {IContainer} from "./database/IContainer"; import {IContainer} from "./database/IContainer";
import Drink from "./database/Drink"; import Drink from "./database/Drink";
import {IDrink} from "./database/IDrink"; import {IDrink} from "./database/IDrink";
@ -10,8 +9,6 @@ import {IJob} from "./database/IJob";
import {Utils} from "./Utils"; import {Utils} from "./Utils";
import {WebSocketPayload} from "./WebSocketPayload"; import {WebSocketPayload} from "./WebSocketPayload";
import {WebSocketEvent} from "./WebSocketEvent"; import {WebSocketEvent} from "./WebSocketEvent";
import {HX711} from "./HX711";
import {SensorType} from "./SensorType";
import Job from "./database/Job"; import Job from "./database/Job";
import {IIngredient} from "./database/IIngredient"; import {IIngredient} from "./database/IIngredient";
import Ingredient from "./database/Ingredient"; import Ingredient from "./database/Ingredient";
@ -20,6 +17,8 @@ import {RejectReason} from "./RejectReason";
import axios from "axios"; import axios from "axios";
import GPIO from "rpi-gpio"; import GPIO from "rpi-gpio";
import {MyGPIO} from "./MyGPIO"; import {MyGPIO} from "./MyGPIO";
import {SensorHelper} from "./SensorHelper";
import {SensorType} from "./SensorType";
const isPI = require("detect-rpi"); const isPI = require("detect-rpi");
@ -49,6 +48,8 @@ export class iTender {
private static _jobCheckInterval: NodeJS.Timer; private static _jobCheckInterval: NodeJS.Timer;
private static _internetConnection: boolean = false; private static _internetConnection: boolean = false;
private static _jobTimers: NodeJS.Timeout[] = [];
/** /**
* Returns true if internet connection is active * Returns true if internet connection is active
*/ */
@ -161,7 +162,7 @@ export class iTender {
this._currentJob = job; this._currentJob = job;
iTender.setStatus(iTenderStatus.FILLING); iTender.setStatus(iTenderStatus.FILLING);
let timers: NodeJS.Timeout[] = [];
for (let x of job.amounts) { for (let x of job.amounts) {
// Start pump here // Start pump here
@ -172,12 +173,12 @@ export class iTender {
} catch (e) { } catch (e) {
if (isPI()) { if (isPI()) {
log("[ERROR] GPIO I/O Error " + e); log("[ERROR] GPIO I/O Error " + e);
// Todo error handling to user
await iTender.cancelFill(); await iTender.cancelFill();
return; return;
} else { } else {
log("[WARNING] GPIO I/O Error, but it's normal cause you are not on raspberry"); log("[WARNING] GPIO I/O Error, but it's normal cause you are not on raspberry");
} }
} }
@ -185,14 +186,13 @@ export class iTender {
mixLog(`Starting output of pump ${x.container.pumpPin}`); mixLog(`Starting output of pump ${x.container.pumpPin}`);
//mixLog(x.ingredient + " takes " + (waitTime / 1000) + "s for " + x.amount + "ml"); //mixLog(x.ingredient + " takes " + (waitTime / 1000) + "s for " + x.amount + "ml");
let timer = setTimeout(async () => { let timer = setTimeout(async () => {
// Remove from list of timers // Remove from list of timers
let arr: NodeJS.Timer[] = []; let arr: NodeJS.Timer[] = [];
for (let i = 0; i < timers.length; i++) { for (let i = 0; i < this._jobTimers.length; i++) {
if (timers[i] != timer) if (this._jobTimers[i] != timer)
arr.push(timers[i]); arr.push(this._jobTimers[i]);
} }
mixLog(`Stopping output of pump ${x.container.pumpPin}`); mixLog(`Stopping output of pump ${x.container.pumpPin}`);
// Stop pump here // Stop pump here
try { try {
@ -207,15 +207,21 @@ export class iTender {
} }
} }
timers = arr; if (x.container.sensorType == SensorType.NONE) {
// V2: Manual measuring
x.container.filled = x.container.filled - x.amount;
await x.container.save();
}
this._jobTimers = arr;
}, waitTime); }, waitTime);
timers.push(timer); this._jobTimers.push(timer);
} }
iTender._jobCheckInterval = setInterval(async () => { iTender._jobCheckInterval = setInterval(async () => {
if (timers.length != 0) if (this._jobTimers.length != 0)
return; return;
clearInterval(iTender._jobCheckInterval); clearInterval(iTender._jobCheckInterval);
@ -235,19 +241,30 @@ export class iTender {
static async cancelFill() { static async cancelFill() {
if (!this._currentJob || this.status != iTenderStatus.FILLING) if (!this._currentJob || this.status != iTenderStatus.FILLING)
return; return;
clearInterval(this._jobCheckInterval); clearInterval(this._jobCheckInterval);
this._currentJob.successful = false; this._currentJob.successful = false;
this._currentJob.endAt = new Date(); this._currentJob.endAt = new Date();
await this._currentJob.save(); await this._currentJob.save();
for (let timer of this._jobTimers) {
// Clears all the ongoing stop timers
clearTimeout(timer);
}
for (let x of this._currentJob.amounts) { for (let jobIngredient of this._currentJob.amounts) {
// stop pump pin // stop pump pin
try { try {
await MyGPIO.write(x.container.pumpPin, false); await MyGPIO.write(jobIngredient.container.pumpPin, false);
} catch (e) { } catch (e) {
} }
// ToDo
let container: IContainer = jobIngredient.container;
let deltaStartStop = (this._currentJob.endAt.getTime() - this._currentJob.startedAt.getTime()) / 1000;
container.filled = container.filled - ( jobIngredient.amount * (deltaStartStop / ((jobIngredient.amount / 100) * iTender.secondsPer100ml)) ); // V2: Near the current fill value based on time values from delta start stop // todo fixme
container.save().then();
} }
iTender.setStatus(iTenderStatus.READY); iTender.setStatus(iTenderStatus.READY);
@ -263,35 +280,24 @@ export class iTender {
return new Promise(async resolve => { return new Promise(async resolve => {
for (let c of (await Container.find({}))) { for (let c of (await Container.find({}))) {
try { if (c.sensorType != SensorType.NONE) {
let rand = Math.random() * 5; let weight = SensorHelper.measure(c);
if (c.sensorType == SensorType.ULTRASOUND) { if (!weight) {
let sensor = new HCSR04(c.sensorPin1, c.sensorPin2); 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;
c.rawData = sensor.distance();
c.rawData = rand;
} else if (c.sensorType == SensorType.LOADCELL) {
let sensor = new HX711(c.sensorPin1, c.sensorPin2);
c.rawData = sensor.measure();
c.rawData = rand;
} }
if (c.sensorFilledMax && c.sensorFilledMin) { // V2: New calculation method
c.filled = c.rawData * c.sensorFilledMax / 100; c.filled = weight - c.sensorDelta; // V2: Testing
}
} catch (e) { await c.save();
c.filled = -1;
c.rawData = 0;
} }
await c.save();
} }
log("Containers measured!"); log("Containers measured!");
resolve(); resolve();
let payload = new WebSocketPayload(WebSocketEvent.CONTAINERS, false, (await Container.find())); let payload = new WebSocketPayload(WebSocketEvent.CONTAINERS, (await Container.find()));
await WebSocketHandler.send(payload); await WebSocketHandler.send(payload);
}); });
} }
@ -448,7 +454,7 @@ export class iTender {
} catch (e) { } catch (e) {
console.error("Could not refresh drinks " + e); console.error("Could not refresh drinks " + e);
await WebSocketHandler.send(new WebSocketPayload(WebSocketEvent.ERROR, false, "Beim aktualisieren der Getränke ist ein Netzwerk-Fehler aufgetreten.<br>Bitte später erneut versuchen!")); await WebSocketHandler.send(new WebSocketPayload(WebSocketEvent.ERROR, "Beim Aktualisieren der Getränke ist ein Netzwerk-Fehler aufgetreten.<br>Bitte später erneut versuchen!"));
} }
iTender.setStatus(iTenderStatus.READY); iTender.setStatus(iTenderStatus.READY);

View File

@ -10,6 +10,8 @@ import {Settings} from "../../Settings";
import Ingredient from "../../database/Ingredient"; import Ingredient from "../../database/Ingredient";
import {RequestType} from "../../RequestType"; import {RequestType} from "../../RequestType";
import {IJob} from "../../database/IJob"; import {IJob} from "../../database/IJob";
import {SensorHelper} from "../../SensorHelper";
import {IContainer} from "../../database/IContainer";
const express = require('express'); const express = require('express');
const router = express.Router(); const router = express.Router();
@ -71,7 +73,7 @@ router.ws('/', async (ws, req, next) => {
} }
case WebSocketEvent.CONTAINER_UPDATE: { case WebSocketEvent.CONTAINER_UPDATE: {
let container = await Container.findById(msg.data["container"]); let container : IContainer | null = await Container.findById(msg.data["container"]);
if (!container) break; if (!container) break;
let ingredient; let ingredient;
@ -81,8 +83,25 @@ router.ws('/', async (ws, req, next) => {
ingredient = undefined; ingredient = undefined;
} }
container.filled = parseInt(msg.data["filled"]); let filled : number = parseInt(msg.data["filled"]);
container.volume = parseInt(msg.data["filled"]); // V2: Volume is now being updated after change of ingredient
container.filled = filled;
container.volume = filled; // V2: Volume is now being updated after change of ingredient
if( container.sensorType != SensorType.NONE )
{
let raw = SensorHelper.measure(container);
if( !raw )
{
await WebSocketHandler.send(new WebSocketPayload(WebSocketEvent.ERROR, "Der 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." ));
}
else
{
container.sensorDelta = raw - filled; // V2: Kalkuliere differenz zwischen Gewicht und gefülltem Inhalt // Todo Möglicherweise ist der "raw"-Wert nicht Gewicht
}
}
container.content = ingredient; container.content = ingredient;
await container.save(); await container.save();

View File

@ -150,7 +150,7 @@ export class Containers {
if (selectIngredient.value == "null") if (selectIngredient.value == "null")
volumeSlider.value = "0"; volumeSlider.value = "0";
let payload = new WebSocketPayload(WebSocketEvent.CONTAINER_UPDATE, false, { let payload = new WebSocketPayload(WebSocketEvent.CONTAINER_UPDATE, {
container: selectContainer.value, container: selectContainer.value,
ingredient: (selectIngredient.value == "null") ? null : selectIngredient.value, ingredient: (selectIngredient.value == "null") ? null : selectIngredient.value,
filled: volumeSlider.value filled: volumeSlider.value

View File

@ -66,7 +66,7 @@ Dort werden die Behälter definiert, welche in den iTender gestellt werden.<br>D
const cancelBtn = document.getElementById("setup_cancelBtn") as HTMLButtonElement; const cancelBtn = document.getElementById("setup_cancelBtn") as HTMLButtonElement;
cancelBtn.onclick = () => { cancelBtn.onclick = () => {
let payload = new WebSocketPayload(WebSocketEvent.SETUP, false, false); let payload = new WebSocketPayload(WebSocketEvent.SETUP, false);
WebWebSocketHandler.send(payload); WebWebSocketHandler.send(payload);
} }
@ -159,10 +159,10 @@ Dort werden die Behälter definiert, welche in den iTender gestellt werden.<br>D
}); });
} }
let payload = new WebSocketPayload(WebSocketEvent.CONTAINERS, false, cons); let payload = new WebSocketPayload(WebSocketEvent.CONTAINERS, cons);
WebWebSocketHandler.send(payload); WebWebSocketHandler.send(payload);
payload = new WebSocketPayload(WebSocketEvent.CONFIG, false, { payload = new WebSocketPayload(WebSocketEvent.CONFIG, {
"led_enabled": ledCheckbox.checked, "led_enabled": ledCheckbox.checked,
"remote_enabled": allowRemoteCheckbox.checked, "remote_enabled": allowRemoteCheckbox.checked,
"hotspot_enabled": hotspotCheckbox.checked, "hotspot_enabled": hotspotCheckbox.checked,
@ -221,14 +221,14 @@ Die Gewichtssensoren werden beim Bestätigen austariert<br><br>Zum fortfahren Ta
btn.innerText = "Tarieren"; btn.innerText = "Tarieren";
btn.style.marginTop = "3%"; btn.style.marginTop = "3%";
btn.onclick = () => { btn.onclick = () => {
let payload = new WebSocketPayload(WebSocketEvent.TARE, false, {tare: 0}); let payload = new WebSocketPayload(WebSocketEvent.TARE, {tare: 0});
WebWebSocketHandler.send(payload); WebWebSocketHandler.send(payload);
txt.innerHTML = `Messung Teil 2<br> txt.innerHTML = `Messung Teil 2<br>
Bitte nun alle <strong>Behälter mit Inhalt füllen</strong> und wieder einsetzen.<br> Bitte nun alle <strong>Behälter mit Inhalt füllen</strong> und wieder einsetzen.<br>
Die Gewichtssensoren werden beim Bestätigen austariert.<br><br>Zum fortfahren Tarieren drücken.<br>`; Die Gewichtssensoren werden beim Bestätigen austariert.<br><br>Zum fortfahren Tarieren drücken.<br>`;
btn.onclick = () => { btn.onclick = () => {
let payload = new WebSocketPayload(WebSocketEvent.TARE, false, {tare: 1}); let payload = new WebSocketPayload(WebSocketEvent.TARE, {tare: 1});
WebWebSocketHandler.send(payload); WebWebSocketHandler.send(payload);
btn.onclick = () => { btn.onclick = () => {
@ -319,7 +319,7 @@ Die Gewichtssensoren werden beim Bestätigen austariert.<br><br>Zum fortfahren T
let sensorTypeUltrasound = document.createElement("option") as HTMLOptionElement; let sensorTypeUltrasound = document.createElement("option") as HTMLOptionElement;
sensorTypeUltrasound.innerText = "Ultraschall"; sensorTypeUltrasound.innerText = "Ultraschall";
sensorTypeUltrasound.value = "0"; sensorTypeUltrasound.value = "0";
sensorType.append(sensorTypeUltrasound); //sensorType.append(sensorTypeUltrasound); // V2: Removed
let sensorTypeScale = document.createElement("option") as HTMLOptionElement; let sensorTypeScale = document.createElement("option") as HTMLOptionElement;
sensorTypeScale.innerText = "Wägezelle"; sensorTypeScale.innerText = "Wägezelle";
sensorTypeScale.value = "1"; sensorTypeScale.value = "1";
@ -374,7 +374,7 @@ Die Gewichtssensoren werden beim Bestätigen austariert.<br><br>Zum fortfahren T
// Volume // Volume
let volumeLabel = document.createElement("label"); let volumeLabel = document.createElement("label");
volumeLabel.innerText = "Volumen (ml) "; volumeLabel.innerText = "Volumen (ml) ";
con.append(volumeLabel); //con.append(volumeLabel);
let volumeSelect = document.createElement("select"); let volumeSelect = document.createElement("select");
volumeSelect.classList.add("noCheckup"); volumeSelect.classList.add("noCheckup");
volumeSelect.classList.add("input"); volumeSelect.classList.add("input");
@ -387,7 +387,7 @@ Die Gewichtssensoren werden beim Bestätigen austariert.<br><br>Zum fortfahren T
volumeSelect["volume"] = volumeSelect; volumeSelect["volume"] = volumeSelect;
} }
volumeSelect.selectedIndex = 7; volumeSelect.selectedIndex = 7;
con.append(volumeSelect); //con.append(volumeSelect);
let removeBtn = document.createElement("button"); let removeBtn = document.createElement("button");
removeBtn.classList.add("btn", "btn-danger"); removeBtn.classList.add("btn", "btn-danger");
@ -440,7 +440,6 @@ Die Gewichtssensoren werden beim Bestätigen austariert.<br><br>Zum fortfahren T
(selects[1] as HTMLSelectElement).value = type; (selects[1] as HTMLSelectElement).value = type;
(selects[2] as HTMLSelectElement).value = c.sensorPin1.toString(); (selects[2] as HTMLSelectElement).value = c.sensorPin1.toString();
(selects[3] as HTMLSelectElement).value = c.sensorPin2.toString(); (selects[3] as HTMLSelectElement).value = c.sensorPin2.toString();
(selects[4] as HTMLSelectElement).value = c.volume.toString();
let event = new Event('change', {bubbles: true}); let event = new Event('change', {bubbles: true});
selects[1].dispatchEvent(event); selects[1].dispatchEvent(event);

View File

@ -222,7 +222,7 @@ export class WebWebSocketHandler {
resolve(payload); resolve(payload);
} }
}); });
WebWebSocketHandler.send(new WebSocketPayload(WebSocketEvent.REQUEST, false, { WebWebSocketHandler.send(new WebSocketPayload(WebSocketEvent.REQUEST, {
type: type, type: type,
content: content content: content
})); }));

View File

@ -102,7 +102,7 @@ function setupOnClickEvents() {
menuSettingsBtn.onclick = () => WebHandler.openPane(Pane.SETTINGS); menuSettingsBtn.onclick = () => WebHandler.openPane(Pane.SETTINGS);
menuSetupBtn.onclick = () => { menuSetupBtn.onclick = () => {
let payload = new WebSocketPayload(WebSocketEvent.SETUP, false, true); let payload = new WebSocketPayload(WebSocketEvent.SETUP, true);
WebWebSocketHandler.send(payload); WebWebSocketHandler.send(payload);
} }