Hot off the success of the MK III, I decided to press my engineering hubris further and further. Seeing no sun to melt my Icarian wings, I sat down to make my next adjustments to brew-bot. But, I did not seek to make small, viable changes that I could iterate upon. No, dear reader, I was drunk on the sweet nectar of power, and decided to tackle recipe generation based on observation.
I spent the next few hours hacking, and I do mean hacking, together a shoddy website scraper that could parse BeerXML. After a few well-deserved, HTTP 429: Too Many Requests filling my recipe data, I throttled my haphazard device and set it loose to scrape as many Märzen recipes as I could find to normalize down into a generic one.
For those who have no idea what the prior paragraph said, let me break it down step-by-step:
- There is a computer-legible file format for storing beer recipes called BeerXML, and I wrote a program to translate those recipes into data brew-bot could understand.
- I’m an intrinsically bad person, so I hastily made a program to download that data as quickly as I could and got temporarily restricted from a few sites for sending too many requests too quickly.
- I eventually got all of the data I asked for, averaged it, and used it as input into brew-bot to generate a recipe that was as similar as possible to the aggregate of the recipes I had downloaded.
- This could be considered a rookie move as a programmer, because data experiments like this are chock-full of hidden complexities and pitfalls. Additionally, they’re very hard to work backwards from and analyze the general behavior of.
- Knowing 4, I went ahead and did this anyway.
Now that we’re (hopefully) on the same page, let me explain why I chose the style I did. While it was a seasonal variety, that didn’t guide my choice at all. Knowing that I’d run into a series of technical hurdles, I wanted a simple, straightforward recipe so I could work out the issues along the way. Additionally, since I was going to be normalizing unfamiliar data for the first time, I wanted a dataset that’d be relatively clean. Thanks to Reinheitsgebot, or the (in)famous German Beer Purity Laws, I hoped a traditional German style would have the data attributes I wanted.
So, after some serious number crunching, I was granted this recipe:
- 3.25 lbs 2-row
- 2.0 lbs Munich Malt
- 3.3 lbs Pilsner Liquid Extract
- Omega Yeast OYL-107: Oktoberfest
- 0.25 oz Tettnang (60 minutes)
- 0.25 oz Perle (30 minutes)
- 0.25 oz Perle (10 minutes)
- 0.50 oz Perle (5 minutes)
And now comes the part I struggled with: leaving the recipe alone.
I’m not joking. Every impulse in my body told me to tweak the recipe, to add a wild touch of something, to make the recipe not a textbook recipe; however, I truly did want to test my application, and so, I decided to be faithful to the wiles of probability. The brew tested my self-restraint, but I made it through a vanilla brewing day just fine. Even though I felt uncomfortable making something so raw and plain, I let my experience guide me directly into the next hurdle.
As I prepared to pitch the yeast, I read the back of the package to determine where Dariusz and I would be leaving our thermostat for the next few weeks. It was in that moment I learned brew-bot had selected a lager yeast, and, with no equipment to lager a beer, I’d have to find an alternative solution quickly.
At this point, I’d be remiss to withhold a few fun facts about water, especially the water at our apartment.
- Our building’s water heater does its job well, and our hot tap water is almost mashable at 140 degrees Fahrenheit.
- Our cold water is also aptly named, and, in the winter months, is frigid enough that we have to run a thin stream of water nearly 24/7, lest our pipes burst.
- Water has an insanely high specific heat, which is why it takes so long to boil/freeze.
- Out bathtub holds enough water that, if someone were to place a brewing bucket in it, they’d cover 70+% of the height of said bucket.
With no other options, I submerged my sealed fermentation bucket into our bathtub, and set off an unusual addition to my morning routine.