A comm-error/timeout-triggered disconnect left power_soll/power_actor (heater) or speed (stirrer) untouched, so a later reconnect - or the closed-loop TC, which keeps computing y regardless of connection state - could immediately resume driving the device at whatever it was doing before the outage. HeaterTask.disconnect()/StirrerTask.disconnect() now centralize disconnect + zero-setpoint and are used for the explicit Disconnect message, the per-tick comm-error path, and the outer unexpected-error recovery path alike. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EU3NTwLygh8jkrnqPoHNXF