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.
Is there anyway to calculate ABV on the fermentation dashboard? Even if you type in the OG to start and then it reads the Tilt as it ferments and does the math on the backend to display current ABV? I have this now on Brewfather but just being greedy and a data nerd and wanting it on there.

EDIT: I am slowly sorting through these 165 PAGES of things and I think this has been posted please forgive me
 
Last edited:
Yeah you'll need to tweak it for sure to match up with your tilt names and globals. Unfortunately it's not going to be smaller due to the inline math limitation of the interpreter.
 
Yeah you'll need to tweak it for sure to match up with your tilt names and globals. Unfortunately it's not going to be smaller due to the inline math limitation of the interpreter.

I see you have all the yellow as globals do those run on global script? Also on your control is that a switch? I am running one fermenter so I took out all the FV2 and slowly renaming with no FV in front
 
Those globals are only referenced by that fermentation calcs script. Yes, I use simple switches to turn off/on the automation to the fermenters, which can be conveniently referenced by other things as well, like the calcs script.
 
Those globals are only referenced by that fermentation calcs script. Yes, I use simple switches to turn off/on the automation to the fermenters, which can be conveniently referenced by other things as well, like the calcs script.
I am getting SG not a valid second operator. Do you bracket this in anyway? I have my tilt already provisioned so that part was set
1629252117314.png
 

Attachments

  • 1629252100073.png
    1629252100073.png
    4.7 KB · Views: 8
Sure thing, pm me in the morning with a screenshot of your layouts and the script implementation as you have it and I'll get you sorted out.
Just figured that out, I took out the new value of tilt line that you built in the script since I already had that value built in..... told you I am slow at this. I will keep plugging away and PM you when I get stuck again. Thanks again for your help
 
The nominal One-Wire pull-up resistor values are 2.2K for 3.3V applications and 4.7K for 5V applications.

fwiw, I have multiple One-Wire "networks" in my home including a few with 5 ds18b20 temperature sensors. Half of these networks are on 5V (Arduino UNO and MEGA usage) and the other half on 3.3V (Raspberry Pi and ESP8266/ESP32 applications), some with almost 20 meters of total wire, and all use the "nominal" pull-up values...

Cheers!
The 2.2k resistor fixed my thermometer issue. Thankyou for the suggestion.
OK... just added an LCD test firmware into the version 45 package. Download off the website, run the FW tool as usual, use the "BruControl.LCDTest.MEGA.S" version. This only displays a counter on a connected display, so should help you determine if the wiring and hardware are correct. This assumes the defaultI2C address on the backpack (no jumpers changed).
I shutdown BC and installed the LCD test firmware. After a successful installation I still see blocks on the LCD. I made the assumption I needed to go back into BC and connect to interface. It did not connect so I went to termite to reconfigure the IP address and I cannot get a response with %0&15;. Any suggestions?
 
That FW is just to test the functionality of the LCD. It has nothing to do with BruControl or the application. If you didn’t see a message then it means that hardware is not compatible. I suggest you replace that LCD controller with the one from Adafruit.
 
Just fired up the Olimex ESP32-EVB-EA as I noted in post BruControl: Brewery control & automation software.

Dang... for $45 (a bit more now than when I paid for it) this is a pretty easy fermenter controller (1x heating and 1x cooling relay). You would have to solder in 3 wires and a resistor to get 1-wire sensor integration, but that's not too hard. Needs a 5V power supply, but with wire terminals, a LiPo battery plug, box and external antenna, it's a very easy & quick option.

Just sayin!
 
That FW is just to test the functionality of the LCD. It has nothing to do with BruControl or the application. If you didn’t see a message then it means that hardware is not compatible. I suggest you replace that LCD controller with the one from Adafruit.
10-4 the new controller is on its way. Thankyou for the effort of trying to get this one to work.
 
Hi,

I'm checking why you have two extra DB files with my partner - stay tuned. That said, if you need the space and don't mind missing any old data, then you can delete them.

Globals are recorded every refresh interval. Yes, its wasteful in the database. We are adding some logging control in an upcoming upgrade. And no, you can't disable a Global Element.

hi, just asking if there is any update / near future plans for better logging control? I have tons of global and huge db :)
Maybe if it would be possible to disable logging for the whole workspace ?
 
I just have upgraded to beta 1.1.9 (beta 1.2).
For me it wasn't straightforward, as I couldn't make installation of SQL 2019 LocalDB running. It wouldn't start service at the end of the installation called VSS. My workaround was to install full version of SQL express together with LocalDB feature, then uninstall SQL instace leaving LocalDB running. This isn't brucontrol installation issue per se, but it made me crazy for 1 day. :)

I ran into this and it messed with me for a few hours, finally found the answer was to install Visual C++ redistributable first and then install the SQL LocalDB https://aka.ms/vs/16/release/VC_redist.x64.exe @BrunDog you might want to put this in the Installation Product Note.
 
That FW is just to test the functionality of the LCD. It has nothing to do with BruControl or the application. If you didn’t see a message then it means that hardware is not compatible. I suggest you replace that LCD controller with the one from Adafruit.
I got the backpack soldered in and am successfully showing temperatures on LCD screen using the script below. Is it possible to have text listed before the temp display such as "Cold Storage Temp - 40.0F" ? I am currently just seeing the temp. Do I have to make Line 1 Cold Storage Temp and then Line 2 to report the temp?

Code:
[Setup]
new string CC                        //declare a new string variable
CC = "1"                        //turn on lcd backlight
new string csroomtemp
new string csminisplitfinsensor
new string cswindowfinsensor

[Loop]
csroomtemp = "CS ROOM SENSOR" DisplayText        //  "CS ROOM SENSOR" is 1-wire temp input 
display "ESP32-Cold Storage" 1 csroomtemp        //"ESP32-Cold Storage" is interface

sleep 1000

csminisplitfinsensor = "CS MINI-SPLIT FIN SENSOR" DisplayText    //"CS MINI-SPLIT FIN SENSOR" is 1-wire temp input 
display "ESP32-Cold Storage" 2 csminisplitfinsensor        // "ESP32-Cold Storage" is interface

sleep 1000

cswindowfinsensor = "CS WINDOW FIN SENSOR" DisplayText        //  "CS ROOM SENSOR" is 1-wire temp input 
display "ESP32-Cold Storage" 3 cswindowfinsensor    //"ESP32-Cold Storage" is interface

sleep 1000
goto "Loop"
 
hi, just asking if there is any update / near future plans for better logging control? I have tons of global and huge db :)
Maybe if it would be possible to disable logging for the whole workspace ?
I bought a new computer and did not install the DB as a method to shut the logging down. Having the DB almost made my old computer (WIN 10 PRO) unusable when I loaded Brew Control unless I deleted the DB Files. If it had a large DB, it might take 10 minutes to load BruControl. During that time, the entire computer was "locked".
 
I bought a new computer and did not install the DB as a method to shut the logging down. Having the DB almost made my old computer (WIN 10 PRO) unusable when I loaded Brew Control unless I deleted the DB Files. If it had a large DB, it might take 10 minutes to load BruControl. During that time, the entire computer was "locked".
How much memory, and type of drive? I had HP Elitedesk 800G1 with I7-4770, 32GB with 7200rpm HDD and it took 6-7 minutes. Same config file, Same HP motherboard in a HP 800 Elitedesk G1SFF, similar processor(I5-4690), 24GB and older Kingston 240GB SSD is about 10 seconds to load.
 
I got the backpack soldered in and am successfully showing temperatures on LCD screen using the script below. Is it possible to have text listed before the temp display such as "Cold Storage Temp - 40.0F" ? I am currently just seeing the temp. Do I have to make Line 1 Cold Storage Temp and then Line 2 to report the temp?

Code:
[Setup]
new string CC                        //declare a new string variable
CC = "1"                        //turn on lcd backlight
new string csroomtemp
new string csminisplitfinsensor
new string cswindowfinsensor

[Loop]
csroomtemp = "CS ROOM SENSOR" DisplayText        //  "CS ROOM SENSOR" is 1-wire temp input
display "ESP32-Cold Storage" 1 csroomtemp        //"ESP32-Cold Storage" is interface

sleep 1000

csminisplitfinsensor = "CS MINI-SPLIT FIN SENSOR" DisplayText    //"CS MINI-SPLIT FIN SENSOR" is 1-wire temp input
display "ESP32-Cold Storage" 2 csminisplitfinsensor        // "ESP32-Cold Storage" is interface

sleep 1000

cswindowfinsensor = "CS WINDOW FIN SENSOR" DisplayText        //  "CS ROOM SENSOR" is 1-wire temp input
display "ESP32-Cold Storage" 3 cswindowfinsensor    //"ESP32-Cold Storage" is interface

sleep 1000
goto "Loop"

You can add a string before or after the value you want. Just build it up with additions. Here is an example:

Code:
fdisplayinfo = "Ferm: "
fdisplayinfo += "Fermenter Temp" DisplayText
fdisplayinfo += " - "
fdisplayinfo += "Fermenter Control" DisplayText
fdisplayinfo += " "
display "Refrigeration" 1 fdisplayinfo

This will display, for example: Ferm: 34.7 F - ON
 
We will be adding a control to limit data logging and reduce the size of the databases. 6-7 minutes sounds very long. In the meantime, reduce your refresh periods or increase the multiples in order to pull data less frequently. For example, if you update a temperature every second, then that data is logged every second. You might not need that kind of resulution, especially for fermentation, etc.
 
This is a repost from a month or two ago, but I didn't see an answer and it seems relevant now:

I see sustained Reads of over 200MB/s off a SSD, pointing at my DB, so there is definitely a high IO demand on the SQL side during BC loadup. I watched the active query manager on the DB and now I see why. During loadup, BC requests a row count of every table, which on my system seems to average 250ms per table. I have 209 tables in my DB x 250ms average count query = ~52 seconds, which is basically what my startup time is.

@BrunDog - Do you know/can you ask what the purpose of the row count is on loadup?
 
You can add a string before or after the value you want. Just build it up with additions. Here is an example:

Code:
fdisplayinfo = "Ferm: "
fdisplayinfo += "Fermenter Temp" DisplayText
fdisplayinfo += " - "
fdisplayinfo += "Fermenter Control" DisplayText
fdisplayinfo += " "
display "Refrigeration" 1 fdisplayinfo

This will display, for example: Ferm: 34.7 F - ON
I have 3 lines of the LCD with each dedicated to refreshing temp input. Is it recommended I utilize the clear display? Can you elaborate on when this is needed?
 
Any idea why I need to hit reset button on ESP 32 any time I power it up to achieve connection in BC?
 
I'm trying to work through a nested if statement that says if two hysteresis devices are active then a globals string is Yes. If either of the two hysteresis are not active then the globals string is No. Cant seem to get the else statement to function.

Code:
[loop]
if "CS ROOF + ROOM HYSTERESIS" value == true
    if "CS ROOF HEATER HYSTERESIS" value == true
        "CS ROOF ACTIVE" value = Yes
    else "CS ROOF ACTIVE" value = No
    endif
endif

sleep 1000
goto "loop"

The reason I am doing this is because I have two hysteresis interlocked (fin sensor and room sensor) to turn on the cold storage AC unit. Since I want the LCD readout to say the unit is active (under the two conditions) I assume I need this nested if statement to write a string to a global. I can then reference the globals string to display to LCD. Perhaps there is a more elegant solution to this?
 
My old computer is an HP laptop with normal Hard Drive. I think it only has 8 gb of memory. The new computers is an SSD and 16 gb of memory. It is very fast loading. I did not do a lot of research on my old computer as I knew I was getting a computer just for BruControl and nothing else. I do know that deleting the .Database files made it load quickly, but after some use, it would be a very long load if I started it again. Restricting Data and the read times would be a great help. I only want to track mash (maybe every minute) and fermentation ( maybe ever hour (or even every two hours) I use lots of global but most 99% I do not want to track. I do have some global that I keep to know the information on a brew, such as 1st RUN TRANSFER Time, but I log manually that in a spreadsheet after the brew. It does not need to be recorded in the database. In fact, it is useless data as it is zero then the time it took. Recording it does nothing for me. I keep heating times, start temperatures, Nd other data points, but they are mostly 1 time data and do not change . I record the start temp, the volume, and the time to the target. I do not care to keep the rise ( and it is again zero until I calculte and fill the global.
 
I'm trying to work through a nested if statement that says if two hysteresis devices are active then a globals string is Yes. If either of the two hysteresis are not active then the globals string is No. Cant seem to get the else statement to function.

Code:
[loop]
if "CS ROOF + ROOM HYSTERESIS" value == true
    if "CS ROOF HEATER HYSTERESIS" value == true
        "CS ROOF ACTIVE" value = Yes
    else "CS ROOF ACTIVE" value = No
    endif
endif

sleep 1000
goto "loop"

The reason I am doing this is because I have two hysteresis interlocked (fin sensor and room sensor) to turn on the cold storage AC unit. Since I want the LCD readout to say the unit is active (under the two conditions) I assume I need this nested if statement to write a string to a global. I can then reference the globals string to display to LCD. Perhaps there is a more elegant solution to this?

The else is only going to work for one of the if’s. Need another one.
 
My old computer is an HP laptop with normal Hard Drive. I think it only has 8 gb of memory. The new computers is an SSD and 16 gb of memory. It is very fast loading. I did not do a lot of research on my old computer as I knew I was getting a computer just for BruControl and nothing else. I do know that deleting the .Database files made it load quickly, but after some use, it would be a very long load if I started it again. Restricting Data and the read times would be a great help. I only want to track mash (maybe every minute) and fermentation ( maybe ever hour (or even every two hours) I use lots of global but most 99% I do not want to track. I do have some global that I keep to know the information on a brew, such as 1st RUN TRANSFER Time, but I log manually that in a spreadsheet after the brew. It does not need to be recorded in the database. In fact, it is useless data as it is zero then the time it took. Recording it does nothing for me. I keep heating times, start temperatures, Nd other data points, but they are mostly 1 time data and do not change . I record the start temp, the volume, and the time to the target. I do not care to keep the rise ( and it is again zero until I calculte and fill the global.

Definitely hear these comments. We will add that level of control. We want to extend the recorded time out to multiple months and will need to do this.

FYI globals are a big culprit… they record every second.
 
The else is only going to work for one of the if’s. Need another one.
Where does the other else go? Cant get it to work...

Code:
[Loop]

if "CS ROOF + ROOM HYSTERESIS" value == true
    if "CS ROOF HEATER HYSTERESIS" value == true
        "CS ROOF ACTIVE" value = Yes
    else "CS ROOF ACTIVE" value = No
    endif
else "CS ROOF ACTIVE" value = No
endif

sleep 1000
goto "Loop"
 
Last edited:
Back
Top