Version 1.6.2: - Kommt das Panel nicht hoch, stürzt der P4 nicht mehr wortlos ab. Die Bringup-Schritte melden ihren Fehler jetzt im Klartext auf der seriellen Konsole (auch bei abgeschaltetem Core-Debug-Level), zusammen mit PSRAM-Größe, freiem PSRAM und dem tatsächlich benötigten Framebuffer-Bedarf. Vorher endete ein fehlgeschlagener Panel-Aufbau in einem Speicherauszug, aus dem die Ursache nicht hervorging. - Schlägt der Panel-Aufbau fehl, läuft die Firmware ohne Anzeige weiter, statt ein zweites Mal abzustürzen: UART-Verbindung und OTA bleiben offen, die S3 kann also neu flashen. Alle Oberflächenfunktionen prüfen dafür, ob das Dashboard überhaupt aufgebaut wurde. - Fehlerbehebung: Findet der Touch-Controller nicht statt, lieferte der Hersteller-Treiber einen bereits freigegebenen Zeiger zurück, der ungeprüft weiterverwendet wurde. Das Display läuft in diesem Fall jetzt einfach ohne Bedienung weiter. Version 1.6.1: - Waveshare 7" (H): Bild und Touch lassen sich um 180 Grad drehen, wenn das Panel auf dem Kopf eingebaut ist. Schalter WS7_ROTATE_180 in pins_config.h, Vorgabe ist gedreht. Die Drehung übernimmt der PPA-Grafikbeschleuniger des ESP32-P4 - die Software-Rotation des LVGL-Ports rechnet nur in RGB565 und wäre für dieses Panel unbrauchbar. - Der Touch dreht mit, sonst läge die Bedienung spiegelbildlich zum Bild. Version 1.6.0: - Neu: Dieselbe Firmware läuft jetzt auch auf einem Waveshare ESP32-P4-Pico mit dem Waveshare 7inch DSI LCD (H) (1280x720). Umgeschaltet wird über „JC_PANEL_TYPE" in config.h; WS_PANEL_7H ist ab dieser Version die Vorgabe, JC_PANEL_43 und JC_PANEL_70 bleiben unverändert verfügbar. - Das Waveshare-Panel hängt hinter einer Bridge, die ausschließlich RGB888 annimmt. LVGL rechnet für dieses Panel deshalb mit 24 statt 16 Bit Farbtiefe. lv_conf.h liest dazu JC_PANEL_TYPE aus config.h, damit Sketch und LVGL-Bibliothek garantiert dieselbe Farbtiefe benutzen; display_hal.cpp bricht den Build ab, falls sie auseinanderlaufen. Der Panelwechsel muss aus diesem Grund in config.h erfolgen und nicht per Compiler-Flag. - Bringup ohne Hersteller-Panel-Treiber: DSI-Bus, Kommandokanal und DPI-Panel werden direkt angelegt. Entscheidend ist die Legacy-Referenztaktquelle PLL_F20M - mit der Standardquelle bleibt der Bildschirm auf ESP32-P4 Rev. 1.3 / ECO2 schwarz. Die Zeitbasis (2 Lanes zu 1250 Mbit/s, 80 MHz DPI-Takt, Austastlücken 64/64/64, rund 60 Hz) steht als WS7_*-Werte in pins_config.h und ist dort anpassbar, falls das Bild reißt. - Panel-Freigabe und Helligkeit laufen beim Waveshare nicht über einen PWM-Pin, sondern über Register der Bridge auf I2C-Adresse 0x45. Die Hintergrundbeleuchtung wird bewusst erst eingeschaltet, wenn die DSI-Ausgabe steht - sonst blitzt beim Start Bildrauschen auf. Standby-Abdunklung und „Uhrzeit im Standby" funktionieren wie bei den JC-Panels. - Touch: Der GT9271 des Waveshare-Panels benutzt dieselbe Registerbelegung wie der GT911, liegt aber auf I2C-Adresse 0x14 und meldet im Hochformat. X und Y werden deshalb getauscht und auf die Bildfläche begrenzt; Ausreißer des Controllers landen nicht mehr als Klick am Bildrand. Sollte die Bedienung spiegelverkehrt reagieren, lässt sich das mit WS7_TOUCH_MIRROR_RAW_X / _Y in pins_config.h umdrehen. - Der Framebuffer wächst auf 3 x 2,8 MB (rund 8,3 MB PSRAM). Auf dem P4-Pico mit 32 MB PSRAM ist das unkritisch. - Die UART-Pins zur Hauptplatine sind für das Waveshare-Board getrennt eingestellt, weil dessen 40-poliger Header eine andere Belegung hat als die JC-Panels: TX = GPIO17, RX = GPIO18 (JC-Panels unverändert TX = GPIO33, RX = GPIO31). Version 1.5.0: - Neu: Dieselbe Firmware unterstützt jetzt auch das 7-Zoll-Display Guition JC1060P470C-I-W (JD9165, 1024x600) zusätzlich zum bisherigen 4,3-Zöller JC4880P443C-I-W (ST7701, 480x800). Umgeschaltet wird über „JC_PANEL_TYPE" in config.h (JC_PANEL_43 / JC_PANEL_70) oder per Compiler-Flag -DJC_PANEL_TYPE=70. Vorgabe bleibt das 4,3-Zoll-Panel, dessen Verhalten sich nicht ändert. - Panel-Treiber esp_lcd_jd9165.c/.h aus dem Hersteller-Paket übernommen; board_bringup.c legt je nach Panel den passenden DSI-Bus, die DPI-Zeitbasis und den Herstellertreiber an. - pins_config.h liefert Auflösung, LCD-Reset-Pin (4,3": GPIO5, 7,0": GPIO27) und Ausrichtung panelabhängig. Das 7-Zoll-Panel ist nativ Querformat, deshalb entfällt dort die 270-Grad- Rotation samt PPA-Beschleunigung. - Der GT911 des 7-Zöllers meldet Rohkoordinaten im Raster 800x480 statt 1024x600. Die Umrechnung hängt am process_coordinates-Hook von esp_lcd_touch, damit die Herstellerdatei esp_lcd_touch_gt911.c unverändert bleibt. Ohne sie wäre nur der linke obere Bildteil bedienbar. - Die Oberfläche rechnet nicht mehr mit fest verdrahteten 480 Pixeln Höhe, sondern mit DISP_VER_RES. Layout und Schriften bleiben sonst unverändert: Das Dashboard arbeitet fast durchgehend mit Prozentmaßen, und die feineren Pixelabstände des 7-Zöllers (170 statt 213 dpi) lassen dieselben Schriftgrößen physisch größer erscheinen. - Die UART-Verkabelung ist bei beiden Panels gleich (P4 GPIO33 = TX, GPIO31 = RX). Beim 7-Zöller liegen diese Pins allerdings auf der FPC-Buchse FPC4 (1,0 mm, 16-polig) statt auf einer Stiftleiste - dort wird ein Adapterkabel gebraucht. Version 1.4.2: - Bug-Fix: Beim Aufwecken über Antippen erschien die Auswahl „Espresso oder Cold Extraction" manchmal nicht. Der Dialog entschied nach einer anderen Bedingung, ob er die Auswahl ANZEIGT (verlangte zusätzlich cxArmable), als er beim Absenden benutzte, um die Rückfrage der S3 zu UNTERDRÜCKEN. In der Lücke dazwischen zeigte er nur „Aufwecken", sendete aber „wakeEspresso" - und damit war die Frage auch auf der S3 erledigt. Beide Stellen benutzen jetzt dieselbe Funktion wake_choice_offered(). - Hat der Dialog die Auswahl nicht angeboten, sendet er wieder „deactivateStandby". Dann öffnet die S3 ihr eigenes Auswahlfenster, und die Frage kommt trotzdem - derselbe Weg wie beim Aufwecken über den Schalter. Die Auswahl kann damit nicht mehr ersatzlos entfallen. Version 1.4.1: - Passend zu S3 5.6.2: Die Auswahl beim Aufwecken erscheint auch dann, wenn der Cold-Extraction-Modus bereits aktiv ist - sie geht in beide Richtungen. „Espresso" schaltet den Modus dann ab. - Der Cold-Extraction-Knopf zeigt den Ist-Zustand: Bei aktivem Modus ist er hervorgehoben und heißt „Cold Extraction (aktiv lassen)", sonst „Cold Extraction (Wasser bleibt kalt)". Version 1.4.0: - Die Auswahl „Espresso oder Cold Extraction" erscheint jetzt auch beim Aufwecken über den Schalter (braucht S3-Firmware ab 5.6.0). Meldet die S3 ein offenes Auswahlfenster (cxWakeChoice), blendet das Display den Dialog von sich aus ein - ohne Antippen - und zeigt die verbleibende Bedenkzeit als Countdown. „Abbrechen" entfällt in diesem Fall, weil es nichts abzubrechen gibt: Läuft die Zeit ab, heizt die Maschine normal auf. - Der Espresso-Knopf sendet „wakeEspresso" statt „deactivateStandby", sobald die Auswahl relevant ist. Damit wird die Entscheidung auf der S3 vermerkt und nicht direkt danach erneut gefragt. - Der Cold-Extraction-Knopf beendet den Standby nur noch, wenn er überhaupt aktiv ist - im Auswahlfenster nach dem Aufwecken schaltet er nur den Modus. Version 1.3.0: - Der Aufweck-Dialog wird zur Auswahl: „Womit aufwecken?" mit den Knöpfen „Espresso" (heizt normal auf) und „Cold Extraction (Wasser bleibt kalt)". Braucht S3-Firmware ab 5.5.0. Bei „Cold Extraction" wird erst der Modus scharf geschaltet und dann der Standby beendet, damit der Wasserkreis nicht zwischendurch anheizt. - Steuerbar über die neue Einstellung „Beim Aufwecken fragen" (Cold-Extraction-Seite, Abschnitt Grundeinstellung; identisch zur Web-UI). Ist sie aus, erscheint wieder der bisherige Dialog mit „Aufwecken" und „Abbrechen" - der Zwischenschritt entfällt dann komplett. Version 1.2.1: - Bug-Fix: Während einer kalten Extraktion zeigten Waage-Kachel und Live-Bezugsschirm das Zielgewicht des normalen Espresso-Bezugs (bbwTarget) statt des Ziels der kalten Extraktion (cxTarget). Außerdem erschienen Gewichtsanzeige und Fortschrittsbalken nur, wenn Brew-by-Weight aktiv war - bei kalter Extraktion ist das typischerweise aus, obwohl ein Ziel existiert. Beide Anzeigen nutzen jetzt cxTarget, sobald cxShot gesetzt ist. Version 1.2.0: - Neue Seite „Cold Extraction" mit eigenem Menüeintrag (braucht S3-Firmware ab 5.4.0). Dort stehen jetzt alle Parameter der kalten Extraktion und lassen sich direkt am Display ändern: Freigabetemperatur, Vorbenetzung (Dauer + Pumpenleistung), Hauptbezug (Pulsperiode + Pumpenleistung), Zielgewicht, maximale Bezugsdauer sowie der Pumpenschutz. Gespeichert wird über das erweiterte saveBrew-Kommando. - Der Modus-Schalter ist von der Temperatur-Seite auf die neue Seite umgezogen (eine Stelle statt zwei). Der Knopf „Aufwecken mit Cold Extraction" im Standby-Dialog bleibt unverändert. - Brew-Control-Seite neu gegliedert: Statt einer durchlaufenden Liste unter Zwischenüberschriften liegt jede Funktion (Pre-Infusion, Brew-by-Time, Brew-by-Weight, Dampf-Timer) jetzt in einer eigenen Karte mit Titel und einer Zeile, die erklärt, was sie tut. Die neue Cold-Extraction-Seite nutzt dieselbe Gliederung. - Eingabefelder werden nur beim Öffnen der Seite aus dem Zustand gefüllt, damit laufende State-Pushes eine begonnene Eingabe nicht überschreiben (gleiches Verhalten wie auf der Brew-Control-Seite). Version 1.1.3: - Aufweck-Dialog hat einen dritten Knopf: „Aufwecken mit Cold Extraction" (braucht S3 ab 5.3.5). Er stellt den Modus scharf und beendet erst danach den Standby - in dieser Reihenfolge, damit der Wasserkreis gar nicht erst anheizt. Ohne diesen Weg musste man normal aufwecken (Maschine heizt an) und den Modus danach umschalten. Der Knopf erscheint nur, wenn die Funktion freigeschaltet und umschaltbar ist und der Modus nicht ohnehin schon läuft. - Der Schalter „Cold Extraction" auf der Temperatur-Seite hängt jetzt am neuen State-Feld cxArmable statt an cxAllowed: umschaltbar auch im Standby und bei warmem Kessel, gesperrt nur während eines laufenden kalten Bezugs. Bei älterer S3-Firmware fällt das Feld auf cxEnabled zurück, der Schalter bleibt also bedienbar. - Erklärzeile im Standby: „Nach dem Aufwecken bleibt der Wasserkreis aus." Version 1.1.2: - Cold Extraction: Fehlt eine nutzbare Waage, weist das Display jetzt dauerhaft darauf hin. Ohne Waage greifen weder Zielgewicht noch Stillstands-Erkennung, der Bezug endet erst nach der maximalen Bezugsdauer (braucht S3-Firmware ab 5.3.4). - Statuszeile: „Cold Extraction aktiv - ohne Waage, Ende nach Zeit" (gelb) statt des blauen Normalhinweises; beim Aktivieren zusätzlich kurz die Meldung zum neuen cxNotice-Code 4. - Erklärzeile unter dem Schalter und die Parameter-Anzeige auf der Brew-Seite ergänzen den Hinweis; bei aktivem Modus ohne Waage nennt die Zeile die Zeit statt des Zielgewichts. Version 1.1.1: - Compiler-Warnungen des P4-Builds aufgeräumt (rein technisch, keine Funktionsänderung): - „LV_FS_DEFAULT_DRIVE_LETTER is deprecated": Die Option heißt ab LVGL 9.3 LV_FS_DEFAULT_DRIVER_LETTER. Der alte Name funktionierte zwar noch, löste aber in lv_api_map_v9_1.h ein #warning aus - und zwar in JEDER Übersetzungseinheit, die lvgl.h einbindet. Das allein waren rund 60 Warnungen pro Build, die alles andere zugedeckt haben. In lv_conf.h umbenannt. - „bitwise operation between different enumeration types is deprecated": LV_PART_* und LV_STATE_* sind in LVGL 9 zwei verschiedene Enum-Typen; sie direkt mit | zu verknüpfen ist in C++20 abgekündigt. Neues Makro TH_SEL(part, state) in theme.h castet beide auf lv_style_selector_t (ohnehin uint32_t). Betraf 5 Stellen in ui.cpp und theme.h. - Bug-Fix: Der Puffer für die Cold-Extraction-Infozeile auf der Brew-Seite war mit 192 Bytes zu klein - der Text ist rund 205 Zeichen lang (das „°" zählt als zwei Bytes), die letzte Zeile wurde also abgeschnitten. Jetzt 256 Bytes. Version 1.1.0: - Cold Extraction am Display bedienbar (braucht S3-Firmware ab 5.3.2): - Neuer Schalter „Cold Extraction" auf der Seite „Temperaturen" unter „Modi", darunter eine Erklärzeile mit dem aktuellen Zustand bzw. dem Sperrgrund. Schalter und Zeile bleiben unsichtbar, solange die S3 die Funktion nicht freigeschaltet meldet (auch bei älterer S3-Firmware, die die Felder gar nicht sendet). - Einschalten ist nur bei erteilter Freigabe möglich (Wasserkessel kalt genug, kein Standby / Wartung / Tuning); ausschalten immer, außer während eines laufenden kalten Bezugs. Gesendet wird gezielt startColdExtraction/stopColdExtraction statt eines Toggles, damit ein abgewiesener Befehl den Schalter nicht in einen nie bestätigten Zustand bringt. - Statuszeile: eigener Slot direkt hinter der Sicherheitsmeldung. Zeigt dauerhaft „Cold Extraction aktiv - Wasserkreis heizt nicht", bei fehlender Freigabe den Grund, während der Pumpen-Zwangspause den Pumpenschutz und transient einen abgewiesenen Start bzw. einen Abbruch wegen fehlenden Zulaufs. - Wasser-Kachel im Dashboard zeigt bei aktivem Modus „Cold Extraction - Heizen aus" statt eines Sollwerts, der nicht erreicht wird; der Aufheiz-Countdown ist dann unterdrückt. - Phasenleiste und Live-Bezugsschirm benennen die erste Phase eines kalten Bezugs „Vorbenetzung" (keine Pause-Phase) und zeigen die Pumpenpause an. - Brew-Seite: Cold-Extraction-Parameter als Anzeige (Freigabeschwelle, Vorbenetzung, Zielgewicht, Timeout) mit Hinweis, dass sie in der Web-UI eingestellt werden. - Statistik-Seite: kalte Bezüge sind mit „(kalt)" markiert und gehen nicht in die mittlere Bezugsdauer ein - gleiche Regel wie in der S3-Statistik. - Bug-Fix: Das Limit für eingehende UART-Zeilen (PROTO_RX_LINE_MAX) lag bei 2048 Bytes, während die State-Zeile der S3 bereits rund 2,1 KB erreicht - mit langem Status-, Profil- oder SSID-Text konnte sie darüber liegen. In dem Fall wurde die GANZE Zeile verworfen und das Display fror auf dem letzten Stand ein, ohne dass die Verbindung als tot erkannt wurde. Das Limit ist jetzt 4096 Bytes; der RX-Puffer selbst bleibt bei 2 KB reserviert, weil der interne RAM knapp ist und eine Arduino-String nicht ins PSRAM alloziert werden kann. Version 1.0.13: - Profil-Schnellwahl + Anzeige des aktiven Profils (braucht S3-Firmware ab 5.1.1): - Neuer Profil-Chip im Header (auf allen Seiten sichtbar): zeigt das zuletzt geladene bzw. gespeicherte Profil; ein „*" hinter dem Namen bedeutet, dass seitdem profil-relevante Einstellungen geändert wurden. Lange Namen werden gekürzt; ohne bekanntes Profil (oder mit älterer S3-Firmware) bleibt der Chip unsichtbar. - Antippen des Chips öffnet die Profil-Schnellwahl: ein Overlay mit allen gespeicherten Profilen, das aktive mit Häkchen und Akzentfarbe hervorgehoben. Ein Tap lädt das Profil direkt (Toast bestätigt, Chip aktualisiert sich mit dem nächsten State) — zwei Berührungen vom Dashboard zum Profilwechsel statt Umweg über die Profile-Seite. - Profile-Seite: das aktive Profil wird in der Liste mit Häkchen-Symbol und Akzentfarbe markiert. Version 1.0.12: - Verlauf-Chart: Flackernde Heizleistungs-Kurven in den großen Zeitfenstern behoben. Die Dezimierung pickte pro Chart-Punkt ein Einzelsample, dessen Abtast-Raster mit jedem Sekundentick um eine Position wanderte — die schnell schaltende Heizleistung (PWM) sprang dadurch sichtbar zwischen zwei Kurvenbildern hin und her. Jetzt wird über den gesamten Zeitabschnitt eines Chart-Punkts gemittelt: das Bild steht ruhig, und die Leistungs-Kurve zeigt die tatsächliche mittlere Heizleistung statt zufälliger Momentwerte. Im 2-min-Fenster (1 Sample je Punkt) ändert sich nichts. Version 1.0.11: - Verlauf-Seite ausgebaut (nur P4, keine S3-/Protokolländerung nötig): - Umschaltbares Zeitfenster: Buttons „2 min / 10 min / 30 min / 60 min" in der Kopfzeile. Intern läuft eine 1-s-Historie als Ringpuffer über volle 60 Minuten; das Chart zeigt weiterhin 120 Punkte und dezimiert je Fenster. Dadurch ist beim Fensterwechsel der komplette Verlauf sofort da (kein leeres Chart, kein Neuaufbau). Die Wahl wird P4-lokal im NVS gespeichert und überlebt Neustarts. - Gestrichelte Soll-Linien für Wasser und Dampf im Chart (Farbe der jeweiligen Kurve, gedimmt). Die Y-Skala bezieht die Soll-Werte mit ein, damit die Linien im Bild liegen — aber nur für Kreise, deren Ist-Kurve im Fenster sichtbar ist (ein kalter Dampfkessel zieht die Skala nicht auseinander). - Heizleistung zuschaltbar: Button „Leistung" blendet Duty-Cycle Wasser/Dampf als gedimmte Zusatzkurven auf einer zweiten Achse (0–100 %) ein, inkl. Live-Legende. Einstellung ebenfalls P4-lokal im NVS. - Feinere Kurven: Die Temperatur-Historie wird jetzt in Zehntelgrad geführt und gezeichnet (vorher ganzzahlig gerundet) — PID-Schwingungen um ±1 °C sind damit sauber ablesbar. - Die ~29 KB Historie liegen im PSRAM (heap_caps_malloc, wie die LVGL-Framebuffer) — als statische Arrays sprengten sie den internen RAM (Linker: 107 % belegt). - Shot-Zusammenfassung: Karte auf 560 px verbreitert und Spaltenabstand zwischen Dauer/Gewicht/Flow deutlich vergrößert (28 px statt 10 px) — die drei Werte standen zu nahe beisammen und waren schlecht lesbar. - PID-AutoTune sichtbar gemacht: Während eines Tuning-Laufs erscheint auf der Verlauf-Seite eine Live-Karte (mit Spinner) — je Kreis Laufzeit, aktuelle Phase (heizt/kühlt ab) und Schwingungshub samt Mittelpunkt (Min/Max der Ist-Temperatur seit Start). Nach dem Ende zeigt die Karte ~30 s das Ergebnis (Erfolg/Abbruch samt Grund, farbcodiert). Die PID-Tuning-Meldung in der Statuszeile ist jetzt antippbar und springt zur Verlauf-Seite, wo die Schwingung auch als Kurve zu sehen ist. Version 1.0.10: - Live-Bezugsschirm (abschaltbar): Beim Start eines echten Bezugs blendet sich ein Vollbild-Overlay weich ein — große Bezugszeit, Live-Gewicht und Flow samt Flow-Verlaufskurve der letzten 30 Sekunden (nur bei verbundener Waage), Fortschrittsbalken Richtung Zielgewicht (Brew-by-Weight) bzw. Zielzeit (Brew-by-Time) und Pre-Infusion-Phasenhinweis mit Restzeit. Über das X oben rechts für den laufenden Bezug schließbar; beim nächsten Bezug erscheint er wieder. Ein/Aus-Schalter auf der Info-Seite unter „Darstellung", die Einstellung wird P4-lokal im NVS gespeichert und überlebt Neustarts. Während Flush und Reinigungsassistent erscheint das Overlay bewusst nicht. - Shot-Zusammenfassung aufgewertet: Die Karte nach Bezugsende blendet jetzt weich ein/aus (Fade), wirft einen Schlagschatten und zeigt Dauer, Endgewicht und mittleren Flow als große Werte mit gedimmter Beschriftung statt reiner Textzeilen (Gewicht/Flow nur bei aktiver Waage). - Pre-Infusion-Phasenanzeige auf dem Dashboard: Während eines Bezugs mit aktiver Pre-Infusion zeigt eine Schrittleiste die Phasen „Pre-Infusion → Pause → Extraktion" an — erledigte Schritte mit Haken, die aktive Phase hervorgehoben (Gold) inkl. Restzeit-Countdown (100-ms-Takt). Die aktive Phase kommt quelltreu von der S3 (neues State-Feld "piState", ab S3-Firmware 5.0.12); bei älterer S3-Firmware wird sie zeitbasiert aus den konfigurierten Phasendauern abgeleitet. Ist keine Pause konfiguriert (0 s), wird der Pause-Schritt ausgeblendet. - Temperatur-Seite: Solltemperaturen für Wasser und Dampf werden jetzt über radiale Drehregler (Arc, 270°) mit großem Wert mittig und −/+-Feinjustage eingestellt. Gesendet wird entprellt (nach kurzer Bedienpause bzw. sofort beim Loslassen des Reglers oder Verlassen der Seite), damit Drag-Gesten die S3 nicht mit setTemp-Kommandos und EEPROM-Schreibzugriffen fluten. Tippen in die Reglermitte löst bewusst keinen Wertsprung aus (ADV_HITTEST: nur Ring/Griff reagieren). - Dashboard-Feinschliff (nur P4, keine S3-/Protokolländerung nötig): - Weiche Temperatur-Zustandsfarben: Der große Ist-Wert färbt sich stufenlos über den Abstand zum Soll (kontinuierliche Farbinterpolation statt harter Stufen) — Blau beim Aufheizen, Gold kurz vor dem Ziel, Grün im Zielband (±0,5 °C), Richtung Warngelb bei deutlichem Überschwinger. Dazu neue „BEREIT"-Pille im Header (auf allen Seiten sichtbar), wenn der Wasserkessel — und der Dampfkessel, sofern er heizt — im Zielband liegt, kein Fehler/ Standby/Eco aktiv ist und kein Aufheiz-Countdown läuft; mit Hysterese gegen Flackern an der Bandgrenze, erscheint und verschwindet weich (Fade). - Umschaltbares Temperatur-Design: Die Dashboard-Temperaturanzeige gibt es jetzt in fünf Varianten — „Klassisch" (bisherige Karten mit Prozentbalken), „Instrumente" (freistehende Rundinstrumente im Manometer-Look: Metall-Bezel mit Verlauf und Schlagschatten für eine leichte 3D-Wirkung, 270°-Bogen füllt sich in der Zustandsfarbe, Soll-Wert in der Bogen-Lücke), „Minimal" (komplett rahmenlos, nur große Werte mit dünner Ist/Soll-Linie), „Soft-3D" (Neumorph: Fläche fast im Hintergrundton wirkt herausgedrückt — dunkler Schatten unten rechts, heller Lichtschein oben links, eingelassener Balken) und „Thermometer" (vertikale Säulen, die sich von unten in der Zustandsfarbe füllen, mit Glanzstreifen als Glas-Effekt und rundem Kolben unten). Außer bei „Klassisch" folgt auch die Füllfarbe von Balken/Bogen/Säule stufenlos der Zustandsfarbe des Ist-Werts. Umschalter auf der Info-Seite unter „Darstellung"; die Wahl wird P4-lokal im NVS gespeichert und überlebt Neustarts. Standard: Instrumente. - Konsolidierte Statuszeile: Die sechs gestapelten Dashboard-Banner (Sicherheit, Dampf, Reinigung, PID-Tuning, Wartung, Aufheiz-Countdown) teilen sich jetzt EINE feste einzeilige Meldung — mehrere aktive Hinweise rotieren alle 4 s weich durch (Fade) statt das Layout zu verschieben, Priorität Rot > Gelb > Blau. Wartungs- und Reinigungsmeldung bleiben antippbar (Serviceseite bzw. Reinigungs-Sub-Screen), Überlängen laufen als Laufschrift durch. Version 1.0.9: - Weiche Übergänge (dezente Fade-Animationen) hinzugefügt: - Start-Animation: Boot-Splash mit Logo, Untertitel, Lade-Spinner ("Verbinde mit Maschine...") und Firmware-Stand; blendet sich beim Start weich ein und beim ersten State von der S3 (Verbindung steht) wieder aus. - Einschlaf-Animation: Die Standby-Uhr wird beim Wechsel in den Standby weich eingeblendet. - Aufweck-Animation: Beim Aufwecken blendet das Standby-Overlay weich aus und gibt das Dashboard frei. - Umsetzung speicher-neutral über das 'opa'-Style (kein opa_layered/Vollbild-Puffer), um den LVGL-Speicherpool nicht zu belasten. Bei ausgeschalteter Standby-Uhr (Display aus) gibt es weiterhin keine Einschlaf-Animation (schwarzer Bildschirm bietet keine Anzeigefläche). Version 1.0.8: - Statistik-Seite hinzugefügt Version 1.0.7: - Brew-by-Weight-Gewichtseingabelimit auf 150g erhöht, um auch Heißwasserbzug für Americano oder ähnliches via BBW zu ermöglichen Version 1.0.6: - Boot-Loop-Schutz implementiert: P4-Boot-Loop-Schutz + „Update-Modus", der den UART-OTA offenhält. Wenn die P4-Firmware in eine Absturzschleife läuft, erkennt sie das (RTC-Zähler wie beim S3) und startet in einen abgespeckten Modus, der bewusst das riskanteste überspringt — vor allem die Display-/LVGL-Init (der wahrscheinlichste P4-Absturzgrund, siehe unser LVGL-Mem-Pool-Thema) — und nur den UART-Empfang + OTA-Receiver laufen lässt. Dann kann der S3 die P4-Firmware jederzeit per UART neu flashen, auch wenn die normale P4-Oberfläche kaputt ist. (Optional: eine ganz simple statische „Update-Modus"-Bildschirmmeldung, falls das Panel-Bringup als sicher genug gilt.)