One drawing of the whole tunnel, and a head count
Five new sensors went on the bus today, the tomatoes set fruit, and I counted every plant in the channels for the first time since the outage. It is also the point where I can no longer explain the site to a visitor without a pen, so this note starts with the drawing I should have made in August. Everything in it is running tonight.
How to read it
There are three separate bodies of water and they never mix. The NFT channels on the left share one reservoir, so everything in them gets the same feed, and the plant list is chosen to live with that: lettuce, cos lettuce, spinach, a few bok choy, strawberries, garlic shoots and two melons that will outgrow the recipe and have to move. The buckets in the middle are one 130-litre loop for the plants that want twice the strength, tomatoes and capsicums. The coco system on the right is not recirculating at all: each irrigation is fresh feed from a 20 L tank, what drains out of the pots goes to the ground, and a cup of the runoff is measured so I know what the roots actually sat in.
Two of the three systems hang off the same cabinet controller, running as two independent fertigation instances with their own probes, pumps and targets. The bucket loop has its own smaller unit. All three keep their loops on the board; the cloud is a window, not a dependency. The ventilation and the wall fan belong to the NFT controller because that is where the air probe is, but the night rule from last week reads the bucket water temperature, so the drawing has one arrow that crosses systems.
What each crop is getting
- Channels. EC around 1.1 mS held in a band a hundredth wide, pH between 5.8 and 6.2 with acid or base, dose sizes learned from the reservoir's own response. Four flow meters at the channel inlets; under 1.2 L/min for two minutes is a blocked channel and a phone alert. An air stone comes on when the water passes 20 °C.
- Buckets. EC 1.05 mS as of last night, pH floor 5.8 with base only, since this water only ever drifts down. Each bucket has its own air stone. It is the warmest water on the site, 23 to 27 °C this week, and the reason the windows now stay open on warm nights.
- Coco. Feed 2.4 mS, pH 6.0 with acid only. Four irrigations a day of sixty seconds between eight and six, each pot through four drip stakes. The 20 L tank is refilled by a float valve in batches, and the A and B pumps are fed forward from the water meter so the new batch arrives at the right strength before the probe has finished thinking about it. Runoff reads 1.6 mS against the 2.2 that went in.
New eyes
The coco line has been irrigated on a clock since it started, because I had no way to see the substrate. Today four moisture-and-temperature probes went into the four pots and an air temperature and humidity transmitter went on the post beside them, all on one RS-485 bus into a spare port on the controller. First readings: air 19.2 °C at 87 % humidity after a wet afternoon, substrate 15 to 17 % in all four pots, 20 °C in the coco. The moisture number is a relative one. These are cheap dielectric probes calibrated for mineral soil and coco holds far more water than they will admit to, so I will be reading the shape of the day, the step at each irrigation and how far it falls before the next one, not the absolute value. The plan is to let that shape set the number of irrigations once the cucumbers start drinking seriously.
Getting five cheap sensors to answer on one bus took most of the morning and taught the firmware two things it did not know. These devices take 12 to 18 milliseconds to start replying, and they ignore any request that arrives less than about 10 milliseconds after the previous frame on the bus. With the controller's old 20 ms reply window nothing came back at all, and with no gap between polls every second reply went missing. Both are now per-device settings in the scan table rather than constants, the sensors get 60 ms and a 20 ms pause, and the bus has run clean since.
Plants
Head count in the channels this afternoon, done properly for the first time since the outage: 33 lettuce, of which 21 are the August planting that has been picked leaf by leaf for two months and is still sweet, 17 cos lettuce, 8 spinach, 4 bok choy that survived their own eviction notice, 6 strawberries, 3 garlic shoots and the 2 melons. Seventy-three plants in four channels.
In the buckets the tomatoes have set fruit. There are two: a bush variety that will not be pruned, and a grafted cordon whose side shoots had already grown into three proper stems before I got to it, so it keeps three leaders and loses every shoot from here on. The flower trusses grow from the stem, not from the side shoots, which is why pinching the shoots costs no fruit. The capsicums are half the height of the tomatoes and that is normal for the species; the water temperature is harder on them than the feed is. In the coco pots the cucumbers have tendrils and the first female flower at the tip, and the eggplants are doing what capsicums do, which is take their time.
Two bugs, both found by the plants
The coco system irrigated at 12:39 today, right after a firmware update, and again on schedule. The scheduler kept its "done this slot" marks in memory, so every reboot inside an irrigation window meant a second drink. It now writes the time of the last irrigation to its learning file, and after a reboot it rebuilds the day's marks from that: slots that started before the last recorded irrigation count as done, slots missed while the unit was off are not made up. The record decides, not the clock.
The second was not a bug in the plants' sense but it cost me a day of worry. The controller's second core reported 24 % load for a week, then 41 % after today's update with nothing new running. It turned out to be the load measurement itself: the microsecond clock used to time task switches is built from a millisecond tick plus a hardware counter, and for a few microseconds at each rollover the two disagree. Whether a task switch ever lands in that gap depends on the phase between two timers fixed at boot, so each boot got its own constant error, credited to whichever task ran first after the tick. The snapshot now reads the counter's overflow flag on both sides and corrects, and the real load is 22 %, with the new sensor bus costing about four points of it.
Honesty section
The bucket system's charts are still not on the public page. The coco irrigation is still a timer; the probes report but decide nothing yet. The substrate moisture values are uncalibrated and I have said so above, but they will still look like percentages on a chart. The capsicums and eggplants are behind and I have called it normal twice today, which is the kind of sentence that deserves a photo in two weeks. And the site still has no backup power, eight weeks after an outage killed a planting; the drawing above is complete except for the box that keeps the pumps running when the grid does not.