From 134004fce98106f39d0a87fe5ea6e7f3b9d5dfd4 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 5 Jul 2026 19:12:54 +0200 Subject: [PATCH] fix py --- .../__pycache__/capture_csv.cpython-314.pyc | Bin 12894 -> 13041 bytes scripts/__pycache__/dryer_tui.cpython-314.pyc | Bin 29529 -> 30570 bytes scripts/dryer_tui.py | 41 ++++++++++++++---- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/scripts/__pycache__/capture_csv.cpython-314.pyc b/scripts/__pycache__/capture_csv.cpython-314.pyc index 341e123b9ac186cfbdb4d63d864ef08120df3965..5150bf84ef0521a9c9e441505f7dd2f25e675b10 100644 GIT binary patch delta 1196 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 HYw`aBV+73^ delta 6745 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[\d.]+)C\s+" r"heatlim=(?P\d+)%\s+" r"heater=(?P[\d.]+)%\s+" - r"fan=(?P\d+)(?P\([^)]*\))?\s+" + r"htop=(?P\S+)\s+" + r"hblk=(?P\S+)\s+" + r"ssr=(?Pon|off)\s+" + r"fan=(?P\S+)\s+" r"cutoff=(?P\S+)\s+" r"failsafe=(?P\S+)\s+" - r"mode=(?P\S+)\s+" - r"sensors=\[(?P.*)\]" + r"mode=(?P.+?)\s+sensors=\[(?P.*)\]" ) SENSOR_RE = re.compile(r"ch(\d+):([\d.]+)C/(\d+)%|ch(\d+):ERR") @@ -60,6 +62,9 @@ class DryerState: spread: str = "—" heatlim: str = "—" heater: str = "—" + htop: str = "—" + hblk: str = "—" + ssr: str = "—" fan: str = "—" fan_note: str = "" cutoff_active: str = "no" @@ -91,7 +96,6 @@ def parse_status(line: str) -> dict | None: else: sensors.append((m.group(1), m.group(2), m.group(3))) data["sensor_list"] = sensors - data["fan_note"] = data.get("fan_note") or "" return data @@ -116,8 +120,14 @@ def apply_status(state: DryerState, data: dict) -> None: state.spread = data["spread"] state.heatlim = data["heatlim"] state.heater = data["heater"] - state.fan = data["fan"] - state.fan_note = data["fan_note"] + state.htop = data["htop"].removesuffix("C") if data["htop"].endswith("C") else data["htop"] + state.hblk = data["hblk"] + state.ssr = data["ssr"] + fan_raw = data["fan"] + state.fan = fan_raw + state.fan_note = "" + if fan_raw.endswith("(off)") or fan_raw.endswith("(cooldown)") or " TEST" in fan_raw: + state.fan_note = fan_raw[fan_raw.find("(") :] if "(" in fan_raw else "" state.cutoff_active = data["cutoff_active"] state.failsafe = data["failsafe"] state.mode = data["mode"] @@ -206,6 +216,10 @@ class SerialWorker: apply_status(self.state, parsed) continue + if line.startswith("target="): + self._note("WARN: could not parse status line") + continue + if line.startswith("OK") or line.startswith("ERR") or line.startswith("WARN"): self._note(line) @@ -324,8 +338,16 @@ def _draw_dashboard(stdscr, state: DryerState) -> None: _safe_addstr(stdscr, row, 2, f"Avg: {state.avg} °C Min: {state.min_temp} °C Max: {state.max_temp} °C Spread: {state.spread} °C") row += 1 - fan_text = f"{state.fan} %{state.fan_note}" - _safe_addstr(stdscr, row, 2, f"Heater: {state.heater} % Fan: {fan_text} Limit: {state.heatlim} %") + fan_text = state.fan if state.fan_note == "" else state.fan + _safe_addstr( + stdscr, + row, + 2, + f"Heater: {state.heater} % SSR: {state.ssr} Fan: {fan_text} Limit: {state.heatlim} %", + ) + + row += 1 + _safe_addstr(stdscr, row, 2, f"Heat stop: {state.htop} °C Block: {state.hblk}") row += 2 _draw_box(stdscr, row, 1, 5, width - 2, "Sensors") @@ -403,6 +425,9 @@ def _curses_main(stdscr, ser, log_dir: Path, auto_log_on: bool) -> int: spread=state.spread, heatlim=state.heatlim, heater=state.heater, + htop=state.htop, + hblk=state.hblk, + ssr=state.ssr, fan=state.fan, fan_note=state.fan_note, cutoff_active=state.cutoff_active,