Ada’s WaterBot

If you’ve stopped by our store recently, you may have noticed this new contraption behind our counter. In the pursuit of brewing the best coffee for our customers, we’ve built a system to improve the water we use for brewing. The water here in Seattle is amazing for drinking, but turns out to not be optimal for brewing coffee. Not all water is created equal and coffee requires water that’s well balanced in minerals, acidity, and hardness to bring out it’s full potential. Much of this has been outlined by the SCAA and there’s some outstanding research and a great (out of print) book on the subject, “Water for Coffee” by Maxwell Colonna-Dashwood and Christopher H. Hendon if you wish to fully venture down the rabbit hole.

The bottom line is that Seattle’s amazing water is too clean. Using the chart below as reference, we typically get somewhere between 30-50ppm in Seattle water, and your brew water should really be in the 70-150ppm range. So we set out to create a system to automatically add minerals to our cafe’s brew water in a precise and tuneable way. First, we start out by running our water through a basic off the shelf 3-stage carbon filtration system just to remove any sediment, chlorine, and other off tastes and odors in the city water.

From there we feed the water to a solenoid valve so that we can control the refill of our mixing tank. After that, we run it through an in-line TDS sensor so we can get a rough idea of how clean the water is coming into the system. 

For our mixing tank, we managed to get a really good deal from a surplus lab supply store on a Chemglass 15L spinner flask and accessories. The benefit of using a spinner flask is that they’re built with a flat bottom which allows use of a magnetic stirring setup, and with the proper attachments allows you to create a fully closed system to prevent external contaminants from getting into the water. In order to get our water piped into the mixing tank and pull it out with a wide enough dip tube, we modified a thermowell assembly to make use of the ⅜” thermowell tube port as our water outlet, the ¼” tube port as our water inlet, and the other shorter ¼” port as our air filter port to allow air pressure inside the chamber to stabilize as the water level changes.

On the other side, for injecting minerals, we used a standard 3-port assembly that connected to the ends of gravity feed bags that we use for holding our mineral solutions. The reason for using the gravity feed bags is that they’re inexpensive, disposable, safe for food use, and most importantly, can be fully sealed and not have air pressure issues as the solutions become depleted. To control how much of each solution is injected, we use peristaltic pumps in-line for each of the 3 solutions. We’ve experimented with various strengths for the mineral solutions and settled on 5% being a reasonable amount that works well with the pumps and so far hasn’t caused any issues and doesn’t have to be refilled too frequently.

Finally, the only remaining part is that we need to know is how much water is in the tank. To sense the water level in the tank, we use 2 non-contact liquid level sensors that are positioned currently between the 10L and 15L marks on the tank. When the water gets down to 10L, we open up the solenoid valve to add water to the tank and stop it when it reaches 15L, and then add the appropriate amount of minerals for the 5L that was added.

To connect up all of our coffee brewing equipment and espresso machine to the system we used a Shurflo 2088 Delivery Pump and 5.5 Gallon Bladder Tank to stabilize the pressure to our equipment and built in a bypass so we can switch back over to city water in case our system needs to be serviced or modified in the future. We also connected a TDS sensor on the output so we can see the approximate TDS of our brew water coming out of the system.

Finally, to actually control the whole system, we hooked everything up to an Arduino Uno with an AdaFruit MotorShield and Adafruit LCD Shield and wrote software to let us specify the exact ppm of each mineral we want in our brew water. We’ve posted the code up on github in case you want to try to build something similar at your cafe. This is definitely a work in progress and we’re constantly refining the system in our cafe. We hope to sometime in the near future release a product that makes it easy for other cafe’s to mineralize their water as well, so stay tuned for updates!

Ada’s KyotoBot

We love to experiment with coffee brewing and roasting methods and we’re constantly looking to the scientific method to ask ourselves “What makes a certain parameter or method better than another?” The only way to fully test these hypotheses is to setup controlled experiments where we keep certain parameters constant and vary a parameter to determine its effect on the end product. To this end, we’ve realized that certain parameters in some brewing methods are very imprecise and often times we don’t have clear visibility of what’s actually happening throughout the brew and, therefore, we don’t have an accurate method for controlling it.

If you’ve been in Ada’s Technical Books and Cafe or Ada’s Discovery, you’ll most likely have noticed the OJI WD-300 cold drip towers that we have on display. These towers are popular in cafes in Japan and specifically the Kyoto/Kansai region (thus the term Kyoto-style cold brew was coined) for making cold brewed coffee. This style of brewing coffee has become more popular in the US and is often seen as having a cleaner taste compared to the more common Toddy method which involves steeping the grounds in water instead of having water slowly drip through.

The basic idea behind the cold drip tower is that you have cold water on the top which slowly drips through the grounds creating cold brewed coffee at the bottom. The main variables that you can adjust to effect the brew are:

  1. Grind Size
  2. Brew Ratio (Water to Coffee)
  3. Temperature of Water
  4. Water over time (Total duration, flow rate, etc)

Typical parameters are a coarser grind size, a concentrated brew ratio, room temp or colder water (with ice), and around 1-2 seconds per drop. The first 3 parameters we could easily control, but the 4th was a bit of a mystery. Many cold drip systems are gravity fed and have a small knob that you adjust to dial in the specific amount of seconds between drops but often times, we would return to the tower hours later to find it dripping at an entirely different speed. Also, the total brew time would not be consistent because the drip speed wasn’t reliable without constantly checking and adjusting the tower. Even if you could get the tower to drip reliably, it’s time consuming and tedious to dial in the exact drip rate that you want. Visiting other cafe’s, David noticed many times that their cold drip towers would be setup properly but dripping well slower than 2 seconds per drop because the baristas were busy attending to other things. Something obviously needed to happen to address this issue and make it something that could be measured and easily adjusted.

To solve this problem, David custom designed some solenoid valves so that they were super quiet while operating. Solenoid valves are typically used for high speed photography of water droplets, but they also widely used in the food and medical industries for regulating flow of liquids. We specifically designed 12V valves so that we could easily control it from an Adafruit Motor Shield connected to an Arduino Uno with a 12V wall wart power supply. For display and control purposes we also hooked up an Adafruit RGB LCD shield. We then wrote code to control the size of the droplets (amount of time the solenoid is open) and the amount of time in-between each of the drops. After a little while it became apparent that all solenoids aren’t created equal, and that each had a slightly different flow rate based on imperfections with their construction. Additionally, based on gravity, if both were open at the same time, water would flow more out of one than the other if it wasn’t completely level. To solve these issues we had the code alternate between dripping on the left side and right side so there would be only one flow path and we added code to calibrate the size of the droplets so they were the same on both side by measuring the weight of 100 drops and then adjusting the size of the drops until both sides were equal and producing drops of a certain weight. Needless to say, the 4th parameter is under control now. All code for this project and future posts can be found on Github.


  • #8 Grind on the Mahlkonig EK-43 Grinder
  • 100g dose on each side
  • 1500g room temp brew water per side (3000g total) in top
  • Bloom with 200g boiling water on each side
  • Paper filter on top of rounded grounds to disperse water
  • 2 seconds per drop, total brew time ~12 hours
  • Result should be ~1.3% TDS and ~20-21% extraction

The overall philosophy with our coffee program is that there is a meaningful amount of finesse and art that can and should be expressed by a skilled and experienced barista, but any way we can use technology and science to help them provide the best quality result is something we should do. Especially with the recent resurgence of hand brewing methods being favored over automatic brewing — this is particularly where we hope to find improvements. That being said, we believe there is an extent to which technology can help. Ultimately, the barista’s job is to interpret and adjust the parameters into something that tastes great, and a robot or algorithm can help us get close but will never be able to fully interpret and enjoy the results like a human can. Until next time, happy coffee hacking!