Files
brewpi/tasks/sud_log.py
T
jensandClaude Sonnet 5 0e60860cf0 feat: periodically checkpoint server/sud logs to disk
Both loggers previously only wrote their JSON log on their end trigger
(shutdown / Stop-or-DONE), losing the whole session/run's data on a
hard crash or power loss. Add a log_interval (config.json, default
300s) that rewrites the same file whole every N seconds in between.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TvgC7oy9MxaA4ZQxXqkNdS
2026-07-01 09:44:11 +02:00

44 lines
1.3 KiB
Python

import time
from tasks.server_log import ServerLogTask
from components import APid, AHeater
def _safe_filename_part(text):
return "".join(c if c.isalnum() or c in "-_" else "_" for c in text) or "Sud"
class SudLogTask(ServerLogTask):
"""Records temp/power samples for a single Sud run - same sample format
as ServerLogTask, but only while a run is active: recording starts on
Play and is written out on Stop (or natural completion), to
logs/log_{date_time}_{sud_name}.log. A Pause/resume doesn't start a new
file - only a fresh Play (from IDLE/DONE) does."""
def __init__(self, tc: APid, heater: AHeater, heater_task, sud, interval, path='./logs', config=None, dt=None, log_interval=None):
ServerLogTask.__init__(self, tc, heater, heater_task, interval, path, config, dt, log_interval)
self.sud = sud
self._active = False
def _should_sample(self):
return self._active
def _filename(self):
name_part = _safe_filename_part(self.sud.name or 'Sud')
return 'log_{}_{}.log'.format(self._run_id, name_part)
def start_run(self):
if self._active:
return
self._samples = []
self._t0 = time.monotonic()
self._last_write = self._t0
self._run_id = time.strftime("%Y%m%dT%H%M%S", time.localtime())
self._active = True
def stop_run(self):
if not self._active:
return
self._active = False
self.write()
self._param_events = []