Remove TracerTask

Its brewpi.mat output had no consumer - the GUI never subscribed to the
'Tracer' channel, and SudLogTask's run-scoped JSON logs now cover the same
sensor/heater/tc data for actual analysis. Drop the task, its DT_TASK_TRACER
interval, and the wiring in server/brewpi.py.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DkkuG48uHFCGKe6dPSERFk
This commit is contained in:
2026-06-22 18:03:48 +02:00
co-authored by Claude Sonnet 4.6
parent 6c50a819fc
commit e0bd3acc26
4 changed files with 5 additions and 77 deletions
+1 -5
View File
@@ -13,7 +13,7 @@ from components.plant import Pot
from components.actor import HeaterFactory, StirrerFactory
from components.sud import Sud
from components.sud_forecast import SudForecastEstimator
from tasks import TaskManager, TempSensorTask, HeaterTask, PotTask, TcTask, StirrerTask, TracerTask, SudTask, SudLogTask
from tasks import TaskManager, TempSensorTask, HeaterTask, PotTask, TcTask, StirrerTask, SudTask, SudLogTask
import argparse as ap
@@ -67,7 +67,6 @@ if __name__ == '__main__':
DT = config['Controller']['dt']
DT_TASK = 1.0 / config['Controller']['sim_warp_factor']
DT_TASK_TRACER = DT_TASK / DT
theta_amb = config['ambient_temperature']
plant_sim = "sim" in config['Controller']['plant_name']
@@ -111,9 +110,6 @@ if __name__ == '__main__':
# tasks/sud_log.py.
taskmgr.add(SudLogTask(sud, tc, heater, heater_task, sud_task, DT_TASK))
# Tracer
taskmgr.add(TracerTask(sensor, heater, tc, DT_TASK_TRACER, dispatcher.msgio_get("Tracer")))
# Assign data flow
# Assign tc control value to heater
tc.set_on_changed("y", heater_task.actor)
-1
View File
@@ -4,6 +4,5 @@ from tasks.heater import *
from tasks.stirrer import *
from tasks.pot import *
from tasks.tempctrl import *
from tasks.tracer import *
from tasks.sud import *
from tasks.sud_log import *
+4 -3
View File
@@ -21,9 +21,10 @@ class SudLogTask(ATask):
power_eff - see client/brewpi_gui.py's PlotCanvas.sample()), plus
the forecast curve it's compared against (tasks/sud.py's SudTask.
forecast_t/forecast_theta), for the whole duration of a Sud run -
for later offline analysis. One pair of JSON files per run, not the
ever-growing, continuously-rewritten .mat tasks/tracer.py's
TracerTask already produces independently of any Sud run.
for later offline analysis. One pair of JSON files per run, scoped
to that run alone - unlike a continuously-rewritten trace file that
keeps growing independently of whether a Sud run is even in
progress.
A fresh, uniquely-named pair of logs starts the moment a run
actually starts (Sud.state leaves IDLE/DONE) and is written out
-68
View File
@@ -1,68 +0,0 @@
import time
import asyncio
from tasks import ATask
from ws.message import MsgIo
from components import ATemperatureSensor
from components import AHeater
from components import APid
import numpy as np
import scipy.io
import os
class TracerTask(ATask):
def __init__(self, sensor: ATemperatureSensor, heater: AHeater, temp_ctrl: APid, interval, msg_handler: MsgIo, path= './logs'):
ATask.__init__(self, interval)
if not os.path.exists(path):
os.makedirs(path)
self.msg_handler = msg_handler
msg_handler.set_recv_handler(self.recv)
self.sensor = sensor
self.heater = heater
self.temp_ctrl = temp_ctrl
self.path = path
async def recv(self, data):
pass
async def send(self, data):
await self.msg_handler.send(data)
async def on_process(self):
print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval))
timestamp = 0
_timestamp = np.empty(0)
_sensor_temp = np.empty(0)
_heater_power = np.empty(0)
_tc_temp_ist = np.empty(0)
_tc_dtemp_ist = np.empty(0)
_tc_temp_soll = np.empty(0)
_tc_dtemp_soll = np.empty(0)
_tc_dtemp_commanded = np.empty(0)
name = 'brewpi'
filename = os.path.join(self.path, '') + name + ".mat"
filename_full = os.path.join(self.path, '') + name + "." + time.strftime("%Y%m%d%H%M%S", time.localtime()) + ".mat"
while True:
_timestamp = np.append(_timestamp, timestamp)
_sensor_temp = np.append(_sensor_temp, self.sensor.temperature())
_heater_power = np.append(_heater_power, self.heater.get_power())
_tc_temp_ist = np.append(_tc_temp_ist, self.temp_ctrl.theta_ist)
_tc_dtemp_ist = np.append(_tc_dtemp_ist, max(-1, self.temp_ctrl.heatrate_ist))
_tc_temp_soll = np.append(_tc_temp_soll, self.temp_ctrl.theta_soll_set)
_tc_dtemp_soll = np.append(_tc_dtemp_soll, self.temp_ctrl.heatrate_soll_set)
_tc_dtemp_commanded = np.append(_tc_dtemp_commanded, self.temp_ctrl.heatrate_soll)
data = {'time': _timestamp, 'sensor_temp': _sensor_temp, 'heater_power': _heater_power, 'tc_temp_ist': _tc_temp_ist, 'tc_dtemp_ist': _tc_dtemp_ist, 'tc_temp_soll': _tc_temp_soll, 'tc_dtemp_soll': _tc_dtemp_soll, 'tc_dtemp_commanded': _tc_dtemp_commanded}
scipy.io.savemat(filename, data)
scipy.io.savemat(filename_full, data)
timestamp += 1
await asyncio.sleep(self.interval)