diff --git a/doc/installPi.sh b/doc/installPi.sh index 09806f7..82de2c8 100644 --- a/doc/installPi.sh +++ b/doc/installPi.sh @@ -7,6 +7,9 @@ fi echo "Creating user if not exists" useradd -p $(openssl passwd -1 iTender2022) itender || true +mkdir /home/itender/ +usermod -d /home/itender/ itender || true +chown itender:itender /home/itender echo "Updating indexes" apt update @@ -52,6 +55,10 @@ echo "Installing mongodb and yarn..." apt install nodejs yarn mongodb-org -y apt upgrade -y +adduser itender gpio +adduser itender sudo +chown itender:itender /home/itender/ -R + # V2: Arduino CLI echo "Installing arduino-cli..." sudo -u itender mkdir -p /home/itender/bin @@ -61,8 +68,6 @@ sudo -u itender /home/itender/bin/arduino-cli core update-index || true sudo -u itender /home/itender/bin/arduino-cli lib install ArduinoJson || true sudo -u itender /home/itender/bin/arduino-cli lib install HX711 || true - - echo "Installing autostart..." # Autostart cat </etc/xdg/openbox/autostart @@ -85,7 +90,6 @@ echo "Installing bashrc" echo "clear" >>/home/itender/.bashrc echo "[[ -z \$DISPLAY && \$XDG_VTNR -eq 1 ]] && startx -- -nocursor >/dev/null 2>&1" >>/home/itender/.bashrc - DIR="/home/itender/itender/" if [ -d "$DIR" ]; then # Take action if $DIR exists. # @@ -136,7 +140,6 @@ WantedBy=multi-user.target EOT #sh -c "git pull --quiet || true" - echo "Activating systemctl daemons..." systemctl daemon-reload systemctl enable mongod @@ -176,7 +179,6 @@ if ! grep -w "gpu_freq=700" /boot/config.txt; then echo "gpu_freq=700" >>/boot/config.txt fi - echo "Setting no-logo..." systemctl disable getty@tty1.service @@ -186,19 +188,17 @@ if ! grep -w "logo.nologo" /boot/cmdline.txt; then sed -i '1 s_$_ loglevel=3 logo.nologo disable\_splash=1 splash quiet plymouth.ignore-serial-consoles logo.nologo vt.global\_cursor_default=0_' /boot/cmdline.txt #cp /tmp/cmdline.txt /boot/cmdline.txt sed -i "1 s|$| vt.global_cursor_default=0|" /boot/cmdline.txt - sed -i '1 i\avoid_warnings=1' /boot/config.txt + sed -i 's/console=tty0/console=tty3/' /boot/cmdline.txt fi -echo "iTender© 2022-2023 +echo "iTender© 2022-2023 - Official licensed software Programmed by Tobias Hopp" >/etc/motd echo "[Service] ExecStart=/usr/sbin/dhcpcd -q" >/etc/systemd/system/dhcpcd.service.d/wait.conf chown itender:itender -R /home/itender/ -adduser itender gpio -adduser itender sudo echo "Installation finished!" diff --git a/src/Mixer.ts b/src/Mixer.ts index 93dac12..f7e8a29 100644 --- a/src/Mixer.ts +++ b/src/Mixer.ts @@ -47,6 +47,7 @@ export class Mixer { */ static async startFill(job: IJob) { this._jobTimers = []; + job.startedAt = new Date(); await job.populate([{path: "amounts.ingredient"}, {path: "amounts.container"}, {path: "drink"}]); log("New fill job " + job.drink.name + " will take " + job.estimatedTime + "s"); @@ -88,11 +89,6 @@ export class Mixer { //mixLog(x.ingredient + " takes " + (waitTime / 1000) + "s for " + x.amount + "ml"); let timer = setTimeout(async () => { // Remove from list of timers - let arr: NodeJS.Timer[] = []; - for (let i = 0; i < this._jobTimers.length; i++) { - if (this._jobTimers[i] != timer) - arr.push(this._jobTimers[i]); - } log(`Stopping output of pump ${x.container.pumpPin}`); // Stop pump here @@ -124,7 +120,7 @@ export class Mixer { await x.container.save(); } - this._jobTimers = arr; + this._jobTimers.splice(this._jobTimers.indexOf(timer),1); }, waitTime); this._jobTimers.push(timer); @@ -140,9 +136,8 @@ export class Mixer { clearInterval(this._jobEndCheckInterval); job.endAt = new Date(); job.successful = true; - - await job.save(); log("Job successful"); + await job.save(); setTimeout(() => iTender.setStatus(iTenderStatus.READY), 2500); await ContainerHelper.measureContainers(); diff --git a/src/RequestType.ts b/src/RequestType.ts index 19f3de6..d6c88a6 100644 --- a/src/RequestType.ts +++ b/src/RequestType.ts @@ -9,4 +9,5 @@ export enum RequestType { TARE = "TARE", CHECK = "CHECK", UPDATE = "UPDATE", + INFO = "INFO", } \ No newline at end of file diff --git a/src/routes/ws/websocketRoute.ts b/src/routes/ws/websocketRoute.ts index 250da1d..d70897a 100644 --- a/src/routes/ws/websocketRoute.ts +++ b/src/routes/ws/websocketRoute.ts @@ -15,6 +15,9 @@ import {IContainer} from "../../database/IContainer"; import {Mixer} from "../../Mixer"; import {ArduinoProxy} from "../../ArduinoProxy"; import {ContainerHelper} from "../../ContainerHelper"; +import * as os from "os"; +import {promisify} from "util"; +const exec = promisify(require('child_process').exec) const express = require('express'); const router = express.Router(); @@ -269,6 +272,7 @@ router.ws('/', async (ws, req, next) => { WebSocketHandler.answerRequest(type, {success: true, msg: "OK"}); } }, 4000); + break; } @@ -280,6 +284,37 @@ router.ws('/', async (ws, req, next) => { - (arduino update?) - reboot */ + break; + } + + case RequestType.INFO: { + let nets = os.networkInterfaces(); + let net = nets["wlan0"]; + if(!net) + net = nets["wlp0s20f3"]; + let ipAddr : string = ""; + if( net ) + for( let addr of net ) + { + if( addr.family == "IPv4" && addr.address && addr.address !== "127.0.0.1" ) + ipAddr = addr.address; + } + + let packageJson = require('../../../package.json'); + + let wifi = (await exec("iwgetid")).stdout + + + let data = { + "internet": iTender.internetConnection, + "ip": ipAddr, + "network": wifi.substring(wifi.indexOf('"')+1,wifi.length-2), + "uptime": (await exec("uptime -p")).stdout.substring(3), + "version": packageJson.version + } + + return WebSocketHandler.answerRequest(msg.data["type"] as RequestType, data); + break; } } diff --git a/src/web/Settings.ts b/src/web/Settings.ts index 7030bc9..2346bf4 100644 --- a/src/web/Settings.ts +++ b/src/web/Settings.ts @@ -1,3 +1,70 @@ -export class Settings { +import {WebWebSocketHandler} from "./WebWebSocketHandler"; +import {RequestType} from "../RequestType"; +import {Modal} from "./Modal"; +import {ButtonType} from "./ButtonType"; +export class Settings { + public static addListeners() { + // Settings Btns + const downloadDrinks = document.getElementById("settings_refreshDrinks") as HTMLButtonElement; + downloadDrinks.onclick = () => this.onClickRefreshDrinks(); + const getInfo = document.getElementById("settings_getInfo") as HTMLButtonElement; + getInfo.onclick = () => this.onClickInfo(); + } + + private static onClickRefreshDrinks() { + WebWebSocketHandler.request(RequestType.DOWNLOAD_DRINKS).then(); + } + + private static onClickUpdate() { + + } + + private static onClickInfo() { + WebWebSocketHandler.request(RequestType.INFO, null).then((payload) => { + let modal = new Modal("info", "Systeminformationen"); + + let table = document.createElement("table"); + table.style.marginLeft = "auto"; + table.style.marginRight = "auto"; + + let th = document.createElement("th"); + table.append(th); + + let tdTh1 = document.createElement("td"); + tdTh1.innerText = ""; + let tdTh2 = document.createElement("td"); + tdTh2.innerText = ""; + + th.append(tdTh1, tdTh2); + + let x = [["internet","Internet-Konnektivität"], ["ip","IP-Adresse"], ["network","WiFi-Netzwerk"], ["uptime","Gerät aktiv seit"], ["version", "Version"]]; + for( let y of x ) + { + let tr = document.createElement("tr"); + let td1 = document.createElement("td"); + let td2 = document.createElement("td"); + + td1.innerText = y[1]; + td1.style.fontWeight = "bold"; + if( payload.data[y[0]] === true || payload.data[y[0]] === false ) + { + td2.innerText = payload.data[y[0]] == true ? "Verbunden" : "Getrennt"; + } + else + { + td2.innerText = payload.data[y[0]]; + } + + tr.append(td1,td2); + + table.append(tr); + } + modal.addContent(table); + + modal.addBR(); + modal.addButton(ButtonType.PRIMARY, "Schließen", () => modal.close() ); + modal.open(); + }); + } } \ No newline at end of file diff --git a/src/web/main.ts b/src/web/main.ts index 72e5726..b448727 100644 --- a/src/web/main.ts +++ b/src/web/main.ts @@ -10,6 +10,7 @@ import {Setup} from "./Setup"; import {RequestType} from "../RequestType"; import container from "../database/Container"; import {IContainer} from "../database/IContainer"; +import {Settings} from "./Settings"; const main = document.getElementById("main"); const time = document.getElementById("right"); @@ -37,6 +38,7 @@ document.addEventListener("DOMContentLoaded", async () => { }, 1000); WebWebSocketHandler.registerForEvent(WebSocketEvent.CONTAINERS, (payload) => { + console.log("Updating container list...") let container : IContainer; let bottomContainers = document.getElementById("menuContainers") as HTMLDivElement; bottomContainers.innerHTML = ""; @@ -154,11 +156,10 @@ function setupOnClickEvents() { } - // Settings Btns - const downloadDrinks = document.getElementById("settings_refreshDrinks") as HTMLButtonElement; - downloadDrinks.onclick = () => { - WebWebSocketHandler.request(RequestType.DOWNLOAD_DRINKS); - } + Settings.addListeners(); + + + } diff --git a/views/index.pug b/views/index.pug index e1395b7..b9ca9a9 100644 --- a/views/index.pug +++ b/views/index.pug @@ -56,6 +56,7 @@ block settings // Settings button.btn.btn-primary#settings_refreshDrinks Getränke herunterladen button.btn.btn-primary#settings_update System aktualisieren + button.btn.btn-primary#settings_getInfo Systeminformationen