MVP Build in The Six


I came across the OpenAG project while looking around for a solution to another project. Now I have a pretty good brown thumb, as I can kill most plants without much effort :). So I figured that I would try to recycle as many parts as I could find, in case this project turned out like most of my plants.MVP%20Start%20Build
And finally came with this as my first MVP. There is still some cleanup that need to be done, but I wanted to get something growing.

After about 2.5 months (yes the first set I killed :sob:)

Before Harvest

Salad for Dinner :):grinning:

After Harvest


As I was planting the salad, I was having a yellow pepper for dinner and figured it would make a nice addition to the first test. Now if you’re asking why there are two plants in the front, well I asked my daughter to pick which pepper plants would get thinned out, and the answer was none. So two pots ended up in the front of the chamber.

I’ll document more of my build later, as additions to this post.

$300 Food Computer - MVP

I’m thinking in the future to have a separate MVP for different plants like pepper or tomato, as currently the lettuce near the pepper plant doesn’t grow as well as the ones farther away. Recently I combined the two pepper plants together and I’ll see how that goes.

As part of that and for some other reasons mentioned later, I’ve been modifying some of the MVP code to create a distributed MVP environment so that I can separate the parts into modules and potentially run multiple MVPs with a single head end. My home environment includes a bunch of other Raspberry Pi and Ardunio devices running different functions with some overlap for a MVP. For instance some home automation in the form of Openhab and MySensors. Rather than have a separate Pi running an MVP it runs on my Raspberry Pi that runs Openhab.

Basically the MVP can be replicated and talk to a central frontend, database and processing engine. There is an alert framework (currently Telegram) so the Processing Engine can send messages to me.

Each module is independent and have the following functions

  • check_config – This function uses the module’s json file to check the configuration for each item of that type.
  • get_state – This returns the state of the module.
  • set_state – This allows you to set the state of the module. Also has a help flag to return what inputs it can take. This will be used by the front-end to be able to create rules in a central console.

The modules use RabbitMQ to communicate to the Processing Engine. When the Processing Engine starts up it will read the main configuration file and request each module to verify the setting in the main configuration file to ensure that it matches the correct fields and types that the module expects.

Also each module has a mode field with two inputs:

  • Run - Runs the module and executes the changes
  • Check - Runs the module but reports back on what it would have changed if it was allowed. This way I can test new versions of the module while the existing one is still running and run the new module while the old one checks.


Still have more work to do, currently I wouldn’t use it on a new MVP build. Though that’s where I’m testing it on.


You could just double the number of lights - that should be more than enough.

Would you be interested in collaborating with us as we work on the next version of the code? We are working on a progressive web app that will enable a user to remotely operate several “farms” from one account. I’m interested to hear what you’re considering in terms of architecture for the database and to learn more about your alarm configuration. @ferguman @wsnook @pspeth


I have six lights in the MVP controlled by 4 relays so that I can individually turn them on if I choose to, but currently only using four lights.

As for software, I’m trying to document the design as I’m building out my distributed version of the MVP (link to design on github). I’m building it off of the development stream of OpenAG-MVP-II, but changing some of the modules to be independent of each other.

In short when the main program (Processing Engine) starts up it will read the modules in the configuration file. It will then ask each of the modules to confirm that the configuration file is correct for them. This should allow me to update a module without having to rewrite other modules or the main program. This will also allow me to have the GUI front-end, query the modules on what buttons appear to write the configuration file and rules. (Hopefully I haven’t confused people more)

As for alarm, I have been using a Telegram Bot for some projects in the past. Telegram-Send will probably be the first version of the Alarm module as it is quick to setup.

For the architecture of the database, I’ll defer to others as this is the first build/growth, though the salads have been great and I’m looking forward to eating a pepper out of the MVP.

Let me know how I can help. Although I have played with Node-Red a bit for a GUI front-end, I’m currently working with Dash for another project as a front-end.


Is this as a replacement to Cron? I’d appreciate more details around this as it sounds like a nice addition.

This is where we’re at on the data model, if you’re interested more in hobby rather than any research though this is probably irrelevant: Sensor Data Modeling

I’m curious what your nutrients are for the pepper, he looks good! Are you still running Jacks 20-20-20???


Is this as a replacement to Cron?

Somewhat, the Processing Engine will read rules from which will contain both cron type entries and logical (ie if Temp > X then Fan On or if Fan On and Temp > PreviousTemp Then Send Alert). In the distributed design if the Main Processing Engine (MPE) is sending heartbeats, then the individual Processing Engines will defer to it, otherwise it will revert to the last rule set that it has. That way an individual MVP can keep the plants alive when it loses connection to the MPE. Still a work in progress, but currently for scheduling it uses Celery to distribute the tasks, but I’m also looking at APScheduler.

As for the pepper plant, just 20-20-20. I had to trim it though as it was getting into the exhaust fan.