From 881acec3df9cb42912a42763a1dd596976f16d7f Mon Sep 17 00:00:00 2001 From: raw-designs Date: Tue, 11 Aug 2026 01:53:48 +0200 Subject: [PATCH] =?UTF-8?q?fix(S3):=20Cold=20Extraction=20brach=20w=C3=A4h?= =?UTF-8?q?rend=20der=20Vorbenetzung=20ab=20(5.3.3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Stillstands-Erkennung lief bereits während der Vorbenetzung mit. In dieser Phase sättigt der Puck aber erst, in der Tasse kommt naturgemäß nichts an — bei einer Vorbenetzung länger als die 15 s Stillstands-Zeit wurde deshalb jeder kalte Bezug mit "kein Zulauf" abgebrochen. Mit dem bisherigen Standard von 30 s wäre das ausnahmslos passiert; die Funktion war mit aktiver Waage unbenutzbar. Die Erkennung startet jetzt erst mit dem Hauptbezug. Dazu der Standard der Vorbenetzung von 30 s auf 10 s: Die Pumpe läuft in dieser Phase bewusst ungepulst auf voller Leistung. Heiß kommt der erste Tropfen nach etwa 7 s, kalt (rund dreifache Viskosität) entsprechend später — 30 s wären längst voller Bezug bei vollem Druck gewesen, und die Hälfte des Pumpen-Laufzeitbudgets wäre vor dem eigentlichen Bezug verbraucht. Bestehende Installationen behalten ihren gespeicherten Wert. Die Beschriftung auf /Brew-Control sagt jetzt ausdrücklich, dass die Pumpe während der Vorbenetzung durchläuft und erst im Hauptbezug gepulst wird. Co-Authored-By: Claude Opus 5 --- Changelog.txt | 16 ++++++++++++++++ Dual-PID.ino | 24 +++++++++++++++++------- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index b9c7cee..7bd9a5e 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,19 @@ +Version 5.3.3: +- Bug-Fix (Cold Extraction, hätte die Funktion mit Waage komplett unbrauchbar gemacht): Die + Stillstands-Erkennung lief bereits während der Vorbenetzung mit. In dieser Phase sättigt der Puck + aber erst, es kommt naturgemäß nichts in der Tasse an - bei einer Vorbenetzung länger als die + 15 s Stillstands-Zeit wurde deshalb JEDER kalte Bezug mit „kein Zulauf" abgebrochen. Mit dem + bisherigen Standard von 30 s Vorbenetzung wäre das immer passiert. Die Erkennung startet jetzt + erst mit dem Hauptbezug. +- Standard der Vorbenetzung von 30 s auf 10 s gesenkt. In dieser Phase läuft die Pumpe bewusst + ungepulst auf voller Leistung; bei heißem Bezug kommt der erste Tropfen nach etwa 7 s, kalt + (rund dreifache Viskosität) entsprechend später. 30 s wären also längst voller Bezug bei vollem + Druck gewesen, und die Hälfte des Pumpen-Laufzeitbudgets wäre vor dem eigentlichen Bezug + verbraucht. Bestehende Installationen behalten ihren gespeicherten Wert - dort ggf. auf + /Brew-Control nachziehen. +- Die Beschriftung auf /Brew-Control sagt jetzt ausdrücklich, dass die Pumpe während der + Vorbenetzung durchläuft und erst im Hauptbezug gepulst wird. + Version 5.3.2: - Cold Extraction sendet den Sperrgrund jetzt als Code („cxBlock") statt als Klartext („cxMessage"), dazu eine transiente Meldung als Code („cxNotice") und die Vorbenetzungsdauer („cxPreInf"). diff --git a/Dual-PID.ino b/Dual-PID.ino index e70e34a..1aee607 100644 --- a/Dual-PID.ino +++ b/Dual-PID.ino @@ -369,7 +369,7 @@ Adafruit_SH1106G display = Adafruit_SH1106G(128, 64, &Wire); * Firmware-Informationen ************************************************************************************/ -String version = "5.3.2"; +String version = "5.3.3"; String versionHersteller = "Thomas Müller"; String versionHerstellerMail = "thomas@mueller.black"; @@ -782,7 +782,7 @@ bool flowGuardPumpPulseActive = false; ************************************************************************************/ bool coldExtractionEnabled = false; // Funktion in der Web-UI freigeschaltet float coldExtractionMaxTempC = 30.0f; // Freigabeschwelle Wasserkessel -float coldExtractionPreInfusionSeconds = 30.0f; // Vorbenetzung (Pumpe laeuft ungepulst) +float coldExtractionPreInfusionSeconds = 10.0f; // Vorbenetzung (Pumpe laeuft ungepulst) uint16_t coldExtractionPulsePeriodMs = 2000; // Pulsperiode der Pumpe im Hauptbezug float coldExtractionDutyPercent = 30.0f; // Pumpen-Duty im Hauptbezug float coldExtractionTargetGrams = 60.0f; // Zielgewicht (ca. 1:3 auf 18 g) @@ -792,7 +792,11 @@ float coldExtractionPumpRestSec = 20.0f; // Dauer der Zwangspause const bool defaultColdExtractionEnabled = false; const float defaultColdExtractionMaxTempC = 30.0f; -const float defaultColdExtractionPreInfusionSeconds = 30.0f; +// 10 s statt der urspruenglichen 30 s: Die Pumpe laeuft in dieser Phase ungepulst auf +// voller Leistung. Heiss kommt der erste Tropfen nach ~7 s, kalt (rund dreifache +// Viskositaet) entsprechend spaeter - 30 s waeren laengst voller Bezug bei vollem Druck +// gewesen, und die Haelfte des Pumpen-Laufzeitbudgets waere vor dem Hauptbezug verbraucht. +const float defaultColdExtractionPreInfusionSeconds = 10.0f; const uint16_t defaultColdExtractionPulsePeriodMs = 2000; const float defaultColdExtractionDutyPercent = 30.0f; const float defaultColdExtractionTargetGrams = 60.0f; @@ -4202,8 +4206,12 @@ bool coldExtractionStallDetected(float netWeight) { coldExtractionStallSinceMs = 0; return false; } - if (coldExtractionPumpResting) { - coldExtractionStallSinceMs = 0; // Pause ist kein Stillstand + // Waehrend der Vorbenetzung saettigt der Puck erst - da kommt naturgemaess nichts in + // der Tasse an. Ohne diese Ausnahme wuerde die Erkennung jeden kalten Bezug abbrechen, + // sobald die Vorbenetzung laenger als COLDEX_STALL_TIMEOUT_MS dauert. Der Zaehler + // startet damit erst mit dem Hauptbezug. + if (coldExtractionPumpResting || currentPreInfusionState == PI_PRE_BREW) { + coldExtractionStallSinceMs = 0; // Pause/Vorbenetzung ist kein Stillstand coldExtractionStallLastWeight = netWeight; return false; } @@ -7144,7 +7152,7 @@ static const char brewControlCX_ToggleContainerEnd[] PROGMEM = R"rawliteral(>Freigabe bis Wassertemperatur (°C): - + @@ -7161,7 +7169,9 @@ static const char brewControlCX_Fields[] PROGMEM = R"rawliteral( (Die Maschine hat keinen Bypass um den Wasserkessel: Kaltes Wasser kommt nur bei kaltem Kessel am Puck an. Deshalb ist die kalte Extraktion nur unterhalb der Freigabetemperatur möglich, praktisch also aus dem kalten Zustand heraus. Solange der Modus aktiv ist, heizt der Wasserkreis nicht - der Dampfkreis bleibt - unberührt und darf weiter heizen. Die Pumpenlaufzeit wird kumuliert gezählt; nach der eingestellten + unberührt und darf weiter heizen. Während der Vorbenetzung läuft die Pumpe durchgehend auf voller + Leistung (kein Pulsen) - sinnvoll ist eine Dauer knapp unterhalb des ersten Tropfens; gepulst wird erst im + Hauptbezug. Die Pumpenlaufzeit wird kumuliert gezählt; nach der eingestellten Laufzeit legt die Steuerung eine Zwangspause ein. Der Modus selbst wird auf dem Dashboard bzw. am Touch-Display ein- und ausgeschaltet und bleibt über Standby und Neustart hinweg aktiv, bis er dort wieder ausgeschaltet wird - solange heizt der Wasserkreis nicht.) -- 2.54.0