Dev log: teaching Hypha to run your fans (and what happens when it can't)
We're building climate control into Hypha: Hypha Aeris (closed beta, not for sale yet) switches a zone's humidifier, fans and heater through smart plugs. It's in testing on our bench and isn't available yet. Here's how it works, what it does when something goes wrong, and how we tried very hard to break it.

KayleeUpdated 10 min read

At 11 pm on a Sunday, two LED panel lights in my office were switching on and off on a schedule, which is exactly what I'd built them to do. The lamps were standing in for a humidifier and a circulation fan. Nobody had told the lamps it was bedtime. That's the risk of a climate controller that is very good at its job: it keeps doing it, whether or not you're awake.
So consider this a dev log from a test bench that occasionally keeps me up. We're building climate control into Hypha, it's running on our bench and our own farm, and it isn't available to growers yet. Climate control runs through Hypha Aeris, our CO2, temperature and humidity sensor (closed beta, not for sale yet). Below is what it does, what it does when things go wrong, and the ways we tried to make it fail.
The photo at the top is not the actual test setup. This is just a tribute. The real tests ran on two uncased Aeris boards sitting on top of my desktop computer, with the lights on a stand next to my desk chair. In both versions, the light on the left is a circulation fan and the light on the right is a humidifier. Neither of them knows this.
What's wrong with how grow rooms are run today?
Most grow rooms, ours included, are run by a committee of boxes that have never met. A humidity controller with its own probe runs the humidifier. A timer runs the exhaust fan. A thermostat runs the heater, if there is one. Each of them is doing its best. None of them knows what the others are doing, and that's where most of the trouble starts:
- They fight. The fan comes on and dumps your humidity. The humidity controller panics and fogs flat out, and fog keeps rolling in after the fogger stops, so humidity overshoots just as the fan shuts off. Repeat all day. I've been in meetings like this.
- A timer has no idea what's going on. It runs the fan for five minutes every half hour, whether your CO2 is fine (CO2 targets by stage) or the tent smells like the inside of a submarine.
- Some of them live in the cloud. Plenty of smart plugs and controllers run their schedules from the maker's servers. When your internet drops, or the company decides its app has had a good run, your fan's schedule goes with it.
- When one dies, it dies however it dies. A controller that crashes with the humidifier on leaves the humidifier on. A heater stuck on is a worse story, with vanishingly few good endings.
- Nobody takes notes. When a flush goes wrong, there's no record of what actually ran, or when. You end up reconstructing it from memory, which in my case is a lossy format.
Climate control in Hypha puts one Aeris in charge of the room's whole schedule:
- One schedule runs everything, so the humidifier can start when the fan stops instead of fighting it.
- The Aeris measures CO2, humidity and temperature right there in the room. Hypha uses those readings to nudge each piece of equipment's run time up or down a little every cycle, never past the limits you set, and holds still while things are in range. When the readings stop, it falls back to your plain schedule.
- It works over your own Wi-Fi. No cloud is involved in switching a plug.
- Every plug knows what to do if the Aeris goes away. More on that below, because I spent a lot of time unplugging things.
- Hypha records when each plug was on, and how much power it drew, alongside your sensor history. Seeing that history in the app is coming. So is the rest of this feature, right after the Aeris, which is also coming. It's coming all the way down.
What does climate control in Hypha do?
Climate control lets your Aeris switch the equipment in a zone, such as a humidifier, an exhaust fan, a circulation fan or a heater, through smart plugs on your own network. You tell Hypha what's plugged into each outlet. You set when each piece of equipment should run in a repeating cycle. Hypha sends that schedule to the Aeris, and the Aeris does the switching.
The plugs are ordinary Shelly smart plugs, and the Aeris talks to them directly over your Wi-Fi. That matters for one reason: if your internet goes down, the Aeris keeps running the room. Your humidifier shouldn't care whether your router is having a bad day.
One Aeris can run up to 32 outlets, across as many zones as fit. You can have more than one Aeris on a farm; I'll get to how they share the work.
What happens when the Aeris goes offline?
When the Aeris that runs a zone stops answering, each plug falls back to what you chose for it when you set it up: keep cycling or go to its safe state.
- Keep cycling means the plug keeps repeating its usual on-off pattern by itself, using timers on the plug. Your fans keep moving air and your humidifier keeps humidifying, even if the Aeris was unplugged by someone looking for a free outlet. (This has never happened. On our farm. More than twice.)
- Go to its safe state means the plug switches to whatever is safest for that equipment and stays there until an Aeris comes back.
A heater always goes to its safe state. That one isn't a setting. A heater that decides to freelance is how you find out what your fire extinguisher is for.
To test this, I unplugged the Aeris for eleven minutes and watched the lamps. The "fan" lamp ran six full cycles by itself, on time, 40 seconds on and 80 off. The "humidifier" lamp sat in its safe state and, presumably, enjoyed some quiet time without being poked every 10 seconds. When I plugged the Aeris back in, it picked both lamps back up and they were on schedule within a minute.
What if you press the button on the plug?
If you press a plug's button, Hypha treats it as you taking over: it leaves the plug the way you set it and tells you when it'll go back to the schedule. The notification says something like "Humidifier in Fruiting tent was switched on by hand. It goes back off in 1 min. Need it on longer?" If you do need it longer, you can hold it from the app.

The "in 1 min" is relative on purpose. Hypha's server doesn't know what time zone your grow room is in. Telling you "back off at 05:09" when you meant 11:09 would be technically accurate and completely useless. While that could be a good description of me on a bad day, we want our Aeris units to be modeled on good-day Kaylees only: technically accurate and totally awesome.
This feature is also where our testing earned its keep. The first version worked perfectly on one plug and not at all on the other. A plug that's keeping a cycle has its own timers, and pressing the button starts one of them. On my bench, that timer switched the plug back off 40 seconds after I pressed it. The Aeris was checking each plug once a minute, so it never saw the press at all. The plug had quietly undone my decision and covered its tracks. It must have accidentally ported some code from my... other project.
Now the Aeris checks plugs that run their own timers more often: every 20 seconds on my bench, and never less than every 10. On the re-test, it caught the button press 19 seconds later, a full 21 seconds before the plug's timer would have overruled me.
Which Aeris runs each zone?
Hypha picks which Aeris runs each zone for you, and switches to another one if that Aeris stops working. Nobody wants to spend an evening assigning sensors to rooms. So we made it automatic:
- If a zone has one Aeris in it, that Aeris runs it.
- A healthy Aeris keeps its zones. We don't shuffle control around just to balance the load.
- If the Aeris running a zone goes quiet for 15 minutes, another Aeris on the farm takes over.
- If one Aeris can't reach a plug and another can, the one that can takes over.
Our two test units are named Auric-Drone and Austere-Block, because every Aeris gets a two-word code name and these are the ones the generator rolled (less Doombot-sounding names are on the to-do list). Watching them hand a zone back and forth was the most dramatic thing that happened on my desk all week.
The trickiest rule is coming back. Say an Aeris loses a zone because it couldn't reach a plug, and then it can again. If it grabbed the zone back right away, a flaky Wi-Fi connection could flip control back and forth all day. So it waits at least 30 minutes. On the bench, it could reach the plug again within minutes, sat on its hands as instructed, and took the zone back 30 minutes and 54 seconds after it lost it.
If you'd rather choose, you* can. Edit zone has an Advanced setting where you can pin a zone to one Aeris, and Hypha leaves your pick alone.
*"You" in this case being the future you, who lives in a more data-filled future with your overworked Aeris and its 32 plug-shaped minions.

And if every Aeris on a farm goes offline, Hypha tells you: "Climate control has no Aeris". The plugs set to keep cycling carry on by themselves until one of the bosses comes back from the void.
How did we test it?
This is my favorite part, and probably something I'll have to answer for to our robot overlords. We tested climate control by trying to break it, on purpose and in ways a farm actually breaks. The bench has two Aeris boards, two smart plugs and two lamps, plus my deep rooted desire to b̵r̴e̶a̷k̷ ̴t̴h̶i̵n̷g̸s̷. Among other things, we:
- unplugged the Aeris while a plug was mid-cycle;
- unplugged a plug mid-cycle;
- gave one plug's address to another, to make sure the Aeris refuses to switch the wrong one;
- pressed the buttons;
- powered off every Aeris on the farm at once and waited.
Then there's the question of scale. An Aeris can run 32 outlets, and I own two smart plugs. So I wrote a small program that pretends to be 29 more of them, gave my computer 29 extra network addresses, and let the Aeris loose on the lot. It handled them all: almost six requests a second, every outlet checked about every 11 seconds, and every switch within a second of when it was meant to happen. One of the 30 addresses I picked turned out to belong to something else on my network. I still don't know what. It has declined to identify itself, although the oven has been acting a bit cagey.
The testing also found a real bug, which is what testing is for. Plugs protected with a password weren't being switched at all. The Aeris had been asking to log in before the plug had asked for a password, and the plug, very reasonably, ignored it. We fixed it before any of this reached anyone else's farm. I'd also like the record to show that I forgot that same plug's password twice, so the plug and I are even.
When can you try climate control?
You can't try it yet. Climate control is in testing on our bench and our own farm, and it needs an Aeris, which isn't for sale yet; reservations are planned for 2027. Before it opens up, we still have work to do on how it looks in the app, and it has to run reliably for a good long while somewhere other than my office.
In the meantime, I'd love to hear what you'd plug into it first, and what you'd want it to do when things go wrong. Email team@demetermycolabs.com.
The lamps are off now. I checked twice.
— Kaylee