Open Controlled Environment Agriculture Data Standard
A privacy-first, offline-first data interchange standard for soilless cultivation. Covers hydroponic, aeroponic, fogponic, Kratky, aquaponic, bio-integrated, and fungal cultivation systems. Built on VODS. Fields verified against NASA Advanced Plant Habitat parameters.
OCEADS is a domain specialization of VODS (Veydrin Open Data Standard). Every OCEADS document is a valid VODS document. OCEADS adds the oceads_version field and the domain payload — grow_cycles, environment_logs, nutrient_logs, harvests, and the optional aquatic_module — on top of the VODS envelope.
Refer to the VODS v1.0 specification for the authoritative definition of envelope fields, the anonymization model, the extensions system, and the versioning contract. This document specifies only what OCEADS adds.
Every OCEADS document carries the VODS envelope (inherited) plus the OCEADS domain version field. At least one payload array MUST be present and non-empty.
.oceads.json. This implies VODS envelope conformance.
| Field | Type | Source | Req? | Description |
|---|---|---|---|---|
vods_version | string | VODS | req | VODS version. MUST be "1.0" for VODS v1.0 conformance. |
export_id | string (UUID) | VODS | req | Random UUID v4, fresh per export. Never reused. |
export_date | string (ISO 8601) | VODS | req | Full datetime with timezone. "2026-03-09T14:22:00Z". |
export_mode | enum | VODS | req | "anonymous" or "tracked". See VODS §3. |
oceads_version | string | OCEADS | req | OCEADS version. Currently "1.0". |
extensions | object | VODS | opt | Namespaced org-specific fields. See VODS §4. |
An OCEADS document must contain at least one of: grow_cycles, environment_logs, nutrient_logs, or harvests. Any present array must be non-empty. A document with only an aquatic_module and no other payload is not valid OCEADS.
One record per cultivation run from start to finish. The grow_cycles array contains these records. A grow cycle is the top-level container that links environment logs, nutrient logs, and harvests together. All other records reference a cycle_ref to associate with a cycle.
| Field | Type | Req? | NASA APH | Description |
|---|---|---|---|---|
cycle_ref | string | req | Pseudonymous cycle identifier. Generated per active export_mode. Links all records for this cycle. | |
system_ref | string | req | Pseudonymous system identifier. Groups cycles by physical grow system. | |
system_type | enum | req | hydroponic · aeroponic · fogponic · kratky · aquaponic · bio_integrated · fungal · hybrid | |
start_date | string (date) | req | Date germination, inoculation, or cycle start. ISO 8601. | |
end_date | string (date) | opt | Date of final harvest or cycle termination. Omit if cycle is ongoing. | |
cultivar | string | req | ✓ tracked per experiment | Species and variety. Free text. Examples: "Lactuca sativa 'Outredgeous'", "Pleurotus ostreatus", "Capsicum annuum 'Hatch Green'". |
substrate | enum | opt | ✓ porous clay substrate | rockwool · clay_pebbles · coco_coir · perlite · vermiculite · nutrient_film · deep_water · air · straw · sawdust · masters_mix · other |
grow_area_sqcm | number | opt | Net grow area in square centimeters. | |
plant_count | integer | opt | ✓ tracked per experiment | Number of plants, seedlings, or inoculation sites at start. |
photoperiod_hours | number | opt | ✓ APH controlled parameter | Hours of light per 24-hour period. |
light_spectrum | string[] | opt | ✓ red/green/blue/white/far-red/IR | Active spectrum channels. Suggested values: red · blue · green · white · far_red · uv · infrared · full_spectrum |
light_intensity_umol | number | opt | ✓ PAR 400–700nm | Target PPFD (photosynthetic photon flux density) in µmol/m²/s. |
cycle_notes | string | opt | Free-text notes on this cycle. Omit in anonymous exports if stripping notes. |
One record per environmental measurement event. The environment_logs array contains these records. May be logged automatically by sensors (high-frequency) or manually by the grower (low-frequency). All fields except cycle_ref and logged_at are optional — include what the system actually measures.
| Field | Type | Req? | NASA APH | Description / Unit |
|---|---|---|---|---|
cycle_ref | string | req | Links this log to a grow cycle. | |
logged_at | string (ISO 8601) | req | Full datetime of measurement. "2026-03-09T08:00:00Z". | |
air_temp_c | number | opt | ✓ APH controlled | Ambient air temperature in °C. |
humidity_rh | number | opt | ✓ APH controlled | Relative humidity, 0–100%. |
co2_ppm | number | opt | ✓ APH controlled + logged | CO₂ concentration in parts per million. |
vpd_kpa | number | opt | Vapor pressure deficit in kPa. Derived from temp + humidity; include if calculated. | |
par_umol | number | opt | ✓ APH in-chamber PAR sensor | Measured PPFD at canopy in µmol/m²/s. |
dli_mol | number | opt | Daily light integral in mol/m²/day. Derived from PAR over photoperiod. | |
root_zone_temp_c | number | opt | ✓ APH root zone moisture + temp | Root zone / reservoir temperature in °C. |
substrate_moisture_pct | number | opt | ✓ APH controlled parameter | Root zone substrate moisture, 0–100%. |
canopy_photosynthesis_umol | number | opt | ✓ APH CO₂ drawdown technique | Measured canopy photosynthesis rate in µmol CO₂/m²/s. Research-grade systems only. |
o2_ppm | number | opt | ✓ APH atmosphere O₂ | Dissolved or atmospheric oxygen in ppm. |
water_consumption_ml | number | opt | ✓ APH water recovery tracking | Water consumed or transpired since last log, in mL. |
One record per nutrient solution measurement or adjustment event. The nutrient_logs array contains these records. Covers solution chemistry for all liquid-feed systems (hydroponic, aeroponic, aquaponic). Not applicable for fungal-only or fully passive setups; omit the array in that case.
| Field | Type | Req? | Description / Unit |
|---|---|---|---|
cycle_ref | string | req | Links this log to a grow cycle. |
logged_at | string (ISO 8601) | req | Full datetime of measurement. |
ec_ms | number | opt | Electrical conductivity in mS/cm (nutrient concentration proxy). |
ph | number | opt | Solution pH, 0–14. |
tds_ppm | number | opt | Total dissolved solids in ppm. Include if measured directly. |
water_temp_c | number | opt | Nutrient solution temperature in °C. |
do_mg_l | number | opt | Dissolved oxygen in mg/L. |
reservoir_volume_l | number | opt | Total reservoir volume at time of measurement, in liters. |
top_off_volume_l | number | opt | Volume of water added to reservoir since last log, in liters. |
nutrient_brand | string | opt | Nutrient product name. Free text. Example: "General Hydroponics Flora Series". |
nutrient_ratio | string | opt | Grow/Micro/Bloom or A/B ratio as free text. Example: "1:2:3". |
adjustment_action | enum | opt | ph_up · ph_down · nutrient_add · water_add · reservoir_change · flush · none |
nitrogen_ppm | number | opt | Measured nitrogen in ppm. Research-grade only. |
phosphorus_ppm | number | opt | Measured phosphorus in ppm. Research-grade only. |
potassium_ppm | number | opt | Measured potassium in ppm. Research-grade only. |
calcium_ppm | number | opt | Measured calcium in ppm. Research-grade only. |
log_notes | string | opt | Free-text notes on this adjustment. Omit in anonymous exports if stripping notes. |
One record per harvest event within a cycle. The harvests array contains these records. A cycle may have multiple harvests (cut-and-come-again, staggered, or partial). Final harvest should be accompanied by the end_date on the grow cycle record.
| Field | Type | Req? | NASA APH | Description |
|---|---|---|---|---|
cycle_ref | string | req | Links this harvest to a grow cycle. | |
harvest_date | string (date) | req | ✓ APH records harvest dates | Date of harvest. |
harvest_type | enum | req | full · partial · cut_and_come_again · thinning | |
fresh_weight_g | number | opt | ✓ APH yield measurement | Fresh biomass yield in grams. |
dry_weight_g | number | opt | ✓ APH research samples | Dry biomass yield in grams. Research/post-processing only. |
yield_per_sqcm_g | number | opt | Derived: fresh_weight_g / grow_area_sqcm. Include if calculated. | |
days_to_harvest | integer | opt | ✓ APH tracks growth duration | Days from cycle start to this harvest. |
quality_rating | enum | opt | Grower subjective quality assessment: excellent · good · fair · poor | |
flavor_rating | integer | opt | ✓ crew sensory assessments in Veggie/APH | Grower flavor score, 1–5. |
texture_rating | integer | opt | ✓ crew sensory assessments | Grower texture score, 1–5. |
microbial_test | enum | opt | ✓ APH microbiological sampling | Result of food safety microbial test: pass · fail · not_tested |
harvest_notes | string | opt | Free-text notes. Omit in anonymous exports if stripping notes. |
The aquatic_module object is optional and applies only to aquaponic systems where fish or other aquatic organisms are part of the cultivation loop. When present, it contains a system_ref linking it to a grow cycle's system, plus tank condition records.
| Field | Type | Req? | Description |
|---|---|---|---|
system_ref | string | req | Links to the grow cycle's system_ref. |
species | string | req | Aquatic species. Free text. Example: "Oreochromis niloticus" (tilapia), "Cyprinus carpio" (carp). |
stocking_density_kg_m3 | number | opt | Fish biomass per cubic meter of tank volume. |
tank_volume_l | number | opt | Total tank volume in liters. |
tank_logs | array | opt | Time-series tank condition records. See §7.1. |
| Field | Type | Req? | Description / Unit |
|---|---|---|---|
logged_at | string (ISO 8601) | req | Full datetime of measurement. |
water_temp_c | number | opt | Tank water temperature in °C. |
ph | number | opt | Tank water pH. |
do_mg_l | number | opt | Dissolved oxygen in mg/L. |
ammonia_ppm | number | opt | Total ammonia nitrogen in ppm. |
nitrite_ppm | number | opt | Nitrite (NO₂) in ppm. |
nitrate_ppm | number | opt | Nitrate (NO₃) in ppm. |
fish_count | integer | opt | Current live fish count. |
feed_g | number | opt | Feed added at this log event, in grams. |
{
// VODS envelope
"vods_version": "1.0",
"export_id": "b7e3a1f2-09c4-4d8b-a332-8e4b20dd1c93",
"export_date": "2026-03-09T14:22:00Z",
"export_mode": "anonymous",
// OCEADS domain
"oceads_version": "1.0",
"grow_cycles": [
{
"cycle_ref": "C-4f91",
"system_ref": "S-a2c3",
"system_type": "hydroponic",
"start_date": "2026-02-01",
"end_date": "2026-03-05",
"cultivar": "Lactuca sativa 'Outredgeous'",
"substrate": "rockwool",
"grow_area_sqcm": 2400,
"plant_count": 24,
"photoperiod_hours": 16,
"light_spectrum": ["red", "blue", "white"],
"light_intensity_umol": 250
}
],
"environment_logs": [
{
"cycle_ref": "C-4f91",
"logged_at": "2026-02-15T08:00:00Z",
"air_temp_c": 22.4,
"humidity_rh": 65,
"co2_ppm": 1100,
"par_umol": 238,
"root_zone_temp_c": 20.1
}
],
"nutrient_logs": [
{
"cycle_ref": "C-4f91",
"logged_at": "2026-02-15T08:05:00Z",
"ec_ms": 1.4,
"ph": 6.1,
"water_temp_c": 20.3,
"do_mg_l": 7.8,
"nutrient_brand": "General Hydroponics Flora Series",
"adjustment_action": "none"
}
],
"harvests": [
{
"cycle_ref": "C-4f91",
"harvest_date": "2026-03-05",
"harvest_type": "full",
"fresh_weight_g": 1840,
"days_to_harvest":32,
"quality_rating": "excellent",
"flavor_rating": 5
}
]
}
{
// VODS envelope
"vods_version": "1.0",
"export_id": "c8f1b2a3-14d5-4e9c-b443-9f5c31ee2d04",
"export_date": "2026-03-09T14:22:00Z",
"export_mode": "anonymous",
"oceads_version": "1.0",
"grow_cycles": [
{
"cycle_ref": "C-8b02",
"system_ref": "S-f3d1",
"system_type": "fungal",
"start_date": "2026-02-10",
"end_date": "2026-03-01",
"cultivar": "Pleurotus ostreatus",
"substrate": "straw",
"plant_count": 4 // inoculation blocks
}
],
"environment_logs": [
{
"cycle_ref": "C-8b02",
"logged_at": "2026-02-18T09:00:00Z",
"air_temp_c": 18.5,
"humidity_rh": 92,
"co2_ppm": 800
}
],
"harvests": [
{
"cycle_ref": "C-8b02",
"harvest_date": "2026-02-28",
"harvest_type": "partial",
"fresh_weight_g": 620,
"days_to_harvest": 18,
"quality_rating": "good"
},
{
"cycle_ref": "C-8b02",
"harvest_date": "2026-03-01",
"harvest_type": "full",
"fresh_weight_g": 480,
"days_to_harvest": 19
}
]
}
{
// VODS envelope
"vods_version": "1.0",
"export_id": "d9a2c3b4-25e6-4f0d-c554-0g6d42ff3e15",
"export_date": "2026-03-09T14:22:00Z",
"export_mode": "tracked",
"oceads_version": "1.0",
"grow_cycles": [
{
"cycle_ref": "C-aq-3e72",
"system_ref": "S-aq-b81f",
"system_type": "aquaponic",
"start_date": "2026-01-15",
"cultivar": "Beta vulgaris 'Bull's Blood'",
"substrate": "clay_pebbles",
"plant_count": 32
}
],
"nutrient_logs": [
{
"cycle_ref": "C-aq-3e72",
"logged_at": "2026-03-01T07:00:00Z",
"ec_ms": 0.9,
"ph": 7.2,
"water_temp_c":24.1
}
],
"aquatic_module": {
"system_ref": "S-aq-b81f",
"species": "Oreochromis niloticus",
"tank_volume_l": 380,
"stocking_density_kg_m3": 12.4,
"tank_logs": [
{
"logged_at": "2026-03-01T07:05:00Z",
"water_temp_c": 24.0,
"ph": 7.1,
"do_mg_l": 6.4,
"ammonia_ppm": 0.25,
"nitrite_ppm": 0.05,
"nitrate_ppm": 18.0,
"fish_count": 45,
"feed_g": 120
}
]
}
}
An application claims OCEADS v1.0 conformance by satisfying all VODS v1.0 conformance rules (see VODS spec §6) and the following OCEADS-specific rules.
"oceads_version": "1.0".grow_cycles, environment_logs, nutrient_logs, or harvests.environment_logs, nutrient_logs, and harvests carries a cycle_ref that matches a cycle_ref present in grow_cycles within the same export. Orphaned records are not permitted.aquatic_module is present, its system_ref MUST match a system_ref present in grow_cycles within the same export.null.cycle_ref and system_ref values are generated per the active export_mode. In anonymous mode all refs are randomized per export. In tracked mode refs are stable per-program pseudonyms. Internal IDs are never exposed.Controlled environment agriculture terminology used in this specification. Implementers who are not growers should reference this section when mapping field names to user interfaces.
| Term | Definition |
|---|---|
| Aeroponic | Cultivation where roots hang in air and are misted with nutrient solution at intervals. |
| BSFL | Black soldier fly larvae. Used in bio-integrated systems to convert organic waste into protein and frass fertilizer. |
| Cut-and-come-again | Harvesting method where outer leaves are cut while the plant continues growing new leaves from the center. |
| DLI | Daily Light Integral. Total photosynthetic light received per square meter per day, measured in mol/m²/day. |
| DWC | Deep Water Culture. Hydroponic method where plant roots are suspended directly in aerated nutrient solution. |
| EC | Electrical Conductivity. Proxy measurement for total nutrient concentration in solution, measured in mS/cm. |
| Fogponic | Cultivation using ultrasonic mist (fog) to deliver nutrients to roots. A subcategory of aeroponic systems. |
| Inoculation | Introduction of fungal mycelium (spawn) into a prepared substrate to begin mushroom cultivation. |
| Kratky | Passive deep water culture method requiring no pumps, air stones, or circulation. Plants sit above a static reservoir that depletes over the grow cycle. |
| Masters mix | 50/50 blend of hardwood sawdust and soy hull pellets, a common substrate for gourmet mushroom cultivation. |
| NFT | Nutrient Film Technique. Hydroponic method where a thin film of nutrient solution flows continuously over plant roots in a shallow channel. |
| PAR | Photosynthetically Active Radiation. Light in the 400–700 nm wavelength range that plants use for photosynthesis. |
| PPFD | Photosynthetic Photon Flux Density. Instantaneous measurement of PAR intensity at a given point, in µmol/m²/s. |
| TDS | Total Dissolved Solids. Measurement of dissolved mineral content in solution, in ppm. An alternative to EC for gauging nutrient strength. |
| VPD | Vapor Pressure Deficit. The difference between moisture in the air and the amount it could hold at saturation, in kPa. A key driver of plant transpiration rate. |
OCEADS inherits the security considerations defined in VODS §8. The following are specific to controlled environment agriculture data.
The cultivar, nutrient_brand, nutrient_ratio, cycle_notes, harvest_notes, and log_notes fields accept arbitrary text. Consumers MUST sanitize these values before rendering them in web interfaces or passing them to other systems.
High-frequency environment and nutrient logs can reveal operational patterns — facility operating hours, growth schedules, equipment capabilities, and production scale. In anonymous mode, applications SHOULD consider reducing log frequency or binning timestamps to limit facility fingerprinting.
The environment_logs and nutrient_logs arrays may contain thousands of records from high-frequency sensor logging. Consumers SHOULD enforce reasonable limits on incoming document size and array length to prevent memory exhaustion.
OCEADS inherits all normative references from VODS §9. The following additional references apply to OCEADS domain fields.
| Reference | Title | Relevance |
|---|---|---|
| CEAOD | Controlled Environment Agriculture Open Data | Prior art and conversion target referenced in §9. |
| McCree (1972) | Action spectrum for photosynthesis | Defines the 400–700 nm PAR range referenced by par_umol and ppfd_umol fields. |
| NASA APH | Advanced Plant Habitat | Field alignment reference for environment log parameters. |
| Version | Date | Changes |
|---|---|---|
1.0 |
2026-03-09 | Initial release — grow cycle, environment log, nutrient log, harvest records. Aquatic module. NASA APH field alignment. Seven conformance rules (A1–A7). |