Contents — find the section you need
Separate solids capture from nitrogen and phosphorus load
Do not call cloudy water and dissolved nitrate one load
The previous guide separated fish tank, biofilter and plant observations. This guide separates fish solids from dissolved nitrogen and phosphorus. Cornell describes aquaponics as a path through fish tanks, solids collection, plant areas and return circulation. Cornell Small Farms
Solids capture changes what leaves as particles and what later mineralizes. Dissolved nitrogen passes through nitrification and plant uptake. Phosphorus can be concentrated in solids and must not be inferred from a nitrogen equation.
Keep four paths in separate ledgers
| Path | Record | Do not conflate with |
|---|---|---|
| Solids capture | Mass, water content, time and destination | Dissolved nitrate concentration |
| Dissolved nitrogen | Ammonia, nitrite, nitrate and flow | Total nitrogen in feed |
| Phosphorus | Dissolved/particulate, capture and discharge | Nitrogen-derived estimate |
| Plant uptake and discharge | Harvest, discharge and recovery | Pre-filter load |
Measure filter inlet and outlet together. Whether captured solids are discarded, mineralized separately or returned to plants changes downstream load.
Calculate a synthetic load
Assume daily inputs of 10 g nitrogen and 1.2 g phosphorus from feed. Solids capture removes 3 g N and 0.8 g P; plants take up 4 g dissolved N and 0.2 g P. Residuals are 3 g N and 0.2 g P.
inputs = {"N": 10.0, "P": 1.2}
solids = {"N": 3.0, "P": 0.8}
plants = {"N": 4.0, "P": 0.2}
residual = {k: inputs[k] - solids[k] - plants[k] for k in inputs}
print(residual)
The output is {'N': 3.0, 'P': 0.2}. Residuals may include nitrification, tank storage, other discharge and measurement error; they are not plant uptake or a safe loading limit.
Record the destination of captured solids
Moving solids to another vessel does not make nutrients disappear. Record water content, storage time, treatment and whether material is returned, composted or discarded. If treated liquid returns, register a new lot in both nutrient and sanitation ledgers.
Do not replenish phosphorus or trace elements by assuming the nitrogen ratio. Separate feed, fish, media, plant biomass and discharge boundaries, and do not force unexplained residuals to zero.
Scope
This guide covers solids, nitrogen and phosphorus accounting boundaries. Feed composition, filter design, mineralization kinetics, species limits, pathogens and food release decisions remain outside scope. Next comes design variables connecting water-quality load with fish and plant capacity.
Connect water-quality load to fish and plant capacity
One fish-to-plant ratio is not a system design
The previous guide separated solids, nitrogen and phosphorus loads. This guide connects those loads to fish-tank, biofilter and plant capacity. Oklahoma State University treats solids removal, biofiltration and the hydroponic unit as separate components and recommends adding capacity after sizing them.SRAC aquaponics guide
The relationship between plants and fish changes with species, growth stage, feeding rate, filtration, flow and harvest cycle. Do not turn a fixed ratio into a safety limit or performance guarantee. Compare load and capacity over the same daily time window.
Keep five design tables
| Table | Minimum variables | Compare capacity with |
|---|---|---|
| Fish tank | Biomass, feed, feeding times, temperature, DO | Respiration, excretion and tank volume |
| Solids | Inlet mass, capture, water content, destination | Filter throughput and cleaning interval |
| Biofilter | Ammonia load, nitrite, nitrate, contact area, flow | Peak load and oxygen supply |
| Plants | Growing area, crop stage, harvest, uptake | Dissolved nutrient residual and light/water temperature |
| Hydraulics and headroom | Recirculation, exchange, downtime, reserve | Minimum zone flow and recovery time |
Do not use fish biomass as a substitute for feed input. As fish move from juvenile to harvest stage, feed and waste time series change even when the count stays the same. Record newly planted and harvest-ready plant areas as separate stages.
Assign a synthetic daily load to capacity
Assume 100 g daily feed, 10 g nitrogen load, 3 g nitrogen in the solids path and a 4 g plant uptake target. The residual is 3 g, including biofilter processing, tank storage, discharge and measurement error. Do not increase plant area just to force that residual to zero; assign it to the next capacity columns.
load = {"feed_g": 100.0, "N_g": 10.0}
paths = {"solids_N_g": 3.0, "plant_target_N_g": 4.0,
"biofilter_or_other_N_g": 3.0}
assert sum(paths.values()) == load["N_g"]
capacity = {"fish_tank_feed_g": 120.0,
"biofilter_N_g": 3.5,
"plant_target_N_g": 5.0}
headroom = {"feed_g": capacity["fish_tank_feed_g"] - load["feed_g"],
"biofilter_N_g": capacity["biofilter_N_g"] - paths["biofilter_or_other_N_g"],
"plant_N_g": capacity["plant_target_N_g"] - paths["plant_target_N_g"]}
print(headroom)
The output is {'feed_g': 20.0, 'biofilter_N_g': 0.5, 'plant_N_g': 1.0}. These are synthetic capacity differences, not species limits, food-safety conclusions or pathogen controls. Use the smallest headroom to identify whether the fish tank, biofilter, plant unit or pump becomes the first constraint.
Keep time windows and downtime boundaries
Daily averages can hide post-feeding peaks, night-time oxygen decline, pump stoppage and filter bypass during cleaning. Record feeding time, sampling time, flow, DO, ammonia, nitrite, nitrate and solids status. During downtime, do not assume plant area makes the system safe; keep fish tank, biofilter and plant recovery steps separate.
Scope
This guide covers variables, time windows and headroom for connecting load to capacity. Species thresholds, hardware filter design, feed composition, fluid calculations and food-release decisions remain outside scope. Next comes operating updates to the design table from fish, microbe and plant observations.
Update load and capacity tables from observations
Do not collapse observations into one health score
The previous guide separated feed, biomass, solids, biofiltration, plant area and flow into capacity tables. This guide updates those tables from fish, microbe and plant observations. Oklahoma State University describes monitoring ammonia, nitrite, nitrate, pH, temperature and dissolved oxygen, while checking fish, bacteria and plants separately. Nitrification and Maintenance
A timestamped snapshot can group measurements, but it should not merge their meanings. Low fish-tank DO, rising biofilter nitrite and reduced plant uptake have different boundaries and responses.
Keep five boundaries in each snapshot
| Boundary | Representative observations | Table fields updated |
|---|---|---|
| Fish tank | Biomass, feed, DO, temperature, behavior | Input load and fish headroom |
| Solids | Captured mass, water content, cleaning time, destination | Solids path and filter headroom |
| Biofilter | Ammonia, nitrite, nitrate, flow | Conversion load and filter headroom |
| Plants | Area, crop stage, harvest, leaf condition | Uptake target and plant headroom |
| Hydraulic/sanitation | Recirculation, downtime, zone, lot | Recovery and isolation state |
Attach observed_at, sampling location, unit, method and missing-data reason to every row. Missing data should become a review state, not a new measurement copied from the previous row.
Calculate a headroom change with synthetic data
Place morning and evening observations against the previous capacity table. Here we calculate feed, biofilter nitrogen and plant uptake headroom.
capacity = {"feed_g": 120.0, "biofilter_N_g": 3.5, "plant_N_g": 5.0}
morning = {"feed_g": 100.0, "biofilter_N_g": 3.0, "plant_N_g": 4.0}
evening = {"feed_g": 108.0, "biofilter_N_g": 3.2, "plant_N_g": 4.4}
headroom = {
slot: {k: capacity[k] - obs[k] for k in capacity}
for slot, obs in [("morning", morning), ("evening", evening)]
}
delta = {k: headroom["evening"][k] - headroom["morning"][k] for k in capacity}
print(headroom)
print(delta)
The morning headroom is {'feed_g': 20.0, 'biofilter_N_g': 0.5, 'plant_N_g': 1.0}; evening is {'feed_g': 12.0, 'biofilter_N_g': 0.3, 'plant_N_g': 0.6}; the change is {'feed_g': -8.0, 'biofilter_N_g': -0.2, 'plant_N_g': -0.4}. A negative change means less remaining headroom. It is not an instruction to change feed or flow automatically.
Separate updates from stop states
Define states such as normal, watch, hold and isolate. watch asks for repeat sampling or sensor review. hold pauses new feeding, transfer or reintroduction. isolate separates a lot or zone. Record who can release the state and which observation is required.
Sensor missingness, calibration age and a changed sampling location are quality flags separate from the water-quality value. Do not hide an abnormal value with an average or substitute a value from another zone.
Scope
This guide covers observation snapshots, headroom updates and state-transition records. Species thresholds, sensor calibration, pathogen decisions, food release and hardware automation remain outside scope. Next comes zone- and lot-level isolation and recovery records from observation history.
Zone isolation and staged recovery records
A restarted zone can still contain held lots
Following the observation update guide, connect an incident to its isolation and recovery records. A zone identifies equipment and water connections; a lot identifies a fish cohort, plant production or harvest batch, or collected water. Restoring zone flow does not release every associated lot.
Oklahoma State University describes monitoring ammonia, nitrite, nitrate, pH, temperature and dissolved oxygen for fish, bacteria and plants. See Nitrification and Maintenance. The record design below is an original example informed by these monitoring needs, not a recovery procedure prescribed by that university.
Reconstruct connections before detection
Record the detection time separately from the period under investigation. Review water through shared tanks, fish transfers and plant irrigation since the previous valid observation. Mark missing periods as unresolved rather than recording that no contact occurred.
| Record | Required information | Synthetic example |
|---|---|---|
| Incident | ID, detection time, observation ID, location | INC-01, 09:00, OBS-17, fish tank A |
| Investigation interval | Basis for start, end, unknown periods | Valid observation at 08:00 through verified separation at 09:10 |
| Connections | Supply, return, bypass and change times | Water W-01 transferred to shared tank at 08:40 |
| Lots | Fish, plants, water and parent relationships | F-A, P-A, W-01 and mixed child W-02 |
| Isolation verification | Requested action, observed result, operator, evidence | Closure requested 09:05; flow path checked 09:10 |
Lot ancestry helps investigate origins. To investigate destinations from suspect W-01, follow its children and descendants forward, then their subsequent contacts. The current plumbing diagram cannot reconstruct transfers made before a valve closed.
Preserve life support during isolation
Disconnecting a shared loop changes water and oxygen conditions at fish tanks and biofilters. Link each zone path to site procedures for maintained aeration and circulation, alternative routes and power loss. Record irrigation and drainage destinations for disconnected plant zones too.
Keep isolation_requested separate from isolation_verified. A valve closure command does not prove physical separation, including bypasses and backflow. Reassess the capacity table after removing any biofilter capacity or plant area that isolation makes unavailable.
Recovery needs observations at a stated load
Link the recovery review to corrective work, verified equipment paths, observation quality, response under the proposed load and the responsible reviewer's decision. Define observation periods and acceptable ranges separately for the species, equipment and operating conditions. Improved water quality under no load does not demonstrate capacity for the former feeding load.
| Zone record state | Evidence to retain | Separate decision |
|---|---|---|
| isolated | Verified separation, support paths, affected lots | Confirming the cause |
| recovery_review | Corrective work, calibration and sampling checks, observations with load conditions | Reconnection approval |
| limited_restart | Approval ID, limited load, monitoring frequency, stop criteria | Return to normal load |
| normal | Post-restart observations, capacity table, reviewer decision | Individual lot holds and product release |
For example, zone A may receive limited restart approval at 10:00 while W-01, transferred at 08:40, and its mixed child W-02 remain on hold. If the abnormality returns at 11:00, append a record under the same incident ID, revoke the limited restart and investigate lots contacted during reconnection. Preserve earlier normal observations and hold history.
Build one recovery record
For synthetic incident INC-01, create separate rows for zone A's limited restart and W-02's continuing hold. Include event_id, object_type, object_id, previous_state, new_state, effective_at, recorded_at, evidence_ids, reviewer and next_review_at. Use timezone-aware times so late entries can be reconstructed in occurrence order.
Check three things: can W-02 be traced back to W-01; is zone restart approval kept separate from water-lot release; and can contacts after 10:00 be added when the incident recurs? Missing evidence and unresolved investigations must remain visibly incomplete.
Scope and next step
This guide designs records linking incidents, connections, lots and recovery decisions. It does not validate equipment isolation, species limits, pathogen assays, treatment conditions or food release. The introductory aquaponics sequence now leads to fungal biology, substrates and growth phases in controlled mushroom cultivation, whose assumptions must be developed separately from photosynthetic plant models.

Comments
Please log in to post a comment
No comments yet.