Relative targets for beer profile?


#1

I’m brewing a Belgian tripel, starting from a nice and cold 63F, and intend to ramp to get full attenuation. I set a ramp of temps to bring to 75F after 14 days. But I’m expecting the yeast to kick strong upfront, getting me a good chunk of the way. I want to let the yeast control the beer temp, or at least not crimp their style with unneeded chilling. To achieve this, I have disabled the cooling function entirely by removing the cooling function in device configuration, leaving only the heater enabled.

It would be a nice feature to be able to set this in the beer profile, rather than go to the hardware settings to disable the cooling. Not sure where in the forum this would be best posted. I think the ideal would be to be able to set a range of temps during certain periods of the ferment (cool if out of bounds), then after X days to add Y degrees from last recorded temp (or ramp to Y absolute as final) for the next Z days and hold. Essentially making dynamic temp profiles, rather than 100% locked in temps.

Thoughts?


#2

My idea to implement this was a profile with upper and lower bounds, if the temperature is between them, no actuator action.

That would be easy to understand and implement.


#3

One place I can see this falling down is many profiles for belgians with free-rises I’ve seen say something like “free rise to XdegC then hold for x days”. Upper and lower bounds could allow the temp to start to drop again. Or, if the temp isn’t at X when a steady step is reached, the immediate transition to X could thermally shock your yeast. I think bounds is a good idea. But I think they should allow one or both of the following:-

  • Bound until x is reached, then hold
  • Bound with different min & max values at start and end. This could be used to force a convergence on temp X. Identical bounds at start and end for a completely free rise/fall could just be a special case of the same implementation.

In addition, several Belgian recipes I have used specify to hold until the SG reaches 1.xxx then remp to temp X. The ability to describe “when condition is met, jump to next step” would be very powerful. In an ideal world, this should be possible on any step with any conditions. Use cases including:-

  • Temp reaches X
  • Temp has been at X +/- Y for Zmins
  • SG reaches 1.xxx
  • SG has been at 1.xxx +/- Y for Z mins
  • Filtered rate of change of SG has dropped to X points per hour AND SG is above 1.xxx (This would be particularly useful for preventing stalls)
  • Boil time passed is X and kettle volume is <Y (This would be useful for accounting for boil-off variations. A better version could predict the remaining boil time to hit the target volume and adjust hop drops & total boil time by actually calculating the L/m boil-off on-the-fly)

I wouldn’t expect some of these more complicated use cases to be available strait away. But making sure the various frameworks are there to support them in future would be fantastic. Defining process control steps (e.g. a temp ramp, a wait until a hop drop, etc) as plugin-like blocks of code could go a long way to achieving this.


#4

As a first quick to implement version I was thinking like a double profile, a min and max. If one of them is exceeded, the setpoint is active. You can let the two lines convert or change the profile halfway manually to adjust for gravity readings.

Bringing in gravity makes the whole thing a lot more complicated, but I do want to experiment with gravity based temp control. For example you could even set a minimum fermentation speed in SG points per day. If it starts to drop below a minimum, the temperature is raised to help.

The framework can handle these scenarios, but the control blocks to drive them will be built sometime in 2019.

We are currently also working on step based process control and step transitions can be manual or conditional. We are doing this mostly for mashing but it can also be applied to fermentation to handle some of the scenarios you describe.


#5

Fanstastic, @Elco. Thanks!