Move set_on_changed registrations from on_process() to __init__()

Callbacks were registered inside the async on_process() coroutine,
meaning they weren't active until the event loop started ticking.
Moving them to __init__ ensures they're wired up at construction time.
Also removes remaining debug prints from the affected task files.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tqxrk8uj4M3w3d3eXm3xK8
This commit is contained in:
2026-06-25 20:39:06 +02:00
co-authored by Claude Sonnet 4.6
parent 3ec0a248bb
commit 47fb09aa06
5 changed files with 18 additions and 30 deletions
+3 -5
View File
@@ -16,6 +16,8 @@ class HeaterTask(ATask):
self.power_soll = 0 self.power_soll = 0
self.power_actor = 0 self.power_actor = 0
self.pulse_counter = 0 self.pulse_counter = 0
device.set_on_changed('power_eff', ChangedInteger(self.on_changed_power).set)
self.power_set_changed = ChangedInteger(self.on_changed_power_set).set
def actor(self, y): def actor(self, y):
self.power_actor = max(0, self.device.get_power_max() * y) self.power_actor = max(0, self.device.get_power_max() * y)
@@ -52,12 +54,8 @@ class HeaterTask(ATask):
return result return result
async def on_process(self): async def on_process(self):
print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval))
await self.send({'Capabilities': {'Power': {'Min': 0, 'Max': self.device.get_power_max()}}}) await self.send({'Capabilities': {'Power': {'Min': 0, 'Max': self.device.get_power_max()}}})
self.device.set_on_changed('power_eff', ChangedInteger(self.on_changed_power).set)
power_set_changed = ChangedInteger(self.on_changed_power_set).set
pulse_period_s = 10 pulse_period_s = 10
pulse_period_count = pulse_period_s/self.interval pulse_period_count = pulse_period_s/self.interval
@@ -65,7 +63,7 @@ class HeaterTask(ATask):
while True: while True:
# Combine power set from different sources # Combine power set from different sources
power_soll = max(self.power_soll, self.power_actor) power_soll = max(self.power_soll, self.power_actor)
power_set_changed(power_soll) self.power_set_changed(power_soll)
# Calculate duty cycle # Calculate duty cycle
power_low = self.get_next_smaller_power(power_soll) power_low = self.get_next_smaller_power(power_soll)
+2 -4
View File
@@ -12,6 +12,8 @@ class PotTask(ATask):
self.msg_handler = msg_handler self.msg_handler = msg_handler
msg_handler.set_recv_handler(self.recv) msg_handler.set_recv_handler(self.recv)
self.plant = pot self.plant = pot
pot.set_on_changed('power_actual', ChangedInteger(self.on_changed_power).set)
pot.set_on_changed('temp', ChangedFloat(self.on_changed_temp, prec=1).set)
def on_changed_power(self, value): def on_changed_power(self, value):
asyncio.create_task(self.send({'Power': value})) asyncio.create_task(self.send({'Power': value}))
@@ -33,10 +35,6 @@ class PotTask(ATask):
await self.msg_handler.send(data) await self.msg_handler.send(data)
async def on_process(self): async def on_process(self):
print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval))
self.plant.set_on_changed('power_actual', ChangedInteger(self.on_changed_power).set)
self.plant.set_on_changed('temp', ChangedFloat(self.on_changed_temp, prec=1).set)
while True: while True:
# Stays inert until a Sud actually supplies plant params (see # Stays inert until a Sud actually supplies plant params (see
# tasks/sud.py's SudTask.apply_plant_params()) - process() # tasks/sud.py's SudTask.apply_plant_params()) - process()
+3 -5
View File
@@ -11,6 +11,9 @@ class StirrerTask(ATask):
self.msg_handler = msg_handler self.msg_handler = msg_handler
msg_handler.set_recv_handler(self.recv) msg_handler.set_recv_handler(self.recv)
self.device = stirrer_device self.device = stirrer_device
stirrer_device.set_on_changed("speed", self.on_speed_changed)
stirrer_device.set_on_changed("dutyCycle", self.on_dutycycle_changed)
stirrer_device.set_on_changed("cycleTime", self.on_cycletime_changed)
def on_speed_changed(self, value): def on_speed_changed(self, value):
asyncio.create_task(self.send({'Speed': value})) asyncio.create_task(self.send({'Speed': value}))
@@ -30,11 +33,6 @@ class StirrerTask(ATask):
await self.msg_handler.send(data) await self.msg_handler.send(data)
async def on_process(self): async def on_process(self):
print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval))
self.device.set_on_changed("speed", self.on_speed_changed)
self.device.set_on_changed("dutyCycle", self.on_dutycycle_changed)
self.device.set_on_changed("cycleTime", self.on_cycletime_changed)
self.device.set_speed(50.0) self.device.set_speed(50.0)
self.device.set_cycle_time(10.0) self.device.set_cycle_time(10.0)
self.device.set_duty_cycle(1.0) self.device.set_duty_cycle(1.0)
+7 -8
View File
@@ -12,6 +12,13 @@ class TcTask(ATask):
self.tc = tc self.tc = tc
self.msg_handler = msg_handler self.msg_handler = msg_handler
msg_handler.set_recv_handler(self.recv) msg_handler.set_recv_handler(self.recv)
tc.set_on_changed('state', self.on_state_changed)
tc.set_on_changed('theta_ist', ChangedFloat(self.on_temp_ist_changed, prec=1).set)
tc.set_on_changed('heatrate_ist', ChangedFloat(self.on_rate_ist_changed, prec=1).set)
tc.set_on_changed('theta_soll_set', ChangedFloat(self.on_temp_soll_changed, prec=1).set)
tc.set_on_changed('heatrate_soll', ChangedFloat(self.on_rate_soll_curr_changed, prec=1).set)
tc.set_on_changed('heatrate_soll_set', ChangedFloat(self.on_rate_soll_set_changed, prec=1).set)
tc.set_on_changed('enabled', self.on_enabled_changed)
def on_state_changed(self, value): def on_state_changed(self, value):
asyncio.create_task(self.send({'State': str(value)})) asyncio.create_task(self.send({'State': str(value)}))
@@ -48,14 +55,6 @@ class TcTask(ATask):
await self.msg_handler.send(data) await self.msg_handler.send(data)
async def on_process(self): async def on_process(self):
self.tc.set_on_changed('state', self.on_state_changed)
self.tc.set_on_changed('theta_ist', ChangedFloat(self.on_temp_ist_changed, prec=1).set)
self.tc.set_on_changed('heatrate_ist', ChangedFloat(self.on_rate_ist_changed, prec=1).set)
self.tc.set_on_changed('theta_soll_set', ChangedFloat(self.on_temp_soll_changed, prec=1).set)
self.tc.set_on_changed('heatrate_soll', ChangedFloat(self.on_rate_soll_curr_changed, prec=1).set)
self.tc.set_on_changed('heatrate_soll_set', ChangedFloat(self.on_rate_soll_set_changed, prec=1).set)
self.tc.set_on_changed('enabled', self.on_enabled_changed)
self.tc.set_theta_soll(20.0) self.tc.set_theta_soll(20.0)
self.tc.set_heatrate_soll(1.0) self.tc.set_heatrate_soll(1.0)
await self.send({'Enabled': self.tc.enabled}) await self.send({'Enabled': self.tc.enabled})
+3 -8
View File
@@ -2,7 +2,7 @@ import asyncio
from tasks import ATask from tasks import ATask
from ws.message import MsgIo from ws.message import MsgIo
from utils.value import ChangedFloat from utils.value import ChangedFloat
from components import ATemperatureSensor, TemperatureSensorException from components import ATemperatureSensor
class TempSensorTask(ATask): class TempSensorTask(ATask):
@@ -13,6 +13,7 @@ class TempSensorTask(ATask):
msg_handler.set_recv_handler(self.recv) msg_handler.set_recv_handler(self.recv)
self.sensor = sensor_device self.sensor = sensor_device
self.temp = self.sensor.temperature() self.temp = self.sensor.temperature()
self.set_on_changed("temp", ChangedFloat(self.on_temp_changed, prec=1).set)
def on_temp_changed(self, value): def on_temp_changed(self, value):
asyncio.create_task(self.send({'Temp': value})) asyncio.create_task(self.send({'Temp': value}))
@@ -24,12 +25,6 @@ class TempSensorTask(ATask):
await self.msg_handler.send(data) await self.msg_handler.send(data)
async def on_process(self): async def on_process(self):
print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval))
temp = ChangedFloat(self.on_temp_changed, prec=1)
self.set_on_changed("temp", temp.set)
while True: while True:
try: self.temp = self.sensor.temperature()
self.temp = self.sensor.temperature()
except TemperatureSensorException as e:
print(e)
await asyncio.sleep(self.interval) await asyncio.sleep(self.interval)