• Please visit and share your knowledge at our sister communities:
  • If you have not, please join our official Homebrewing Facebook Group!

    Homebrewing Facebook Group

BruControl: Brewery control & automation software

Homebrew Talk

Help Support Homebrew Talk:

This site may earn a commission from merchant affiliate links, including eBay, Amazon, and others.
Hmm, it seems I _still_ came across as ungrateful, which I’m not. I appreciate work done etc etc. best sw I have ever saw.
Many things were "promised" to me, just to switch to Brucontrol in direct communication but never happened, so I feel I have the right to be slightly disappointed.
I also understand if someone INVESTED 🥳

Also signing off from the topic, nothing more to add.

Cheers
 
Last edited:
Years ago, I had written an MS Access databasae program in VBA for a friend of mine to manage his payphone business. I then "leased" the program for a yearly fee to several companies. Once the business was no longer profitable or worth my time, I sent all the users a forever password. I am not sure if some or still using that program or not, but I hope @BrunDog does something like that.

I have pushed the limits of BruControl and it has some issues that I wished were fixed (mostly the global local database issues and better memory control) , but generally the program can do anything I want it to.
 
Years ago, I had written an MS Access databasae program in VBA for a friend of mine to manage his payphone business. I then "leased" the program for a yearly fee to several companies. Once the business was no longer profitable or worth my time, I sent all the users a forever password. I am not sure if some or still using that program or not, but I hope @BrunDog does something like that.

I have pushed the limits of BruControl and it has some issues that I wished were fixed (mostly the global local database issues and better memory control) , but generally the program can do anything I want it to.
Same here.

In terms of the last part, yeah, when people ask me about it, I describe it as so nicely open-ended and customizable that I could run water sprinklers with it if I wanted
 
Same here.

In terms of the last part, yeah, when people ask me about it, I describe it as so nicely open-ended and customizable that I could run water sprinklers with it if I wanted
My program could do any commissions for any “ widget”. It had tax reports, client reports and all kinds of things that did not need to be a pay phone. It did have a few things that we specific to a pay phone, but that dealt more with being able to import, sorta like the node red “interface” between BruControl and Beer Smith.

You could easily make BruControl do lots of things that have nothing to do with brewing!
 
anyone have any thoughts on ESP32 going dark regularly? I have in on a external USB din-rail power brick powered by 24vdc.
1743706588620.png
 
anyone have any thoughts on ESP32 going dark regularly? I have in on a external USB din-rail power brick powered by 24vdc. View attachment 872415
I've had issues with my 4-relay ESP32 boards doing that at times, but those are powered by 110v (board has stepdowns, of course). For me, it seemed like power flow issues since the relays run the same 110v series (so solenoid flies open or shut quickly, adding a jolt to the current), so not sure if that would be similar to your case.

My work around was to plug my ESP32 boards into a smart plug (running Tasmota). I added a timer in BC that starts when an element shows as disconnected/dropped. Once it hits a minute, a script turns on an alert global, which my Node-RED picks up. From there, it toggles the smart plug off and on. When the system comes back online, a script resets the timer.
 
My work around was to plug my ESP32 boards into a smart plug (running Tasmota). I added a timer in BC that starts when an element shows as disconnected/dropped. Once it hits a minute, a script turns on an alert global, which my Node-RED picks up. From there, it toggles the smart plug off and on. When the system comes back online, a script resets the timer.

Thanks! I don't have node-red running, so will try to get a script only in BC since I do have a SonOff smart plug somewhere that I flashed and BruControl sees.
 
Oh, nice idea. BC can manage the Sonoff's relay for your controller. Hopefully, it doesn't face the same issue, but my initial Sonoffs never gave issues like that.

Also, having an ESP control an ESP....
1000017611.jpg
 
@CDCTx
I thought I was out-of-hand with multiple Unitanks - SsBrewtech and BrewBuilt
But I see you added a Spike to your collection! LMAO
I like the BrewBuilt the best, no doubt.
I should make a YouTube video testing them all, hah.

The SS is intended for an impending single-vessel solera project (it'sa half-barrel). There was a good deal from a local guy getting out of the hobby.

I started with the 14g Brewbuilt and loved it but wished I had more ports. I then got the Spike 14g for that reason. Brewbuilt then started adding more ports, hah. I would have gotten the X3, but the cooling jacket is only good if you brew the batch sizes for it, and I mostly do 5 gal. 7gal X2 for Christmas it was!
 
I should make a YouTube video testing them all, hah.

The SS is intended for an impending single-vessel solera project (it'sa half-barrel). There was a good deal from a local guy getting out of the hobby.

I started with the 14g Brewbuilt and loved it but wished I had more ports. I then got the Spike 14g for that reason. Brewbuilt then started adding more ports, hah. I would have gotten the X3, but the cooling jacket is only good if you brew the batch sizes for it, and I mostly do 5 gal. 7gal X2 for Christmas it was!
You got me thinking now.... I will take the really long cooling coil from the SS-14G and mount it on top of the BrewBuilt X3-14G and see if it will reach down deep enough for a 5-7 gallon batch. When the Hellez Lager is done in the X3 and the Strong Bitter is done in the Ss-14G......
I do LOVE the huge 3" port on the bottom of the BBuilt, with the sight glass/yeast collection vessel. The tank funnels trub, cold break, and yeast, down very efficiently and fast.
 
Is the Arduino Nano ESP32 compatible with Brucontrol? I wasn't sure if the ESP32 firmware would apply to this board or not? When i try to run the interface setup, it doesn't list any firmware options to select.

Thanks.
 
anyone have any thoughts on ESP32 going dark regularly? I have in on a external USB din-rail power brick powered by 24vdc. View attachment 872415
I've had a bunch of these issues and usually it was because my router changed the IP address of the device for some reason I haven't been able to figure out (was set for static IP). I've updated the IP in Brucontrol and voila, it works again! Before that, I had issues with a crappy mesh router and it would simply not hold the signal. Switched to TPlink Omada system and much better!
 
Is the Arduino Nano ESP32 compatible with Brucontrol? I wasn't sure if the ESP32 firmware would apply to this board or not? When i try to run the interface setup, it doesn't list any firmware options to select.

Thanks.
Looks like it runs ESP32-S3, which sadly won't work at this time. I keep hoping we'll get ESP32-S3 and -C3 support at some point, as the S3 is powerful and flexible.
 
yes, with the S3, hoping for support of one of the relay boards so I can run 24vdc, ex antenna, and onboard relays for less than $50. (unsure if the rs-485 implementation can be bypassed for SPI Sensors.) https://www.amazon.com/Waveshare-Industrial-6-Channel-Interfaces-Expanding/dp/B0D14SLHGD
Oh! I bought one of these already. Figured if I went with my own control software project, this would be my go-to board (I have other Waveshare boards, including their touchscreens; good stuff). But if we see an update to BC with S3 support....game changer. I know BrunDog was playing with the S3 because of the expanded pin support.
 
I made a mistake with my OneDrive and inadvertently deleted a my data file and some other things. I copied the files back from a backup I had and now Brucontrol is crashing and closing at least once per day. It didn't use to crash at all. So, a couple of questions:

1. If I decide to uninstall and do a fresh install of Brucontrol -- what is absolutely essential to ensure I keep all my scripts and other programming details? I do not want to lose any of this.
2. Are there other things I should check as to why it might be crashing? Long shot here, but thought I'd ask anyway
3. I noticed my data files is >5GB. Are there obvious things to reduce this file size?

Thanks so much.
 
I made a mistake with my OneDrive and inadvertently deleted a my data file and some other things. I copied the files back from a backup I had and now Brucontrol is crashing and closing at least once per day. It didn't use to crash at all. So, a couple of questions:

1. If I decide to uninstall and do a fresh install of Brucontrol -- what is absolutely essential to ensure I keep all my scripts and other programming details? I do not want to lose any of this.
2. Are there other things I should check as to why it might be crashing? Long shot here, but thought I'd ask anyway
3. I noticed my data files is >5GB. Are there obvious things to reduce this file size?

Thanks so much.
First and foremost is keep your brucfg file. Normally, that is default.brucfg, but if you have other profiles set up, then save those. Keep the Config Backup folder in case you need to revert to a saved config when BC last acted right.
 
First and foremost is keep your brucfg file. Normally, that is default.brucfg, but if you have other profiles set up, then save those. Keep the Config Backup folder in case you need to revert to a saved config when BC last acted right.
Thanks. Does that keep the scripts? Didn't look like it when i opened the file. Are the scripts only kept in the .mdf file?
 
Scripts should be in it. Open the file and search for a piece of your code (perhaps a endif statement). If it isn't in default.bruconfg, check other brucfg files. Depends what profile you have set in BC settings.

Can always copy and paste the scripts into a file, but that can be a pain, hah
 
I made a mistake with my OneDrive and inadvertently deleted a my data file and some other things. I copied the files back from a backup I had and now Brucontrol is crashing and closing at least once per day. It didn't use to crash at all. So, a couple of questions:

1. If I decide to uninstall and do a fresh install of Brucontrol -- what is absolutely essential to ensure I keep all my scripts and other programming details? I do not want to lose any of this.
2. Are there other things I should check as to why it might be crashing? Long shot here, but thought I'd ask anyway
3. I noticed my data files is >5GB. Are there obvious things to reduce this file size?

Thanks so much.
I simply do not use the local data as the data base gets too big in a hurry and does cause issues with BruControl. The file you need for your Devices and scripts is normally in your C:/Documents/BruControl folder. It has a name that ends in .brucfg.

You may have more than one file in the folder than ends in .brucfg, but you only use one.

The name of the file you are using can be found in BruControl.

1. Open BruControl
2. Unlock the Workspace (it may be so already).
3. Go to Settings
4. Go to Configuration
5. The file name is in the Active slot.

You should make a copy of this file. I make several. I put one on a thumb drive and another in my dropbox. I do this monthly.

That is the file that has all your Scripts, Timers, Elements and Workspaces.
 
If you are using default.brucfg, rename it to something meaningful to you. When you install BruControl, it will try to create a default.brucfg. I do not think it would overwrite yours, but better safe than sorry.

If you renamed it to WesternBrewery.brucfg, then you would select that in the Active slot of the configuration.
 
Thanks. Does that keep the scripts? Didn't look like it when i opened the file. Are the scripts only kept in the .mdf file?
An .mdf file is a standard Microsoft Database file that holds data FROM your globals. It has nothing else in it except instances of those global values transferred from BruControl to the .mdf file. It is a one way steet. Data from a BruControl Global to the mdf file.

As an example. if you have a Global Element that copies a Mash Temperature Element ( you can do that with a Script), the value of that Global (and all your Global Elements) to the mdf file. Again. it only goes one way, from BruControl to the mdf file, If you delete an .mdf file, it has zero effect on the BruControl file (.brucfg)

I do not know how often a Global is "wrote" to the .mdf file, but it could be every clock cycle. Over a peroid of time, the .mdf file can get huge (and that does cause issues with BruControl). Promised in a new update, the ability to block a specific Global, and the ability to set how often a global is "read" was in the works.

I personally wish there was a new Element for the Data. Generally, I only might want to keep track of a Mash Temperature that was "read" every minute. I would like to keep track of a Fermentation temperature, but only once an hour (or even longer). If there was a Data Element, I might want to track the SG of a Tilt. Other users may want to keep track of other things, but generally, the items you want to track are very limited.

I have set up (with great help from @RiverCityBrewer ) a lot of Globals to import a BeerSmith3 recipe. I have not counted how many globals are associated with this process, but certainly around a hundred. I have no need to track them. Once I import them, they are static. But they are constantly "read" to the mdf file. Because I have so many globals (maybe over 200), the Database functionality of BruControl is useless to me.

I think I could write a node-red flow to keep track of the items I wanted and may do that. I would output to a csv file where it could be opened in Excel or a Google Sheet. I do not install the local db files associated with the .mdf so I do not have any .mdf files.
 
Last edited:
First, I want to acknowlege @RiverCityBrewer who greatly helped me getting Node Red up and running.

A Node-red flow to create a .csv file of a mash temp with time every minute.

The global element I used was named DX_gblV_Mash_Temp_DE

In addition, I have a folder
C:\BruControl\NodeRedData

To run this, you must have professional License, the Data Exchange enabled under settings, Node-Red installed and Running, and the flow in the local host on the same computer as BruControl.

This will create a simple .csv file which needs to be renamed after each Mash to a different name as this flow will create the file if it does not exist, but will simply append to the file if it does.

This flow could likely be improved as it is my first shot, but I think it would suit my needs.

The Flow:

[
{
"id": "c68aff04e20ee551",
"type": "tab",
"label": "Mash Temperature",
"disabled": false,
"info": "",
"env": []
},
{
"id": "17b429a9678c0b7c",
"type": "inject",
"z": "c68aff04e20ee551",
"name": "Start Mash Temperture",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "60",
"crontab": "",
"once": true,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 190,
"y": 80,
"wires": [
[
"3c74d78c0e3b11dc"
]
]
},
{
"id": "3c74d78c0e3b11dc",
"type": "http request",
"z": "c68aff04e20ee551",
"name": "Connect to BruControl",
"method": "GET",
"ret": "txt",
"paytoqs": "ignore",
"url": "http://127.0.0.1:8000/globals",
"tls": "",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType": "",
"senderr": false,
"headers": [],
"x": 420,
"y": 140,
"wires": [
[
"1e10d705ed8387aa"
]
]
},
{
"id": "034ac9778088f6fa",
"type": "function",
"z": "c68aff04e20ee551",
"name": "Get and Pass Mash Temp",
"func": "var arr = msg.payload; //arr for array\nvar Mash_Temp;\nvar Mash_Data;\nvar bcGlobals;\n\n//The following lines rearranges the array into a standard JSON key/value pair via a string and then makes it an object.\nbcGlobals = '{' + arr.map(function (elem) {\n return '\"' + elem.Name + '\":\"' + elem.Value + '\"';\n}).join(\",\");\nbcGlobals = bcGlobals + '}';\nbcGlobals = JSON.parse(bcGlobals);\n\n\nMash_Temp = bcGlobals['DX_gblV_Mash_Temp_DE']; //Sets Mash_Temp to the value of the BC global based on the global name. Change the name accordingly.\nnode.warn(new Date() +Mash_Temp); //Shows the value in the debug pane.\n\nmsg.payload = (new Date() + Mash_Temp); //Sets msg.payload to the DX_gblV_Mash_Temp_DE value so it can carry forward.\n\n\nreturn msg;\n\nreturn msg; //Returns the message, meaning msg.payload moves forward with the new value.",
"outputs": 1,
"timeout": "",
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 830,
"y": 280,
"wires": [
[
"bd321ddfc458903d",
"63caa0e376233921"
]
]
},
{
"id": "1e10d705ed8387aa",
"type": "json",
"z": "c68aff04e20ee551",
"name": "Convert JSON String to Object",
"property": "payload",
"action": "",
"pretty": false,
"x": 710,
"y": 140,
"wires": [
[
"034ac9778088f6fa"
]
]
},
{
"id": "bd321ddfc458903d",
"type": "debug",
"z": "c68aff04e20ee551",
"name": "Show Mash Temps",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1250,
"y": 280,
"wires": []
},
{
"id": "63caa0e376233921",
"type": "csv",
"z": "c68aff04e20ee551",
"name": "",
"sep": ",",
"hdrin": "",
"hdrout": "none",
"multi": "one",
"ret": "\\r\\n",
"temp": "Mash Temperture",
"skip": "0",
"strings": true,
"include_empty_strings": "",
"include_null_values": "",
"x": 1030,
"y": 440,
"wires": [
[
"aa477984d42a05fa"
]
]
},
{
"id": "aa477984d42a05fa",
"type": "file",
"z": "c68aff04e20ee551",
"name": "Write CSV File",
"filename": "C:\\BruControl\\NodeRedData\\MashTemperature.csv",
"filenameType": "str",
"appendNewline": true,
"createDir": false,
"overwriteFile": "false",
"encoding": "none",
"x": 1180,
"y": 440,
"wires": [
[]
]
}
]
 
First, I want to acknowlege @RiverCityBrewer who greatly helped me getting Node Red up and running.

A Node-red flow to create a .csv file of a mash temp with time every minute.

The global element I used was named DX_gblV_Mash_Temp_DE

In addition, I have a folder
C:\BruControl\NodeRedData

To run this, you must have professional License, the Data Exchange enabled under settings, Node-Red installed and Running, and the flow in the local host on the same computer as BruControl.

This will create a simple .csv file which needs to be renamed after each Mash to a different name as this flow will create the file if it does not exist, but will simply append to the file if it does.

This flow could likely be improved as it is my first shot, but I think it would suit my needs.

The Flow:

[
{
"id": "c68aff04e20ee551",
"type": "tab",
"label": "Mash Temperature",
"disabled": false,
"info": "",
"env": []
},
{
"id": "17b429a9678c0b7c",
"type": "inject",
"z": "c68aff04e20ee551",
"name": "Start Mash Temperture",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "60",
"crontab": "",
"once": true,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 190,
"y": 80,
"wires": [
[
"3c74d78c0e3b11dc"
]
]
},
{
"id": "3c74d78c0e3b11dc",
"type": "http request",
"z": "c68aff04e20ee551",
"name": "Connect to BruControl",
"method": "GET",
"ret": "txt",
"paytoqs": "ignore",
"url": "http://127.0.0.1:8000/globals",
"tls": "",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType": "",
"senderr": false,
"headers": [],
"x": 420,
"y": 140,
"wires": [
[
"1e10d705ed8387aa"
]
]
},
{
"id": "034ac9778088f6fa",
"type": "function",
"z": "c68aff04e20ee551",
"name": "Get and Pass Mash Temp",
"func": "var arr = msg.payload; //arr for array\nvar Mash_Temp;\nvar Mash_Data;\nvar bcGlobals;\n\n//The following lines rearranges the array into a standard JSON key/value pair via a string and then makes it an object.\nbcGlobals = '{' + arr.map(function (elem) {\n return '\"' + elem.Name + '\":\"' + elem.Value + '\"';\n}).join(\",\");\nbcGlobals = bcGlobals + '}';\nbcGlobals = JSON.parse(bcGlobals);\n\n\nMash_Temp = bcGlobals['DX_gblV_Mash_Temp_DE']; //Sets Mash_Temp to the value of the BC global based on the global name. Change the name accordingly.\nnode.warn(new Date() +Mash_Temp); //Shows the value in the debug pane.\n\nmsg.payload = (new Date() + Mash_Temp); //Sets msg.payload to the DX_gblV_Mash_Temp_DE value so it can carry forward.\n\n\nreturn msg;\n\nreturn msg; //Returns the message, meaning msg.payload moves forward with the new value.",
"outputs": 1,
"timeout": "",
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 830,
"y": 280,
"wires": [
[
"bd321ddfc458903d",
"63caa0e376233921"
]
]
},
{
"id": "1e10d705ed8387aa",
"type": "json",
"z": "c68aff04e20ee551",
"name": "Convert JSON String to Object",
"property": "payload",
"action": "",
"pretty": false,
"x": 710,
"y": 140,
"wires": [
[
"034ac9778088f6fa"
]
]
},
{
"id": "bd321ddfc458903d",
"type": "debug",
"z": "c68aff04e20ee551",
"name": "Show Mash Temps",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1250,
"y": 280,
"wires": []
},
{
"id": "63caa0e376233921",
"type": "csv",
"z": "c68aff04e20ee551",
"name": "",
"sep": ",",
"hdrin": "",
"hdrout": "none",
"multi": "one",
"ret": "\\r\\n",
"temp": "Mash Temperture",
"skip": "0",
"strings": true,
"include_empty_strings": "",
"include_null_values": "",
"x": 1030,
"y": 440,
"wires": [
[
"aa477984d42a05fa"
]
]
},
{
"id": "aa477984d42a05fa",
"type": "file",
"z": "c68aff04e20ee551",
"name": "Write CSV File",
"filename": "C:\\BruControl\\NodeRedData\\MashTemperature.csv",
"filenameType": "str",
"appendNewline": true,
"createDir": false,
"overwriteFile": "false",
"encoding": "none",
"x": 1180,
"y": 440,
"wires": [
[]
]
}
]
Same here, thanks to @RiverCityBrewer . Really good to have you in the group. You helped me more than once – like with magnetic flowmeters, Node-RED, and more. 👍👍👍 Kudos
 
I was playing with BruControl on a WIN 11 machine and am having problems with the API Data Exchange.

It seems that in WIN 11, BruControl and node-red cannot share the same port.

If node-red is not running, I can reserve the 1880 port normally if BruControl is running. When I try to run node red, I get this:

2 May 19:54:19 - [error] Unable to listen on http://127.0.0.1:1880/
2 May 19:54:19 - [error] Error: port in use

If BruControl is not running, I can run node red normally:
2 May 19:47:34 - [info] Server now running at http://127.0.0.1:1880/
2 May 19:47:34 - [info] Starting flows
2 May 19:47:34 - [info] Started flows

But now in the Data Exchange under Settings:

1880 service fail.png






If I have reserved the port 1880 and then run node-red,
i get the
2 May 19:54:19 - [error] Unable to listen on http://127.0.0.1:1880/
2 May 19:54:19 - [error] Error: port in use
 
Back
Top