fix(gui): Ventilator-Icon und Speicheranzeige auf Aufnahme-Vorrat

Das erste Icon las sich als Kleeblatt. Jetzt vier gebogene Pinwheel-Fluegel
in einem feststehenden Gehaeusering; nur die Fluegel drehen. Form vorab ohne
Browser geprueft (lab/preview_fan.py rendert die Bezier-Kandidaten als PNG).

Die Prozentzahl misst nicht mehr die Partition, sondern den Aufnahme-Vorrat:
100 % = freier Platz + alle Audiodateien unter recordings/, belegt = diese
Dateien. System, Modelle und node_modules fallen aus Zaehler und Nenner
heraus; der df-Wert steht als Fusszeile in der Klappkarte.

sysstat.js scannt recordings/ per readdir+stat (kein du-Prozess) und puffert
60 s; status() ist dadurch async, die Route laeuft ueber wrap().

Doku: Kapitel 07 + Changelog.
This commit is contained in:
Claude
2026-08-17 22:03:17 +02:00
parent 47288c0479
commit db50c9616d
7 changed files with 215 additions and 43 deletions
+3 -3
View File
@@ -377,9 +377,9 @@ const wrap = fn => (req, res) => fn(req, res).catch(e => res.status(500).json({
app.get('/api/health', (req, res) => res.json({ ok: true, ...rec.status() }));
// Kopfzeilen-Anzeige: Platte, CPU, RAM, Temperatur. Reine /proc-Lesevorgänge,
// deshalb ohne wrap() und ohne Warteschlange.
app.get('/api/sysstat', (req, res) => res.json(sysstat.status()));
// Kopfzeilen-Anzeige: Platte, CPU, RAM, Temperatur. /proc + statfs, dazu ein
// gepufferter Größenscan über recordings/ — kein df/du-Prozess.
app.get('/api/sysstat', wrap(async (req, res) => res.json(await sysstat.status())));
// --- Bluetooth ---
app.post('/api/bt/scan', wrap(async (req, res) => {