measure
If it is not logged, it did not happen — grow stack and resonance harvesters.
Schema: /locus/lab-log.schema.json · Ecosystem: /locus/protocol.json · Runbooks: /locus/build
schemes
Grow your own energy (P0–P3) — irradiance, PV power, fibre exit, climate, algae OD / biomass.
Resonance harvester (RP0) — drive, match frequency, piezo electrical out, optional displacement. Live intuition at /field/resonance-pump.
channels · grow (P0–P3)
tISO-8601 timestamp (UTC preferred)Girradiance W/m² — or lux_proxy with calibration noteV_pvpanel voltageI_pvpanel currentP_pvpanel power (or V×I)P_loadpower at the loadlux_exitfibre exit illuminanceT_wet / RH_wetliving-layer climateT_dry / RH_dryelectronics-bay climateODalgae optical density — biomass battery SoC proxyV_battelectrochemical battery voltage (L2 store)notesfree text; status belongs in status fieldchannels · resonance harvester (RP0)
tISO-8601 timestampf_drivedrive frequency Hzf0membrane natural frequency Hz (estimate or measured)x_peakpeak displacement m (or proxy)F_drivedrive force peak N if knownP_piezoinstantaneous electrical harvest power WV_harv / I_harvrectified harvest voltage / currentE_piezointegrated electrical energy J (summary also fine)drive_onboolean — harvest should track thisnotespad count, η assumption, placementrates
Grow electrical + irradiance: ≥1 Hz during comparison windows. Climate: ≥0.1 Hz. Optical spectrum: at least once per P1 alignment. Harvester: ≥10 Hz during bounce windows if MCU allows; else ≥1 Hz with peak hold.
run object · grow example
{
"schema": "locus-lab-log/1",
"id": "20260725-1400-p2-algae-battery",
"prototype": "P2",
"scheme": "grow_your_own_energy",
"status": "pass",
"goal": "Wet side viable; dry envelope holds; algae SoC + lux_exit logged",
"organism": "algae",
"storage": { "mode": "algae_biomass" },
"parts": [{ "role": "algae", "notes": "Chlorella-class culture" }],
"envelope_dry": { "rh_max": 60, "dewpoint_max_c": 15 },
"summary": { "duration_s": 172800, "od_start": 0.12, "od_end": 0.31, "biomass_gain_g": 0.4 },
"samples": [
{ "t": "2026-07-25T14:00:00Z", "lux_exit": 420, "OD": 0.12, "T_wet": 22, "RH_wet": 88, "T_dry": 24, "RH_dry": 42 }
]
}run object · harvester example
{
"schema": "locus-lab-log/1",
"id": "20260725-1600-rp0-lab-pad",
"prototype": "RP0",
"scheme": "resonance_harvester",
"status": "pass",
"goal": "Matched drive; piezo energy rises only while drive_on",
"parts": [{ "role": "other", "notes": "24 piezo discs · 1 m² mat" }],
"summary": {
"duration_s": 3600,
"f0_hz": 1.05,
"f_drive_hz": 1.04,
"energy_treatment_wh": 0.012
},
"samples": [
{ "t": "2026-07-25T16:00:00Z", "f_drive": 1.04, "P_piezo": 0.8, "drive_on": true },
{ "t": "2026-07-25T16:30:00Z", "f_drive": 0, "P_piezo": 0.02, "drive_on": false }
]
}status is only pass, fail, or aborted.
calibration
Name the instrument. Lux → W/m² needs factor + spectrum note; else store lux_proxy. Harvester: name how f₀ was measured (ring-down, swept drive, or estimate from √(k/m)).
Spectrum for P1: full SPD preferred; RGB ratios allowed if labeled proxy.
minimal logger shape
# grow (1 Hz) or harvester (≥1–10 Hz)
while running:
sample = { t: utc_now_iso(), ...scheme_channels }
append_jsonl(run_path, sample)
sleep(dt)