CellarWarden, a temperature and humidity monitor for the Raspberry Pi

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.

craigmw

Well-Known Member
Joined
Dec 29, 2012
Messages
339
Reaction score
78
Location
Villa Park
Hi everyone. I've developed an application to monitor temperature and humidity and door access in my wine cellar and keezer/fermentation chamber using the Raspberry Pi. This application is based on the design principles of the BrewPi, but it does not currently control temp. However, it only requires a Raspberry Pi B or B+, and does not use an Arduino.

Similar to BrewPi, it logs temps and humidity values (as well as door open events), but unlike the BrewPi, it also includes an alarms function to send emails or text messages indicating that these values are outside of normal range. CellarWarden also includes a web server and client app to access the program from devices on the local LAN or remotely. It currently supports DHT11/DHT22/AM2302 temp/humidity sensors as well as DS18B20 OneWire temperature sensors.

While I have not tried this, it is likely that CellarWarden could be run on the same RPi hosting the BrewPi server. However, since the BrewPi has its DS18B20 sensors linked to the Arduino and not the RPi, CellarWarden needs its own DS18B20 sensors (and thus its own OneWire bus connected to an open GPIO pin).

This can be found at:

http://github.com/craigmw/CellarWarden

The Overview from the README.md file:

Overview

CellarWarden is an application that runs on the Raspberry Pi (B and B Plus; RPi 2 is not currently supported, nor is the BeagleBone Black...yet) that monitors temperature and humidity and provides a graphical display of these values over time. This is set up to monitor wine cellars for optimal temp. and humidity, and if these values are out of range, can send alarm emails and text messages to designated users. For temp and humidity, connect one or two DHT11/DHT22/AM2302 sensors to the RPi. Also, up to two additional Dallas One-Wire (DS18B20) temperature sensors can be connected to the RPi and monitored by CellarWarden. In addition, up to two door switches can be monitored to ensure that the cellar door has not been left open for too long. Alarm functions can be set to only be activated when a condition has been met for a set time (as set in the alarms configuration). The server daemon is programmed in Node.js and the client app is handled by Javascript. Based on design features of the popular beer fermentation control program BrewPi (http://www.brewpi.com), CellarWarden is focused on monitoring cellar/refrigerator temperature, but does not currently control temperatures.

Note that CellarWarden does not currently support the new RPi2 or the BeagleBone Black. I'm working on this and several other issues. However, I thought it would be helpful to get some feedback as I continue to improve the app.

CellarWardenGrab.jpg
 
Very cool to see a project thats forked off of BrewPi!

I have no use for this ATM but will save it incase i do in the future!

Having not tried it, the only suggestion i'd make is to have longer time stamps than BrewPi, for something like a cellar there is no point logging every 10 seconds..more like every 5 minutes is probably more than adequate.
 
Very cool to see a project thats forked off of BrewPi!

I have no use for this ATM but will save it incase i do in the future!

Having not tried it, the only suggestion i'd make is to have longer time stamps than BrewPi, for something like a cellar there is no point logging every 10 seconds..more like every 5 minutes is probably more than adequate.

Thanks FuzzeWuzze:

The logging increment (timestamp) as adjustable in the Configure dialog. I have mine set to log about once every two minutes, which provides plenty of resolution for this purpose. I also have this designed to either "compress" or "truncate" the log file. The compress function reduces resolution of older data to keep the log file small (and the plotting fast). The truncate function eliminates data older than a set number of days. These functions can be automated to run at a set time of day (e.g. 1:00 AM, etc). So, you could have the program monitor and report for say a two week period, and each night, it would delete the data from the 15th day.

This really isn't a fork of BrewPi. It's a completely newly written app, although BrewPi was certainly part of the inspiration (particularly on the client side).
 
Oh really? Wow the UI does look identical so I just assumed it was forked off of it...good job!
 
Oh really? Wow the UI does look identical so I just assumed it was forked off of it...good job!

Thanks! I like the simplicity of the BrewPi client interface, particularly the virtual LCD panel. CellarWarden has rich alarms/notifications features, which was my main focus. While I originally intended this for monitoring my wine cellar, I've also set one up on my combination keezer/ferm chamber. This turned out to be fortuitous, since I accidentally switched the fridge and beer temp probes when setting up a carboy the other night. CellarWarden sent an email and text message indicating that the keezer temperature was dropping too low in temp. This helped me avoid a possible disaster. I can think of other things this could be useful for as well.
 
Just set this up for a buddy who is setting up a wine cellar, works great. Would be nice if you could turn off the controller part entirely though, he has some fancy AC unit that controls his temp and humidity. So this is purely for logging and alarms.
 
Hey Fuzze:

If you uncheck the Active checkbox in the Controllers dialog for any assigned controllers, this will suppress controller processing.

On my unit, it has a more rudimentary cooling unit with analog controls, so CellarWarden handles temperature and humidity regulation. As these cooling units are quite expensive ($1000+), when it eventually dies, I'll just replace it with a small window AC and let CellarWarden control it.

Cheers...

Craig
 
That sounds cool! I may need to do the same if I could ever build a collection. I use a cheap ultrasonic mister floating in a bucket of water in my wine cellar to keep my humidity stable at 70%, all controlled by CellarWarden. It works quite well for this.



I may have to build one of these for my cigar humidor. Would be nice to get notices when the humidity beads need replenishing.
 
Hey Fuzze:

If you uncheck the Active checkbox in the Controllers dialog for any assigned controllers, this will suppress controller processing.

On my unit, it has a more rudimentary cooling unit with analog controls, so CellarWarden handles temperature and humidity regulation. As these cooling units are quite expensive ($1000+), when it eventually dies, I'll just replace it with a small window AC and let CellarWarden control it.

Cheers...

Craig

It does, but if im remembering correctly(he has it now) the LCD on the web app still toggles between controller and current temps. Minor issue but it bugged me ;) But he got the alarms working so its not like hes going to stare at the web gui more than a minute every month or two if that.
 
Hmm. I just checked it right now on my system. If I disable the Active checkbox on any listed controllers, the LCD will only show the page 0 screen (e.g. DHT temp/humidity and onew1 temp). If this doesn't seem to work, maybe the controller configuration file got corrupted somehow. I suggest deleting the controller config file (/home/pi/CellarW/public/controllers.json) and then rebooting the PI. This will set up a fresh controller config file. Just make sure to uncheck Active on Controller 0 and this should fix it.

It does, but if im remembering correctly(he has it now) the LCD on the web app still toggles between controller and current temps. Minor issue but it bugged me ;) But he got the alarms working so its not like hes going to stare at the web gui more than a minute every month or two if that.
 
I've just updated the client app to prevent deletion of Controller 0 since I noticed that doing so would result in some strange behavior. You can just run git pull from the command line in /home/pi/CellarW to institute this change.

Hmm. I just checked it right now on my system. If I disable the Active checkbox on any listed controllers, the LCD will only show the page 0 screen (e.g. DHT temp/humidity and onew1 temp). If this doesn't seem to work, maybe the controller configuration file got corrupted somehow. I suggest deleting the controller config file (/home/pi/CellarW/public/controllers.json) and then rebooting the PI. This will set up a fresh controller config file. Just make sure to uncheck Active on Controller 0 and this should fix it.
 
Hi Craigmw. You've done a good job and I was looking to try and get this working for my humidor. But I keep running into issues. I'm running a raspberry Pi 2 Model B on Raspbian Jessie.

My issue is when trying to start CellarW.js.

Here is the error that gets thrown;


root@Roth-Humidor:~# node cwdaemon.js
module.js:471
throw err;
^

Error: Cannot find module '/root/cwdaemon.js'
at Function.Module._resolveFilename (module.js:469:15)
at Function.Module._load (module.js:417:25)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:394:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:509:3
root@Roth-Humidor:~# node /home/pi/CellarW/cwdaemon.js
/home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules/ep/bindings.js:91
throw err
^

Error: Could not locate the bindings file. Tried:
→ /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
→ /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
→ /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
→ /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesde
→ /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
→ /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
→ /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
→ /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
→ /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesux/arm/epoll.node
at bindings (/home/pi/CellarW/node_modules/lcd/node_modules/onof_modules/bindings/bindings.js:88:9)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_moepoll/epoll.js:1:99)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_mo)
CellarW.js has restarted.
/home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules/ep/bindings.js:91
throw err
^

Error: Could not locate the bindings file. Tried:
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesde
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesux/arm/epoll.node
at bindings (/home/pi/CellarW/node_modules/lcd/node_modules/onof_modules/bindings/bindings.js:88:9)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_moepoll/epoll.js:1:99)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_mo)
CellarW.js has restarted.
/home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules/ep/bindings.js:91
throw err
^

Error: Could not locate the bindings file. Tried:
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesde
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesux/arm/epoll.node
at bindings (/home/pi/CellarW/node_modules/lcd/node_modules/onof_modules/bindings/bindings.js:88:9)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_moepoll/epoll.js:1:99)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_mo)
CellarW.js has restarted.
/home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules/ep/bindings.js:91
throw err
^

Error: Could not locate the bindings file. Tried:
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesde
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesux/arm/epoll.node
at bindings (/home/pi/CellarW/node_modules/lcd/node_modules/onof_modules/bindings/bindings.js:88:9)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_moepoll/epoll.js:1:99)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_mo)
CellarW.js has restarted.
/home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules/ep/bindings.js:91
throw err
^

Error: Could not locate the bindings file. Tried:
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesde
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesux/arm/epoll.node
at bindings (/home/pi/CellarW/node_modules/lcd/node_modules/onof_modules/bindings/bindings.js:88:9)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_moepoll/epoll.js:1:99)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_mo)
CellarW.js has exited after 5 restarts.
CellarW.js has exited!
About to exit CellarW process.


Any help would be greatly appreciated. Or if there is a better place to contact you, let me know.

Thanks,
James
 
Jimmy:

I've not seen this one. Open up an issue on the GitHub site and we'll work it out.

Cheers...

CraigMW

Hi Craigmw. You've done a good job and I was looking to try and get this working for my humidor. But I keep running into issues. I'm running a raspberry Pi 2 Model B on Raspbian Jessie.

My issue is when trying to start CellarW.js.

Here is the error that gets thrown;


root@Roth-Humidor:~# node cwdaemon.js
module.js:471
throw err;
^

Error: Cannot find module '/root/cwdaemon.js'
at Function.Module._resolveFilename (module.js:469:15)
at Function.Module._load (module.js:417:25)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:394:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:509:3
root@Roth-Humidor:~# node /home/pi/CellarW/cwdaemon.js
/home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules/ep/bindings.js:91
throw err
^

Error: Could not locate the bindings file. Tried:
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesde
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesux/arm/epoll.node
at bindings (/home/pi/CellarW/node_modules/lcd/node_modules/onof_modules/bindings/bindings.js:88:9)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_moepoll/epoll.js:1:99)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_mo)
CellarW.js has restarted.
/home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules/ep/bindings.js:91
throw err
^

Error: Could not locate the bindings file. Tried:
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesde
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesux/arm/epoll.node
at bindings (/home/pi/CellarW/node_modules/lcd/node_modules/onof_modules/bindings/bindings.js:88:9)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_moepoll/epoll.js:1:99)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_mo)
CellarW.js has restarted.
/home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules/ep/bindings.js:91
throw err
^

Error: Could not locate the bindings file. Tried:
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesde
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesux/arm/epoll.node
at bindings (/home/pi/CellarW/node_modules/lcd/node_modules/onof_modules/bindings/bindings.js:88:9)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_moepoll/epoll.js:1:99)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_mo)
CellarW.js has restarted.
/home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules/ep/bindings.js:91
throw err
^

Error: Could not locate the bindings file. Tried:
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesde
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesux/arm/epoll.node
at bindings (/home/pi/CellarW/node_modules/lcd/node_modules/onof_modules/bindings/bindings.js:88:9)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_moepoll/epoll.js:1:99)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_mo)
CellarW.js has restarted.
/home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules/ep/bindings.js:91
throw err
^

Error: Could not locate the bindings file. Tried:
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesde
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesnode
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modules
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesl.node
&#8594; /home/pi/CellarW/node_modules/lcd/node_modules/onoff/node_modulesux/arm/epoll.node
at bindings (/home/pi/CellarW/node_modules/lcd/node_modules/onof_modules/bindings/bindings.js:88:9)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_moepoll/epoll.js:1:99)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/home/pi/CellarW/node_modules/lcd/node_mo)
CellarW.js has exited after 5 restarts.
CellarW.js has exited!
About to exit CellarW process.


Any help would be greatly appreciated. Or if there is a better place to contact you, let me know.

Thanks,
James
 

Here's an example with three fermentors, two with Kolsch and one with Doppelsticke:



The chest freezer here is being held at about 32F, and all three fermentors have completed their fermentation profiles and are just conditioning.



Here's what the Doppelsticke profile looks like. I switched over to PID mode about 1/3 of the way in which is why you can see the output moving to about 40%. I then did a hard cold crash after completion of fermentation. Note the few dips during the diacetyl rest at 65F. This was due to me agitating the fermentor to help finish fermentation.



Seems to be working pretty well even with three fermentors running completely independent controllers on different profiles.
 
Here are some views inside of my main controller box:





The box has an RPi3, a PermaProto Hat from Adafruit with 3 level shifter boards and an I2C realtime clock board. The level shifters work to raise the I2C, 1-wire and GPIO lines to 5V and provide some buffering. The I2C bus (the four wires exiting on the right side of the Hat) also connects to an I2C 20x4 LCD display. On the Hat, you can also see the I/O lines. In the middle, these I/O lines connect 5V, ground and two GPIO pins to a Sainsmart 2 channel relay board inside this box. This local relay board switches the chest freezer compressor (with a spare relay that I intend to eventually use to switch on the secondary box). To the left, 5V, ground, 1-wire and 4 I/O lines connect to an RJ45 splitter board:





You can purchase the RJ45 splitter boards from OshPark if you want to go this route:

https://oshpark.com/shared_projects/ehreFVpM

They are handy because if you add stackable headers, it is possible to stack as many of them as needed and they are fairly easy to mount into an enclosure.

I use one splitter board in the main control box and run these I/O lines to a second box on the side of the chest freezer. This second box has two of these RJ45 splitters, allowing a connection to the main box via Cat5e as well as seven additional ports for 1-wire temperature probes (DS18B20). This box also contains a Sainsmart 4 channel SSR board and has four grounded outlets switched by these SSRs. Power to this box is plugged into a GFCI extension cord.

This all may be overkill, but I like the flexibility of being able to independently control 4 separate fermentors inside a single chest freezer.
 
Back
Top