BruControl: Brewery control & automation software

Homebrew Talk - Beer, Wine, Mead, & Cider Brewing Discussion Forum

Help Support Homebrew Talk - Beer, Wine, Mead, & Cider Brewing Discussion Forum:

This site may earn a commission from merchant affiliate links, including eBay, Amazon, and others.
Has anyone tried to integrate an iSpindle with Brucontrol? I know nothing about how they work except that they're basically a wifi, DIY equivalent of a Tilt. Being wifi I've got no idea whether Brucontrol would be able to talk to them or not.

Yes, with the data exchange. Use NodeRed or similar to act as the intermediate step. While not plug and play, it's not that difficult.
 
Already sent an e-mail, but thought I would ask here as well. Anyone have an issue where all of a sudden BruControl states it is not licensed? When trying to activate it thinks it is installed on multiple computers, however it is the same laptop that I have always used and has not been re-imaged.
 
OK so I have recently come into possession of my Grand Central UniShield (thanks again Pete). I am getting started on the installation and I have a few questions. I do need to spend some more time fleshing out some things on my own but I thought I would ask those who have one, for perhaps, a few pointers. I am running the controller with the v45E Ethernet Grand Central firmware.

1.) I am struggling a bit trying to understand which controller pin is routed to which driver output/pin connector. I get the VA, VB, 1, 2, and D, P aspect (that is quite clear) but to which pin does say VD 12:2P/D correspond to? On the board itself there is silk screening that has D46 next to this portion of the connector. The problem is that the BruControl pin 46 does NOT seem to control this. For some reason, BruControl pin 23 is controlling this output. What am I missing?

I can confirm hat the pins directly on the controller are indeed working as expected according to the proper BC interface wiring map. So I guess I need help with the relay board connector mapping.

2.) To get the Ethernet shield (seeed studio W5500) to function I also had to turn off switch 5 (pin 7 base). Should this be the case? This was only required (to maintain Ethernet shield functionality) after I have connected the RP-3 RTD platform board via the UniShield riser board MISO, MOSI, and CLK connections. As a carry over from a previous installation, I did bend out of the way the Ethernet shield SCL and SDA pins so that they do not connect to anything. Should I still be doing this with the UniShield.
 
Last edited:
1. We made the base board to be generic... meaning the pins are not directly associated to the interface pins, becuase if we put on a different interface (different riser board), then that would go out of whack. So you need to check the interface wiring map for the links. That said, I am realizing we didn't publish an updated one for the GC version... so please sue the MEGA version. Therefore, if you check it, you would see that pin 12:2 is tied to pin/port 23. Sorry! We'll get the GC version updated.

2. Yes, you would turn off Pin 7 -> base because the ethernet shield needs to use that pin on the GC. I don't think you should bend the SCL and SDA pins out of the way - those should have no effect.
 
Oh man, that is a useful column to have in the wiring map! I should have checked the 2560. I understand the generic aspect, that makes sense now that I have the decoder ring! Thanks for the help on that.
 
Last edited:
It's about time I posted an update on recent activities in the ole brew shoppe. Since changing my CCS RTDs for some better-quality Auber sensors, and finally settling down to write some useful scripts, I've run (as of yesterday) four brews through my rig. The first brew was an oatmeal stout, and as was typical of my brewing, I missed my target gravity by about .010 SG. I also had a few missteps in the script, which were easily fixed. I was now confident that there was nothing in my process that was causing the low gravity issue. I was pretty comfortable that the problem was in my crush.

I bit a good-sized bullet and ordered the SS Brewtech grain mill and two Tilts. Without gushing, I will say that I am utterly convinced that it was money well spent. The next brew was my Alaskan Amber clone, and I got closer to design numbers than I had ever gotten before. Mashing temp was dead stable right where I wanted it, mashing out and sparging was painless, and the fermentation was dead stable. I was actually .005 SG over on the pre-boil gravity, but finished out at .004 under. Mash efficiency was 80.9% and I got 84.3% attenuation. I patched another thing or two in the script.

Brew number three was my cucumber-basil lager. By now, I was feeling a lot more comfortable with the script, and my process has been getting smoother and smoother. I now have my deadspace and equipment losses dialed in pretty well. The lager OG was 0.001 SG over my target. I kegged it after 53 days of lagering. Without a doubt, it's the palest, clearest beer I've ever produced. The basil flavor is front and center, which is what I was aiming for. It's a great beer for closing out a day of heavy yard work out in the hot Florida sun.

Yeaterday, I brewed a session IPA. I was fortunate to have the benefit of some high-quality supervision from @BrunDog. Despite his best efforts, the brew still went without a hitch. He did offer some comments on a couple of things I could do differently with my script to reduce the total brew time. I'll be incorporating those into the script and will try them on the next brew. This one missed my target OG by 0.002 SG, which (to me) is well within an acceptable margin. After less than 24 hours in fermentation, it has already dropped from 1.054 to 1.041 and is bubbling merrily away. The dry hop will go in as soon as primary fermentation tapers off.

So...Where am I, really? I'm exactly where I'd hoped to be when I started looking at moving away from my cut down keg and Igloo cooler driveway rig. I have a brewery that is so consistent and predictable that I can now change one variable in a recipe and evaluate the difference in the final product. My recipes are now coming out exactly as I'd designed them. The quality of my product rivals the best beers produced by regional craft breweries and beats most of my local brewpubs.

There are still some things left to do. Volume measurement capability would eliminate a large number of manual steps, as would valve-controlled kettle filling. I'd also like to add a secondary wort chiller to get me to pitching temp a lot faster. I have an early version of @BrunDog's UniShield with a Grand Central in it, so sometime later this year the control box will undergo a major refit. I'll be able to ditch a bunch of CCS relays. If I can get some hardware together between now and then, I might add volume measurement.

What I mostly am is tickled pink about how well my system performs, and how much the combination of the microcontroller and the script-controlled automation has helped my beer get better and better.

So, while hoisting a glass in your general direction, I'd like to say "Thanks, @BrunDog."

- - - - -
-pic 1: Fermentation graph for the lager. Note how well the slope followed the target.
-pic 2: Current screenshot of the fermentation/dispensation workspace
 

Attachments

  • Image 4-27-20 at 7.22 PM.jpg
    Image 4-27-20 at 7.22 PM.jpg
    23 KB · Views: 43
  • Screen Shot 2020-05-10 at 8.13.13 PM.png
    Screen Shot 2020-05-10 at 8.13.13 PM.png
    492.7 KB · Views: 42
Last edited:
Despite my best efforts, you definitely had everything "boringly" under contol! No moments where I could sit back and direct as you scurry about to fix a mistake - there weren't any. Because... automation.

Thank you for the company, entertainment, and free samples. I will say, and this is most definitely a biased plug, but your beers were legit - much better than I thought you were capable of 😜. Seriously though... all three styles were definitely better than most commercial samples I've had, even taprooms on-site some well respected breweries. Glad to see it all coming together!
 
I am hoping someone has some insight into a strange problem I am having with analog inputs. I recently received a Grand Central based UniShield that I have been getting wired up in my enclosure. Everything is working properly except for analog inputs A8-A15. Analog inputs A0-A7 work as expected but A8-A15 all act the same in that they report no input voltage at all. I can take the same 3.3v reference source and take it to all the analog inputs and A0-A7 work properly and report as expected, while A8-A15 do not report any input voltage. The interesting thing is that A0-A7 are on one screw terminal port on the UniShield riser board and A8-A15 are all on another. I have tested with the shield pins instead of the riser board with no difference. I am using an Ethernet shield for communications and it is loaded with firmware v.45H. What is it that I am missing here? Does the UniShield have a pin setup that could result in this phenomenon or is there something in the firmware causing this? Or is it that the controller is wonky? I do have a spare grand central controller to try but I would rather get better insight all of this before just tossing it in to perhaps get damaged.

Update: I have done a bunch of testing to help locate the potential problem. I have tested the UniShield with a RobotDyn Ethernet equipped MEGA 2560 and all the analog inputs work as expected. I also tried my spare Grand Central unit which was still running a previous version firmware version from May/June 2019 and it to showed no activity on the analog inputs A8-A15 just as did the other GC controller. After this iterative testing, it appears that the UniShield is working properly and not part of the issue here, the MEGA 2560 based UniShield works as expected but two Grand Central controllers do not. All this testing was in the same enclosure, with the same analog reference source, same grounding, UniShield in a unique manner.

Update II: I also tested the GC in serial mode all by itself and the same holds true where analog inputs A0-A7 work as expected but A8-A15 show no response at all. It seems clear there is something not correct in the GC firmware with regards to analog inputs A8-A15. I guess I should have reread my past posts from last year as the firmware for the GC had this error in it back in June of 2019 and it appears to have persisted. The same applies for the wiring map for the GC not being accurate for many of the PWM outputs as many of those still do not work as well. These are problems in the BC firmware. I'm just surprised that no one is using the GC controller, at least enough of the I/O to encounter these problems and then get enough momentum in place to get these errors fixed.
 
Last edited:
Yes, sounds like a FW issue. Sit tight if you can... we will test and see what's going on.

Edit: Just confirmed. We'll get it fixed asap. Sorry you did all that testing - we probably could have saved you that work if I saw your post sooner!
 
Yes, sounds like a FW issue. Sit tight if you can... we will test and see what's going on.

Edit: Just confirmed. We'll get it fixed asap. Sorry you did all that testing - we probably could have saved you that work if I saw your post sooner!

Yeah, I am a persistent type that won't stop until I fix something or figure out well enough that I can't, so no worries on that testing. I can sit tight and move on to other things. I can still finish off the wiring now that I know those analog inputs are no longer sort of not available.
 
Yes, sounds like a FW issue. Sit tight if you can... we will test and see what's going on.

Edit: Just confirmed. We'll get it fixed asap. Sorry you did all that testing - we probably could have saved you that work if I saw your post sooner!
Quick question. The Grand Central has two independent MSPS DACs on board at pins A0 and A1 that can directly output analog voltages (albeit only 0-3.3V). It is 10-bit I think. Is there any way to get a true analog out device element and have it assigned to the A0 and A1 pins of the GC in its wire map? It might be useful to be able to output two analog signals straight up without the need for a low pass filter.
 
Last edited:
This brings up a good question or 2. Where the heck is this big release with a database backend? But on another note, will there be some documentation on this database, so people can extract data from it outside of BruControl?
 
I am trying to script a hysteresis device (when active ) to illuminate a global LED configured with boolean variable. In other words, when hysteresis output is active Id like an LED indicator to say its active. My attempt is below, perhaps there is an easier way to achieve this?

HLT RAMP is the hysteresis device
HLT E1 is a global which is set for boolean

[Loop]
if "HLT RAMP" value == active
"HLT E1" value = true
else
"HLT E1" value = false
endif
sleep 1000
goto "Loop"
 
I'm not near my system right now to verify this, but try 'state' instead.

Edit: I found a script and I had used value == 0 or 1 with a hysteresis device
 
Last edited:
Thanks guys I'll give that a shot.

Any of you guys using multiple alarms (or single) throughout the boil for hop additions etc? How are you acheiving setting different times as recipe changes? My thoughts were to have an array of globals set to time format, a script would reference the globals to trigger a common alarm.
 
Yep, I bring in all the hop times from Beersmith via the data exchange. Node Red makes sure they are ordered correctly, then they are loaded into globals 1-6etc. Since they are in order I just start a timer counting down and alarm when it gets to the next time in the list. I can send you how I do it if you'd like... script isn't pretty, but its functional.
 
Yep, I bring in all the hop times from Beersmith via the data exchange. Node Red makes sure they are ordered correctly, then they are loaded into globals 1-6etc. Since they are in order I just start a timer counting down and alarm when it gets to the next time in the list. I can send you how I do it if you'd like... script isn't pretty, but its functional.
I'd love to see what you have. Also would like to learn more about the data exchange with Beersmith. I guess step 1 is download Node Red, purchase the BC with data exchange and go from there? Could I achieve basic import fairly quickly with a limited understanding of coding?
 
You can set this up without the data exchange, just manually enter the times in the correct order.

Setup is as follows.

"Boil Timer" is a timer counting down
"BrewStatus" is a global string
"Continue" is a button
"Hop Addition" is an alarm
Status is an in script variable string (holds the previous brewstatus so I can change back dynamically after the hop alarm)
"X Hop Amount" is a global string
"X Hop Time" is a global time
"Hop Variety X" is a global string

Multiple hops at the same time still work due to the <= operator.

The script is started/stopped by my main brew script.

Code:
[setup]
new string Status

[HopAlarms]
wait "Boil Timer" Value <= "First Hop Time" Value
Status = "BrewStatus" Value
"Hop Addition" Active = True
"BrewStatus" Value = "First Hop Amount" Value + " - "
"BrewStatus" Value = "BrewStatus" Value + "Hop Variety 1" Value
"Continue" State = false
wait "Continue" State == true 90000
"Hop Addition" Active = False
"BrewStatus" Value = Status

wait "Boil Timer" Value <= "Second Hop Time" Value
Status = "BrewStatus" Value
"Hop Addition" Active = True
"BrewStatus" Value = "Second Hop Amount" Value + " - "
"BrewStatus" Value = "BrewStatus" Value + "Hop Variety 2" Value
"Continue" State = false
wait "Continue" State == true 90000
"Hop Addition" Active = False
"BrewStatus" Value = Status

wait "Boil Timer" Value <= "Third Hop Time" Value
Status = "BrewStatus" Value
"Hop Addition" Active = True
"BrewStatus" Value = "Third Hop Amount" Value + " - "
"BrewStatus" Value = "BrewStatus" Value + "Hop Variety 3" Value
"Continue" State = false
wait "Continue" State == true 90000
"Hop Addition" Active = False
"BrewStatus" Value = Status

wait "Boil Timer" Value <= "Fourth Hop Time" Value
Status = "BrewStatus" Value
"Hop Addition" Active = True
"BrewStatus" Value = "Fourth Hop Amount" Value + " - "
"BrewStatus" Value = "BrewStatus" Value + "Hop Variety 4" Value
"Continue" State = false
wait "Continue" State == true 90000
"Hop Addition" Active = False
"BrewStatus" Value = Status

wait "Boil Timer" Value <= "Fifth Hop Time" Value
Status = "BrewStatus" Value
"Hop Addition" Active = True
"BrewStatus" Value = "Fifth Hop Amount" Value + " - "
"BrewStatus" Value = "BrewStatus" Value + "Hop Variety 5" Value
"Continue" State = false
wait "Continue" State == true 90000
"Hop Addition" Active = False
"BrewStatus" Value = Status

wait "Boil Timer" Value <= "Sixth Hop Time" Value
Status = "BrewStatus" Value
"Hop Addition" Active = True
"BrewStatus" Value = "Sixth Hop Amount" Value + " - "
"BrewStatus" Value = "BrewStatus" Value + "Hop Variety 6" Value
"Continue" State = false
wait "Continue" State == true 90000
"Hop Addition" Active = False
"BrewStatus" Value = Status

wait "Boil Timer" Value <= "Seventh Hop Time" Value
Status = "BrewStatus" Value
"Hop Addition" Active = True
"BrewStatus" Value = "Seventh Hop Amount" Value + " - "
"BrewStatus" Value = "BrewStatus" Value + "Hop Variety 7" Value
"Continue" State = false
wait "Continue" State == true 90000
"Hop Addition" Active = False
"BrewStatus" Value = Status

wait "Boil Timer" Value <= "Eighth Hop Time" Value
Status = "BrewStatus" Value
"Hop Addition" Active = True
"BrewStatus" Value = "Eighth Hop Amount" Value + " - "
"BrewStatus" Value = "BrewStatus" Value + "Hop Variety 8" Value
"Continue" State = false
wait "Continue" State == true 90000
"Hop Addition" Active = False
"BrewStatus" Value = Status

"Hop Addition" Active = False
stop "Hop Alarm"
 
I'd love to see what you have. Also would like to learn more about the data exchange with Beersmith. I guess step 1 is download Node Red, purchase the BC with data exchange and go from there? Could I achieve basic import fairly quickly with a limited understanding of coding?

To get Node Red up and running for this, you will need a flow/code for this. Luckily, @RiverCityBrewer helped me out by sending the flow that he and @Die_Beerery created. Once you import the flow you need to:

Install xml2json node (google can help here)
change location to pickup exported beersmith recipe file
change IP address for BruControl data exchange server
Add the associated global variables to BruControl

The flow will import over 130 variables to BruControl. You can create global variables for just the ones you want and ignore the rest.
 
To get Node Red up and running for this, you will need a flow/code for this. Luckily, @RiverCityBrewer helped me out by sending the flow that he and @Die_Beerery created. Once you import the flow you need to:

Install xml2json node (google can help here)
change location to pickup exported beersmith recipe file
change IP address for BruControl data exchange server
Add the associated global variables to BruControl

The flow will import over 130 variables to BruControl. You can create global variables for just the ones you want and ignore the rest.
Thankyou for the primer. I'll work on the above and I'm sure I'll have questions in the next few weeks
 
Can you explain what's going on in these lines?

Is this the data from Beersmith?
Yes, the data all comes in from Beersmith.

In those two lines, I'm concatenating a string of the amount of hops and the type. Since we can't do inline math, I have to stretch it into two lines. Once concatenated, the "BrewStatus" value (which is displayed on my main brewing screen), would say something like "2oz - Saaz" when the alarm goes off.
 
Yes, the data all comes in from Beersmith.

In those two lines, I'm concatenating a string of the amount of hops and the type. Since we can't do inline math, I have to stretch it into two lines. Once concatenated, the "BrewStatus" value (which is displayed on my main brewing screen), would say something like "2oz - Saaz" when the alarm goes off.
Do you mind sharing the Node red flow/code @crane is talking about?
 
Back
Top