From 0223cceef8e0a285b88cfc45a240df1880f15151 Mon Sep 17 00:00:00 2001 From: Carsten Graf Date: Sat, 11 Apr 2026 20:24:39 +0200 Subject: [PATCH] =?UTF-8?q?Button=20Simmulator,=20Frontend=20=C3=A4nderung?= =?UTF-8?q?en?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/settings.local.json | 18 ++ AquaMaster-Update-Anleitung.pdf | Bin 0 -> 134435 bytes CLAUDE.md | 66 +++++++ data/index.css | 111 ++++++----- data/index.html | 242 +++++++++++++++++------ src/databasebackend.h | 93 +++++---- src/gamemodes.h | 16 +- src/master.cpp | 2 +- src/master.h | 1 + src/preferencemanager.h | 4 + src/rfid.h | 8 + tools/button-simulator/.gitignore | 2 + tools/button-simulator/README.md | 44 +++++ tools/button-simulator/package.json | 14 ++ tools/button-simulator/public/app.js | 96 +++++++++ tools/button-simulator/public/index.html | 95 +++++++++ tools/button-simulator/public/style.css | 189 ++++++++++++++++++ tools/button-simulator/server.js | 209 ++++++++++++++++++++ tools/update-anleitung.html | 142 +++++++++++++ 19 files changed, 1200 insertions(+), 152 deletions(-) create mode 100644 .claude/settings.local.json create mode 100644 AquaMaster-Update-Anleitung.pdf create mode 100644 CLAUDE.md create mode 100644 tools/button-simulator/.gitignore create mode 100644 tools/button-simulator/README.md create mode 100644 tools/button-simulator/package.json create mode 100644 tools/button-simulator/public/app.js create mode 100644 tools/button-simulator/public/index.html create mode 100644 tools/button-simulator/public/style.css create mode 100644 tools/button-simulator/server.js create mode 100644 tools/update-anleitung.html diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..bf308a5 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,18 @@ +{ + "permissions": { + "allow": [ + "Bash(pio run:*)", + "Bash(npm install:*)", + "Bash(where pio:*)", + "Read(//c/Users/repti/.platformio/penv/Scripts/**)", + "Bash(/c/Users/repti/.platformio/penv/Scripts/pio.exe run:*)", + "Bash(python -c \"import reportlab\")", + "Read(//c/Program Files/Google/Chrome/Application/**)", + "Read(//c/Program Files \\(x86\\)/Microsoft/Edge/Application/**)" + ] + }, + "enableAllProjectMcpServers": true, + "enabledMcpjsonServers": [ + "proxmox" + ] +} diff --git a/AquaMaster-Update-Anleitung.pdf b/AquaMaster-Update-Anleitung.pdf new file mode 100644 index 0000000000000000000000000000000000000000..295b36c283f92d30ac704e76a8870549a3299448 GIT binary patch literal 134435 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 LdC}B>RROX*?i~*I2LBSteBohPn%mV|8 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. Wenn der Build lokal funktioniert, aber CI nicht, ist `esp32thing_CI` (board=esp32dev, platform=espressif32) die maßgebliche Konfiguration. + +## Architektur (das Wesentliche) + +### Header-only-Pattern (wichtig!) + +Es gibt nur **eine** `.cpp`-Datei: `src/master.cpp`. Alle anderen Module unter `src/*.h` enthalten sowohl Deklarationen *als auch* Implementierungen und definieren teilweise **globale Objekte** (z. B. `AsyncWebServer server(80)` in `webserverrouter.h`, `Preferences preferences` in `licenceing.h`, `PicoMQTT::Server mqtt` in `communication.h`). Konsequenzen: + +- Jeder dieser Header darf **nur in `master.cpp`** inkludiert werden, sonst gibt es Multiple-Definition-Linkerfehler. +- Header inkludieren sich gegenseitig (`master.h` ↔ `webserverrouter.h` ↔ `communication.h`). Beim Hinzufügen neuer Header die bestehende Include-Reihenfolge in `master.cpp` beibehalten. +- Globale Timer-/Button-State-Variablen (`timerData1`, `timerData2`, `buttonConfigs`, `localTimes`, `learningMode`, `gamemode`, …) leben in `src/master.h` und werden überall direkt referenziert. + +Wer eine neue Datei anlegt: entweder als weiteren Header dem Pattern folgen und in `master.cpp` einklinken, oder bewusst eine echte `.cpp` mit `extern`-Deklarationen erstellen. + +### Laufzeit-Module + +- **`master.cpp`** — `setup()`/`loop()`. Reihenfolge in `setup()` ist relevant (SPIFFS → API-Setups → `load*()` aus Preferences → WiFi → OTA → Routes → WebSocket → MQTT → RFID). `loop()` priorisiert MQTT vor WebSocket vor RFID. +- **`communication.h`** — PicoMQTT-Broker. Tasten publishen auf `aquacross/button/`; `readButtonJSON()` parst, ordnet die MAC einer der vier Rollen (`start1`/`stop1`/`start2`/`stop2`) zu und triggert die Timerlogik. Hält pro MAC `TimestampData` für Drift-Berechnung. +- **`webserverrouter.h`** — `ESPAsyncWebServer` auf Port 80 + WebSocket `/ws`. Liefert statische Seiten aus SPIFFS (`/`, `/settings`, `/leaderboard`, `/rfid`) und alle `/api/...`-Endpunkte. Vollständige Routenliste in `API.md`. +- **`wificlass.h`** — AP-Modus auf `192.168.10.1` (eindeutiger SSID-Suffix), STA-Fallback wenn gespeicherte Credentials vorhanden. Bindet `PrettyOTA` (lokale Bibliothek unter `lib/PrettyOTA/`) und mDNS ein. +- **`preferencemanager.h`** — Persistierung in NVS (`Preferences`). Namespaces u. a. `buttons`, `leaderboard`, plus WiFi-/Location-/Settings-Slots. Beim Ändern persistierter Strukturen (z. B. `ButtonConfigs`) auf Größenkompatibilität achten — `loadButtonConfig()` lädt nur, wenn `getBytesLength == sizeof(buttonConfigs)`. +- **`licenceing.h`** — HMAC-SHA256 (`mbedtls`) gegen `secret` über die STA-MAC; bestimmt Tier/Online-Funktionen. Lizenz wird zusammen mit jeder Backend-Anfrage als `Authorization: Bearer …` gesendet. +- **`databasebackend.h`** — HTTPS-Client gegen `https://ninja.reptilfpv.de` (Locations, Leaderboard-Upload, Health). Funktioniert nur bei verbundenem STA + gültiger Lizenz. +- **`rfid.h`** — Adafruit PN532 (I²C/SPI). Liest UIDs nur, wenn `isRFIDReadingActive()`; UID landet in `TimerData*::RFIDUID` und wird mit Namen aus `localUsers`/Backend verknüpft. +- **`gamemodes.h`** — Modus `0=individual`, `1=wettkampf`; steuert, wann Timer als „bereit/armiert/laufend" gilt und wie Bestzeiten abgelegt werden (lokales `localTimes`-Vektor + optional Backend). +- **`timesync.h`/`debug.h`/`statusled.h`/`battery.h`/`buttonassigh.h`/`helper.h`** — Hilfsmodule (NTP/Zeitzone, Debug-API, Status-LED, Akku, Lerne-Mode für Tasten-Zuordnung). + +### Web-Frontend + +`data/` enthält `index.html`, `settings.html`, `leaderboard.html`, `rfid.html` plus zugehörige CSS und ein `pictures/`-Verzeichnis. Diese Dateien werden via `pio run -t uploadfs` ins SPIFFS geschrieben und vom Webserver direkt ausgeliefert. **Frontend-Änderungen erfordern ein erneutes `uploadfs`** — ein normaler Firmware-Upload aktualisiert sie nicht. + +`data/firmware.bin` wird unter `/firmware.bin` ausgeliefert (Buttons können sich darüber selbst aktualisieren). + +## API + +Vollständige HTTP-/WebSocket-API in `API.md` (autoritativ; `apientpoints` ist eine ältere Kurzversion). Alle POST-Routen erwarten **Form-Parameter, kein JSON-Body**. Antworten sind JSON, außer bei statischen Dateien. + +## Sprache + +Code-Kommentare und einige Variablennamen sind deutsch (`bahn`, `wettkampf`, „Anlernmodus"). Beim Erweitern bei der vorhandenen Sprache bleiben statt halb zu übersetzen. diff --git a/data/index.css b/data/index.css index 0c4e468..b2170e5 100644 --- a/data/index.css +++ b/data/index.css @@ -472,10 +472,13 @@ body { } .status.large-status.ready { - font-size: clamp(2rem, 8vw, 8rem) !important; display: flex !important; align-items: center !important; justify-content: center !important; + white-space: nowrap; + line-height: 1; + padding: 8px 12px !important; + overflow: hidden; } .status.finished { @@ -538,41 +541,55 @@ body { } } -.best-times { - background: rgba(255, 255, 255, 0.15); - backdrop-filter: blur(10px); - border-radius: 15px; - padding: clamp(10px, 1.5vh, 15px); - margin: 1vh 0 0 0; - width: clamp(320px, 80vw, 960px); - max-width: 960px; - text-align: center; - border: 1px solid rgba(255, 255, 255, 0.2); - flex-shrink: 0; - align-self: center; - display: flex; - flex-direction: column; - align-items: stretch; - gap: clamp(12px, 2vh, 20px); - box-sizing: border-box; -} - -#leaderboard-container { - text-align: left; +.leaderboards-row { display: grid; - grid-template-columns: 1fr; - gap: clamp(12px, 2vh, 20px); + grid-template-columns: 1fr 1fr; + gap: clamp(15px, 2vw, 30px); width: 100%; + max-width: 100%; + padding: 0 2vw; + margin-top: 0.5vh; + box-sizing: border-box; + flex-shrink: 0; } -@media (min-width: 768px) { - #leaderboard-container { - grid-template-columns: repeat(2, minmax(0, 1fr)); +@media (max-width: 768px) { + .leaderboards-row { + grid-template-columns: 1fr; + gap: clamp(15px, 3vw, 30px); + padding: 0 15px; } } +.best-times { + background: rgba(255, 255, 255, 0.15); + backdrop-filter: blur(10px); + border-radius: 12px; + padding: clamp(6px, 1vh, 10px); + text-align: center; + border: 1px solid rgba(255, 255, 255, 0.2); + display: flex; + flex-direction: column; + align-items: stretch; + gap: clamp(4px, 0.8vh, 8px); + box-sizing: border-box; + min-width: 0; +} + +.best-times--full { + grid-column: 1 / -1; +} + +.leaderboard-list { + text-align: left; + display: flex; + flex-direction: column; + gap: clamp(4px, 0.8vh, 8px); + width: 100%; +} + .best-times h3 { - font-size: clamp(0.9rem, 1.8vw, 1.1rem); + font-size: clamp(0.7rem, 1.2vw, 0.85rem); margin: 0 auto; font-weight: bold; text-transform: uppercase; @@ -592,53 +609,58 @@ body { } /* Leaderboard Styles */ -#leaderboard-container { - text-align: left; -} - .leaderboard-entry { display: flex; justify-content: space-between; align-items: center; - margin: clamp(8px, 1vh, 12px) 0; - font-size: clamp(1.1rem, 2.2vw, 1.4rem); + margin: 0; + font-size: clamp(0.7rem, 1.1vw, 0.9rem); font-weight: 600; background: rgba(255, 255, 255, 0.15); - padding: clamp(12px, 2vh, 16px) clamp(16px, 3vw, 24px); - border-radius: 10px; + padding: clamp(4px, 0.8vh, 7px) clamp(8px, 1.2vw, 12px); + border-radius: 8px; border: 1px solid rgba(255, 255, 255, 0.3); transition: all 0.3s ease; - min-height: 50px; + min-height: 0; width: 100%; box-sizing: border-box; + gap: 8px; } .leaderboard-entry:hover { background: rgba(255, 255, 255, 0.25); - transform: translateY(-2px); - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); + transform: translateY(-1px); + box-shadow: 0 3px 10px rgba(0, 0, 0, 0.2); } .leaderboard-entry .rank { color: #ffd700; font-weight: bold; - min-width: 30px; - font-size: clamp(1.2rem, 2.4vw, 1.5rem); + min-width: 20px; + font-size: clamp(0.75rem, 1.2vw, 0.95rem); + flex-shrink: 0; } .leaderboard-entry .name { flex: 1; - margin: 0 15px; + margin: 0; color: #ffffff; - font-weight: 600; + font-weight: 500; + font-size: clamp(0.7rem, 1.1vw, 0.9rem); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + min-width: 0; } .leaderboard-entry .time { color: #00ff88; font-weight: bold; font-family: 'Courier New', monospace; - min-width: 80px; + min-width: 70px; text-align: right; + font-size: clamp(1rem, 1.8vw, 1.3rem); + flex-shrink: 0; } .leaderboard-entry.gold { @@ -703,6 +725,7 @@ body { padding: 20px; } + .learning-mode { background: rgba(245, 157, 15, 0.2); border: 2px solid #f59d0f; diff --git a/data/index.html b/data/index.html index c2f98db..61f44e3 100644 --- a/data/index.html +++ b/data/index.html @@ -44,7 +44,6 @@

🏊‍♀️ NinjaCross Timer

-

Dein professioneller Zeitmesser für Ninjacross Wettkämpfe

-
-

🏆 Lokales Leaderboard

-
+
+
+

🏊‍♀️ Bahn 1 — Letzte Zeiten

+
+
+
+

🏊‍♂️ Bahn 2 — Letzte Zeiten

+
+
+ + diff --git a/tools/button-simulator/public/style.css b/tools/button-simulator/public/style.css new file mode 100644 index 0000000..b636b8c --- /dev/null +++ b/tools/button-simulator/public/style.css @@ -0,0 +1,189 @@ +* { box-sizing: border-box; } + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + background: #0f172a; + color: #e2e8f0; + padding: 16px; +} + +header { + display: flex; + flex-direction: column; + gap: 10px; + margin-bottom: 16px; +} + +header h1 { + margin: 0; + font-size: 20px; + font-weight: 600; +} + +.connection { + display: flex; + gap: 8px; + align-items: center; + flex-wrap: wrap; +} + +.connection input { + flex: 1; + min-width: 220px; + padding: 8px 10px; + background: #1e293b; + border: 1px solid #334155; + border-radius: 6px; + color: #e2e8f0; + font-family: monospace; +} + +button { + padding: 8px 14px; + border: 1px solid #334155; + background: #1e293b; + color: #e2e8f0; + border-radius: 6px; + cursor: pointer; + font-weight: 500; +} + +button:hover { background: #334155; } +button.primary { background: #2563eb; border-color: #2563eb; } +button.primary:hover { background: #1d4ed8; } + +.status { + padding: 4px 10px; + border-radius: 99px; + font-size: 12px; + font-weight: 600; + text-transform: uppercase; +} +.status.online { background: #14532d; color: #86efac; } +.status.offline { background: #7f1d1d; color: #fca5a5; } + +.grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 16px; + margin-bottom: 16px; +} + +@media (max-width: 720px) { + .grid { grid-template-columns: 1fr; } +} + +.lane { + background: #1e293b; + border: 1px solid #334155; + border-radius: 10px; + padding: 12px; +} + +.lane h2 { + margin: 0 0 10px; + font-size: 14px; + text-transform: uppercase; + letter-spacing: 1px; + color: #94a3b8; +} + +.button-card { + background: #0f172a; + border: 1px solid #334155; + border-radius: 8px; + padding: 10px; + margin-bottom: 10px; +} + +.button-card:last-child { margin-bottom: 0; } + +.button-header { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 8px; +} + +.role { + font-weight: 700; + font-size: 13px; + min-width: 60px; +} + +.mac { + flex: 1; + padding: 6px 8px; + font-family: monospace; + font-size: 12px; + background: #1e293b; + border: 1px solid #334155; + border-radius: 4px; + color: #e2e8f0; +} + +.press { + width: 100%; + padding: 16px; + font-size: 18px; + font-weight: 700; + letter-spacing: 2px; + margin-bottom: 8px; +} + +.press-start { background: #166534; border-color: #166534; } +.press-start:hover { background: #15803d; } +.press-stop { background: #991b1b; border-color: #991b1b; } +.press-stop:hover { background: #b91c1c; } +.press:active { transform: scale(0.98); } + +.battery label { + display: block; + font-size: 12px; + color: #94a3b8; + margin-bottom: 4px; +} + +.battery input[type="range"] { width: 100%; } + +.controls { + background: #1e293b; + border: 1px solid #334155; + border-radius: 10px; + padding: 12px; + display: flex; + gap: 16px; + align-items: center; + flex-wrap: wrap; + margin-bottom: 16px; +} + +.controls label { font-size: 13px; display: flex; align-items: center; gap: 6px; } +.controls input[type="number"] { + width: 80px; + padding: 6px 8px; + background: #0f172a; + border: 1px solid #334155; + border-radius: 4px; + color: #e2e8f0; +} + +.log-wrap { + background: #1e293b; + border: 1px solid #334155; + border-radius: 10px; + padding: 12px; +} + +.log-wrap h3 { margin: 0 0 8px; font-size: 13px; color: #94a3b8; } + +#log { + margin: 0; + max-height: 260px; + overflow-y: auto; + font-family: monospace; + font-size: 11px; + white-space: pre-wrap; + color: #cbd5e1; +} diff --git a/tools/button-simulator/server.js b/tools/button-simulator/server.js new file mode 100644 index 0000000..997ce18 --- /dev/null +++ b/tools/button-simulator/server.js @@ -0,0 +1,209 @@ +const express = require("express"); +const mqtt = require("mqtt"); +const path = require("path"); + +const PORT = process.env.PORT || 3000; + +const BUTTON_KEYS = ["start1", "stop1", "start2", "stop2"]; + +const state = { + brokerUrl: process.env.BROKER_URL || "mqtt://192.168.1.209:1883", + connected: false, + lastError: null, + heartbeatEnabled: true, + heartbeatIntervalMs: 3000, + buttons: { + start1: { mac: "AA:BB:CC:DD:EE:01", voltage: 3700 }, + stop1: { mac: "AA:BB:CC:DD:EE:02", voltage: 3700 }, + start2: { mac: "AA:BB:CC:DD:EE:03", voltage: 3700 }, + stop2: { mac: "AA:BB:CC:DD:EE:04", voltage: 3700 }, + }, + log: [], +}; + +let client = null; +let heartbeatTimer = null; +let bootTime = Date.now(); + +function logEvent(direction, text) { + const entry = { t: Date.now(), direction, text }; + state.log.push(entry); + if (state.log.length > 200) state.log.shift(); + const arrow = direction === "out" ? "→" : direction === "in" ? "←" : "·"; + console.log(`[${new Date(entry.t).toISOString()}] ${arrow} ${text}`); +} + +function publish(topic, payload) { + if (!client || !state.connected) { + logEvent("err", `publish abgelehnt (nicht verbunden): ${topic}`); + return false; + } + const body = typeof payload === "string" ? payload : JSON.stringify(payload); + client.publish(topic, body, { qos: 0 }, (err) => { + if (err) logEvent("err", `publish fehlgeschlagen ${topic}: ${err.message}`); + }); + logEvent("out", `${topic} ${body}`); + return true; +} + +function startHeartbeats() { + stopHeartbeats(); + if (!state.heartbeatEnabled) return; + heartbeatTimer = setInterval(() => { + if (!state.connected) return; + const now = Date.now(); + const uptime = now - bootTime; + for (const key of BUTTON_KEYS) { + const mac = state.buttons[key].mac; + publish(`heartbeat/alive/${mac}`, { timestamp: now, uptime }); + publish(`aquacross/battery/${mac}`, { + timestamp: now, + voltage: state.buttons[key].voltage, + }); + } + }, state.heartbeatIntervalMs); +} + +function stopHeartbeats() { + if (heartbeatTimer) { + clearInterval(heartbeatTimer); + heartbeatTimer = null; + } +} + +function connectBroker(url) { + disconnectBroker(); + state.brokerUrl = url; + state.lastError = null; + logEvent("sys", `Verbinde zu ${url} ...`); + + client = mqtt.connect(url, { + clientId: `button-simulator-${Math.random().toString(16).slice(2, 10)}`, + reconnectPeriod: 0, + connectTimeout: 5000, + clean: true, + }); + + client.on("connect", () => { + state.connected = true; + bootTime = Date.now(); + logEvent("sys", `Verbunden mit ${url}`); + startHeartbeats(); + }); + + client.on("error", (err) => { + state.lastError = err.message; + logEvent("err", `MQTT Fehler: ${err.message}`); + }); + + client.on("close", () => { + if (state.connected) logEvent("sys", "Verbindung geschlossen"); + state.connected = false; + stopHeartbeats(); + }); + + client.on("offline", () => { + state.connected = false; + logEvent("sys", "offline"); + }); +} + +function disconnectBroker() { + stopHeartbeats(); + if (client) { + try { client.end(true); } catch (_) {} + client = null; + } + state.connected = false; +} + +const app = express(); +app.use(express.json()); +app.use(express.static(path.join(__dirname, "public"))); + +app.get("/api/status", (_req, res) => { + res.json({ + brokerUrl: state.brokerUrl, + connected: state.connected, + lastError: state.lastError, + heartbeatEnabled: state.heartbeatEnabled, + heartbeatIntervalMs: state.heartbeatIntervalMs, + buttons: state.buttons, + log: state.log.slice(-80), + }); +}); + +app.post("/api/connect", (req, res) => { + const url = (req.body && req.body.brokerUrl) || state.brokerUrl; + connectBroker(url); + res.json({ ok: true }); +}); + +app.post("/api/disconnect", (_req, res) => { + disconnectBroker(); + logEvent("sys", "Getrennt (manuell)"); + res.json({ ok: true }); +}); + +app.post("/api/config", (req, res) => { + const { button, mac, voltage } = req.body || {}; + if (!BUTTON_KEYS.includes(button)) { + return res.status(400).json({ ok: false, error: "unbekannter Button" }); + } + if (typeof mac === "string" && mac.length > 0) { + state.buttons[button].mac = mac.toUpperCase(); + } + if (typeof voltage === "number" && voltage >= 2500 && voltage <= 4500) { + state.buttons[button].voltage = Math.round(voltage); + } + res.json({ ok: true, button: state.buttons[button] }); +}); + +app.post("/api/heartbeat", (req, res) => { + const { enabled, intervalMs } = req.body || {}; + if (typeof enabled === "boolean") state.heartbeatEnabled = enabled; + if (typeof intervalMs === "number" && intervalMs >= 500 && intervalMs <= 60000) { + state.heartbeatIntervalMs = Math.round(intervalMs); + } + if (state.connected) startHeartbeats(); + res.json({ + ok: true, + heartbeatEnabled: state.heartbeatEnabled, + heartbeatIntervalMs: state.heartbeatIntervalMs, + }); +}); + +app.post("/api/press", (req, res) => { + const { button } = req.body || {}; + if (!BUTTON_KEYS.includes(button)) { + return res.status(400).json({ ok: false, error: "unbekannter Button" }); + } + // start* sendet type=2, stop* sendet type=1 (siehe communication.h) + const type = button.startsWith("start") ? 2 : 1; + const mac = state.buttons[button].mac; + const payload = { type, timestamp: Date.now() }; + const ok = publish(`aquacross/button/${mac}`, payload); + res.json({ ok, button, mac, payload }); +}); + +app.post("/api/battery", (req, res) => { + const { button, voltage } = req.body || {}; + if (!BUTTON_KEYS.includes(button)) { + return res.status(400).json({ ok: false, error: "unbekannter Button" }); + } + if (typeof voltage !== "number") { + return res.status(400).json({ ok: false, error: "voltage fehlt" }); + } + state.buttons[button].voltage = Math.round(voltage); + const mac = state.buttons[button].mac; + const ok = publish(`aquacross/battery/${mac}`, { + timestamp: Date.now(), + voltage: state.buttons[button].voltage, + }); + res.json({ ok, button, mac, voltage: state.buttons[button].voltage }); +}); + +app.listen(PORT, () => { + console.log(`Button-Simulator läuft: http://localhost:${PORT}`); + console.log(`Broker (Default): ${state.brokerUrl}`); +}); diff --git a/tools/update-anleitung.html b/tools/update-anleitung.html new file mode 100644 index 0000000..103ad96 --- /dev/null +++ b/tools/update-anleitung.html @@ -0,0 +1,142 @@ + + + + +AquaMaster – OTA Update Anleitung + + + + +

AquaMaster – OTA Update Anleitung

+

Schritt-für-Schritt-Anleitung zum Einspielen eines neuen Firmware- und Filesystem-Updates auf die AquaMaster-Einheit über die Weboberfläche (PrettyOTA).

+

Gilt für: AquaMaster MQTT (ESP32) · OTA-Oberfläche: PrettyOTA · Build: esp32thing_CI

+ +

1. Warum zwei Dateien?

+

Der ESP32 speichert die Software des AquaMasters in zwei getrennten Flash-Partitionen. Jede enthält etwas anderes, und beide können (und müssen teilweise) einzeln aktualisiert werden:

+ + + + + + + + + + + + + +
DateiPartitionInhalt
firmware.binApp-Partition (OTA)Die eigentliche ESP32-Software: Timer-Logik, MQTT-Broker, WiFi, Webserver, Spielmodi, RFID-Auswertung, Lizenzprüfung usw. Also alles, was der Master tut.
spiffs.binSPIFFS-PartitionDas Dateisystem mit der Weboberfläche: index.html, settings.html, leaderboard.html, rfid.html, CSS, Bilder sowie die Button-firmware.bin, über die sich die Funktaster selbst updaten.
+ +
+ Kurz gesagt: firmware.bin = was der Master macht, spiffs.bin = wie der Master im Browser aussieht. Beide leben in verschiedenen Flash-Bereichen und werden deshalb getrennt hochgeladen. +
+ +

Muss ich immer beide flashen?

+
    +
  • Nur Code geändert (z. B. neue Timerlogik, Bugfix): es reicht firmware.bin.
  • +
  • Nur Weboberfläche geändert (HTML/CSS, neue Button-Firmware): es reicht spiffs.bin.
  • +
  • Im Zweifel beide einspielen – in der Reihenfolge unten – dann kann garantiert nichts „alt gegen neu" kollidieren.
  • +
+ +

2. Vorbereitung

+
    +
  1. Die aktuelle Release-ZIP entpacken. Darin liegen firmware.bin und spiffs.bin.
  2. +
  3. AquaMaster einschalten und mit seinem WLAN verbinden: +
      +
    • AP-Modus: SSID AquaMaster-xxxx, IP 192.168.10.1
    • +
    • STA-Modus: die im Heimnetz vergebene IP (im Router oder per mDNS-Namen aquamaster.local)
    • +
    +
  4. +
  5. Im Browser die OTA-Seite öffnen: http://<IP-des-Masters>/update
    + Beispiel AP: http://192.168.10.1/update
  6. +
+ +
+ Wichtig: Während des Updates den AquaMaster nicht vom Strom trennen und die Verbindung nicht abbrechen. Ein unterbrochener Firmware-Upload führt im schlimmsten Fall zu einem Rollback auf die vorherige Version – ein unterbrochenes Filesystem-Update zu einer leeren Weboberfläche. +
+ +

3. Update-Modus wählen – das Wichtigste

+

Auf der PrettyOTA-Seite gibt es oben ein Dropdown „OTA-Mode" (oder „Update Mode") mit zwei Einträgen:

+ + + + + +
ModusWann auswählen?
FirmwareWenn du firmware.bin hochladen willst (Standard, die Option ist beim Öffnen der Seite bereits aktiv).
FilesystemWenn du spiffs.bin hochladen willst. Muss vor dem Upload manuell umgestellt werden!
+ +
+ Häufigster Fehler: spiffs.bin wird im Modus „Firmware" hochgeladen. PrettyOTA akzeptiert die Datei dann zwar, schreibt sie aber in die falsche Partition – der Master startet nicht mehr sauber bzw. zeigt nach dem Neustart eine kaputte Weboberfläche. Immer zuerst den richtigen Modus wählen, dann die Datei hinzufügen. +
+ +

4. Update durchführen

+ +

4.1 Firmware aktualisieren

+

1Im Dropdown „Firmware" auswählen.

+

2firmware.bin per Drag-&-Drop auf den Upload-Bereich ziehen (oder über „Datei auswählen" öffnen).

+

3Fortschrittsbalken abwarten, bis „Update successful" erscheint.

+

4Der AquaMaster startet automatisch neu. Warten, bis die Status-LED wieder Normalbetrieb signalisiert (ca. 5–10 s).

+ +

4.2 Filesystem (Weboberfläche) aktualisieren

+

1Erneut http://<IP>/update öffnen (nach dem Neustart ist die Verbindung evtl. kurz weg).

+

2Im Dropdown auf „Filesystem" umstellen. Nicht vergessen!

+

3spiffs.bin per Drag-&-Drop hochladen.

+

4Nach „Update successful" startet der Master erneut.

+ +
+ Tipp – Reihenfolge: Erst firmware.bin, dann spiffs.bin. So läuft nach dem ersten Reboot bereits die neue Timer-Software, die dann passend zur neuen Weboberfläche ist. +
+ +

5. Prüfen, ob das Update sitzt

+
    +
  • Die Hauptseite http://<IP>/ öffnen – die Oberfläche sollte fehlerfrei laden.
  • +
  • Unter Einstellungen / Status die Firmware-Version bzw. das Build-Datum kontrollieren.
  • +
  • Einen kurzen Testlauf starten (Start-/Stopp-Taster drücken), um zu prüfen, dass die Timerlogik reagiert.
  • +
  • Falls die Seite nach einem Filesystem-Update weiß/leer bleibt: spiffs.bin nochmal im Modus „Filesystem" hochladen.
  • +
+ +

6. Fehlerbehebung

+ + + + + + + + + + + + + + + + + + +
SymptomUrsache / Fix
„Wrong partition" oder Upload bricht sofort abFalscher Modus gewählt – Dropdown umstellen und erneut hochladen.
Nach dem Update leere / unformatierte WeboberflächeEs wurde nur firmware.bin geflasht, aber die HTML/CSS-Dateien haben sich geändert. spiffs.bin nachliefern (Modus „Filesystem").
Master kommt nach Firmware-Update nicht mehr ins WLANKurz stromlos machen; PrettyOTA führt intern bei einem fehlerhaften Boot ein Rollback auf die vorherige App-Partition aus.
Browser zeigt „Verbindung verloren"Normal während des Reboots. Seite nach ~10 s neu laden.
+ +

Bei fortbestehenden Problemen: seriellen Monitor mit 115200 Baud anschließen – PrettyOTA und der Master schreiben detaillierte Update- und Boot-Logs auf UART.

+ + +