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
Every name accepted by PlanTransition, SetpointChange, or setpoint_snapshot.
Includes dispatcher-routed and readback-only firmware inputs.
Required in every routine set_plan waypoint.
The only tunables the planner may write. Operator, crop-band, readback, and retired rows are context only.
Live safety state at generation time.
148 future active plan rows.
Should remain zero for no-op/deprecated params.
Plan dispatcher writes carrying trigger IDs.
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_VENTexits immediately if dehumidifying with vent/fans pushes VPD abovevpd_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.
heat2is never valid withoutheat1; 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
VENTILATEstress with healthy dew margin, the dispatcher clamps conservative moisture thresholds near the activevpd_highband: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.
| Parameter | Active | Future rows | Last dispatch | 7d confirmed | Planner instruction |
|---|---|---|---|---|---|
bias_cool | 3 | 4 | 2026-05-13 03:04Z | 134/134 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
bias_heat | 0.5 | 4 | 2026-05-13 03:04Z | 113/113 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
d_cool_stage_2 | 3 | 4 | 2026-05-13 03:04Z | 110/110 | 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 | 5 | 4 | 2026-05-13 03:04Z | 97/97 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
dwell_gate_ms | 300000 | 4 | 2026-05-13 03:04Z | 97/97 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
enthalpy_close | 1 | 4 | 2026-05-13 03:04Z | 100/100 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
enthalpy_open | -2 | 4 | 2026-05-13 03:04Z | 100/100 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
fog_escalation_kpa | 0.85 | 4 | 2026-05-13 04:39Z | 167/169 | 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. |
heat_hysteresis | 1.2 | 4 | 2026-05-13 03:04Z | 125/127 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
min_fog_off_s | 120 | 4 | 2026-05-13 03:04Z | 128/128 | 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 | 45 | 4 | 2026-05-13 03:04Z | 112/112 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
min_heat_off_s | 180 | 4 | 2026-05-13 03:04Z | 102/102 | 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 | 120 | 4 | 2026-05-13 03:04Z | 96/96 | 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 | 60 | 4 | 2026-05-13 03:04Z | 113/113 | 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 | 60 | 4 | 2026-05-13 03:04Z | 101/101 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
mist_backoff_s | 900 | 4 | 2026-05-13 03:04Z | 134/136 | 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 | 180 | 4 | 2026-05-13 03:04Z | 140/142 | 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 | 90 | 4 | 2026-05-13 03:04Z | 97/97 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
mister_all_delay_s | 300 | 4 | 2026-05-13 04:39Z | 149/151 | 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 | 2.35 | 4 | 2026-05-13 04:39Z | 152/152 | 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_engage_delay_s | 90 | 4 | 2026-05-13 04:39Z | 144/146 | 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 | 1.75 | 4 | 2026-05-13 04:39Z | 151/151 | 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_pulse_gap_s | 60 | 4 | 2026-05-13 04:39Z | 173/175 | 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 | 90 | 4 | 2026-05-13 03:04Z | 143/145 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
mister_vpd_weight | 1.5 | 4 | 2026-05-13 03:04Z | 77/77 | 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 | 500 | 4 | 2026-05-13 03:04Z | 96/96 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
outdoor_staleness_max_s | 600 | 4 | 2026-05-13 03:04Z | 43/43 | 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 | 1 | 4 | 2026-05-11 19:49Z | 62/62 | 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 | 1 | 4 | 2026-05-11 19:49Z | 9/9 | 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 | 1 | 4 | 2026-05-11 19:49Z | 62/62 | 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_mister_closes_vent | 1 | 4 | 2026-05-11 19:49Z | 30/30 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
sw_summer_vent_enabled | 1 | 4 | 2026-05-11 19:49Z | 85/87 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
temp_hysteresis | 1.8 | 4 | 2026-05-13 03:04Z | 113/113 | 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 | 5 | 4 | 2026-05-13 03:04Z | 53/53 | 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 | 5 | 4 | 2026-05-13 03:04Z | 53/53 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
vpd_hysteresis | 0.5 | 4 | 2026-05-13 03:04Z | 124/124 | Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard. |
vpd_watch_dwell_s | 60 | 4 | 2026-05-13 03:04Z | 150/152 | Include 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_kpais effectful, but it is not the state-machine entry trigger. Firmware enters humidification fromvpd_highplusvpd_watch_dwell_s;mister_engage_kpagates physical S1 mister pulses once humidity or zone demand exists, and zone stress can bypass the global threshold.mister_all_kpacontrols physical all-zone mister rotation. The header mist-stage delay also usesmister_all_delay_s; fog escalation usesfog_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 activevpd_highunless 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; readbackcfg_dwell_gate_ms. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default300000, bounds60000 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
300000fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch300000at2026-05-13 03:04Zfromesp32. - Readback: latest
300000at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
97, confirmed97, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_planwaypoint. 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_enabledvia SETPOINT_MAP; readbackcfg_dwell_gate_enabled. - Registry: class
planner_policy, kindswitch, ownerplanner, tier1, default0, boundsswitch 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
1fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch1at2026-05-11 19:49Zfromplan. - Readback: latest
1at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
62, confirmed62, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_planwaypoint. 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_enabledvia SETPOINT_MAP; readbackcfg_fsm_controller_enabled. - Registry: class
planner_policy, kindswitch, owneroperator, tier1, default1, boundsswitch 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
1fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch1at2026-05-11 19:49Zfrommanual. - Readback: latest
1at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
62, confirmed62, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_inhibitvia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindswitch, owneroperator, tier2, default1, boundsswitch 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 dispatch1at2026-05-09 22:37Zfrommanual. - Readback: latest
-at-(- old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
22, confirmed0, unconfirmed22, distinct 7d values1, 30d clamps0. - 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__fvia SETPOINT_MAP; readbackcfg___econ_heat_margin___f_. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default5, bounds1 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 dispatch5at2026-05-13 03:04Zfromesp32. - Readback: latest
5at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackcfg___enthalpy_close__kj_kg___. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default1, bounds-5 to 20. - Firmware evidence:
controls.yaml:2, globals.yaml:1, sensors.yaml:2, tunables.yaml:4. - Last used: active
1fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch1at2026-05-13 03:04Zfromesp32. - Readback: latest
1at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
100, confirmed100, unconfirmed0, distinct 7d values2, 30d clamps0. - 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_planwaypoint. 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; readbackcfg___enthalpy_open__kj_kg___. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default-2, bounds-5 to 0. - Firmware evidence:
controls.yaml:2, globals.yaml:1, sensors.yaml:2, tunables.yaml:4. - Last used: active
-2fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch-2at2026-05-13 03:04Zfromesp32. - Readback: latest
-2at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
100, confirmed100, unconfirmed0, distinct 7d values2, 30d clamps0. - 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_planwaypoint. 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; readbackcfg___site_pressure__hpa_. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default840, bounds700 to 1100. - Firmware evidence:
globals.yaml:1, sensors.yaml:4, tunables.yaml:2. - Last used: active
-from-; latest plan-at-; latest dispatch840at2026-05-13 03:04Zfromesp32. - Readback: latest
840at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_enabledvia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindswitch, owneroperator, tier2, default1, boundsswitch 0/1. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:9. - Last used: active
-from-; latest planiris-20260409-2105at2026-04-13 01:30Z; latest dispatch1at2026-04-10 05:33Zfromplan. - Readback: latest
1at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
0, confirmed0, unconfirmed0, distinct 7d values0, 30d clamps0. - 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; readbackcfg___fog_burst__min_. - Registry: class
retired, kindnumeric, owneroperator, tier2, default10, bounds1 to 60. - Firmware evidence:
controls.yaml:4, globals.yaml:1, sensors.yaml:2, tunables.yaml:2. - Last used: active
-from-; latest planiris-20260409-2105at2026-04-13 01:30Z; latest dispatch8at2026-05-13 04:37Zfromesp32. - Readback: latest
8at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
48, confirmed48, unconfirmed0, distinct 7d values3, 30d clamps0. - 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; readbackcfg___fog_escalation__kpa_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default0.4, bounds0.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.85fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch0.85at2026-05-13 04:39Zfromplan. - Readback: latest
0.85at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
169, confirmed167, unconfirmed2, distinct 7d values17, 30d clamps8. - 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
VENTILATEstress with healthy dew margin, use about0.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; readbackcfg___fog_min_temp___f_. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default55, bounds40 to 65. - Firmware evidence:
controls.yaml:1, globals.yaml:1, sensors.yaml:2, tunables.yaml:2. - Last used: active
-from-; latest plan-at-; latest dispatch55at2026-05-13 03:04Zfromesp32. - Readback: latest
55at2026-05-13 05:45Z(0m old); 7d readbacks3255. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackcfg___fog_rh_ceiling____. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default90, bounds75 to 98. - Firmware evidence:
controls.yaml:1, globals.yaml:1, sensors.yaml:2, tunables.yaml:2. - Last used: active
-from-; latest plan-at-; latest dispatch90at2026-05-13 03:04Zfromesp32. - Readback: latest
90at2026-05-13 05:45Z(0m old); 7d readbacks3255. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackcfg___fog_window_end__hour_. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default18, bounds14 to 20. - Firmware evidence:
controls.yaml:1, globals.yaml:1, sensors.yaml:2, tunables.yaml:2. - Last used: active
-from-; latest plan-at-; latest dispatch17at2026-05-13 03:04Zfromesp32. - Readback: latest
17at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackcfg___fog_window_start__hour_. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default6, bounds5 to 12. - Firmware evidence:
controls.yaml:1, globals.yaml:1, sensors.yaml:2, tunables.yaml:2. - Last used: active
-from-; latest plan-at-; latest dispatch7at2026-05-13 03:04Zfromesp32. - Readback: latest
7at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackcfg___min_fog_off__s_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default60, bounds15 to 300. - Firmware evidence:
controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
120fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch120at2026-05-13 03:04Zfromesp32. - Readback: latest
120at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
128, confirmed128, unconfirmed0, distinct 7d values6, 30d clamps0. - 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_planwaypoint. 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; readbackcfg___min_fog_on__s_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default60, bounds15 to 300. - Firmware evidence:
controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
45fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch45at2026-05-13 03:04Zfromesp32. - Readback: latest
45at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
112, confirmed112, unconfirmed0, distinct 7d values2, 30d clamps0. - 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_planwaypoint. 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_ventvia SETPOINT_MAP; readbackfog_closes_vent. - Registry: class
planner_policy, kindswitch, ownerplanner, tier1, default1, boundsswitch 0/1. - Firmware evidence:
controls.yaml:6, globals.yaml:2, tunables.yaml:9. - Last used: active
1fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch1at2026-05-11 19:49Zfromplan. - Readback: latest
1at2026-05-13 05:45Z(0m old); 7d readbacks2558. - Landing evidence: 7d dispatcher writes
9, confirmed9, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_planwaypoint. 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; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default14, bounds1 to 50. - Firmware evidence:
controls.yaml:2, globals.yaml:1, tunables.yaml:4. - Last used: active
-from-; latest planiris-fix-dli-20260328at2026-03-29 03:04Z; latest dispatch14at2026-05-13 03:04Zfromesp32. - Readback: latest
14at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_hysteresisvia SETPOINT_MAP; readbackcfg___gl_lux_hysteresis. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default1500, bounds0 to 10000. - Firmware evidence:
controls.yaml:2, globals.yaml:1, sensors.yaml:2, tunables.yaml:4. - Last used: active
-from-; latest plan-at-; latest dispatch1500at2026-05-13 03:04Zfromesp32. - Readback: latest
1500at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_thresholdvia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default3000, bounds100 to 50000. - Firmware evidence:
controls.yaml:2, globals.yaml:1, tunables.yaml:4. - Last used: active
-from-; latest planiris-fix-gl-20260328at2026-03-29 03:06Z; latest dispatch3000at2026-05-13 03:04Zfromesp32. - Readback: latest
20000at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_hourvia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default7, bounds0 to 23. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:4. - Last used: active
-from-; latest plan-at-; latest dispatch7at2026-05-13 03:04Zfromesp32. - Readback: latest
7at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_hourvia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default19, bounds0 to 23. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:4. - Last used: active
-from-; latest plan-at-; latest dispatch19at2026-05-13 03:04Zfromesp32. - Readback: latest
19at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_modevia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindswitch, owneroperator, tier2, default1, boundsswitch 0/1. - Firmware evidence:
no token hit. - Last used: active
-from-; latest planiris-dev-gl-fixat2026-03-25 17:31Z; latest dispatch1at2026-05-09 22:37Zfrommanual. - Readback: latest
1at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
23, confirmed0, unconfirmed23, distinct 7d values2, 30d clamps0. - 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; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default10, bounds1 to 120. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:2. - Last used: active
-from-; latest plan-at-; latest dispatch10at2026-05-13 03:04Zfromesp32. - Readback: latest
10at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default5, bounds0 to 60. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:2. - Last used: active
-from-; latest plan-at-; latest dispatch5at2026-05-13 03:04Zfromesp32. - Readback: latest
5at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_cyclesvia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default0, bounds0 to 30. - Firmware evidence:
controls.yaml:2, globals.yaml:1, tunables.yaml:4. - Last used: active
-from-; latest plan-at-; latest dispatch0at2026-05-13 03:04Zfromesp32. - Readback: latest
0at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default2, bounds0 to 30. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:2. - Last used: active
-from-; latest plan-at-; latest dispatch2at2026-05-13 03:04Zfromesp32. - Readback: latest
0at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default1, bounds1 to 14. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:2. - Last used: active
-from-; latest plan-at-; latest dispatch1at2026-05-13 03:04Zfromesp32. - Readback: latest
0at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_hourvia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default6, bounds0 to 23. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:4. - Last used: active
-from-; latest plan-at-; latest dispatch6at2026-05-13 03:04Zfromesp32. - Readback: latest
6at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_minvia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default30, bounds0 to 59. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:4. - Last used: active
-from-; latest plan-at-; latest dispatch30at2026-05-13 03:04Zfromesp32. - Readback: latest
0at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default25, bounds0 to 200. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:4. - Last used: active
-from-; latest planiris-20260409-2105at2026-04-13 01:30Z; latest dispatch25at2026-05-13 03:04Zfromesp32. - Readback: latest
25at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default3, bounds0 to 24. - Firmware evidence:
controls.yaml:2, globals.yaml:1, tunables.yaml:2. - Last used: active
-from-; latest planiris-20260409-2105at2026-04-13 01:30Z; latest dispatch3at2026-05-13 03:04Zfromesp32. - Readback: latest
3at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default10, bounds1 to 120. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:2. - Last used: active
-from-; latest planiris-20260405-1020at2026-04-05 16:20Z; latest dispatch10at2026-05-13 03:04Zfromesp32. - Readback: latest
10at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default5, bounds0 to 60. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:2. - Last used: active
-from-; latest plan-at-; latest dispatch5at2026-05-13 03:04Zfromesp32. - Readback: latest
5at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_cyclesvia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default0, bounds0 to 30. - Firmware evidence:
controls.yaml:2, globals.yaml:1, tunables.yaml:4. - Last used: active
-from-; latest plan-at-; latest dispatch0at2026-05-13 03:04Zfromesp32. - Readback: latest
0at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default2, bounds0 to 30. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:2. - Last used: active
-from-; latest plan-at-; latest dispatch2at2026-05-13 03:04Zfromesp32. - Readback: latest
2at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default1, bounds1 to 14. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:2. - Last used: active
-from-; latest planiris-20260405-1020at2026-04-05 16:20Z; latest dispatch1at2026-05-13 03:04Zfromesp32. - Readback: latest
1at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_hourvia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default6, bounds0 to 23. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:4. - Last used: active
-from-; latest planiris-20260405-1020at2026-04-05 16:20Z; latest dispatch6at2026-05-13 03:04Zfromesp32. - Readback: latest
6at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_minvia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default0, bounds0 to 59. - Firmware evidence:
controls.yaml:1, globals.yaml:1, tunables.yaml:4. - Last used: active
-from-; latest plan-at-; latest dispatch0at2026-05-13 03:04Zfromesp32. - Readback: latest
0at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_enabledvia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindswitch, owneroperator, tier2, default1, boundsswitch 0/1. - Firmware evidence:
no token hit. - Last used: active
-from-; latest plan-at-; latest dispatch0at2026-05-09 22:37Zfrommanual. - Readback: latest
-at-(- old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
22, confirmed0, unconfirmed22, distinct 7d values1, 30d clamps0. - 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_enabledvia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindswitch, owneroperator, tier2, default1, boundsswitch 0/1. - Firmware evidence:
no token hit. - Last used: active
-from-; latest plan-at-; latest dispatch0at2026-05-09 22:37Zfrommanual. - Readback: latest
-at-(- old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
22, confirmed0, unconfirmed22, distinct 7d values1, 30d clamps0. - 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_enabledvia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindswitch, owneroperator, tier2, default1, boundsswitch 0/1. - Firmware evidence:
no token hit. - Last used: active
-from-; latest plan-at-; latest dispatch0at2026-05-09 22:37Zfrommanual. - Readback: latest
-at-(- old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
22, confirmed0, unconfirmed22, distinct 7d values1, 30d clamps0. - 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_skipvia SETPOINT_MAP; readbackno cfg readback. - Registry: class
controller_safety, kindswitch, owneroperator, tier2, default1, boundsswitch 0/1. - Firmware evidence:
no token hit. - Last used: active
-from-; latest plan-at-; latest dispatch1at2026-05-09 22:37Zfrommanual. - Readback: latest
-at-(- old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
22, confirmed0, unconfirmed22, distinct 7d values1, 30d clamps0. - 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; readbackcfg___mist_backoff__s_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default600, bounds60 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
900fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch900at2026-05-13 03:04Zfromesp32. - Readback: latest
900at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
136, confirmed134, unconfirmed2, distinct 7d values4, 30d clamps0. - 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_planwaypoint. 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; readbackcfg___mist_max_closed_vent__s_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default600, bounds120 to 900. - Firmware evidence:
controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
180fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch180at2026-05-13 03:04Zfromesp32. - Readback: latest
180at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
142, confirmed140, unconfirmed2, distinct 7d values7, 30d clamps0. - 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_planwaypoint. 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; readbackcfg___mist_thermal_relief__s_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default90, bounds30 to 300. - Firmware evidence:
controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
90fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch90at2026-05-13 03:04Zfromesp32. - Readback: latest
90at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
97, confirmed97, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_planwaypoint. 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; readbackcfg___mist_vent_close_lead__s_. - Registry: class
retired, kindnumeric, ownerplanner, tier2, default15, bounds0 to 60. - Firmware evidence:
globals.yaml:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
-from-; latest planiris-20260511-0448at2026-05-13 15:00Z; latest dispatch15at2026-05-13 03:04Zfromesp32. - Readback: latest
15at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
89, confirmed89, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackcfg___mist_vent_reopen_delay__s_. - Registry: class
retired, kindnumeric, ownerplanner, tier2, default45, bounds0 to 120. - Firmware evidence:
globals.yaml:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
-from-; latest planiris-20260511-0448at2026-05-13 15:00Z; latest dispatch45at2026-05-13 03:04Zfromesp32. - Readback: latest
45at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
101, confirmed101, unconfirmed0, distinct 7d values4, 30d clamps0. - 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; readbackcfg___mister_all_delay__s_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default300, bounds60 to 900. - Firmware evidence:
controls.yaml:4, globals.yaml:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
300fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch300at2026-05-13 04:39Zfromplan. - Readback: latest
300at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
151, confirmed149, unconfirmed2, distinct 7d values8, 30d clamps66. - 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
VENTILATEstress 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_kpavia SETPOINT_MAP; readbackcfg_mister_all__kpa_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default1.9, bounds1 to 2.5. - Firmware evidence:
controls.yaml:2, globals.yaml:1, sensors.yaml:2, tunables.yaml:4. - Last used: active
2.35fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch2.35at2026-05-13 04:39Zfromplan. - Readback: latest
2.35at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
152, confirmed152, unconfirmed0, distinct 7d values17, 30d clamps10. - 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
VENTILATEstress with healthy dew margin, keep nearmax(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; readbackno cfg readback. - Registry: class
retired, kindnumeric, ownerplanner, tier2, default420, bounds120 to 600. - Firmware evidence:
globals.yaml:2, tunables.yaml:6. - Last used: active
-from-; latest plan-at-; latest dispatch420at2026-05-13 03:04Zfromesp32. - Readback: latest
0at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackno cfg readback. - Registry: class
retired, kindnumeric, ownerplanner, tier2, default480, bounds120 to 600. - Firmware evidence:
globals.yaml:2, tunables.yaml:6. - Last used: active
-from-; latest plan-at-; latest dispatch480at2026-05-13 03:04Zfromesp32. - Readback: latest
0at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_penaltyvia SETPOINT_MAP; readbackcfg___mister_center_penalty. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default0.5, bounds0 to 1. - Firmware evidence:
controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4. - Last used: active
-from-; latest plan-at-; latest dispatch0.5at2026-05-13 03:04Zfromesp32. - Readback: latest
0.5at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
96, confirmed96, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackcfg___mister_engage_delay__s_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default45, bounds30 to 900. - Firmware evidence:
controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
90fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch90at2026-05-13 04:39Zfromplan. - Readback: latest
90at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
146, confirmed144, unconfirmed2, distinct 7d values6, 30d clamps66. - 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
VENTILATEstress 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_kpavia SETPOINT_MAP; readbackcfg_mister_engage__kpa_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default1.6, bounds0.5 to 2.5. - Firmware evidence:
controls.yaml:3, globals.yaml:1, sensors.yaml:2, tunables.yaml:4. - Last used: active
1.75fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch1.75at2026-05-13 04:39Zfromplan. - Readback: latest
1.75at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
151, confirmed151, unconfirmed0, distinct 7d values16, 30d clamps8. - 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
VENTILATEstress with healthy dew margin, keep near activevpd_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; readbackno cfg readback. - Registry: class
retired, kindnumeric, ownerplanner, tier2, default120, bounds5 to 480. - Firmware evidence:
globals.yaml:1, tunables.yaml:2. - Last used: active
-from-; latest plan-at-; latest dispatch120at2026-05-13 03:04Zfromesp32. - Readback: latest
120at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackno cfg readback. - Registry: class
retired, kindnumeric, ownerplanner, tier2, default600, bounds120 to 900. - Firmware evidence:
globals.yaml:2, tunables.yaml:6. - Last used: active
-from-; latest plan-at-; latest dispatch600at2026-05-13 03:04Zfromesp32. - Readback: latest
600at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackno cfg readback. - Registry: class
retired, kindnumeric, ownerplanner, tier2, default300, bounds60 to 600. - Firmware evidence:
globals.yaml:2, tunables.yaml:6. - Last used: active
-from-; latest plan-at-; latest dispatch300at2026-05-13 03:04Zfromesp32. - Readback: latest
0at2026-03-29 20:00Z(44d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackcfg___mister_pulse_gap__s_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default45, bounds10 to 60. - Firmware evidence:
controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
60fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch60at2026-05-13 04:39Zfromplan. - Readback: latest
60at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
175, confirmed173, unconfirmed2, distinct 7d values10, 30d clamps8. - 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
VENTILATEstress 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; readbackcfg___mister_pulse_on__s_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default60, bounds30 to 90. - Firmware evidence:
controls.yaml:6, globals.yaml:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
90frompreemptive-20260513-0245; latest planpreemptive-20260513-0245at2026-05-13 02:45Z; latest dispatch90at2026-05-13 03:04Zfromesp32. - Readback: latest
90at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
145, confirmed143, unconfirmed2, distinct 7d values6, 30d clamps0. - 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_planwaypoint. 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_weightvia SETPOINT_MAP; readbackcfg___mister_vpd_weight. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default1.5, bounds0.5 to 5. - Firmware evidence:
controls.yaml:3, globals.yaml:1, sensors.yaml:2, tunables.yaml:4. - Last used: active
1.5fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch1.5at2026-05-13 03:04Zfromesp32. - Readback: latest
1.5at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
77, confirmed77, unconfirmed0, distinct 7d values15, 30d clamps2. - 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_planwaypoint. 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; readbackcfg___mister_water_budget__gal_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default500, bounds100 to 600. - Firmware evidence:
controls.yaml:2, globals.yaml:1, sensors.yaml:2, tunables.yaml:2. - Last used: active
500fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch500at2026-05-13 03:04Zfromesp32. - Readback: latest
500at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
96, confirmed96, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_planwaypoint. 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_ventvia SETPOINT_MAP; readbackmister_closes_vent. - Registry: class
planner_policy, kindswitch, ownerplanner, tier1, default0, boundsswitch 0/1. - Firmware evidence:
controls.yaml:6, globals.yaml:1, tunables.yaml:9. - Last used: active
1fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch1at2026-05-11 19:49Zfromplan. - Readback: latest
1at2026-05-13 05:45Z(0m old); 7d readbacks3255. - Landing evidence: 7d dispatcher writes
30, confirmed30, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_planwaypoint. 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; readbackcfg___fan_burst__min_. - Registry: class
retired, kindnumeric, owneroperator, tier2, default10, bounds1 to 60. - Firmware evidence:
globals.yaml:1, sensors.yaml:2, tunables.yaml:2. - Last used: active
-from-; latest plan-at-; latest dispatch10at2026-05-13 03:04Zfromesp32. - Readback: latest
10at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackcfg___vent_bypass__min_. - Registry: class
retired, kindnumeric, owneroperator, tier2, default10, bounds1 to 60. - Firmware evidence:
globals.yaml:1, sensors.yaml:2, tunables.yaml:2. - Last used: active
-from-; latest plan-at-; latest dispatch10at2026-05-13 03:04Zfromesp32. - Readback: latest
10at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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__fvia SETPOINT_MAP; readbackcfg___bias_cool___f_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default0, 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
3fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch3at2026-05-13 03:04Zfromesp32. - Readback: latest
3at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
134, confirmed134, unconfirmed0, distinct 7d values9, 30d clamps0. - 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_planwaypoint. 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__fvia SETPOINT_MAP; readbackcfg___bias_heat___f_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default0, 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.5fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch0.5at2026-05-13 03:04Zfromesp32. - Readback: latest
0.5at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
113, confirmed113, unconfirmed0, distinct 7d values5, 30d clamps0. - 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_planwaypoint. 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_kpavia SETPOINT_MAP; readbackcfg___dehum_aggressive__kpa_. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default0.6, bounds0.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 dispatch0.6at2026-05-13 03:04Zfromesp32. - Readback: latest
0.6at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_cyclesvia SETPOINT_MAP; readbackcfg___max_relief_cycles. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default3, bounds1 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 dispatch3at2026-05-13 03:04Zfromesp32. - Readback: latest
3at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
58, confirmed56, unconfirmed2, distinct 7d values2, 30d clamps0. - 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; readbackcfg___vent_latch_timeout__ms_. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default1800000, bounds60000 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 dispatch1800000at2026-05-13 03:04Zfromesp32. - Readback: latest
1800000at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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, kindnumeric, ownerfirmware internal, tier2, default900, bounds60 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
3600at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
0, confirmed0, unconfirmed0, distinct 7d values0, 30d clamps0. - 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, kindnumeric, ownerfirmware internal, tier2, defaultlive, 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.649at2026-05-01 04:00Z(12d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
0, confirmed0, unconfirmed0, distinct 7d values0, 30d clamps0. - 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, kindnumeric, ownerfirmware internal, tier2, defaultlive, 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.4at2026-05-01 04:00Z(12d old); 7d readbacks0. - Landing evidence: 7d dispatcher writes
0, confirmed0, unconfirmed0, distinct 7d values0, 30d clamps0. - 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; readbackcfg___lead_rotate_timeout__s_. - Registry: class
controller_safety, kindnumeric, owneroperator, tier2, default600, bounds60 to 1800. - Firmware evidence:
controls.yaml:1, globals.yaml:1, sensors.yaml:2, tunables.yaml:4. - Last used: active
-from-; latest planiris-20260409-2105at2026-04-13 01:30Z; latest dispatch600at2026-05-13 03:04Zfromesp32. - Readback: latest
600at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackcfg___min_fan_off__s_. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default90, bounds30 to 300. - Firmware evidence:
controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
-from-; latest planiris-20260409-2105at2026-04-13 01:30Z; latest dispatch90at2026-05-13 03:04Zfromesp32. - Readback: latest
90at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackcfg___min_fan_on__s_. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default120, bounds30 to 300. - Firmware evidence:
controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
-from-; latest planiris-20260409-2105at2026-04-13 01:30Z; latest dispatch120at2026-05-13 03:04Zfromesp32. - Readback: latest
120at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackcfg___min_heat_off__s_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default180, bounds60 to 600. - Firmware evidence:
controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
180fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch180at2026-05-13 03:04Zfromesp32. - Readback: latest
180at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
102, confirmed102, unconfirmed0, distinct 7d values3, 30d clamps0. - 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_planwaypoint. 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; readbackcfg___min_heat_on__s_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default120, bounds30 to 300. - Firmware evidence:
controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
120fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch120at2026-05-13 03:04Zfromesp32. - Readback: latest
120at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
96, confirmed96, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_planwaypoint. 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; readbackcfg___min_vent_off__s_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default60, bounds10 to 300. - Firmware evidence:
controls.yaml:2, globals.yaml:2, greenhouse_logic.h:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
60fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch60at2026-05-13 03:04Zfromesp32. - Readback: latest
60at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
113, confirmed113, unconfirmed0, distinct 7d values4, 30d clamps0. - 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_planwaypoint. 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; readbackcfg___min_vent_on__s_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default60, bounds10 to 300. - Firmware evidence:
controls.yaml:2, globals.yaml:2, greenhouse_logic.h:2, sensors.yaml:4, tunables.yaml:6. - Last used: active
60fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch60at2026-05-13 03:04Zfromesp32. - Readback: latest
60at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
101, confirmed101, unconfirmed0, distinct 7d values3, 30d clamps0. - 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_planwaypoint. 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__fvia SETPOINT_MAP; readbackcfg___safety_max___f_. - Registry: class
controller_safety, kindnumeric, ownersafety, tier2, default95, bounds80 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 dispatch100at2026-05-13 03:04Zfromesp32. - Readback: latest
100at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
101, confirmed101, unconfirmed0, distinct 7d values2, 30d clamps0. - 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__fvia SETPOINT_MAP; readbackcfg___safety_seal_margin___f_. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default5, bounds1 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 dispatch5at2026-05-13 03:04Zfromesp32. - Readback: latest
5at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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__fvia SETPOINT_MAP; readbackcfg___safety_min___f_. - Registry: class
controller_safety, kindnumeric, ownersafety, tier2, default45, bounds30 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 dispatch40at2026-05-13 03:04Zfromesp32. - Readback: latest
40at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
101, confirmed101, unconfirmed0, distinct 7d values2, 30d clamps0. - 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_kpavia SETPOINT_MAP; readbackcfg___safety_vpd_max__kpa_. - Registry: class
controller_safety, kindnumeric, ownersafety, tier2, default2.5, bounds2.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 dispatch2.5at2026-05-13 03:04Zfromesp32. - Readback: latest
2.5at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
58, confirmed56, unconfirmed2, distinct 7d values2, 30d clamps0. - 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_kpavia SETPOINT_MAP; readbackcfg___safety_vpd_min__kpa_. - Registry: class
controller_safety, kindnumeric, ownersafety, tier2, default0.3, bounds0.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 dispatch0.3at2026-05-13 03:04Zfromesp32. - Readback: latest
0.3at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
58, confirmed56, unconfirmed2, distinct 7d values2, 30d clamps0. - 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; readbackcfg___outdoor_staleness_max__s_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default600, bounds120 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
600fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch600at2026-05-13 03:04Zfromesp32. - Readback: latest
600at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
43, confirmed43, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_planwaypoint. 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; readbackcfg___summer_vent_min_runtime__s_. - Registry: class
retired, kindnumeric, ownerplanner, tier2, default180, bounds60 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 planiris-20260511-0448at2026-05-13 15:00Z; latest dispatch180at2026-05-13 03:04Zfromesp32. - Readback: latest
180at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_enabledvia SETPOINT_MAP; readbackcfg_summer_vent_enabled. - Registry: class
planner_policy, kindswitch, ownerplanner, tier1, default1, boundsswitch 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
1fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch1at2026-05-11 19:49Zfromplan. - Readback: latest
1at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
87, confirmed85, unconfirmed2, distinct 7d values2, 30d clamps0. - Effectiveness: Mostly confirmed: 85/87 7d writes have readbacks.
- Latest plan rationale: -; expected effect: -.
- Planner use: Include this in every routine
set_planwaypoint. 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; readbackcfg___vent_prefer_dp_delta__f_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default5, bounds2 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
5fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch5at2026-05-13 03:04Zfromesp32. - Readback: latest
5at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
53, confirmed53, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_planwaypoint. 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; readbackcfg___vent_prefer_temp_delta__f_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default5, bounds2 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
5fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch5at2026-05-13 03:04Zfromesp32. - Readback: latest
5at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
53, confirmed53, unconfirmed0, distinct 7d values1, 30d clamps0. - 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_planwaypoint. 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__fvia SETPOINT_MAP; readbackcfg___d_cool_stage_2___f_. - Registry: class
planner_policy, kindnumeric, ownerband, tier1, default3, bounds2 to 15. - Firmware evidence:
greenhouse_logic.h:1, sensors.yaml:2. - Last used: active
3fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch3at2026-05-13 03:04Zfromesp32. - Readback: latest
3at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
110, confirmed110, unconfirmed0, distinct 7d values4, 30d clamps0. - 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_planwaypoint. 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__fvia SETPOINT_MAP; readbackcfg___d_heat_stage_2___f_. - Registry: class
planner_policy, kindnumeric, ownerband, tier1, default5, bounds2 to 15. - Firmware evidence:
greenhouse_logic.h:1, sensors.yaml:2. - Last used: active
5fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch5at2026-05-13 03:04Zfromesp32. - Readback: latest
5at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
97, confirmed97, unconfirmed0, distinct 7d values2, 30d clamps0. - 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_planwaypoint. 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__fvia SETPOINT_MAP; readbackcfg___heat_hyst___f_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default1, bounds0 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.2fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch1.2at2026-05-13 03:04Zfromesp32. - Readback: latest
1.2at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
127, confirmed125, unconfirmed2, distinct 7d values4, 30d clamps0. - Effectiveness: Mostly confirmed: 125/127 7d writes have readbacks.
- Latest plan rationale: -; expected effect: -.
- Planner use: Include this in every routine
set_planwaypoint. 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__fvia SETPOINT_MAP; readbackcfg___temp_high___f_. - Registry: class
crop_band, kindnumeric, ownerband, tier2, default95, bounds40 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 planpreemptive-20260512-2036at2026-05-12 20:36Z; latest dispatch65at2026-05-13 04:44Zfromband. - Readback: latest
65at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
391, confirmed389, unconfirmed2, distinct 7d values120, 30d clamps493. - 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__fvia SETPOINT_MAP; readbackcfg___temp_hyst___f_. - Registry: class
planner_policy, kindnumeric, ownerband, tier1, default1.5, bounds0.5 to 3. - Firmware evidence:
controls.yaml:1, greenhouse_logic.h:7, greenhouse_types.h:5. - Last used: active
1.8fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch1.8at2026-05-13 03:04Zfromesp32. - Readback: latest
1.8at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
113, confirmed113, unconfirmed0, distinct 7d values7, 30d clamps0. - 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_planwaypoint. 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__fvia SETPOINT_MAP; readbackcfg___temp_low___f_. - Registry: class
crop_band, kindnumeric, ownerband, tier2, default40, bounds30 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 planpreemptive-20260418-0730at2026-04-18 07:30Z; latest dispatch62at2026-05-13 04:44Zfromband. - Readback: latest
62at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
363, confirmed361, unconfirmed2, distinct 7d values86, 30d clamps1970. - 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_kpavia SETPOINT_MAP; readbackcfg___vpd_high__kpa_. - Registry: class
crop_band, kindnumeric, ownerband, tier2, default2.8, bounds0.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 planoperator-2026-04-25-band-reliefat2026-04-25 22:34Z; latest dispatch0.8at2026-05-13 04:44Zfromband. - Readback: latest
0.8at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
360, confirmed358, unconfirmed2, distinct 7d values56, 30d clamps1496. - 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_kpavia SETPOINT_MAP; readbackcfg___vpd_hyst__kpa_. - Registry: class
planner_policy, kindnumeric, ownerband, tier1, default0.3, bounds0.05 to 0.5. - Firmware evidence:
controls.yaml:1, greenhouse_logic.h:5, greenhouse_types.h:4. - Last used: active
0.5fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch0.5at2026-05-13 03:04Zfromesp32. - Readback: latest
0.5at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
124, confirmed124, unconfirmed0, distinct 7d values7, 30d clamps2. - 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_planwaypoint. 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_kpavia SETPOINT_MAP; readbackcfg___vpd_low__kpa_. - Registry: class
crop_band, kindnumeric, ownerband, tier2, default0.35, bounds0.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 dispatch0.25at2026-05-13 04:44Zfromband. - Readback: latest
0.25at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
500, confirmed499, unconfirmed1, distinct 7d values75, 30d clamps63. - 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; readbackcfg___vpd_watch_dwell__s_. - Registry: class
planner_policy, kindnumeric, ownerplanner, tier1, default60, bounds15 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
60fromiris-20260512-2007; latest planiris-20260512-2007at2026-05-14 01:30Z; latest dispatch60at2026-05-13 03:04Zfromesp32. - Readback: latest
60at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
152, confirmed150, unconfirmed2, distinct 7d values7, 30d clamps0. - 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_planwaypoint. 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_factorvia SETPOINT_MAP; readbackcfg___east_adjacency_factor. - Registry: class
controller_safety, kindnumeric, ownerplanner, tier2, default0.3, bounds0 to 1. - Firmware evidence:
controls.yaml:2, globals.yaml:1, sensors.yaml:3, tunables.yaml:4. - Last used: active
-from-; latest planiris-20260409-2105at2026-04-13 01:30Z; latest dispatch0.3at2026-05-13 03:04Zfromesp32. - Readback: latest
0.3at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
35, confirmed35, unconfirmed0, distinct 7d values1, 30d clamps0. - 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; readbackcfg___vpd_target_center__kpa_. - Registry: class
crop_band, kindnumeric, ownerband, tier2, default0.8, bounds0.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 dispatch0.6at2026-05-13 04:44Zfromband. - Readback: latest
0.6at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
849, confirmed847, unconfirmed2, distinct 7d values64, 30d clamps0. - 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; readbackcfg___vpd_target_east__kpa_. - Registry: class
crop_band, kindnumeric, ownerband, tier2, default1, bounds0.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 dispatch0.6at2026-05-13 04:44Zfromband. - Readback: latest
0.6at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
968, confirmed962, unconfirmed6, distinct 7d values87, 30d clamps0. - 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; readbackcfg___vpd_target_south__kpa_. - Registry: class
crop_band, kindnumeric, ownerband, tier2, default1.3, bounds0.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 dispatch1at2026-05-13 04:44Zfromband. - Readback: latest
1at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
688, confirmed686, unconfirmed2, distinct 7d values85, 30d clamps0. - 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; readbackcfg___vpd_target_west__kpa_. - Registry: class
crop_band, kindnumeric, ownerband, tier2, default1.2, bounds0.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 dispatch1.2at2026-05-13 04:44Zfromband. - Readback: latest
1.2at2026-05-13 05:45Z(0m old); 7d readbacks10065. - Landing evidence: 7d dispatcher writes
198, confirmed196, unconfirmed2, distinct 7d values2, 30d clamps0. - 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.