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.
| 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.