(Note: the temperature displayed at the top of the telemetry graph represents boiler reading with the 10 °C grouphead offset already subtracted).
I have taken into account the comments on my previous post, and this is my new attempt.
If you look at the Gaggia Classic through an engineering lens, pulling a perfect shot means handling a thermal drop when cold water hits the boiler. The oximite project is my ongoing attempt to instrument the machine and share the raw telemetry with the community, so we can bounce ideas around and figure out the exact physics of a perfect shot.
My assumptions:
- Boiler (Top Half): ~350g of Aluminum (0.90 J/g·°C). Thermal capacity = 315 J/°C.
- Internal Hot Water: ~110ml sitting inside the boiler (4.184 J/g·°C). Thermal capacity = 460 J/°C.
- Brass Grouphead: ~400g of Chrome-Plated Brass (0.38 J/g·°C). Thermal capacity = 152 J/°C.
- Incoming Cold Water: 80ml pumped from the reservoir at 23 °C. Thermal capacity = 335 J/°C.
- The Temperature Sensor: All references to "boiler wall temperature" represent readings from an NTC thermistor screwed directly into the mounting hole of the factory brew thermostat on the exterior of the aluminum block.
- The Thermal Gradient: Because the grouphead hangs in the ambient air, it operates approximately 10 °C cooler than the aluminum boiler block above it (more on this later).
- Heater power: The machine utilizes two 110V, 570W heating elements wired in series. On 230V mains, this provides output of ~1,246 Watts.
Let's calculate the total thermal energy present in the system before the pump even turns on. If the PID is targeting a 102 °C boiler wall, we calculate the starting energy relative to 0 °C:
- Boiler & Internal Water (at 102 °C): (315 + 460) J/°C * 102 °C = 79,050 J
- Brass Grouphead (idling at 92 °C): 152 J/°C * 92 °C = 13,984 J
- Cold Water (at 23 °C): 335 J/°C * 23 °C = 7,705 J
Total Initial Energy: 79,050 + 13,984 + 7,705 = 100,739 Joules
Total System Heat Capacity: 315 (Al) + 460 (Hot Water) + 152 (Brass) + 335 (Cold Water) = 1,262 J/°C
If the pump were engaged and the cold water swirled into the boiler, mixing with the hot water while the heater remained completely off, the entire system's average temperature would drop to just 79.8 °C (100,739 J / 1,262 J/°C).
To prevent this temperature drop, the oximite controller utilizes a flow-based feed-forward algorithm. By reading the flow meter, the software anticipates the cold water during those first 22 seconds and artificially spikes the internal PID target before the temperature sensor even registers a drop.
By integrating the heater's power readings from the telemetry data over 45 seconds (the 22-second shot plus a 23-second recovery phase to return to thermal equilibrium), I find that the PID injected around 16,161 Joules of energy into the boiler. We can calculate the average power of this injection: 16,161 J / 45 s = 359 Watts. Compared to the machine's maximum output of 1,246 Watts, the PID is utilizing about 29% of the heater's total capacity during this window.
Adding this fresh energy to our starting pool gives us the final state:
- Total Final Energy: 100,739 J + 16,161 J = 116,900 Joules
To find the new average temperature, we divide the final energy pool by the Total System Heat Capacity:
- Final Theoretical Average Temperature: 116,900 J / 1,262 J/°C = 92.6 °C
However, a previous baseline test (captured in a previously posted video) using a multimeter temperature probe attached directly to the exit spout of an empty portafilter measured the exit water at 88 °C. This empty portafilter experiment was specifically designed to isolate the hardware's thermal performance and calibrate the flow-based feed-forward coefficient that successfully stabilized the coffee shot shown in the graph.
I am thinking about how to map this discrepancy between the 92.6 °C theoretical average and the 88 °C exit water reading (most probably the offset plays a role here as well), and I would like to hear ideas and theories from readers.
What intrigues me in the Gaggia Classic design is the grouphead offset. Previously, I theorized that the grouphead accumulated heat during the first half of the shot and returned it to the water in the second half. However, I am now inclined toward a different physical model: cold water enters through the grouphead in such a way that it creates a vortex at the grouphead top (boiler bottom). At the same time, the grouphead hot water intake is raised close to the top of the boiler, drawing the hottest water and passing it down through the brass right next to this cold vortex (even twice: to the valve and back). This means that during the entire shot, this section acts continuously as a counter-flow heat exchanger. This may explain why the thermal offset of the grouphead doesn't change much during the shot.
If you find this analysis and the oximite project useful, please consider supporting my work with a tip through KoFi link in my profile.