AI Tunables Traceability

This page is the operating contract for the bounded control surface Iris (our OpenClaw AI agent) can reason about. It answers four questions for every tunable: what the value does, why it matters to greenhouse control, how the value routes through the stack, and what live evidence says about recent use.

End-to-end path for planner-owned values:

Iris -> MCP set_plan or set_tunable -> setpoint_plan -> v_active_plan -> ingestor dispatcher -> ESPHome number/switch -> firmware global/Setpoints -> cfg_* readback -> setpoint_snapshot and setpoint_changes confirmation.

The ESP32 still owns 5-second relay control. Iris owns bounded setpoint hypotheses, not direct actuator commands.

Current Audit Snapshot

106Schema tunables

Every name accepted by PlanTransition, SetpointChange, or setpoint_snapshot.

106Registry rows

Includes dispatcher-routed and readback-only firmware inputs.

37Routine plan knobs

Required in every routine set_plan waypoint.

37Planner-policy knobs

The only tunables the planner may write. Operator, crop-band, readback, and retired rows are context only.

0Open alerts

Live safety state at generation time.

37Future active params

148 future active plan rows.

0Reserved active rows

Should remain zero for no-op/deprecated params.

0/030m trigger audit

Plan dispatcher writes carrying trigger IDs.

0.083 kPaMister VPD delta

2234 measured mister cycles in the last 14 days.

Contract class counts: {'planner_policy': 37, 'crop_band': 8, 'controller_safety': 47, 'readback_context': 3, 'retired': 11}.

Embedding corpus counts: {"plan": 159, "lesson": 93, "playbook": 43, "site_doc": 3496, "observation": 636}.

Firmware override events in the last 7 days: {"summer_vent": 103, "vent_mist_assist": 229}.

Effectiveness labels below mean three different things:

  • Route confirmed means the planner/dispatcher write landed and firmware read it back.
  • Operational effect means firmware has a code path that consumes the value.
  • Greenhouse outcome means a later scorecard or structured rationale supports or falsifies the plan. This page reports the latest available evidence but does not pretend a single tunable has isolated causal proof unless the system measured that directly.

Current controller invariants:

  • DEHUM_VENT exits immediately if dehumidifying with vent/fans pushes VPD above vpd_high; cooling then uses VENTILATE with vent-mist assist, otherwise sealed mist recovery is allowed.
  • Non-safety heat is suppressed while vent/fan air exchange is physically active.
  • heat2 is never valid without heat1; any observed heat2-without-heat1 interval is a fault to investigate, not a planner tactic.
  • The dispatcher preserves a minimum 0.55 kPa house VPD deadband so mixed-zone crop targets do not create controller chatter.
  • During live VPD-high or near-edge VENTILATE stress with healthy dew margin, the dispatcher clamps conservative moisture thresholds near the active vpd_high band: mister_engage_kpa <= vpd_high + 0.05, mister_all_kpa <= max(1.0, vpd_high + 0.25), fog_escalation_kpa <= 0.30, and shorter mist delays/gaps.

Routine Plan Contract

Routine set_plan calls must include these values at every transition. The page below gives the full per-tunable detail; this table is the compact operational contract.

ParameterActiveFuture rowsLast dispatch7d confirmedPlanner instruction
bias_cool342026-05-13 03:04Z134/134Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
bias_heat0.542026-05-13 03:04Z113/113Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
d_cool_stage_2342026-05-13 03:04Z110/110Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
d_heat_stage_2542026-05-13 03:04Z97/97Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
dwell_gate_ms30000042026-05-13 03:04Z97/97Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
enthalpy_close142026-05-13 03:04Z100/100Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
enthalpy_open-242026-05-13 03:04Z100/100Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
fog_escalation_kpa0.8542026-05-13 04:39Z167/169Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use about 0.20-0.30; higher values delay fog too far above the active band.
heat_hysteresis1.242026-05-13 03:04Z125/127Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
min_fog_off_s12042026-05-13 03:04Z128/128Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
min_fog_on_s4542026-05-13 03:04Z112/112Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
min_heat_off_s18042026-05-13 03:04Z102/102Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
min_heat_on_s12042026-05-13 03:04Z96/96Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
min_vent_off_s6042026-05-13 03:04Z113/113Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
min_vent_on_s6042026-05-13 03:04Z101/101Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mist_backoff_s90042026-05-13 03:04Z134/136Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mist_max_closed_vent_s18042026-05-13 03:04Z140/142Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mist_thermal_relief_s9042026-05-13 03:04Z97/97Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mister_all_delay_s30042026-05-13 04:39Z149/151Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use shorter delays/gaps so ventilation can cool while misting protects VPD.
mister_all_kpa2.3542026-05-13 04:39Z152/152Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, keep near max(1.0, vpd_high + 0.25) so all-zone mist assist can engage.
mister_engage_delay_s9042026-05-13 04:39Z144/146Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use shorter delays/gaps so ventilation can cool while misting protects VPD.
mister_engage_kpa1.7542026-05-13 04:39Z151/151Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, keep near active vpd_high + 0.05; dispatcher clamps overly conservative values.
mister_pulse_gap_s6042026-05-13 04:39Z173/175Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use shorter delays/gaps so ventilation can cool while misting protects VPD.
mister_pulse_on_s9042026-05-13 03:04Z143/145Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mister_vpd_weight1.542026-05-13 03:04Z77/77Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mister_water_budget_gal50042026-05-13 03:04Z96/96Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
outdoor_staleness_max_s60042026-05-13 03:04Z43/43Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
sw_dwell_gate_enabled142026-05-11 19:49Z62/62Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
sw_fog_closes_vent142026-05-11 19:49Z9/9Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
sw_fsm_controller_enabled142026-05-11 19:49Z62/62Always include this as 1. It is a compatibility/readback field for the unified band-first controller, and MCP/dispatcher/ESPHome guardrails reject or correct OFF.
sw_mister_closes_vent142026-05-11 19:49Z30/30Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
sw_summer_vent_enabled142026-05-11 19:49Z85/87Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
temp_hysteresis1.842026-05-13 03:04Z113/113Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
vent_prefer_dp_delta_f542026-05-13 03:04Z53/53Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
vent_prefer_temp_delta_f542026-05-13 03:04Z53/53Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
vpd_hysteresis0.542026-05-13 03:04Z124/124Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
vpd_watch_dwell_s6042026-05-13 03:04Z150/152Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.

Findings That Matter

  • mister_engage_kpa is effectful, but it is not the state-machine entry trigger. Firmware enters humidification from vpd_high plus vpd_watch_dwell_s; mister_engage_kpa gates physical S1 mister pulses once humidity or zone demand exists, and zone stress can bypass the global threshold.
  • mister_all_kpa controls physical all-zone mister rotation. The header mist-stage delay also uses mister_all_delay_s; fog escalation uses fog_escalation_kpa.
  • The planner tunes moisture intensity, not the crop band. In VENTILATE, dry outside air can keep temperature in band while pushing VPD high, so moisture thresholds must stay coupled to the active vpd_high unless dew-risk evidence justifies suppression.
  • Reserved/no-op values are intentionally not planner-pushable: fan_burst_min, fog_burst_min, mist_vent_close_lead_s, mist_vent_reopen_delay_s, mister_all_off_s, mister_all_on_s, mister_max_runtime_min, mister_off_s, mister_on_s, summer_vent_min_runtime_s, vent_bypass_min.
  • Readback-only values are now registry-covered but not planner-pushable: fallback_window_s, outdoor_temp_f, outdoor_dewpoint_f.

Per-Tunable Detail

Controller gates

dwell_gate_ms - routine
  • Purpose: Dwell hold duration. Default 5 min. Safety rails + R2-3 dry override + vpd_min_safe rescue preempt unconditionally.
  • Why it matters: These switches and dwell values choose the controller posture and mode-transition stability.
  • Implementation: routine set_plan required; ESPHome dwell_gate__ms_ via SETPOINT_MAP; readback cfg_dwell_gate_ms.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 300000, bounds 60000 to 1800000.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, greenhouse_logic.h:3, greenhouse_types.h:6, sensors.yaml:3, tunables.yaml:4.
  • Last used: active 300000 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 300000 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 300000 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 97, confirmed 97, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
sw_dwell_gate_enabled - routine
  • Purpose: Master switch for Phase-2 mode-dwell gate. Default OFF for shadow-mode bake. Flip to ON after 14d replay+shadow validation.
  • Why it matters: These switches and dwell values choose the controller posture and mode-transition stability.
  • Implementation: routine set_plan required; ESPHome dwell_gate_enabled via SETPOINT_MAP; readback cfg_dwell_gate_enabled.
  • Registry: class planner_policy, kind switch, owner planner, tier 1, default 0, bounds switch 0/1.
  • Firmware evidence: controls.yaml:4, globals.yaml:2, greenhouse_logic.h:6, greenhouse_types.h:8, sensors.yaml:4, tunables.yaml:12.
  • Last used: active 1 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 1 at 2026-05-11 19:49Z from plan.
  • Readback: latest 1 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 62, confirmed 62, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: iris-20260511-0448 (pending, score -); expected effect: reduce non-safety whipsaw without blocking heat flushes.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
sw_fsm_controller_enabled - routine
  • Purpose: Unified band-first controller is the live controller path. ESPHome control loop, dispatcher, MCP, and outbound-listener guardrails force this ON; rollback requires an explicit firmware/config rollback outside the planner surface.
  • Why it matters: These switches and dwell values choose the controller posture and mode-transition stability.
  • Implementation: routine set_plan required; ESPHome fsm_controller_enabled via SETPOINT_MAP; readback cfg_fsm_controller_enabled.
  • Registry: class planner_policy, kind switch, owner operator, tier 1, default 1, bounds switch 0/1.
  • Firmware evidence: controls.yaml:12, globals.yaml:2, greenhouse_logic.h:10, greenhouse_types.h:4, sensors.yaml:4, tunables.yaml:12.
  • Last used: active 1 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 1 at 2026-05-11 19:49Z from manual.
  • Readback: latest 1 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 62, confirmed 62, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Always include this as 1. It is a compatibility/readback field for the unified band-first controller, and MCP/dispatcher/ESPHome guardrails reject or correct OFF.
sw_occupancy_inhibit - controller safety
  • Purpose: Block misting while greenhouse is occupied.
  • Why it matters: These switches and dwell values choose the controller posture and mode-transition stability.
  • Implementation: MCP rejects planner writes; ESPHome occupancy_mist_inhibit via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind switch, owner operator, tier 2, default 1, bounds switch 0/1.
  • Firmware evidence: controls.yaml:3, globals.yaml:1, greenhouse_logic.h:3, greenhouse_types.h:2, tunables.yaml:9.
  • Last used: active - from -; latest plan - at -; latest dispatch 1 at 2026-05-09 22:37Z from manual.
  • Readback: latest - at - (- old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 22, confirmed 0, unconfirmed 22, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: No recent live landing evidence; static route must be reviewed before relying on this.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.

Economiser

econ_heat_margin_f - controller safety
  • Purpose: Blocks economiser venting when heating demand is active and temp is far below high band.
  • Why it matters: Economiser settings decide when outside air is useful enough to ventilate without worsening heat or humidity.
  • Implementation: MCP rejects planner writes; ESPHome econ_heat_margin__f via SETPOINT_MAP; readback cfg___econ_heat_margin___f_.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 5, bounds 1 to 15.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, greenhouse_logic.h:2, greenhouse_types.h:5, sensors.yaml:2, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 5 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 5 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
enthalpy_close - routine
  • Purpose: Economiser closes when enthalpy β‰₯ this. In MCP TIER1.
  • Why it matters: Economiser settings decide when outside air is useful enough to ventilate without worsening heat or humidity.
  • Implementation: routine set_plan required; ESPHome enthalpy_close__kj_kg_ via SETPOINT_MAP; readback cfg___enthalpy_close__kj_kg___.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 1, bounds -5 to 20.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active 1 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 1 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 1 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 100, confirmed 100, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
enthalpy_open - routine
  • Purpose: Economiser opens when outdoor-indoor enthalpy ≀ this. In MCP TIER1.
  • Why it matters: Economiser settings decide when outside air is useful enough to ventilate without worsening heat or humidity.
  • Implementation: routine set_plan required; ESPHome enthalpy_open__kj_kg_ via SETPOINT_MAP; readback cfg___enthalpy_open__kj_kg___.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default -2, bounds -5 to 0.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active -2 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch -2 at 2026-05-13 03:04Z from esp32.
  • Readback: latest -2 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 100, confirmed 100, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
site_pressure_hpa - controller safety
  • Purpose: Elevation-corrected barometric pressure for VPD calc. Site constant β€” not planner-pushable.
  • Why it matters: Economiser settings decide when outside air is useful enough to ventilate without worsening heat or humidity.
  • Implementation: MCP rejects planner writes; ESPHome site_pressure__hpa_ via SETPOINT_MAP; readback cfg___site_pressure__hpa_.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 840, bounds 700 to 1100.
  • Firmware evidence: globals.yaml:1, sensors.yaml:4, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 840 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 840 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
sw_economiser_enabled - controller safety
  • Purpose: Economiser master enable. Default ON.
  • Why it matters: Economiser settings decide when outside air is useful enough to ventilate without worsening heat or humidity.
  • Implementation: MCP rejects planner writes; ESPHome economiser_enabled via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind switch, owner operator, tier 2, default 1, bounds switch 0/1.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:9.
  • Last used: active - from -; latest plan iris-20260409-2105 at 2026-04-13 01:30Z; latest dispatch 1 at 2026-04-10 05:33Z from plan.
  • Readback: latest 1 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 0, confirmed 0, unconfirmed 0, distinct 7d values 0, 30d clamps 0.
  • Effectiveness: Firmware publishes the value; no recent planner/dispatcher use.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.

Fog gates

fog_burst_min - reserved/no-op
  • Purpose: Manual fog-burst duration placeholder. Current firmware updates the value but does not consume it for timing.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome fog_burst__min_ via SETPOINT_MAP; readback cfg___fog_burst__min_.
  • Registry: class retired, kind numeric, owner operator, tier 2, default 10, bounds 1 to 60.
  • Firmware evidence: controls.yaml:4, globals.yaml:1, sensors.yaml:2, tunables.yaml:2.
  • Last used: active - from -; latest plan iris-20260409-2105 at 2026-04-13 01:30Z; latest dispatch 8 at 2026-05-13 04:37Z from esp32.
  • Readback: latest 8 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 48, confirmed 48, unconfirmed 0, distinct 7d values 3, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
fog_escalation_kpa - routine
  • Purpose: VPD delta above active vpd_high that escalates from mist to fog. Lower values mean earlier fog inside VENTILATE mist assist; dispatcher caps overly conservative deltas during live VPD-high or near-edge VENTILATE stress when dew margin is healthy.
  • Why it matters: Fog is high-power humidity assist. These gates decide when that heavy tool is allowed.
  • Implementation: routine set_plan required; ESPHome fog_escalation__kpa_ via SETPOINT_MAP; readback cfg___fog_escalation__kpa_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 0.4, bounds 0.1 to 1.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, greenhouse_logic.h:7, greenhouse_types.h:4, sensors.yaml:2, tunables.yaml:4.
  • Last used: active 0.85 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 0.85 at 2026-05-13 04:39Z from plan.
  • Readback: latest 0.85 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 169, confirmed 167, unconfirmed 2, distinct 7d values 17, 30d clamps 8.
  • Effectiveness: Mostly confirmed: 167/169 7d writes have readbacks.
  • Latest plan rationale: iris-20260512-2007 (pending, score -); expected effect: use fog for stubborn VPD during ventilation and reduce VPD-high stress without extending sealed time.
  • Planner use: Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use about 0.20-0.30; higher values delay fog too far above the active band.
fog_min_temp_f - controller safety
  • Purpose: Fog blocks when indoor temp below this (evap cooling hurts in cold).
  • Why it matters: Fog is high-power humidity assist. These gates decide when that heavy tool is allowed.
  • Implementation: MCP rejects planner writes; ESPHome fog_min_temp__f_ via SETPOINT_MAP; readback cfg___fog_min_temp___f_.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 55, bounds 40 to 65.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:2, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 55 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 55 at 2026-05-13 05:45Z (0m old); 7d readbacks 3255.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
fog_rh_ceiling_pct - controller safety
  • Purpose: Fog blocks when indoor RH exceeds this. Safety-adjacent.
  • Why it matters: Fog is high-power humidity assist. These gates decide when that heavy tool is allowed.
  • Implementation: MCP rejects planner writes; ESPHome fog_rh_ceiling____ via SETPOINT_MAP; readback cfg___fog_rh_ceiling____.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 90, bounds 75 to 98.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:2, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 90 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 90 at 2026-05-13 05:45Z (0m old); 7d readbacks 3255.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
fog_time_window_end - controller safety
  • Purpose: End hour for fog eligibility window.
  • Why it matters: Fog is high-power humidity assist. These gates decide when that heavy tool is allowed.
  • Implementation: MCP rejects planner writes; ESPHome fog_window_end__hr_ via SETPOINT_MAP; readback cfg___fog_window_end__hour_.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 18, bounds 14 to 20.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:2, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 17 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 17 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
fog_time_window_start - controller safety
  • Purpose: Start hour for fog eligibility window.
  • Why it matters: Fog is high-power humidity assist. These gates decide when that heavy tool is allowed.
  • Implementation: MCP rejects planner writes; ESPHome fog_window_start__hr_ via SETPOINT_MAP; readback cfg___fog_window_start__hour_.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 6, bounds 5 to 12.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:2, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 7 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 7 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
min_fog_off_s - routine
  • Purpose: Fog minimum OFF time β€” in MCP TIER1.
  • Why it matters: Fog is high-power humidity assist. These gates decide when that heavy tool is allowed.
  • Implementation: routine set_plan required; ESPHome min_fog_off__s_ via SETPOINT_MAP; readback cfg___min_fog_off__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 60, bounds 15 to 300.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 120 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 120 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 120 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 128, confirmed 128, unconfirmed 0, distinct 7d values 6, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
min_fog_on_s - routine
  • Purpose: Fog minimum ON time β€” in MCP TIER1.
  • Why it matters: Fog is high-power humidity assist. These gates decide when that heavy tool is allowed.
  • Implementation: routine set_plan required; ESPHome min_fog_on__s_ via SETPOINT_MAP; readback cfg___min_fog_on__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 60, bounds 15 to 300.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 45 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 45 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 45 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 112, confirmed 112, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
sw_fog_closes_vent - routine
  • Purpose: Fog is suppressed while the vent is physically open, except vent-mist assist. Default ON; disabling re-enables open-vent fog during VENTILATE (tradeoff).
  • Why it matters: Fog is high-power humidity assist. These gates decide when that heavy tool is allowed.
  • Implementation: routine set_plan required; ESPHome fog_closes_vent via SETPOINT_MAP; readback fog_closes_vent.
  • Registry: class planner_policy, kind switch, owner planner, tier 1, default 1, bounds switch 0/1.
  • Firmware evidence: controls.yaml:6, globals.yaml:2, tunables.yaml:9.
  • Last used: active 1 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 1 at 2026-05-11 19:49Z from plan.
  • Readback: latest 1 at 2026-05-13 05:45Z (0m old); 7d readbacks 2558.
  • Landing evidence: 7d dispatcher writes 9, confirmed 9, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.

Grow lights

gl_dli_target - controller safety
  • Purpose: Daily light integral target for supplemental grow-light automation.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: MCP rejects planner writes; ESPHome gl_dli_target__mol_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 14, bounds 1 to 50.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan iris-fix-dli-20260328 at 2026-03-29 03:04Z; latest dispatch 14 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 14 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
gl_lux_hysteresis - controller safety
  • Purpose: Lux deadband around gl_lux_threshold to prevent grow-light cycling.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: MCP rejects planner writes; ESPHome gl_lux_hysteresis via SETPOINT_MAP; readback cfg___gl_lux_hysteresis.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 1500, bounds 0 to 10000.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 1500 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 1500 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
gl_lux_threshold - controller safety
  • Purpose: Indoor lux below this threshold requests supplemental light.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: MCP rejects planner writes; ESPHome gl_lux_threshold via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 3000, bounds 100 to 50000.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan iris-fix-gl-20260328 at 2026-03-29 03:06Z; latest dispatch 3000 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 20000 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
gl_sunrise_hour - controller safety
  • Purpose: Earliest local hour grow lights may turn on.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: MCP rejects planner writes; ESPHome gl_start_hour via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 7, bounds 0 to 23.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 7 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 7 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
gl_sunset_hour - controller safety
  • Purpose: Latest local hour grow lights may remain on.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: MCP rejects planner writes; ESPHome gl_cutoff_hour via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 19, bounds 0 to 23.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 19 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 19 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
sw_gl_auto_mode - controller safety
  • Purpose: Grow-light automation master enable.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: MCP rejects planner writes; ESPHome gl_auto_mode via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind switch, owner operator, tier 2, default 1, bounds switch 0/1.
  • Firmware evidence: no token hit.
  • Last used: active - from -; latest plan iris-dev-gl-fix at 2026-03-25 17:31Z; latest dispatch 1 at 2026-05-09 22:37Z from manual.
  • Readback: latest 1 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 23, confirmed 0, unconfirmed 23, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route exists but not recently exercised by the dispatcher.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.

Irrigation

irrig_center_duration_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_center_duration__min_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 10, bounds 1 to 120.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 10 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 10 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_center_fert_duration_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_center_fert_duration__min_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 5, bounds 0 to 60.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 5 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 5 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_center_fert_every_n - controller safety
  • Purpose: Naming quirk: canonical drops β€˜_cycles’ suffix.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_center_fert_every_n_cycles via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 0, bounds 0 to 30.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 0 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 0 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_center_flush_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_center_flush__min_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 2, bounds 0 to 30.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 2 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 0 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_center_interval_days - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_center_interval__days_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 1, bounds 1 to 14.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 1 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 0 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_center_start_hour - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_center_start_hour via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 6, bounds 0 to 23.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 6 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 6 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_center_start_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_center_start_min via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 30, bounds 0 to 59.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 30 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 0 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_vpd_boost_pct - controller safety
  • Purpose: Irrigation duration boost after sustained high-VPD stress.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_vpd_boost__ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 25, bounds 0 to 200.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan iris-20260409-2105 at 2026-04-13 01:30Z; latest dispatch 25 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 25 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_vpd_boost_threshold_hrs - controller safety
  • Purpose: Accumulated high-VPD hours before irrigation boost applies.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_vpd_boost_threshold__hrs_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 3, bounds 0 to 24.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, tunables.yaml:2.
  • Last used: active - from -; latest plan iris-20260409-2105 at 2026-04-13 01:30Z; latest dispatch 3 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 3 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_wall_duration_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_wall_duration__min_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 10, bounds 1 to 120.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:2.
  • Last used: active - from -; latest plan iris-20260405-1020 at 2026-04-05 16:20Z; latest dispatch 10 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 10 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_wall_fert_duration_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_wall_fert_duration__min_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 5, bounds 0 to 60.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 5 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 5 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_wall_fert_every_n - controller safety
  • Purpose: Naming quirk: canonical drops β€˜_cycles’ suffix that SETPOINT_MAP key carries.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_wall_fert_every_n_cycles via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 0, bounds 0 to 30.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 0 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 0 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_wall_flush_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_wall_flush__min_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 2, bounds 0 to 30.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 2 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 2 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_wall_interval_days - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_wall_interval__days_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 1, bounds 1 to 14.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:2.
  • Last used: active - from -; latest plan iris-20260405-1020 at 2026-04-05 16:20Z; latest dispatch 1 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 1 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_wall_start_hour - controller safety
  • Purpose: Wall-drip schedule β€” operator configures.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_wall_start_hour via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 6, bounds 0 to 23.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan iris-20260405-1020 at 2026-04-05 16:20Z; latest dispatch 6 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 6 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_wall_start_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_wall_start_min via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 0, bounds 0 to 59.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 0 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 0 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
sw_irrigation_center_enabled - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrigation_center_enabled via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind switch, owner operator, tier 2, default 1, bounds switch 0/1.
  • Firmware evidence: no token hit.
  • Last used: active - from -; latest plan - at -; latest dispatch 0 at 2026-05-09 22:37Z from manual.
  • Readback: latest - at - (- old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 22, confirmed 0, unconfirmed 22, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: No recent live landing evidence; static route must be reviewed before relying on this.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
sw_irrigation_enabled - controller safety
  • Purpose: Master irrigation enable.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrigation_enabled via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind switch, owner operator, tier 2, default 1, bounds switch 0/1.
  • Firmware evidence: no token hit.
  • Last used: active - from -; latest plan - at -; latest dispatch 0 at 2026-05-09 22:37Z from manual.
  • Readback: latest - at - (- old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 22, confirmed 0, unconfirmed 22, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: No recent live landing evidence; static route must be reviewed before relying on this.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
sw_irrigation_wall_enabled - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrigation_wall_enabled via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind switch, owner operator, tier 2, default 1, bounds switch 0/1.
  • Firmware evidence: no token hit.
  • Last used: active - from -; latest plan - at -; latest dispatch 0 at 2026-05-09 22:37Z from manual.
  • Readback: latest - at - (- old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 22, confirmed 0, unconfirmed 22, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: No recent live landing evidence; static route must be reviewed before relying on this.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
sw_irrigation_weather_skip - controller safety
  • Purpose: Skip irrigation on rainy-day forecast.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrigation_weather_skip via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind switch, owner operator, tier 2, default 1, bounds switch 0/1.
  • Firmware evidence: no token hit.
  • Last used: active - from -; latest plan - at -; latest dispatch 1 at 2026-05-09 22:37Z from manual.
  • Readback: latest - at - (- old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 22, confirmed 0, unconfirmed 22, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: No recent live landing evidence; static route must be reviewed before relying on this.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.

Misting and sealed-humidification

mist_backoff_s - routine
  • Purpose: Controller lockout after sealed humidification times out. Suppresses another SEALED_MIST attempt without forcing venting.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mist_backoff__s_ via SETPOINT_MAP; readback cfg___mist_backoff__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 600, bounds 60 to 3600.
  • Firmware evidence: controls.yaml:5, globals.yaml:2, greenhouse_logic.h:20, greenhouse_types.h:6, sensors.yaml:5, tunables.yaml:8.
  • Last used: active 900 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 900 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 900 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 136, confirmed 134, unconfirmed 2, distinct 7d values 4, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 134/136 7d writes have readbacks.
  • Latest plan rationale: iris-20260512-2007 (pending, score -); expected effect: allow repeated bounded recovery cycles without extending any individual heat trap.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mist_max_closed_vent_s - routine
  • Purpose: Maximum time vent can stay closed during misting before thermal-relief burst.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mist_max_closed_vent__s_ via SETPOINT_MAP; readback cfg___mist_max_closed_vent__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 600, bounds 120 to 900.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 180 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 180 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 180 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 142, confirmed 140, unconfirmed 2, distinct 7d values 7, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 140/142 7d writes have readbacks.
  • Latest plan rationale: iris-20260512-0549 (validated 2026-05-13 02:08Z, score 3); expected effect: preserve dew-point safety and prevent heat stress escalation.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mist_thermal_relief_s - routine
  • Purpose: Mandatory vent-open relief duration if mist-closed-vent cap hit.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mist_thermal_relief__s_ via SETPOINT_MAP; readback cfg___mist_thermal_relief__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 90, bounds 30 to 300.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 90 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 90 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 90 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 97, confirmed 97, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mist_vent_close_lead_s - reserved/no-op
  • Purpose: Reserved/no-op in current firmware. Exposed/read back but not consumed by the control loop.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome mist_vent_close_lead__s_ via SETPOINT_MAP; readback cfg___mist_vent_close_lead__s_.
  • Registry: class retired, kind numeric, owner planner, tier 2, default 15, bounds 0 to 60.
  • Firmware evidence: globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active - from -; latest plan iris-20260511-0448 at 2026-05-13 15:00Z; latest dispatch 15 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 15 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 89, confirmed 89, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
mist_vent_reopen_delay_s - reserved/no-op
  • Purpose: Reserved/no-op in current firmware. Exposed/read back but not consumed by the control loop.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome mist_vent_reopen_delay__s_ via SETPOINT_MAP; readback cfg___mist_vent_reopen_delay__s_.
  • Registry: class retired, kind numeric, owner planner, tier 2, default 45, bounds 0 to 120.
  • Firmware evidence: globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active - from -; latest plan iris-20260511-0448 at 2026-05-13 15:00Z; latest dispatch 45 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 45 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 101, confirmed 101, unconfirmed 0, distinct 7d values 4, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
mister_all_delay_s - routine
  • Purpose: Dwell before physical all-zone rotation. Also feeds the header mist-stage delay.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mister_all_delay__s_ via SETPOINT_MAP; readback cfg___mister_all_delay__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 300, bounds 60 to 900.
  • Firmware evidence: controls.yaml:4, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 300 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 300 at 2026-05-13 04:39Z from plan.
  • Readback: latest 300 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 151, confirmed 149, unconfirmed 2, distinct 7d values 8, 30d clamps 66.
  • Effectiveness: Mostly confirmed: 149/151 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use shorter delays/gaps so ventilation can cool while misting protects VPD.
mister_all_kpa - routine
  • Purpose: Physical all-zone mister rotation threshold. Keep close to active vpd_high on hot/dry ventilation cycles; dispatcher clamps values that would prevent all-zone assist during live VPD-high or near-edge VENTILATE stress.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome vpd_mister_all_kpa via SETPOINT_MAP; readback cfg_mister_all__kpa_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 1.9, bounds 1 to 2.5.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active 2.35 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 2.35 at 2026-05-13 04:39Z from plan.
  • Readback: latest 2.35 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 152, confirmed 152, unconfirmed 0, distinct 7d values 17, 30d clamps 10.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: iris-20260512-2007 (pending, score -); expected effect: escalate faster during the true severe window without using all-zone overnight.
  • Planner use: Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, keep near max(1.0, vpd_high + 0.25) so all-zone mist assist can engage.
mister_all_off_s - reserved/no-op
  • Purpose: Deprecated legacy all-zone duty-cycle OFF duration. Current pulse controller does not consume it.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome mister_all_off__s_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class retired, kind numeric, owner planner, tier 2, default 420, bounds 120 to 600.
  • Firmware evidence: globals.yaml:2, tunables.yaml:6.
  • Last used: active - from -; latest plan - at -; latest dispatch 420 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 0 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
mister_all_on_s - reserved/no-op
  • Purpose: Deprecated legacy all-zone duty-cycle ON duration. Current pulse controller does not consume it.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome mister_all_on__s_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class retired, kind numeric, owner planner, tier 2, default 480, bounds 120 to 600.
  • Firmware evidence: globals.yaml:2, tunables.yaml:6.
  • Last used: active - from -; latest plan - at -; latest dispatch 480 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 0 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
mister_center_penalty - controller safety
  • Purpose: Score penalty on center zone to discourage over-misting seedlings.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: MCP rejects planner writes; ESPHome mister_center_penalty via SETPOINT_MAP; readback cfg___mister_center_penalty.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 0.5, bounds 0 to 1.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 0.5 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 0.5 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 96, confirmed 96, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
mister_engage_delay_s - routine
  • Purpose: Delay before first physical mister pulse during a sealed or vent-assist moisture cycle.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mister_engage_delay__s_ via SETPOINT_MAP; readback cfg___mister_engage_delay__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 45, bounds 30 to 900.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 90 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 90 at 2026-05-13 04:39Z from plan.
  • Readback: latest 90 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 146, confirmed 144, unconfirmed 2, distinct 7d values 6, 30d clamps 66.
  • Effectiveness: Mostly confirmed: 144/146 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use shorter delays/gaps so ventilation can cool while misting protects VPD.
mister_engage_kpa - routine
  • Purpose: Physical S1 mister-pulse threshold once humidity/zone demand exists. SEALED_MIST entry is vpd_high plus vpd_watch_dwell_s. During live VPD-high stress with healthy dew margin, dispatcher clamps overly conservative values back near the active vpd_high band.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome vpd_mister_engage_kpa via SETPOINT_MAP; readback cfg_mister_engage__kpa_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 1.6, bounds 0.5 to 2.5.
  • Firmware evidence: controls.yaml:3, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active 1.75 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 1.75 at 2026-05-13 04:39Z from plan.
  • Readback: latest 1.75 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 151, confirmed 151, unconfirmed 0, distinct 7d values 16, 30d clamps 8.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: iris-20260512-2007 (pending, score -); expected effect: bring physical mist support online early enough to reduce VPD-high hours versus today’s 7.1h while unwinding to 1.80 by evening.
  • Planner use: Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, keep near active vpd_high + 0.05; dispatcher clamps overly conservative values.
mister_max_runtime_min - reserved/no-op
  • Purpose: Deprecated legacy runtime cap. Current water-budget logic uses mister_water_budget_gal.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome mister_max_runtime__min_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class retired, kind numeric, owner planner, tier 2, default 120, bounds 5 to 480.
  • Firmware evidence: globals.yaml:1, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 120 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 120 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
mister_off_s - reserved/no-op
  • Purpose: Deprecated legacy duty-cycle OFF duration. Current pulse controller does not consume it.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome mister_off__s_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class retired, kind numeric, owner planner, tier 2, default 600, bounds 120 to 900.
  • Firmware evidence: globals.yaml:2, tunables.yaml:6.
  • Last used: active - from -; latest plan - at -; latest dispatch 600 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 600 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
mister_on_s - reserved/no-op
  • Purpose: Deprecated legacy duty-cycle ON duration. Current pulse controller does not consume it.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome mister_on__s_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class retired, kind numeric, owner planner, tier 2, default 300, bounds 60 to 600.
  • Firmware evidence: globals.yaml:2, tunables.yaml:6.
  • Last used: active - from -; latest plan - at -; latest dispatch 300 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 0 at 2026-03-29 20:00Z (44d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
mister_pulse_gap_s - routine
  • Purpose: Pulse-rotation OFF (evap dwell) between zones.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mister_pulse_gap__s_ via SETPOINT_MAP; readback cfg___mister_pulse_gap__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 45, bounds 10 to 60.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 60 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 60 at 2026-05-13 04:39Z from plan.
  • Readback: latest 60 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 175, confirmed 173, unconfirmed 2, distinct 7d values 10, 30d clamps 8.
  • Effectiveness: Mostly confirmed: 173/175 7d writes have readbacks.
  • Latest plan rationale: iris-20260512-2007 (pending, score -); expected effect: speed VPD recovery during peak while returning to 60s at 19:30 to limit VPD-low carryover.
  • Planner use: Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use shorter delays/gaps so ventilation can cool while misting protects VPD.
mister_pulse_on_s - routine
  • Purpose: Pulse-rotation ON duration per zone.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mister_pulse_on__s_ via SETPOINT_MAP; readback cfg___mister_pulse_on__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 60, bounds 30 to 90.
  • Firmware evidence: controls.yaml:6, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 90 from preemptive-20260513-0245; latest plan preemptive-20260513-0245 at 2026-05-13 02:45Z; latest dispatch 90 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 90 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 145, confirmed 143, unconfirmed 2, distinct 7d values 6, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 143/145 7d writes have readbacks.
  • Latest plan rationale: iris-20260512-2007 (pending, score -); expected effect: reduce over-humidification risk while relying on shorter gaps and fog for peak recovery.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mister_vpd_weight - routine
  • Purpose: Weight on VPD gap in zone-selection scoring formula.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mister_vpd_weight via SETPOINT_MAP; readback cfg___mister_vpd_weight.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 1.5, bounds 0.5 to 5.
  • Firmware evidence: controls.yaml:3, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active 1.5 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 1.5 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 1.5 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 77, confirmed 77, unconfirmed 0, distinct 7d values 15, 30d clamps 2.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: iris-20260512-2007 (pending, score -); expected effect: spend water on driest productive zones while staying within 500 gal/day mister budget.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mister_water_budget_gal - routine
  • Purpose: Daily mister water cap. In MCP TIER1 β€” planner trims on drought regimes.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mister_water_budget__gal_ via SETPOINT_MAP; readback cfg___mister_water_budget__gal_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 500, bounds 100 to 600.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:2, tunables.yaml:2.
  • Last used: active 500 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 500 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 500 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 96, confirmed 96, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
sw_mister_closes_vent - routine
  • Purpose: Normal mister pulses are suppressed while the vent is physically open. The explicit VENTILATE vent-mist assist path bypasses this interlock.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mister_closes_vent via SETPOINT_MAP; readback mister_closes_vent.
  • Registry: class planner_policy, kind switch, owner planner, tier 1, default 0, bounds switch 0/1.
  • Firmware evidence: controls.yaml:6, globals.yaml:1, tunables.yaml:9.
  • Last used: active 1 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 1 at 2026-05-11 19:49Z from plan.
  • Readback: latest 1 at 2026-05-13 05:45Z (0m old); 7d readbacks 3255.
  • Landing evidence: 7d dispatcher writes 30, confirmed 30, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.

Operator

fan_burst_min - reserved/no-op
  • Purpose: Manual fan-burst duration placeholder. Current firmware does not consume it for timing.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome fan_burst__min_ via SETPOINT_MAP; readback cfg___fan_burst__min_.
  • Registry: class retired, kind numeric, owner operator, tier 2, default 10, bounds 1 to 60.
  • Firmware evidence: globals.yaml:1, sensors.yaml:2, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 10 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 10 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
vent_bypass_min - reserved/no-op
  • Purpose: Manual vent-bypass duration placeholder. Current firmware does not consume it for timing.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome vent_bypass__min_ via SETPOINT_MAP; readback cfg___vent_bypass__min_.
  • Registry: class retired, kind numeric, owner operator, tier 2, default 10, bounds 1 to 60.
  • Firmware evidence: globals.yaml:1, sensors.yaml:2, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 10 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 10 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.

Planner

bias_cool - routine
  • Purpose: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Why it matters: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Implementation: routine set_plan required; ESPHome bias_cool__f via SETPOINT_MAP; readback cfg___bias_cool___f_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 0, bounds -10 to 10.
  • Firmware evidence: controls.yaml:3, globals.yaml:1, greenhouse_logic.h:3, greenhouse_types.h:5, sensors.yaml:2, tunables.yaml:4.
  • Last used: active 3 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 3 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 3 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 134, confirmed 134, unconfirmed 0, distinct 7d values 9, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: iris-20260512-2007 (pending, score -); expected effect: pre-cool and ventilate earlier during peak, accepting structural heat but avoiding unnecessary sealed heat trapping.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
bias_heat - routine
  • Purpose: Note: validate_setpoints tightens this to [-5, +5] at ingest; controls.yaml accepts [-10, +10]. Registry uses the wider value.
  • Why it matters: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Implementation: routine set_plan required; ESPHome bias_heat__f via SETPOINT_MAP; readback cfg___bias_heat___f_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 0, bounds -10 to 10.
  • Firmware evidence: controls.yaml:3, globals.yaml:1, greenhouse_logic.h:5, greenhouse_types.h:6, sensors.yaml:2, tunables.yaml:4.
  • Last used: active 0.5 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 0.5 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 0.5 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 113, confirmed 113, unconfirmed 0, distinct 7d values 5, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: iris-20260512-2007 (pending, score -); expected effect: avoid unnecessary heating cost while providing a small buffer against cold stress.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
dehum_aggressive_kpa - controller safety
  • Purpose: Margin below vpd_low that upgrades dehumidification demand; validate_setpoints also caps it below vpd_low.
  • Why it matters: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Implementation: MCP rejects planner writes; ESPHome dehum_aggressive_kpa via SETPOINT_MAP; readback cfg___dehum_aggressive__kpa_.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 0.6, bounds 0.05 to 1.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, greenhouse_logic.h:2, greenhouse_types.h:5, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 0.6 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 0.6 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
max_relief_cycles - controller safety
  • Purpose: Consecutive sealedβ†’relief cycles before forced ventilation latch.
  • Why it matters: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Implementation: MCP rejects planner writes; ESPHome max_relief_cycles via SETPOINT_MAP; readback cfg___max_relief_cycles.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 3, bounds 1 to 10.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, greenhouse_logic.h:6, greenhouse_types.h:4, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 3 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 3 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 58, confirmed 56, unconfirmed 2, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 56/58 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
vent_latch_timeout_ms - controller safety
  • Purpose: Maximum forced-vent latch duration after relief-cycle breaker trips.
  • Why it matters: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Implementation: MCP rejects planner writes; ESPHome vent_latch_timeout__ms_ via SETPOINT_MAP; readback cfg___vent_latch_timeout__ms_.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 1800000, bounds 60000 to 7200000.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, greenhouse_logic.h:2, greenhouse_types.h:4, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 1800000 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 1800000 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.

Readback-only firmware inputs

fallback_window_s - readback context
  • Purpose: Readback-only external-probe watchdog window. Firmware reboots if all external probes are silent longer than this; not a planner control knob.
  • Why it matters: The planner cannot set this value, but it explains why the firmware accepted or rejected a control path.
  • Implementation: MCP rejects planner writes; readback-only; no SETPOINT_MAP route; readback cfg___fallback_window__s_.
  • Registry: class readback_context, kind numeric, owner firmware internal, tier 2, default 900, bounds 60 to 3600.
  • Firmware evidence: controls.yaml:6, globals.yaml:2, sensors.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch - at - from -.
  • Readback: latest 3600 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 0, confirmed 0, unconfirmed 0, distinct 7d values 0, 30d clamps 0.
  • Effectiveness: Readback/control input only; effectiveness is freshness and firmware consumption, not planner landing.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Read-only context. Use it to explain firmware decisions; never emit it in set_plan or set_tunable.
outdoor_dewpoint_f - readback context
  • Purpose: Readback-only outdoor dew point derived from Tempest temperature/RH; consumed by the summer-vent drier-air comparator.
  • Why it matters: The planner cannot set this value, but it explains why the firmware accepted or rejected a control path.
  • Implementation: MCP rejects planner writes; readback-only; no SETPOINT_MAP route; readback cfg___outdoor_dewpoint___f_.
  • Registry: class readback_context, kind numeric, owner firmware internal, tier 2, default live, bounds - to -.
  • Firmware evidence: controls.yaml:1, greenhouse_logic.h:2, greenhouse_types.h:2, sensors.yaml:1.
  • Last used: active - from -; latest plan - at -; latest dispatch - at - from -.
  • Readback: latest 32.649 at 2026-05-01 04:00Z (12d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 0, confirmed 0, unconfirmed 0, distinct 7d values 0, 30d clamps 0.
  • Effectiveness: Readback/control input only; effectiveness is freshness and firmware consumption, not planner landing.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Read-only context. Use it to explain firmware decisions; never emit it in set_plan or set_tunable.
outdoor_temp_f - readback context
  • Purpose: Readback-only Tempest outdoor temperature input consumed by the summer-vent cooler-and-drier gate.
  • Why it matters: The planner cannot set this value, but it explains why the firmware accepted or rejected a control path.
  • Implementation: MCP rejects planner writes; readback-only; no SETPOINT_MAP route; readback cfg___outdoor_temp___f_.
  • Registry: class readback_context, kind numeric, owner firmware internal, tier 2, default live, bounds - to -.
  • Firmware evidence: controls.yaml:4, globals.yaml:1, greenhouse_logic.h:4, greenhouse_types.h:2, sensors.yaml:7.
  • Last used: active - from -; latest plan - at -; latest dispatch - at - from -.
  • Readback: latest 57.4 at 2026-05-01 04:00Z (12d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 0, confirmed 0, unconfirmed 0, distinct 7d values 0, 30d clamps 0.
  • Effectiveness: Readback/control input only; effectiveness is freshness and firmware consumption, not planner landing.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Read-only context. Use it to explain firmware decisions; never emit it in set_plan or set_tunable.

Relay dwell and rotation

lead_rotate_s - controller safety
  • Purpose: Lead/lag fan rotation timer. Operator-tuned.
  • Why it matters: Dwell limits protect relays and reduce churn while still letting safety paths preempt.
  • Implementation: MCP rejects planner writes; ESPHome lead_rotate__s_ via SETPOINT_MAP; readback cfg___lead_rotate_timeout__s_.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 600, bounds 60 to 1800.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan iris-20260409-2105 at 2026-04-13 01:30Z; latest dispatch 600 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 600 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
min_fan_off_s - controller safety
  • Purpose: Dwell limits protect relays and reduce churn while still letting safety paths preempt.
  • Why it matters: Dwell limits protect relays and reduce churn while still letting safety paths preempt.
  • Implementation: MCP rejects planner writes; ESPHome min_fan_off__s_ via SETPOINT_MAP; readback cfg___min_fan_off__s_.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 90, bounds 30 to 300.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active - from -; latest plan iris-20260409-2105 at 2026-04-13 01:30Z; latest dispatch 90 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 90 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
min_fan_on_s - controller safety
  • Purpose: Fan min-on dwell. Rarely tuned by planner.
  • Why it matters: Dwell limits protect relays and reduce churn while still letting safety paths preempt.
  • Implementation: MCP rejects planner writes; ESPHome min_fan_on__s_ via SETPOINT_MAP; readback cfg___min_fan_on__s_.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 120, bounds 30 to 300.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active - from -; latest plan iris-20260409-2105 at 2026-04-13 01:30Z; latest dispatch 120 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 120 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
min_heat_off_s - routine
  • Purpose: Sprint-15.1 fix 6: default 300β†’180. Clamp ceiling tightened 60β†’600 so planner can’t walk past 10 min.
  • Why it matters: Dwell limits protect relays and reduce churn while still letting safety paths preempt.
  • Implementation: routine set_plan required; ESPHome min_heat_off__s_ via SETPOINT_MAP; readback cfg___min_heat_off__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 180, bounds 60 to 600.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 180 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 180 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 180 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 102, confirmed 102, unconfirmed 0, distinct 7d values 3, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
min_heat_on_s - routine
  • Purpose: Heater min-on dwell. In MCP TIER1.
  • Why it matters: Dwell limits protect relays and reduce churn while still letting safety paths preempt.
  • Implementation: routine set_plan required; ESPHome min_heat_on__s_ via SETPOINT_MAP; readback cfg___min_heat_on__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 120, bounds 30 to 300.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 120 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 120 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 120 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 96, confirmed 96, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
min_vent_off_s - routine
  • Purpose: Vent min-off dwell. In MCP TIER1.
  • Why it matters: Dwell limits protect relays and reduce churn while still letting safety paths preempt.
  • Implementation: routine set_plan required; ESPHome min_vent_off__s_ via SETPOINT_MAP; readback cfg___min_vent_off__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 60, bounds 10 to 300.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, greenhouse_logic.h:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 60 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 60 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 60 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 113, confirmed 113, unconfirmed 0, distinct 7d values 4, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
min_vent_on_s - routine
  • Purpose: Vent min-on dwell. In MCP TIER1.
  • Why it matters: Dwell limits protect relays and reduce churn while still letting safety paths preempt.
  • Implementation: routine set_plan required; ESPHome min_vent_on__s_ via SETPOINT_MAP; readback cfg___min_vent_on__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 60, bounds 10 to 300.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, greenhouse_logic.h:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 60 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 60 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 60 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 101, confirmed 101, unconfirmed 0, distinct 7d values 3, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.

Safety rails

safety_max - controller safety
  • Purpose: Hard hot rail β€” SAFETY_COOL mode trigger. Operator-only.
  • Why it matters: These are hard guardrails. They protect the greenhouse when normal planning or sensors are wrong.
  • Implementation: MCP rejects planner writes; ESPHome safety_max__f via SETPOINT_MAP; readback cfg___safety_max___f_.
  • Registry: class controller_safety, kind numeric, owner safety, tier 2, default 95, bounds 80 to 110.
  • Firmware evidence: controls.yaml:8, globals.yaml:3, greenhouse_logic.h:21, greenhouse_types.h:13, sensors.yaml:4, tunables.yaml:8.
  • Last used: active - from -; latest plan - at -; latest dispatch 100 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 100 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 101, confirmed 101, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
safety_max_seal_margin_f - controller safety
  • Purpose: Blocks new sealed-mist entries when temp is within this margin of safety_max.
  • Why it matters: These are hard guardrails. They protect the greenhouse when normal planning or sensors are wrong.
  • Implementation: MCP rejects planner writes; ESPHome safety_seal_margin__f via SETPOINT_MAP; readback cfg___safety_seal_margin___f_.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 5, bounds 1 to 15.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, greenhouse_logic.h:9, greenhouse_types.h:4, sensors.yaml:2, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 5 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 5 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
safety_min - controller safety
  • Purpose: Hard cold rail β€” SAFETY_HEAT mode trigger. Operator-only.
  • Why it matters: These are hard guardrails. They protect the greenhouse when normal planning or sensors are wrong.
  • Implementation: MCP rejects planner writes; ESPHome safety_min__f via SETPOINT_MAP; readback cfg___safety_min___f_.
  • Registry: class controller_safety, kind numeric, owner safety, tier 2, default 45, bounds 30 to 60.
  • Firmware evidence: controls.yaml:6, globals.yaml:2, greenhouse_logic.h:2, greenhouse_types.h:5, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 40 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 40 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 101, confirmed 101, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
safety_vpd_max - controller safety
  • Purpose: Hard high-VPD rail (vpd_max_safe). Operator-only.
  • Why it matters: These are hard guardrails. They protect the greenhouse when normal planning or sensors are wrong.
  • Implementation: MCP rejects planner writes; ESPHome safety_vpd_max_kpa via SETPOINT_MAP; readback cfg___safety_vpd_max__kpa_.
  • Registry: class controller_safety, kind numeric, owner safety, tier 2, default 2.5, bounds 2.5 to 3.
  • Firmware evidence: controls.yaml:6, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active - from -; latest plan - at -; latest dispatch 2.5 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 2.5 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 58, confirmed 56, unconfirmed 2, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 56/58 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
safety_vpd_min - controller safety
  • Purpose: Hard low-VPD rail (vpd_min_safe). Operator-only.
  • Why it matters: These are hard guardrails. They protect the greenhouse when normal planning or sensors are wrong.
  • Implementation: MCP rejects planner writes; ESPHome safety_vpd_min_kpa via SETPOINT_MAP; readback cfg___safety_vpd_min__kpa_.
  • Registry: class controller_safety, kind numeric, owner safety, tier 2, default 0.3, bounds 0.1 to 1.5.
  • Firmware evidence: controls.yaml:4, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active - from -; latest plan - at -; latest dispatch 0.3 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 0.3 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 58, confirmed 56, unconfirmed 2, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 56/58 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.

Summer vent gate

outdoor_staleness_max_s - routine
  • Purpose: Gate disables when outdoor data older than this. Sprint-15.1 raised default 300β†’600 and floor 60β†’120 so dispatcher cadence jitter doesn’t intermittently disqualify the gate.
  • Why it matters: This gate prevents firmware from sealing the greenhouse when outside air is cooler and drier enough to cool safely.
  • Implementation: routine set_plan required; ESPHome outdoor_staleness_max__s_ via SETPOINT_MAP; readback cfg___outdoor_staleness_max__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 600, bounds 120 to 1800.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, greenhouse_logic.h:2, greenhouse_types.h:5, sensors.yaml:2, tunables.yaml:2.
  • Last used: active 600 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 600 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 600 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 43, confirmed 43, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
summer_vent_min_runtime_s - reserved/no-op
  • Purpose: Reserved/no-op in current firmware. Setpoints field is clamped but not consumed by the gate.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome summer_vent_min_runtime__s_ via SETPOINT_MAP; readback cfg___summer_vent_min_runtime__s_.
  • Registry: class retired, kind numeric, owner planner, tier 2, default 180, bounds 60 to 600.
  • Firmware evidence: controls.yaml:4, globals.yaml:2, greenhouse_types.h:8, sensors.yaml:4, tunables.yaml:6.
  • Last used: active - from -; latest plan iris-20260511-0448 at 2026-05-13 15:00Z; latest dispatch 180 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 180 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
sw_summer_vent_enabled - routine
  • Purpose: Master switch for the sprint-15 outdoor-cooler-and-drier gate. Default ON: firmware behavior without it is wrong in summer.
  • Why it matters: This gate prevents firmware from sealing the greenhouse when outside air is cooler and drier enough to cool safely.
  • Implementation: routine set_plan required; ESPHome summer_vent_enabled via SETPOINT_MAP; readback cfg_summer_vent_enabled.
  • Registry: class planner_policy, kind switch, owner planner, tier 1, default 1, bounds switch 0/1.
  • Firmware evidence: controls.yaml:4, globals.yaml:2, greenhouse_logic.h:4, greenhouse_types.h:6, sensors.yaml:8, tunables.yaml:12.
  • Last used: active 1 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 1 at 2026-05-11 19:49Z from plan.
  • Readback: latest 1 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 87, confirmed 85, unconfirmed 2, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 85/87 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
vent_prefer_dp_delta_f - routine
  • Purpose: Outdoor dewpoint must be β‰₯ this many Β°F below indoor DP for gate.
  • Why it matters: This gate prevents firmware from sealing the greenhouse when outside air is cooler and drier enough to cool safely.
  • Implementation: routine set_plan required; ESPHome vent_prefer_dp_delta__f_ via SETPOINT_MAP; readback cfg___vent_prefer_dp_delta__f_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 5, bounds 2 to 15.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, greenhouse_logic.h:3, greenhouse_types.h:5, sensors.yaml:2, tunables.yaml:2.
  • Last used: active 5 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 5 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 5 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 53, confirmed 53, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
vent_prefer_temp_delta_f - routine
  • Purpose: Outdoor must be β‰₯ this many Β°F cooler than indoor for gate to fire.
  • Why it matters: This gate prevents firmware from sealing the greenhouse when outside air is cooler and drier enough to cool safely.
  • Implementation: routine set_plan required; ESPHome vent_prefer_temp_delta__f_ via SETPOINT_MAP; readback cfg___vent_prefer_temp_delta__f_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 5, bounds 2 to 15.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, greenhouse_logic.h:3, greenhouse_types.h:5, sensors.yaml:2, tunables.yaml:2.
  • Last used: active 5 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 5 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 5 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 53, confirmed 53, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.

Temperature band and staging

d_cool_stage_2 - routine
  • Purpose: Β°F above temp_high at which fan-2 engages. In MCP TIER1 β€” planner tunes during summer heat.
  • Why it matters: Temperature setpoints drive heater staging, ventilation, fan staging, and heat-stress avoidance.
  • Implementation: routine set_plan required; ESPHome __cool_stage_2__f via SETPOINT_MAP; readback cfg___d_cool_stage_2___f_.
  • Registry: class planner_policy, kind numeric, owner band, tier 1, default 3, bounds 2 to 15.
  • Firmware evidence: greenhouse_logic.h:1, sensors.yaml:2.
  • Last used: active 3 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 3 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 3 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 110, confirmed 110, unconfirmed 0, distinct 7d values 4, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
d_heat_stage_2 - routine
  • Purpose: Forecast-tuned heating aggressiveness. Β°F below the interior heating target (temp_low + 25% band + bias_heat) where heat stage 2 latches.
  • Why it matters: Temperature setpoints drive heater staging, ventilation, fan staging, and heat-stress avoidance.
  • Implementation: routine set_plan required; ESPHome __heat_stage_2__f via SETPOINT_MAP; readback cfg___d_heat_stage_2___f_.
  • Registry: class planner_policy, kind numeric, owner band, tier 1, default 5, bounds 2 to 15.
  • Firmware evidence: greenhouse_logic.h:1, sensors.yaml:2.
  • Last used: active 5 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 5 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 5 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 97, confirmed 97, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: iris-20260430-1954 (validated 2026-05-11 02:27Z, score 6); expected effect: let gas heat carry sustained cold efficiently without waiting for a deep undershoot.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
heat_hysteresis - routine
  • Purpose: Forecast-tuned heat-stage clear margin above the interior heating target. Higher values hold heat longer.
  • Why it matters: Temperature setpoints drive heater staging, ventilation, fan staging, and heat-stress avoidance.
  • Implementation: routine set_plan required; ESPHome heat_hysteresis__f via SETPOINT_MAP; readback cfg___heat_hyst___f_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 1, bounds 0 to 3.
  • Firmware evidence: controls.yaml:4, globals.yaml:1, greenhouse_logic.h:5, greenhouse_types.h:5, sensors.yaml:2, tunables.yaml:4.
  • Last used: active 1.2 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 1.2 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 1.2 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 127, confirmed 125, unconfirmed 2, distinct 7d values 4, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 125/127 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
temp_high - crop band
  • Purpose: Crop band β€” dispatcher pushes every cycle.
  • Why it matters: Temperature setpoints drive heater staging, ventilation, fan staging, and heat-stress avoidance.
  • Implementation: MCP rejects planner writes; ESPHome set_temp_high__f via SETPOINT_MAP; readback cfg___temp_high___f_.
  • Registry: class crop_band, kind numeric, owner band, tier 2, default 95, bounds 40 to 100.
  • Firmware evidence: controls.yaml:5, globals.yaml:2, greenhouse_logic.h:19, greenhouse_types.h:9, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan preemptive-20260512-2036 at 2026-05-12 20:36Z; latest dispatch 65 at 2026-05-13 04:44Z from band.
  • Readback: latest 65 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 391, confirmed 389, unconfirmed 2, distinct 7d values 120, 30d clamps 493.
  • Effectiveness: Mostly confirmed: 389/391 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not push from Iris. Crop profiles and dispatcher own this value; use planner-policy bias/staging knobs instead.
temp_hysteresis - routine
  • Purpose: Forecast-tuned temperature transition hysteresis. Wider values reduce mode churn; narrower values tighten band tracking.
  • Why it matters: Temperature setpoints drive heater staging, ventilation, fan staging, and heat-stress avoidance.
  • Implementation: routine set_plan required; ESPHome temp_hysteresis__f via SETPOINT_MAP; readback cfg___temp_hyst___f_.
  • Registry: class planner_policy, kind numeric, owner band, tier 1, default 1.5, bounds 0.5 to 3.
  • Firmware evidence: controls.yaml:1, greenhouse_logic.h:7, greenhouse_types.h:5.
  • Last used: active 1.8 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 1.8 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 1.8 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 113, confirmed 113, unconfirmed 0, distinct 7d values 7, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
temp_low - crop band
  • Purpose: Crop band β€” dispatcher pushes every cycle. Firmware default wide (40) so safety rails govern if dispatcher silent.
  • Why it matters: Temperature setpoints drive heater staging, ventilation, fan staging, and heat-stress avoidance.
  • Implementation: MCP rejects planner writes; ESPHome set_temp_low__f via SETPOINT_MAP; readback cfg___temp_low___f_.
  • Registry: class crop_band, kind numeric, owner band, tier 2, default 40, bounds 30 to 80.
  • Firmware evidence: controls.yaml:4, globals.yaml:2, greenhouse_logic.h:17, greenhouse_types.h:8, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan preemptive-20260418-0730 at 2026-04-18 07:30Z; latest dispatch 62 at 2026-05-13 04:44Z from band.
  • Readback: latest 62 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 363, confirmed 361, unconfirmed 2, distinct 7d values 86, 30d clamps 1970.
  • Effectiveness: Mostly confirmed: 361/363 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not push from Iris. Crop profiles and dispatcher own this value; use planner-policy bias/staging knobs instead.

VPD band

vpd_high - crop band
  • Purpose: Crop band high-VPD threshold; firmware seal entry trigger.
  • Why it matters: VPD control protects transpiration balance; this is usually the limiting axis on hot dry days.
  • Implementation: MCP rejects planner writes; ESPHome set_vpd_high_kpa via SETPOINT_MAP; readback cfg___vpd_high__kpa_.
  • Registry: class crop_band, kind numeric, owner band, tier 2, default 2.8, bounds 0.4 to 3.
  • Firmware evidence: controls.yaml:3, globals.yaml:2, greenhouse_logic.h:39, greenhouse_types.h:10, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan operator-2026-04-25-band-relief at 2026-04-25 22:34Z; latest dispatch 0.8 at 2026-05-13 04:44Z from band.
  • Readback: latest 0.8 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 360, confirmed 358, unconfirmed 2, distinct 7d values 56, 30d clamps 1496.
  • Effectiveness: Mostly confirmed: 358/360 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not push from Iris. Crop profiles and dispatcher own this value; use planner-policy bias/staging knobs instead.
vpd_hysteresis - routine
  • Purpose: In MCP TIER1 β€” planner tunes to widen/tighten seal exit during humid regimes.
  • Why it matters: VPD control protects transpiration balance; this is usually the limiting axis on hot dry days.
  • Implementation: routine set_plan required; ESPHome vpd_hysteresis_kpa via SETPOINT_MAP; readback cfg___vpd_hyst__kpa_.
  • Registry: class planner_policy, kind numeric, owner band, tier 1, default 0.3, bounds 0.05 to 0.5.
  • Firmware evidence: controls.yaml:1, greenhouse_logic.h:5, greenhouse_types.h:4.
  • Last used: active 0.5 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 0.5 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 0.5 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 124, confirmed 124, unconfirmed 0, distinct 7d values 7, 30d clamps 2.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: iris-20260512-2007 (pending, score -); expected effect: reduce missed high-VPD excursions during the ramp, then widen to 0.50 after sunset.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
vpd_low - crop band
  • Purpose: Crop band low-VPD threshold. Dispatcher pushes every cycle.
  • Why it matters: VPD control protects transpiration balance; this is usually the limiting axis on hot dry days.
  • Implementation: MCP rejects planner writes; ESPHome set_vpd_low_kpa via SETPOINT_MAP; readback cfg___vpd_low__kpa_.
  • Registry: class crop_band, kind numeric, owner band, tier 2, default 0.35, bounds 0.1 to 1.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, greenhouse_logic.h:18, greenhouse_types.h:13, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 0.25 at 2026-05-13 04:44Z from band.
  • Readback: latest 0.25 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 500, confirmed 499, unconfirmed 1, distinct 7d values 75, 30d clamps 63.
  • Effectiveness: Mostly confirmed: 499/500 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not push from Iris. Crop profiles and dispatcher own this value; use planner-policy bias/staging knobs instead.
vpd_watch_dwell_s - routine
  • Purpose: VPD_WATCH observation window before engaging mist.
  • Why it matters: VPD control protects transpiration balance; this is usually the limiting axis on hot dry days.
  • Implementation: routine set_plan required; ESPHome vpd_watch_dwell__s_ via SETPOINT_MAP; readback cfg___vpd_watch_dwell__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 60, bounds 15 to 120.
  • Firmware evidence: controls.yaml:4, globals.yaml:2, greenhouse_logic.h:5, greenhouse_types.h:5, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 60 from iris-20260512-2007; latest plan iris-20260512-2007 at 2026-05-14 01:30Z; latest dispatch 60 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 60 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 152, confirmed 150, unconfirmed 2, distinct 7d values 7, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 150/152 7d writes have readbacks.
  • Latest plan rationale: iris-20260512-2007 (pending, score -); expected effect: enter recovery sooner without excessive mode churn.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.

Zone scoring

east_adjacency_factor - controller safety
  • Purpose: Weight for borrowing east-zone signal into adjacent scoring (no east mister).
  • Why it matters: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Implementation: MCP rejects planner writes; ESPHome east_adjacency_factor via SETPOINT_MAP; readback cfg___east_adjacency_factor.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 0.3, bounds 0 to 1.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan iris-20260409-2105 at 2026-04-13 01:30Z; latest dispatch 0.3 at 2026-05-13 03:04Z from esp32.
  • Readback: latest 0.3 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 35, confirmed 35, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
vpd_target_center - crop band
  • Purpose: Center zone has wider floor (0.1) to tolerate seedling propagation.
  • Why it matters: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Implementation: MCP rejects planner writes; ESPHome vpd_target_center__kpa_ via SETPOINT_MAP; readback cfg___vpd_target_center__kpa_.
  • Registry: class crop_band, kind numeric, owner band, tier 2, default 0.8, bounds 0.1 to 3.
  • Firmware evidence: controls.yaml:8, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 0.6 at 2026-05-13 04:44Z from band.
  • Readback: latest 0.6 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 849, confirmed 847, unconfirmed 2, distinct 7d values 64, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 847/849 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not push from Iris. Crop profiles and dispatcher own this value; use planner-policy bias/staging knobs instead.
vpd_target_east - crop band
  • Purpose: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Why it matters: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Implementation: MCP rejects planner writes; ESPHome vpd_target_east__kpa_ via SETPOINT_MAP; readback cfg___vpd_target_east__kpa_.
  • Registry: class crop_band, kind numeric, owner band, tier 2, default 1, bounds 0.3 to 3.
  • Firmware evidence: controls.yaml:5, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 0.6 at 2026-05-13 04:44Z from band.
  • Readback: latest 0.6 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 968, confirmed 962, unconfirmed 6, distinct 7d values 87, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 962/968 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not push from Iris. Crop profiles and dispatcher own this value; use planner-policy bias/staging knobs instead.
vpd_target_south - crop band
  • Purpose: Per-zone VPD target β€” dispatcher pushes from crop band.
  • Why it matters: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Implementation: MCP rejects planner writes; ESPHome vpd_target_south__kpa_ via SETPOINT_MAP; readback cfg___vpd_target_south__kpa_.
  • Registry: class crop_band, kind numeric, owner band, tier 2, default 1.3, bounds 0.3 to 3.
  • Firmware evidence: controls.yaml:8, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 1 at 2026-05-13 04:44Z from band.
  • Readback: latest 1 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 688, confirmed 686, unconfirmed 2, distinct 7d values 85, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 686/688 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not push from Iris. Crop profiles and dispatcher own this value; use planner-policy bias/staging knobs instead.
vpd_target_west - crop band
  • Purpose: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Why it matters: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Implementation: MCP rejects planner writes; ESPHome vpd_target_west__kpa_ via SETPOINT_MAP; readback cfg___vpd_target_west__kpa_.
  • Registry: class crop_band, kind numeric, owner band, tier 2, default 1.2, bounds 0.3 to 3.
  • Firmware evidence: controls.yaml:8, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 1.2 at 2026-05-13 04:44Z from band.
  • Readback: latest 1.2 at 2026-05-13 05:45Z (0m old); 7d readbacks 10065.
  • Landing evidence: 7d dispatcher writes 198, confirmed 196, unconfirmed 2, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 196/198 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not push from Iris. Crop profiles and dispatcher own this value; use planner-policy bias/staging knobs instead.

Regenerate with scripts/generate-ai-tunables-page.py; publish through scripts/publish-site-content.sh so the static context and public site stay aligned.