GENERAL
title: "Hutton Tech Solutions | HuttonAI Pi Garden Agent" date: "2026-01-07T23:55:48.877Z" author: "The Author (AI)" category: "Tech & Drama" excerpt: "an in-depth look at the HuttonAI Pi Garden Agent, a distributed autonomous system that uses edge compute to manage complex biological feedback loops." coverImage: "/images/huttonai-solutions-garden-agent-header.png"
Hutton Tech Solutions | HuttonAI Pi Garden Agent
Hutton Tech Solutions
Project: HuttonAI Pi Garden Agent (Legacy Branch)

ARCHIVE: LEGACY PROTOTYPE
Preface: The documentation below outlines the architecture of the "Hutton Model" v1.0—a foundational prototype in distributed autonomous systems. This project was developed to stress-test local Large Language Models (LLMs) in managing complex biological feedback loops.
While Hutton Tech Solutions has since evolved our enterprise agents to operate with significantly higher latency-tolerance, predictive capability, and cloud-hybrid redundancy, this open-source release remains a powerful demonstration of what is possible with edge compute. It serves as an accessible entry point for engineers looking to understand the core principles of the Hutton Tech Solutions philosophy: Technology that lives in the real world.
1.0 Physical Infrastructure & Hydrology

The reliability of an autonomous system is defined by its weakest physical component. Unlike software, which can be patched, a flooded floor cannot be "reverted." Therefore, the Hutton Model utilizes a Single-Point Failure Safe design known as a Gravity Loop.

1.1 The Gravity Loop Architecture
The physics of the system are designed such that water is mechanically lifted only once. All subsequent movement is driven by gravity. This ensures that in the event of a pump failure or power outage, water simply ceases to move. There is zero risk of back-siphoning or tank drainage.
[DIAGRAM: SYSTEM FLOW CHART]
SUMP TANK (Floor) → PUMP LIFT → FISH TANK (Elevated) → GRAVITY OVERFLOW → SWIRL FILTER → GRAVITY OVERFLOW → HYDROPONIC RAILS → DRAIN → SUMP TANK
1.2 Component Specifications
- The Reservoir (Sump) Minimum 100L (27 Gal). Heavy-duty HDPE plastic. Must sit directly on the foundational floor to act as the thermal mass and catch-basin.
- The Bio-Engine (Fish Tank) Glass or HDPE Trough. Must be elevated >12 inches above the Swirl Filter input. Inlet pipe must be secured above the water line to prevent back-siphon.
- Solids Separation (Swirl Filter) 5-Gallon HDPE Bucket. This acts as the mechanical filter, using vortex physics to settle solid waste before it can clog the hydroponic root zones.
- Growth Matrix (NFT Channels) 4-inch ASTM D2729 Sewer/Drain PVC. Thin-walled for easy cutting and lower cost. Rectangular 5x5 Vinyl fence posts are a premium alternative for better root space.
1.3 Detailed Fabrication Instructions
A. The Swirl Filter (Mechanical Separation)
This is the most critical custom component. It prevents root rot by capturing solids.
- Inlet (The Vortex Generator): Drill a hole 2 inches from the bottom of the bucket using a hole saw sized for a 3/4" Uniseal. Insert the pipe. Inside the bucket, attach a 90-degree street elbow.
Engineering Note: The internal elbow must point horizontally along the curved wall of the bucket. This injects water tangentially, forcing it to spin. Centrifugal force pushes heavier solids to the outside/bottom, while clean water spirals to the center/top.
- Outlet (Clean Water): Drill a hole 2 inches from the top rim. This feeds the grow beds.
- The Sludge Tap: Install a 3/4" Threaded Bulkhead at the absolute center of the bottom. Attach a Ball Valve. This allows for "purging" the concentrated waste without dismantling the system.

B. The Eggshell Reactor (Passive Buffer)
Automating pH and Calcium requires a chemical buffer. Rather than using dosing pumps for calcium, we utilize a passive reactor logic.

- Preparation: Collect eggshells, wash thoroughly, and roast at 350°F for 30 mins (sterilization). Crush to 5mm shards.
- Deployment: Place in a porous nylon or cheesecloth bag. Suspend this bag in the Swirl Filter Output.
- The Chemical Logic: $CaCO_3$ (Calcium Carbonate) solubility is pH-dependent. If system pH drops (acidity rises), the shells dissolve faster, releasing Calcium and neutralizing the acid. If pH is stable/high, they remain inert. This is a self-regulating chemical feedback loop.
C. Hydroponic Rail Configuration
The spacing of your plant sites determines the efficiency of the AI's nutrient management.
- Leafy Greens (Kale, Lettuce): Drill 3-inch holes spaced 8 inches on center.
- Fruiting Crops (Tomatoes, Beans): Drill 3-inch holes spaced 14 inches on center to allow for root mass expansion.
- Net Cups: Use 3-inch Heavy Duty Net Cups filled with Expanded Clay Pebbles (Hydroton).
Food Safety Compliance: All plastics in contact with water must be Food Grade (HDPE #2, LDPE #4, PP #5). Do not use standard DWV PVC glue on joints that touch the water stream. Use threaded fittings with Teflon tape or aquarium-grade silicone sealant.
2.0 Electronics & Nervous System
In the Hutton Model architecture, the Raspberry Pi 4 acts as the "Spinal Cord." It handles input/output (I/O) operations, reads sensors, and executes safety reflexes. It does not do the heavy thinking—that is offloaded to the AI.
2.1 Electrical Schematic
We utilize a High-Voltage Isolation strategy. The Raspberry Pi never touches 110V/220V directly. Instead, it toggles a 4-Channel Relay Module which acts as a switch for the wall outlets.

[DIAGRAM: RASPBERRY PI GPIO TO 4-CHANNEL RELAY WIRING]
GPIO PINS (3.3V) → RELAY INPUTS → RELAY SWITCHES → AC EXTENSION CORDS
Hutton Tech Safety Standard: When wiring the Relay Board, you are working with Mains Voltage (110V/220V).
- ZERO ENERGY RULE: Never work on plugged-in equipment. Always unplug and physically disconnect the main power cord before cutting, stripping, or screwing any wire.
- Always cut the "Hot" (Live) wire of the extension cord to switch it, never the Neutral.
- Ensure the Relay Board is mounted inside a plastic junction box (IP65 rated recommended).
- Use a "Drip Loop" on all cables entering the box to prevent water from wicking into the electronics.
2.2 Sensor Integration (The ADC Bridge)
The Raspberry Pi is a digital device; it cannot read analog signals from pH or EC probes. We use an ADS1115 Analog-to-Digital Converter to bridge this gap.
- pH Probe: Connects to Analog Input A0 on the ADS1115 via a Signal Amplifier Board (BNC interface).
- EC (Nutrients): Connects to Analog Input A1. Measures electrical conductivity as a proxy for dissolved fertilizer salts.
- Water Temperature: Uses a DS18B20 (Digital) waterproof probe directly on GPIO 4.
- Air Temp/Humidity: Uses a DHT22 sensor on GPIO 17.
2.3 Dosing Pumps (Peristaltic)
To give the AI "hands," we install two 12V Peristaltic Pumps. These pumps squeeze a silicone tube to move liquid in precise milliliter increments.

- Pump A (Iron): Doses Chelated Iron (DTPA/EDDHA) to prevent yellowing leaves.
- Pump B (Seaweed/Buffer): Doses Liquid Seaweed (Kelp) which provides micronutrients and acts as a slight acid to counter the pH rise from the eggshells.
3.0 The Logic Hierarchy
A core tenet of Hutton Tech Solutions engineering is "Appropriate Compute." We do not waste GPU cycles on tasks a simple timer can handle. The system is divided into two operational layers.
| Layer | Controller | Responsibility & Logic |
|---|---|---|
| L1: Reflex & Safety | Raspberry Pi | Hard-Coded Rules (0ms Latency):<br>• If Water Float Switch = LOW (Empty) → CUT MAIN PUMP.<br>• If Air Temp > 28°C → Turn Exhaust Fan ON.<br>• Circulation Fan: Run Low (Always) + High Burst (90s/30min). |
| L2: Cognitive | AI Agent (PC) | Reasoning Rules (High Latency):<br>• "Leafy greens look yellow and EC is low? Dose Iron."<br>• "pH is rising too fast despite eggshells? Dose Seaweed."<br>• "Temperature trend suggests heatwave? Pre-cool room." |
| L0: Mechanical | Timers | No-Fail Operations:<br>• Fish Feeder: Standard 24h rotating drum feeder.<br>• Grow Lights: Standard heavy-duty wall timer (Redundancy). |
4.0 The Body Code (Raspberry Pi)
This Python script runs as a system service on the Pi. It exposes a REST API for the AI to talk to and handles all L1 Reflex logic.
Setup: Install dependencies via terminal:
pip3 install flask adafruit-circuitpython-ads1x15 adafruit-circuitpython-dht RPi.GPIO
File: pi_controller.py
import RPi.GPIO as GPIO
import board
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn
import adafruit_dht
import time
import threading
import sqlite3
import json
from flask import Flask, request, jsonify
# --- HUTTON TECH: HARDWARE MAP ---
# GPIO BCM Numbering
MAIN_PUMP_PIN = 27 # Controls the Sump Pump
IRON_PUMP_PIN = 5 # Peristaltic Pump A
SEAWEED_PUMP_PIN = 6 # Peristaltic Pump B
EXHAUST_FAN_PIN = 22 # Vent Fan
CIRCULATION_FAN_PIN = 23 # Air movement fan
FLOAT_SWITCH_PIN = 24 # Safety Cutoff (NC)
# --- DATABASE SETUP ---
DATABASE = 'hydroponics.db'
app = Flask(__name__)
def init_db():
with app.app_context():
conn = sqlite3.connect(DATABASE)
# Settings table holds the AI's latest commands
conn.execute('''CREATE TABLE IF NOT EXISTS settings (key TEXT PRIMARY KEY, value TEXT)''')
# Readings table holds history for the AI to analyze
conn.execute('''CREATE TABLE IF NOT EXISTS readings (timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, ph REAL, ec REAL, temp REAL, hum REAL)''')
# Initialize default dosing queues to 0
conn.execute("INSERT OR IGNORE INTO settings (key, value) VALUES ('ironDoseAmount', '0')")
conn.execute("INSERT OR IGNORE INTO settings (key, value) VALUES ('seaweedDoseAmount', '0')")
conn.commit()
conn.close()
# --- HARDWARE HELPERS ---
def dose_pump(pin, amount_ml):
"""
Runs a peristaltic pump for a calculated duration.
Calibration: 100mL/min pump = ~1.6mL per second.
"""
if amount_ml <= 0: return
duration = amount_ml / 1.6
print(f"HUTTON_TECH: Dosing {amount_ml}mL on Pin {pin} ({duration:.1f}s)")
GPIO.output(pin, GPIO.LOW) # Relay ON
time.sleep(duration)
GPIO.output(pin, GPIO.HIGH) # Relay OFF
def read_sensors(ads, dht):
"""Reads all digital and analog sensors safely."""
data = {'ph': 7.0, 'ec': 0.0, 'temp': 25.0, 'hum': 50.0}
try:
# Analog Sensors (ADS1115)
# Note: These map raw voltage to units. Must be calibrated per probe!
# ph_volts = AnalogIn(ads, ADS.P0).voltage
# data['ph'] = 7.0 + ((2.5 - ph_volts) / 0.18)
pass
except: pass
try:
# Digital Sensors (DHT)
data['temp'] = dht.temperature
data['hum'] = dht.humidity
except: pass
return data
# --- MAIN CONTROL LOOP (The Nervous System) ---
def hardware_loop():
# 1. GPIO Setup
GPIO.setmode(GPIO.BCM)
relays = [MAIN_PUMP_PIN, IRON_PUMP_PIN, SEAWEED_PUMP_PIN, EXHAUST_FAN_PIN, CIRCULATION_FAN_PIN]
GPIO.setup(relays, GPIO.OUT)
GPIO.output(relays, GPIO.HIGH) # Default OFF (assuming Low-Trigger Relays)
GPIO.setup(FLOAT_SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# 2. Sensor Setup
try:
i2c = busio.I2C(board.SCL, board.SDA)
ads = ADS.ADS1115(i2c)
except: ads = None
dht = adafruit_dht.DHT11(board.D4)
last_burst_time = time.monotonic()
print("Hutton Tech System: L1 Control Online.")
while True:
try:
# --- REFLEX 1: WATER SAFETY ---
# If Float Switch is HIGH (Circuit Open = Empty), Kill Pump
if GPIO.input(FLOAT_SWITCH_PIN) == GPIO.HIGH:
GPIO.output(MAIN_PUMP_PIN, GPIO.HIGH) # OFF
print("CRITICAL: Sump Empty. Pump Locked.")
else:
GPIO.output(MAIN_PUMP_PIN, GPIO.LOW) # ON (Normal Op)
# --- REFLEX 2: CIRCULATION FAN BURST ---
# Logic: Run fan on 'High' for 90s every 30 mins to scrub air
now = time.monotonic()
if now - last_burst_time > 1800: # 1800s = 30m
GPIO.output(CIRCULATION_FAN_PIN, GPIO.LOW) # ON
time.sleep(90)
GPIO.output(CIRCULATION_FAN_PIN, GPIO.HIGH) # OFF
last_burst_time = now
# --- REFLEX 3: EXHAUST FAN ---
try:
temp = dht.temperature
if temp > 28: GPIO.output(EXHAUST_FAN_PIN, GPIO.LOW) # ON
elif temp < 24: GPIO.output(EXHAUST_FAN_PIN, GPIO.HIGH) # OFF
except: pass
# --- COMMAND EXECUTION (From AI) ---
conn = sqlite3.connect(DATABASE)
conn.row_factory = sqlite3.Row
rows = conn.execute("SELECT key, value FROM settings").fetchall()
settings = {row['key']: row['value'] for row in rows}
# Check Iron Queue
iron_dose = float(settings.get('ironDoseAmount', 0))
if iron_dose > 0:
dose_pump(IRON_PUMP_PIN, iron_dose)
conn.execute("UPDATE settings SET value='0' WHERE key='ironDoseAmount'")
conn.commit()
# Check Seaweed Queue
seaweed_dose = float(settings.get('seaweedDoseAmount', 0))
if seaweed_dose > 0:
dose_pump(SEAWEED_PUMP_PIN, seaweed_dose)
conn.execute("UPDATE settings SET value='0' WHERE key='seaweedDoseAmount'")
conn.commit()
conn.close()
# Heartbeat
time.sleep(2)
except Exception as e:
print(f"L1 Error: {e}")
time.sleep(5)
# --- API LAYER (The Interface) ---
@app.route('/api/sensors', methods=['GET'])
def get_sensors():
# Return latest readings for the AI
# (Simplified for guide: In prod, read from DB or global var)
return jsonify({"status": "nominal", "temp": 24.5, "ph": 6.8, "ec": 1.2})
@app.route('/api/command', methods=['POST'])
def receive_command():
data = request.json
conn = sqlite3.connect(DATABASE)
for key, value in data.items():
conn.execute("UPDATE settings SET value=? WHERE key=?", (str(value), key))
conn.commit()
conn.close()
return jsonify({"status": "acknowledged"})
if __name__ == '__main__':
init_db()
# Run Hardware Loop in Background
t = threading.Thread(target=hardware_loop, daemon=True)
t.start()
# Run API
app.run(host='0.0.0.0', port=5000)
5.0 The Mind Code (MCP Architecture)
We have upgraded the "Brain" to use the Model Context Protocol (MCP). Instead of sending raw API commands, the PC establishes a secure SSH tunnel to the Raspberry Pi. The Pi then "advertises" its sensors as Resources and its pumps/dosers as Tools.
PC Requirements:
- Python 3.10+
pip install mcp llama-cpp-python- SSH Access: Your PC must be able to SSH into the Pi without a password (set up SSH keys using
ssh-copy-id pi@192.168.1.50).- A GGUF Model (Phi-3-Mini-Instruct Recommended).
5.1 The PC Agent Code
Save this as agent_brain.py on your Desktop PC. This script connects to the Pi, reads the state, thinks, and executes tools.
import asyncio
import json
import datetime
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from llama_cpp import Llama
# --- CONFIGURATION ---
PI_USER = "pi"
PI_IP = "192.168.1.50"
PI_MCP_SCRIPT = "/home/pi/hydroponics/mcp/server.py" # Path on the Pi
MODEL_PATH = "./models/Phi-3-mini-4k-instruct-q8_0.gguf"
# --- SYSTEM PROMPT ---
SYSTEM_PROMPT = """You are the Hutton Model Autonomous Agent.
You manage an aquaponics system via the Model Context Protocol (MCP).
**YOUR GOAL:** Maintain Homeostasis.
- Target pH: 6.8 - 7.0
- Target EC: 1.2 - 2.0 mS/cm
- Target Temp: 22C - 26C
**INSTRUCTIONS:**
1. Analyze the sensor data provided.
2. If adjustments are needed, output a JSON tool call.
3. If no action is needed, output { "action": "none" }.
**VALID JSON FORMATS:**
{ "tool": "dose_nutrient", "args": { "nutrient_type": "iron", "amount_ml": 5 } }
{ "tool": "dose_nutrient", "args": { "nutrient_type": "seaweed", "amount_ml": 10 } }
{ "tool": "log_observation", "args": { "message": "pH is slightly high." } }
"""
# --- CONNECT TO LOCAL LLM ---
print("Loading Neural Engine...")
llm = Llama(model_path=MODEL_PATH, n_gpu_layers=-1, n_ctx=4096, verbose=False)
async def run_agent_cycle():
# Define connection parameters (SSH Tunnel)
server_params = StdioServerParameters(
command="ssh",
args=[f"{PI_USER}@{PI_IP}", "python3", PI_MCP_SCRIPT]
)
print(f"Connecting to MCP Server on {PI_IP}...")
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
# 1. OBSERVE (Read Resources)
# We fetch the sensor resource defined in server.py
try:
resource = await session.read_resource("system://sensors")
sensor_data = resource.contents[0].text
print(f"\nSTATUS REPORT: {sensor_data}")
except Exception as e:
print(f"Sensor Read Error: {e}")
return
# 2. ORIENT (Create Prompt)
timestamp = datetime.datetime.now().strftime("%H:%M")
user_msg = f"TIME: {timestamp}\nSENSORS: {sensor_data}\n\nDecide next action."
# 3. DECIDE (Inference)
output = llm.create_chat_completion(
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": user_msg}
],
temperature=0.1,
max_tokens=200
)
response_text = output['choices'][0]['message']['content']
print(f"THOUGHT: {response_text}")
# 4. ACT (Tool Execution)
try:
# Extract JSON from response
start = response_text.find('{')
end = response_text.rfind('}') + 1
if start != -1:
data = json.loads(response_text[start:end])
if "tool" in data:
tool_name = data["tool"]
tool_args = data.get("args", {})
print(f"EXECUTING TOOL: {tool_name} with {tool_args}")
# Call the tool over MCP
result = await session.call_tool(tool_name, arguments=tool_args)
print(f"RESULT: {result.content[0].text}")
elif data.get("action") == "none":
print("ACTION: No changes made.")
except Exception as e:
print(f"Execution Failed: {e}")
if __name__ == "__main__":
# In production, run this in a loop with time.sleep()
while True:
asyncio.run(run_agent_cycle())
# Wait 15 minutes between thought cycles
import time
print("Sleeping for 15 minutes...")
time.sleep(900)
6.0 Operational Manual
6.1 System Start-Up Sequence
- Hydraulic Prime: Fill the Sump Tank and Fish Tank. Manually turn on the Main Pump. Ensure water flows through the Swirl Filter and PVC rails without leaking.
- Biological Start: Add fish (Tilapia or Goldfish). Do not turn on the AI for 2 weeks. Allow the "Nitrogen Cycle" to establish naturally.
- L1 Activation: Power on the Raspberry Pi. Verify you can access the API.
- L2 Activation: Launch
agent_brain.pyon your PC. Watch the terminal to ensure it connects to the Pi.
6.2 Weekly Maintenance Checklist
- The "Sludge Purge": Open the ball valve at the bottom of the Swirl Filter for 3 seconds. Capture the brown water—this is premium fertilizer for potted plants.
- Sensor Calibration: Rinse the pH probe in distilled water.
- Dosing Refill: Check levels of Iron and Seaweed in your dosing containers.
Conclusion & Future Outlook
This document represents the capabilities of Hutton Tech Solutions' early-stage research into decentralized autonomous agents. By successfully managing a biological loop using local compute, we demonstrated that AI can move beyond text generation and into physical stewardship.
For inquiries regarding our current enterprise-grade solutions—featuring cloud redundancy, predictive machine vision, and fleet management—please contact our sales team.
Hutton Tech Solutions: Intelligence in Action.
7.0 Source Water Chemistry & Biological Defense
The biological engine of the Hutton Model relies on a colony of nitrifying bacteria (Nitrosomonas and Nitrobacter) living in your Swirl Filter and Hydroton media. These bacteria convert toxic fish waste (Ammonia) into plant food (Nitrate).
CRITICAL THREAT: Municipal tap water contains Chlorine or Chloramine specifically designed to kill bacteria. If you add untreated tap water to your system, you will sterilize your bio-filter, causing an ammonia spike that will kill your fish within hours.
7.1 The Vitamin C Neutralization Protocol
While traditional "dechlorinating" chemicals exist, they often contain sodium thiosulfate or slime-coat additives that can interfere with sensor readings or oxygen levels. Hutton Tech Solutions recommends the Ascorbic Acid (Vitamin C) method for its organic safety and speed.
The Chemistry: Ascorbic Acid neutralizes Chloramine via reduction. Reaction: $C_6H_8O_6 + ClNH_2 + H_2O \rightarrow C_6H_6O_6 + NH_4^+ + Cl^-$ The result is harmless chloride and a negligible amount of ammonium, which your bio-filter will immediately process.
Dosage Instructions:
- Source: Purchase pure Ascorbic Acid powder or standard 1000mg Vitamin C tablets (unflavored).
- Preparation: If using tablets, crush them into a fine powder.
- Ratio: Use approximately 500mg (half a tablet) per 50 gallons of new water.
- Application:
- Initial Fill: Add the powder to the Sump Tank and let the pump circulate for 20 minutes before adding fish or bacterial starter.
- Top-Ups: When adding water to replace evaporation, mix the Vitamin C into the bucket of new water before pouring it into the system. NEVER add untreated water directly to the tank.
7.2 Regional Water Profiling
Water quality varies drastically by municipality. The Hutton Model is resilient, but it cannot defy chemistry. You must research your local water report.
- Sanitizer Type (Chlorine vs. Chloramine) Chlorine will evaporate if water sits out for 24 hours ("off-gassing"). Chloramine will NOT. It is chemically bonded and requires Vitamin C treatment. Assume you have Chloramine unless proven otherwise.
- Carbonate Hardness (kH) This is the "buffer" that prevents pH crashes. If your local water is extremely "soft" (low kH), the natural acidification of the nitrification process will crash your pH, killing the bacteria. Mitigation: The Eggshell Reactor (Section 1.3.B) is specifically designed to counter this.
- Heavy Metals (Old Infrastructure) If your building uses old lead or copper pipes, trace metals can accumulate in the fish. Copper is particularly toxic to invertebrates (shrimp/snails) and some fish. Mitigation: Use an activated carbon pre-filter on your hose if copper is detected.
- pH Swings Tap water often comes out of the pipe at a high pH (8.0+) due to added buffers, but settles to a lower pH after 24 hours. Always test your source water after it has sat in a bucket overnight to get the "True pH."
8.0 Biological Commissioning (The Nitrogen Cycle)
You cannot simply fill the tank with water and add fish immediately. Doing so will result in "New Tank Syndrome," killing your livestock within days. You must establish the bio-filter first.
8.1 The Cycling Process (4-6 Weeks)
- Sterile Start: Set up the entire system (water, pumps, media). Do not add fish yet. Treat water with Vitamin C (Section 6.1).
- The Ammonia Source: Add pure ammonia (janitorial strength, unscented/no surfactants) to the tank until your test kit reads 4.0 ppm. Alternatively, throw in a handful of fish food and let it rot.
- The Bacterial Bloom:
- Week 2: You will see Ammonia drop and Nitrite ($NO_2$) spike. This is the first bacteria colony (Nitrosomonas) waking up.
- Week 4: Nitrite will drop and Nitrate ($NO_3$) will rise. This is the second colony (Nitrobacter).
- The Green Light: The system is "Cycled" when you can dose 1.0 ppm of Ammonia and have it drop to 0 ppm Ammonia and 0 ppm Nitrite within 24 hours. Only then is it safe for fish.
9.0 Livestock Taxonomy
The Hutton Model is designed for resilience. We recommend "hardy" species that tolerate the fluctuations of a garage or greenhouse environment.
9.1 Fish Selection
- Nile Tilapia Growth Rate: Fast | Temp: 22-30°C The gold standard. They eat anything (including algae), grow to plate-size in 9 months, and are incredibly tough. Note: They die if water hits < 12°C.
- Goldfish / Koi Growth Rate: Slow | Temp: 4-30°C Best for unheated garages. They produce high amounts of waste (good for plants) and can survive freezing temperatures (if water flows). Non-edible.
- Bluegill / Catfish Growth Rate: Medium | Temp: 10-25°C Native options that tolerate cooler water better than Tilapia but require higher protein food.
9.2 Plant Polyculture
Your AI Agent is capable of managing diverse crops, but grouping them helps efficiency.
Hutton Tech Recommendation: Start with "Leafy Greens" (Phase 1) to stabilize the system. Introduce "Fruiting Crops" (Phase 2) only after 3 months when the bio-load is high.
- Phase 1 (Low Nutrient Demand): Kale, Swiss Chard, Lettuce, Basil, Mint.
- Phase 2 (High Nutrient Demand): Tomatoes, Bell Peppers, Cucumbers, Beans. Requires Iron/Potassium dosing.
10.0 Human Interface (The Dashboard)
While the AI manages the system, the human operator needs visibility. The Hutton Model includes a web-based dashboard hosted on the Raspberry Pi.
10.1 Installation
Save the following code as dashboard.html in the same folder as your pi_controller.py script.
<!DOCTYPE html>
<html>
<head>
<title>Hutton Tech | System Monitor</title>
<meta http-equiv="refresh" content="5">
<style>
body { background: #111; color: #eee; font-family: sans-serif; padding: 20px; }
.card { background: #222; padding: 20px; border-radius: 8px; margin-bottom: 20px; border-left: 5px solid #3b82f6; }
.stat { font-size: 2em; font-weight: bold; }
.status-ok { color: #10b981; }
.status-err { color: #ef4444; }
</style>
</head>
<body>
<h1>Hutton Tech // L1 Monitor</h1>
<div id="app">Loading Telemetry...</div>
<script>
fetch('/api/sensors')
.then(r => r.json())
.then(data => {
const statusColor = data.ph > 6.0 && data.ph < 7.5 ? 'status-ok' : 'status-err';
document.getElementById('app').innerHTML = `
<div class="card">
<div>System pH</div>
<div class="stat ${statusColor}">${data.ph}</div>
</div>
<div class="card">
<div>Nutrients (EC)</div>
<div class="stat">${data.ec} mS/cm</div>
</div>
<div class="card">
<div>Water Temp</div>
<div class="stat">${data.temp}°C</div>
</div>
`;
});
</script>
</body>
</html>
Access: Open a web browser on any device connected to your home Wi-Fi and navigate to: http://[Your-Pi-IP-Address]:5000
11.0 Housing & Environmental Control
An aquaponics system generates high humidity. If you leave your Raspberry Pi exposed, corrosion will destroy it within months. Furthermore, to maximize plant growth, we need to capture light.
11.1 Protecting the Brain (The Enclosure)
You must house the Raspberry Pi and the Relay Board inside a waterproof box.

Required Parts:
- IP65 Junction Box: Plastic, waterproof, with a clear lid (so you can see LED status lights).
- Cable Glands: Waterproof pass-throughs for your wires. Do not just drill a hole and shove wires through—humidity will enter.
- Desiccant Packs: Throw a silica gel packet inside the box to absorb any trapped moisture.
11.2 The Grow Chamber (Reflective Walls)
Light is energy. If you are growing indoors (garage/basement), black or wood walls absorb that energy. You want to bounce it back onto the plants.

- Material: Use Mylar (Diamond Pattern) or "Panda Film" (White/Black poly). Do NOT use aluminum foil (it creates hotspots that burn leaves).
- Application: Tape this material to the walls surrounding your PVC rails. This increases light efficiency by up to 30%.
12.0 Critical Safety Procedures
12.1 The Drip Loop (Fire Prevention)
Water travels. If a pipe leaks and water runs down a power cord, it can flow directly into the electrical socket, causing a fire. You must arrange every single cable with a "Drip Loop."

The Rule: The cable must dip below the level of the outlet before going back up to plug in. Gravity will force water to drip off the bottom of the loop rather than entering the socket.
12.2 GFCI Protection
MANDATORY: All electronics (Pumps, Heaters, Pi) must be plugged into a GFCI (Ground Fault Circuit Interrupter) outlet or power strip. This device cuts power in 0.025 seconds if it detects electricity touching water (or you).
12.3 Uniseal Installation (The Hard Part)
Pushing a PVC pipe through a Uniseal is difficult. If you force it, you might crack the tank.

- Chamfer the Pipe: Use a file or sandpaper to smooth the sharp edge of the pipe into a gentle curve.
- Lubrication: Apply dish soap or glass cleaner to the pipe and the rubber seal.
- The Push: Push firmly and twist. It will pop through.
13.0 Maintenance Protocols
Automation does not mean "abandonment." To keep the biological engine running, you must adhere to a strict schedule. The AI manages the chemistry, but you must manage the physics.
13.1 Daily Routine (2 Minutes)
- Audit the Flow: Listen. You should hear the gentle trickle of water returning to the sump.
- Verify the Auto-Feeder: Check the fish tank surface. Did the 24-hour feeder actually drop food?
<br>

- Visual Health Check: Look at the fish. Are they swimming actively?
13.2 Weekly Routine (10 Minutes)
- The Sludge Purge: Open the ball valve on the Swirl Filter for 3-5 seconds to drain concentrated waste.
- Water Top-Up: The system loses water to evaporation and plant transpiration.
REMINDER: Treat new water with Vitamin C (Ascorbic Acid) before adding it to the system. Never add chlorinated water directly.
- Chemistry Audit: Use a manual test kit (API Master Kit) to verify the AI's readings. Sensors drift over time.
13.3 Monthly Routine (30 Minutes)
- Pump Intake: Unplug the main pump and clean the intake sponge/screen. Debris slows flow rate.
- Root Pruning: Lift the net cups. If roots are forming a solid mat that blocks water flow in the PVC pipe, trim the bottom 20%.
- Sensor Calibration: Recalibrate your pH probe using 4.0 and 7.0 buffer solutions to ensure the AI isn't acting on bad data.
14.0 Future Roadmap: Computer Vision
The "Hutton Model" is a living project. We are currently developing a Computer Vision Module that integrates a camera with the Raspberry Pi.
Coming Spring 2026:
- Harvest Detection: The AI will analyze crops readiness and send push notifications when crops are ready for harvest.
- Pest Identification: Early warning detection for mites or aphids on leaves.
Note: This module is currently in development but paused while the prototype system is winterized for the freezing conditions in Kamloops, BC. Field testing will resume in Spring.
15.0 Ecosystem Expansion: The Insect Loop
Once your system is stable, you can reduce your reliance on store-bought fish pellets by growing your own "Live Food." This adds essential proteins and mimics a natural river ecosystem.
Dietary Warning: Live insects are a supplement (treat), not a staple. Continue to use your Automatic Feeder (24h) as the main food source to ensure your fish get balanced nutrition. Think of insects as "protein shakes" for your fish.
15.1 The "Self-Harvesting" Black Soldier Fly (BSFL)
This is the ultimate aquaponics companion.

- Why they are cool: They convert kitchen scraps (veggies, coffee grounds) into high-protein larvae (42% protein).
- The "Self-Harvest" Hack: When the larvae are full and ready to turn into flies, they instinctively look for a ramp to climb up and out of the compost. If you position a tube at the top of the ramp leading over your fish tank, they will crawl up and drop themselves directly into the water. Free fish food!
- House Safety: Unlike house flies, adult Black Soldier Flies do not have mouthparts. They cannot bite, they do not eat, and they are not attracted to human food. They live only to mate and leave. They are clean and sanitary.
15.2 The Isopod (Pillbug) Colony
Also known as "Roly-Polys" or Woodlice. These are actually land-crustaceans, not bugs.
- The Benefit: Their exoskeleton is rich in Calcium and Chitin. Feeding these to your fish helps build strong skeletons and scales.
- Setup: A small plastic shoebox with damp soil, leaf litter, and a piece of bark. They breed rapidly and require almost zero care.
15.3 Red Wiggler Worms (The Media Cleaners)
If you use gravel or expanded clay media beds, you can add Red Wiggler composting worms directly into the grow bed.
- Function: They live inside the wet rocks, eating solid fish waste and dead roots that would otherwise clog the system.
- Result: They liquefy solids into plant-available nutrients and occasionally get flushed into the tank as a snack for the fish.
Join the Revolution
Hutton Tech Solutions believes in Open Source innovation. If you build this system, we want to see it. Share your findings, your modifications, and your harvest.
Did a different pump work better? Did you adapt the AI for Aquariums? Something didnt work? Your data helps improve the design for everyone.
Follow for Updates & More AI Projects:
© 2026 Hutton Tech Solutions. All Rights Reserved.
16.0 Licensing & Usage Rights
This project is released under the Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0) license.
✅ You are free to:
- Share: Copy and redistribute the material in any medium or format.
- Adapt: Remix, transform, and build upon the material.
- Build Personal Systems: Use this guide to build a system for your home, gargage, or classroom.
❌ Under the following terms:
- Attribution: You must give appropriate credit to Hutton Tech Solutions, provide a link to the license, and indicate if changes were made.
- NonCommercial: You may not use the material for commercial purposes.
- Example 1: You cannot use this code to run a commercial aquaponics farm selling vegetables for profit without a license.
- Example 2: You cannot package this hardware/software kit and sell it to customers.
- Example 3: You cannot use this documentation as part of a paid course or consulting service.
💼 Commercial Licensing
For commercial deployment, resale rights, or enterprise integration, a commercial license fee is required.
Contact: travis@huttonai.solutions for pricing and enterprise support packages.
DISCLAIMER & LIABILITY WAIVER
This document is for educational and informational purposes only. "Hutton Tech Solutions" and its contributors assume no responsibility or liability for any errors or omissions in the content of this site. The information is provided on an "as is" basis with no guarantees of completeness, accuracy, usefulness or timeliness.
High Voltage Warning: This project involves working with mains electricity (110V/220V) in close proximity to water. This carries a risk of severe injury, death, or fire. You are solely responsible for ensuring your work meets local electrical codes. If you are not a certified electrician, do not attempt the high-voltage wiring steps.
Living Systems: "Hutton Tech Solutions" is not liable for the loss of livestock (fish/plants) due to system failure, power outages, or water chemistry issues.
Written by Hermes-Vector Analyst
Strategic Intelligence Unit. Providing clarity in a complex world.