feat: re-add per-run sud log alongside the continuous server log

SudLogTask reuses ServerLogTask's sample format but only records while
a Sud run is active: starts on Play (fresh start only, not a Pause
resume) and writes logs/log_{date_time}_{sud_name}.log on Stop or
natural completion.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TvgC7oy9MxaA4ZQxXqkNdS
This commit is contained in:
2026-07-01 09:06:39 +02:00
co-authored by Claude Sonnet 5
parent 0736f76ca3
commit 0b2a2be035
4 changed files with 81 additions and 18 deletions
+22 -12
View File
@@ -34,24 +34,34 @@ class ServerLogTask(ATask):
async def on_process(self):
while True:
power_set = max(self.heater_task.power_soll, self.heater_task.power_actor)
self._samples.append({
't': time.monotonic() - self._t0,
'timestamp': time.time(),
'temp_ist': self.tc.theta_ist,
'temp_soll': self.tc.theta_soll_set,
'rate_ist': self.tc.heatrate_ist,
'rate_soll': self.tc.heatrate_soll,
'power_set': power_set,
'power_eff': self.heater.power_eff,
})
if self._should_sample():
self._samples.append(self._take_sample())
await asyncio.sleep(self.interval)
def _should_sample(self):
return True
def _take_sample(self):
power_set = max(self.heater_task.power_soll, self.heater_task.power_actor)
return {
't': time.monotonic() - self._t0,
'timestamp': time.time(),
'temp_ist': self.tc.theta_ist,
'temp_soll': self.tc.theta_soll_set,
'rate_ist': self.tc.heatrate_ist,
'rate_soll': self.tc.heatrate_soll,
'power_set': power_set,
'power_eff': self.heater.power_eff,
}
def _filename(self):
return 'log_{}.json'.format(self._run_id)
def write(self):
if not self._samples:
return
os.makedirs(self.path, exist_ok=True)
filename = 'log_{}.json'.format(self._run_id)
filename = self._filename()
path = os.path.join(self.path, filename)
log_data = {'Name': ''}
if self.dt is not None: