The previous hotfix's disconnect()-on-comm-error path can now fire during server/brewpi.py's own final best-effort hardware-release cleanup (finally: block's heater.close()/stirrer.activate(False)), which runs after the event loop has already stopped - previously nothing about hardware teardown touched an AttributeChange-tracked field, so this path was dormant. asyncio.create_task() there raises RuntimeError: no running event loop, crashing the shutdown sequence. Adds fire_and_forget() (tasks/task.py) - asyncio.create_task() that silently drops the message instead of raising when there's no loop to schedule on - and uses it for the Connected/FirmwareVersion broadcasts. SudTask.check_connections() also now no-ops entirely without a running loop, since self.sud.stop() cascades into further unguarded create_task() calls (on_state_changed, heater_task.shutdown(), ...) that a stopped loop can't help with anyway. Reproduced and verified fixed directly against HeaterTask/HeaterHendi with no event loop running (mirrors the exact server/brewpi.py shutdown-time call path that crashed on the brewpi Pi). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YaPLuRPpyjWcwhMvCvpHCL
10 lines
351 B
Python
10 lines
351 B
Python
from tasks.task import ATask, TaskManager, fire_and_forget
|
|
from tasks.tempsensor import TempSensorTask
|
|
from tasks.heater import HeaterTask
|
|
from tasks.stirrer import StirrerTask
|
|
from tasks.pot import PotTask
|
|
from tasks.tempctrl import TcTask
|
|
from tasks.sud import SudTask
|
|
from tasks.server_log import ServerLogTask
|
|
from tasks.sud_log import SudLogTask
|