AI Tunables Traceability

This page is the operating contract for the bounded control surface Iris, the AI planner 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

141Schema tunables

Every name accepted by PlanTransition, SetpointChange, or setpoint_snapshot.

141Registry rows

Includes dispatcher-routed and readback-only firmware inputs.

37Routine plan knobs

Required in every routine set_plan waypoint.

67Planner-policy knobs

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

13Open alerts

Live safety state at generation time.

37Future active params

111 future active plan rows.

0Reserved active rows

Should remain zero for no-op/deprecated params.

0/030m trigger audit

Plan dispatcher writes carrying trigger IDs.

0.091 kPaMister VPD delta

1979 measured mister cycles in the last 14 days.

Contract class counts: {'planner_policy': 67, 'crop_band': 8, 'controller_safety': 52, '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": 56, "fog_gate_window": 1, "fog_heat_assist": 1, "vent_mist_assist": 511, "occupancy_blocks_moisture": 1}.

Effectiveness labels below mean three different things:

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

Current controller invariants:

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

Routine Plan Contract

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

ParameterActiveFuture rowsLast dispatch7d confirmedPlanner instruction
bias_cool432026-05-19 01:58Z134/166Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
bias_heat1.8532026-05-19 04:30Z107/140Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
d_cool_stage_2332026-05-19 01:58Z124/129Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
d_heat_stage_2332026-05-19 01:58Z75/75Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
dwell_gate_ms30000032026-05-19 01:58Z63/63Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
enthalpy_close132026-05-19 01:58Z63/63Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
enthalpy_open-232026-05-19 01:58Z63/63Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
fog_escalation_kpa132026-05-19 01:58Z260/301Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use about 0.20, or 0.15 in hot/dry venting; higher values delay fog too far above the active band.
heat_hysteresis1.532026-05-19 01:58Z116/153Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
min_fog_off_s18032026-05-19 01:58Z157/189Planner-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.
min_fog_on_s4532026-05-19 01:58Z109/109Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
min_heat_off_s18032026-05-19 01:58Z63/63Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
min_heat_on_s12032026-05-19 01:58Z63/63Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
min_vent_off_s6032026-05-19 01:58Z63/63Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
min_vent_on_s6032026-05-19 01:58Z65/65Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mist_backoff_s240032026-05-19 01:58Z130/167Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mist_max_closed_vent_s12032026-05-19 01:58Z118/127Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mist_thermal_relief_s9032026-05-19 01:58Z63/63Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mister_all_delay_s60032026-05-19 02:23Z208/248Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use shorter delays/gaps so ventilation can cool while misting protects VPD.
mister_all_kpa2.532026-05-19 02:23Z243/286Planner-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_s30032026-05-19 02:23Z197/232Planner-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_kpa2.432026-05-19 02:23Z263/310Planner-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_s6032026-05-19 02:23Z228/268Planner-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_s6032026-05-19 01:58Z89/89Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mister_vpd_weight232026-05-19 01:58Z163/173Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mister_water_budget_gal60032026-05-19 01:58Z111/111Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
outdoor_staleness_max_s60032026-05-19 01:58Z63/63Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
sw_dwell_gate_enabled132026-05-18 19:44Z6/6Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
sw_fog_closes_vent132026-05-18 19:44Z4/4Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
sw_fsm_controller_enabled132026-05-18 19:44Z6/6Always 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_vent132026-05-18 19:44Z20/20Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
sw_summer_vent_enabled132026-05-18 19:44Z22/22Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
temp_hysteresis232026-05-19 01:58Z126/164Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
vent_prefer_dp_delta_f532026-05-19 01:58Z63/63Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
vent_prefer_temp_delta_f532026-05-19 01:58Z63/63Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
vpd_hysteresis0.532026-05-19 01:58Z157/167Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
vpd_watch_dwell_s12032026-05-19 01:58Z141/180Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.

Findings That Matter

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

Per-Tunable Detail

Activity and direct-wet gates

activity_duration_min - controller safety
  • Purpose: Dispatcher-owned mirror of main-light target runtime. Direct wetting is blocked outside this global biological activity window.
  • Why it matters: The activity window aligns lights, wetting, fert paths, and drydown timing so direct plant wetting happens only during the biological day.
  • Implementation: MCP rejects planner writes; ESPHome activity_duration__min_ via SETPOINT_MAP; readback cfg_activity_duration_min.
  • Registry: class controller_safety, kind numeric, owner dispatcher default, tier 2, default 1440, bounds 0 to 1440.
  • Firmware evidence: controls.yaml:8, globals.yaml:1, greenhouse_logic.h:4, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 960 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 960 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 5, confirmed 5, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Dispatcher-owned mirror of the main lighting runtime policy. Do not set directly; adjust the main light schedule when the biological day should move.
activity_start_hour - controller safety
  • Purpose: Dispatcher-owned mirror of the main-light activity start hour. Direct-wet gates consume it so lights and wetting share one activity policy.
  • Why it matters: The activity window aligns lights, wetting, fert paths, and drydown timing so direct plant wetting happens only during the biological day.
  • Implementation: MCP rejects planner writes; ESPHome activity_start_hour via SETPOINT_MAP; readback cfg_activity_start_hour.
  • Registry: class controller_safety, kind numeric, owner dispatcher default, tier 2, default 6, bounds 0 to 23.
  • Firmware evidence: controls.yaml:8, globals.yaml:1, greenhouse_logic.h:2, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 6 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 6 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 2, confirmed 2, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Dispatcher-owned mirror of the main lighting runtime policy. Do not set directly; adjust the main light schedule when the biological day should move.
activity_start_minute - controller safety
  • Purpose: Dispatcher-owned mirror of the main-light activity start minute.
  • Why it matters: The activity window aligns lights, wetting, fert paths, and drydown timing so direct plant wetting happens only during the biological day.
  • Implementation: MCP rejects planner writes; ESPHome activity_start_min via SETPOINT_MAP; readback cfg_activity_start_min.
  • Registry: class controller_safety, kind numeric, owner dispatcher default, tier 2, default 0, bounds 0 to 59.
  • Firmware evidence: controls.yaml:16, globals.yaml:2, greenhouse_logic.h:4, sensors.yaml:4, tunables.yaml:6.
  • Last used: active - from -; latest plan - at -; latest dispatch 0 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 0 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 2, confirmed 2, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Dispatcher-owned mirror of the main lighting runtime policy. Do not set directly; adjust the main light schedule when the biological day should move.
direct_wet_center_drydown_before_off_min - planner policy
  • Purpose: Center-zone drydown hold before global activity off. Applies to clean/fert wetting paths in the zone.
  • Why it matters: The activity window aligns lights, wetting, fert paths, and drydown timing so direct plant wetting happens only during the biological day.
  • Implementation: set_tunable allowed; ESPHome direct_wet_center_drydown_before_off__min_ via SETPOINT_MAP; readback cfg_direct_wet_center_drydown_before_off_min.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 0, bounds 0 to 720.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 180 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 180 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 6, confirmed 6, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy gate for direct plant wetting. Tune per zone to move morning wet start or pre-off drydown without adding crop-specific firmware logic.
direct_wet_center_start_offset_min - planner policy
  • Purpose: Center-zone direct-wet start offset from global activity start. Applies to clean/fert wetting paths in the zone.
  • Why it matters: The activity window aligns lights, wetting, fert paths, and drydown timing so direct plant wetting happens only during the biological day.
  • Implementation: set_tunable allowed; ESPHome direct_wet_center_start_offset__min_ via SETPOINT_MAP; readback cfg_direct_wet_center_start_offset_min.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 0, bounds 0 to 720.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 120 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 120 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 5, confirmed 5, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy gate for direct plant wetting. Tune per zone to move morning wet start or pre-off drydown without adding crop-specific firmware logic.
direct_wet_min_temp_f - planner policy
  • Purpose: Minimum house temperature for automated direct wetting across misters, fert paths, and drips.
  • Why it matters: The activity window aligns lights, wetting, fert paths, and drydown timing so direct plant wetting happens only during the biological day.
  • Implementation: set_tunable allowed; ESPHome direct_wet_min_temp__f_ via SETPOINT_MAP; readback cfg_direct_wet_min_temp_f.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 0, bounds 0 to 90.
  • Firmware evidence: controls.yaml:4, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 65 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 65 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 4, confirmed 4, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy gate for direct plant wetting. Tune per zone to move morning wet start or pre-off drydown without adding crop-specific firmware logic.
direct_wet_south_drydown_before_off_min - planner policy
  • Purpose: South-zone drydown hold before global activity off. Applies to clean/fert wetting paths in the zone.
  • Why it matters: The activity window aligns lights, wetting, fert paths, and drydown timing so direct plant wetting happens only during the biological day.
  • Implementation: set_tunable allowed; ESPHome direct_wet_south_drydown_before_off__min_ via SETPOINT_MAP; readback cfg_direct_wet_south_drydown_before_off_min.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 0, bounds 0 to 720.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 120 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 120 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 4, confirmed 4, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy gate for direct plant wetting. Tune per zone to move morning wet start or pre-off drydown without adding crop-specific firmware logic.
direct_wet_south_start_offset_min - planner policy
  • Purpose: South-zone direct-wet start offset from global activity start. Applies to clean/fert wetting paths in the zone.
  • Why it matters: The activity window aligns lights, wetting, fert paths, and drydown timing so direct plant wetting happens only during the biological day.
  • Implementation: set_tunable allowed; ESPHome direct_wet_south_start_offset__min_ via SETPOINT_MAP; readback cfg_direct_wet_south_start_offset_min.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 0, bounds 0 to 720.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 60 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 60 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 4, confirmed 4, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy gate for direct plant wetting. Tune per zone to move morning wet start or pre-off drydown without adding crop-specific firmware logic.
direct_wet_wall_drydown_before_off_min - planner policy
  • Purpose: Wall drip drydown hold before global activity off. Applies to wall clean/fert drip and flush paths.
  • Why it matters: The activity window aligns lights, wetting, fert paths, and drydown timing so direct plant wetting happens only during the biological day.
  • Implementation: set_tunable allowed; ESPHome direct_wet_wall_drydown_before_off__min_ via SETPOINT_MAP; readback cfg___direct_wet_wall_drydown_before_off__min_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 0, bounds 0 to 720.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 120 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 120 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 5, confirmed 5, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy gate for direct plant wetting. Tune per zone to move morning wet start or pre-off drydown without adding crop-specific firmware logic.
direct_wet_wall_start_offset_min - planner policy
  • Purpose: Wall drip direct-wet start offset from global activity start. Applies to wall clean/fert drip and flush paths.
  • Why it matters: The activity window aligns lights, wetting, fert paths, and drydown timing so direct plant wetting happens only during the biological day.
  • Implementation: set_tunable allowed; ESPHome direct_wet_wall_start_offset__min_ via SETPOINT_MAP; readback cfg___direct_wet_wall_start_offset__min_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 0, bounds 0 to 720.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 60 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 60 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 4, confirmed 4, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy gate for direct plant wetting. Tune per zone to move morning wet start or pre-off drydown without adding crop-specific firmware logic.
direct_wet_west_drydown_before_off_min - planner policy
  • Purpose: West-zone drydown hold before global activity off. Applies to clean/fert wetting paths in the zone.
  • Why it matters: The activity window aligns lights, wetting, fert paths, and drydown timing so direct plant wetting happens only during the biological day.
  • Implementation: set_tunable allowed; ESPHome direct_wet_west_drydown_before_off__min_ via SETPOINT_MAP; readback cfg_direct_wet_west_drydown_before_off_min.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 0, bounds 0 to 720.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 120 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 120 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 5, confirmed 5, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy gate for direct plant wetting. Tune per zone to move morning wet start or pre-off drydown without adding crop-specific firmware logic.
direct_wet_west_start_offset_min - planner policy
  • Purpose: West-zone direct-wet start offset from global activity start. Applies to clean/fert wetting paths in the zone.
  • Why it matters: The activity window aligns lights, wetting, fert paths, and drydown timing so direct plant wetting happens only during the biological day.
  • Implementation: set_tunable allowed; ESPHome direct_wet_west_start_offset__min_ via SETPOINT_MAP; readback cfg_direct_wet_west_start_offset_min.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 0, bounds 0 to 720.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 60 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 60 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 4, confirmed 4, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy gate for direct plant wetting. Tune per zone to move morning wet start or pre-off drydown without adding crop-specific firmware logic.
sw_direct_wet_gate_enabled - planner policy
  • Purpose: Enables global biological activity and per-zone direct-wet gates for clean/fert misters and irrigation paths.
  • Why it matters: The activity window aligns lights, wetting, fert paths, and drydown timing so direct plant wetting happens only during the biological day.
  • Implementation: set_tunable allowed; ESPHome direct_wet_gate_enabled via SETPOINT_MAP; readback direct_wet_gate_enabled.
  • Registry: class planner_policy, kind switch, owner planner, tier 2, default 1, bounds switch 0/1.
  • Firmware evidence: controls.yaml:4, globals.yaml:2, tunables.yaml:9.
  • Last used: active - from -; latest plan - at -; latest dispatch - at - from -.
  • Readback: latest 1 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 0, confirmed 0, unconfirmed 0, distinct 7d values 0, 30d clamps 0.
  • Effectiveness: Firmware publishes the value; no recent planner/dispatcher use.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy gate for direct plant wetting. Tune per zone to move morning wet start or pre-off drydown without adding crop-specific firmware logic.

Controller gates

dwell_gate_ms - routine
  • Purpose: Dwell hold duration. Default 5 min. Safety rails + R2-3 dry override + vpd_min_safe rescue preempt unconditionally.
  • Why it matters: These switches and dwell values choose the controller posture and mode-transition stability.
  • Implementation: routine set_plan required; ESPHome dwell_gate__ms_ via SETPOINT_MAP; readback cfg_dwell_gate_ms.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 300000, bounds 60000 to 1800000.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, greenhouse_logic.h:3, greenhouse_types.h:6, sensors.yaml:3, tunables.yaml:4.
  • Last used: active 300000 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 300000 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 300000 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 63, confirmed 63, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
sw_dwell_gate_enabled - routine
  • Purpose: Master switch for Phase-2 mode-dwell gate. Default OFF for shadow-mode bake. Flip to ON after 14d replay+shadow validation.
  • Why it matters: These switches and dwell values choose the controller posture and mode-transition stability.
  • Implementation: routine set_plan required; ESPHome dwell_gate_enabled via SETPOINT_MAP; readback cfg_dwell_gate_enabled.
  • Registry: class planner_policy, kind switch, owner planner, tier 1, default 0, bounds switch 0/1.
  • Firmware evidence: controls.yaml:4, globals.yaml:2, greenhouse_logic.h:6, greenhouse_types.h:8, sensors.yaml:4, tunables.yaml:12.
  • Last used: active 1 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 1 at 2026-05-18 19:44Z from plan.
  • Readback: latest 1 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 6, confirmed 6, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: iris-20260518-0543 (validated 2026-05-19 02:13Z, score 6); expected effect: Reduce ordinary mode churn without blocking safety or thermal-relief exits..
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
sw_fsm_controller_enabled - routine
  • Purpose: Unified band-first controller is the live controller path. ESPHome control loop, dispatcher, MCP, and outbound-listener guardrails force this ON; rollback requires an explicit firmware/config rollback outside the planner surface.
  • Why it matters: These switches and dwell values choose the controller posture and mode-transition stability.
  • Implementation: routine set_plan required; ESPHome fsm_controller_enabled via SETPOINT_MAP; readback cfg_fsm_controller_enabled.
  • Registry: class planner_policy, kind switch, owner operator, tier 1, default 1, bounds switch 0/1.
  • Firmware evidence: controls.yaml:12, globals.yaml:2, greenhouse_logic.h:10, greenhouse_types.h:4, sensors.yaml:4, tunables.yaml:12.
  • Last used: active 1 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 1 at 2026-05-18 19:44Z from manual.
  • Readback: latest 1 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 6, confirmed 6, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Always include this as 1. It is a compatibility/readback field for the unified band-first controller, and MCP/dispatcher/ESPHome guardrails reject or correct OFF.
sw_gl_grow_auto_mode - planner policy
  • Purpose: Per-circuit automation enable for grow/secondary lighting.
  • Why it matters: These switches and dwell values choose the controller posture and mode-transition stability.
  • Implementation: set_tunable allowed; ESPHome gl_grow_auto_mode via SETPOINT_MAP; readback cfg_gl_grow_auto_mode.
  • Registry: class planner_policy, kind switch, owner planner, tier 2, default 1, bounds switch 0/1.
  • Firmware evidence: sensors.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 1 at 2026-05-18 02:35Z from band.
  • Readback: latest 1 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 15, confirmed 1, unconfirmed 14, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 1/15 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
sw_gl_main_auto_mode - planner policy
  • Purpose: Per-circuit automation enable for main/overhead lighting.
  • Why it matters: These switches and dwell values choose the controller posture and mode-transition stability.
  • Implementation: set_tunable allowed; ESPHome gl_main_auto_mode via SETPOINT_MAP; readback cfg_gl_main_auto_mode.
  • Registry: class planner_policy, kind switch, owner planner, tier 2, default 1, bounds switch 0/1.
  • Firmware evidence: sensors.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 1 at 2026-05-18 02:35Z from band.
  • Readback: latest 1 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 15, confirmed 1, unconfirmed 14, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 1/15 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
sw_occupancy_inhibit - controller safety
  • Purpose: Block misting while greenhouse is occupied.
  • Why it matters: These switches and dwell values choose the controller posture and mode-transition stability.
  • Implementation: MCP rejects planner writes; ESPHome occupancy_mist_inhibit via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind switch, owner operator, tier 2, default 1, bounds switch 0/1.
  • Firmware evidence: controls.yaml:3, globals.yaml:1, greenhouse_logic.h:4, greenhouse_types.h:2, tunables.yaml:9.
  • Last used: active - from -; latest plan - at -; latest dispatch 1 at 2026-05-18 13:34Z from manual.
  • Readback: latest - at - (- old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 17, confirmed 3, unconfirmed 14, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 3/17 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.

Economiser

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

Fog gates

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

Grow lights

gl_dli_target - controller safety
  • Purpose: Daily light integral target for supplemental grow-light automation.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: MCP rejects planner writes; ESPHome gl_dli_target__mol_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 14, bounds 1 to 50.
  • Firmware evidence: globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan iris-fix-dli-20260328 at 2026-03-29 03:04Z; latest dispatch 22 at 2026-05-18 02:31Z from band.
  • Readback: latest 14 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 254, confirmed 13, unconfirmed 241, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 13/254 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.
gl_grow_dli_target - controller safety
  • Purpose: Legacy grow/secondary lighting DLI telemetry target. Runtime control now uses gl_grow_target_light_minutes.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: MCP rejects planner writes; ESPHome gl_grow_dli_target via SETPOINT_MAP; readback cfg_gl_grow_dli_target.
  • Registry: class controller_safety, kind numeric, owner dispatcher default, tier 2, default 14, bounds 1 to 50.
  • Firmware evidence: globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 14 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 14 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 52, confirmed 52, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
gl_grow_lux_hysteresis - planner policy
  • Purpose: Grow/secondary circuit OFF threshold is ON threshold plus this hysteresis.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: set_tunable allowed; ESPHome gl_grow_lux_hysteresis via SETPOINT_MAP; readback cfg_gl_grow_lux_hysteresis.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 8000, bounds 0 to 25000.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 8000 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 8000 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 55, confirmed 55, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
gl_grow_lux_threshold - planner policy
  • Purpose: Grow/secondary circuit ON threshold from Tempest outdoor lux.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: set_tunable allowed; ESPHome gl_grow_lux_threshold via SETPOINT_MAP; readback cfg_gl_grow_lux_threshold.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 40000, bounds 100 to 100000.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 40000 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 40000 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 55, confirmed 55, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
gl_grow_min_off_s - planner policy
  • Purpose: Minimum OFF dwell for grow/secondary lighting state machine.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: set_tunable allowed; ESPHome gl_grow_min_off_s via SETPOINT_MAP; readback cfg_gl_grow_min_off_s.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 60, bounds 0 to 3600.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:5, tunables.yaml:8.
  • Last used: active - from -; latest plan - at -; latest dispatch 60 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 60 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 36, confirmed 36, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
gl_grow_min_on_s - planner policy
  • Purpose: Minimum ON dwell for grow/secondary lighting state machine.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: set_tunable allowed; ESPHome gl_grow_min_on_s via SETPOINT_MAP; readback cfg_gl_grow_min_on_s.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 120, bounds 0 to 3600.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:5, tunables.yaml:8.
  • Last used: active - from -; latest plan - at -; latest dispatch 120 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 120 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 36, confirmed 36, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
gl_grow_sunrise_hour - planner policy
  • Purpose: Earliest local hour the grow/secondary circuit may turn on.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: set_tunable allowed; ESPHome gl_grow_sunrise_hour via SETPOINT_MAP; readback cfg_gl_grow_sunrise_hour.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 7, bounds 0 to 23.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 6 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 6 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 55, confirmed 55, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
gl_grow_sunset_hour - planner policy
  • Purpose: Latest local hour the grow/secondary circuit may remain on.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: set_tunable allowed; ESPHome gl_grow_sunset_hour via SETPOINT_MAP; readback cfg_gl_grow_sunset_hour.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 19, bounds 0 to 23.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 22 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 22 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 55, confirmed 55, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
gl_grow_target_light_minutes - planner policy
  • Purpose: Grow/secondary daily qualified-light-minutes target. A minute counts once when natural lux is above threshold or the actual switch is ON.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: set_tunable allowed; ESPHome gl_grow_target_light_minutes via SETPOINT_MAP; readback cfg_gl_grow_target_light_minutes.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 960, bounds 0 to 1080.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 960 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 960 at 2026-05-19 06:35Z (0m old); 7d readbacks 2026.
  • Landing evidence: 7d dispatcher writes 23, confirmed 23, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
gl_lux_hysteresis - controller safety
  • Purpose: Legacy shared grow-light hysteresis. Read-only fallback now that per-circuit hysteresis tunables are planner-writable.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: MCP rejects planner writes; ESPHome gl_lux_hysteresis via SETPOINT_MAP; readback cfg___gl_lux_hysteresis.
  • Registry: class controller_safety, kind numeric, owner dispatcher default, tier 2, default 1500, bounds 0 to 10000.
  • Firmware evidence: globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 8000 at 2026-05-18 02:31Z from band.
  • Readback: latest 1500 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 109, confirmed 109, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
gl_lux_threshold - controller safety
  • Purpose: Legacy shared grow-light threshold. Read-only fallback now that per-circuit gl_main_* and gl_grow_* thresholds are planner-writable.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: MCP rejects planner writes; ESPHome gl_lux_threshold via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner dispatcher default, tier 2, default 3000, bounds 100 to 50000.
  • Firmware evidence: globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan iris-fix-gl-20260328 at 2026-03-29 03:06Z; latest dispatch 40000 at 2026-05-18 02:31Z from band.
  • Readback: latest 20000 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 102, confirmed 31, unconfirmed 71, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 31/102 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.
gl_main_dli_target - controller safety
  • Purpose: Legacy main/overhead lighting DLI telemetry target. Runtime control now uses gl_main_target_light_minutes.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: MCP rejects planner writes; ESPHome gl_main_dli_target via SETPOINT_MAP; readback cfg_gl_main_dli_target.
  • Registry: class controller_safety, kind numeric, owner dispatcher default, tier 2, default 14, bounds 1 to 50.
  • Firmware evidence: globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 14 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 14 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 52, confirmed 52, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
gl_main_lux_hysteresis - planner policy
  • Purpose: Main/overhead circuit OFF threshold is ON threshold plus this hysteresis.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: set_tunable allowed; ESPHome gl_main_lux_hysteresis via SETPOINT_MAP; readback cfg_gl_main_lux_hysteresis.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 8000, bounds 0 to 25000.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 8000 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 8000 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 56, confirmed 56, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
gl_main_lux_threshold - planner policy
  • Purpose: Main/overhead circuit ON threshold from Tempest outdoor lux.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: set_tunable allowed; ESPHome gl_main_lux_threshold via SETPOINT_MAP; readback cfg_gl_main_lux_threshold.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 40000, bounds 100 to 100000.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 40000 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 40000 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 55, confirmed 55, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
gl_main_min_off_s - planner policy
  • Purpose: Minimum OFF dwell for main/overhead lighting state machine.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: set_tunable allowed; ESPHome gl_main_min_off_s via SETPOINT_MAP; readback cfg_gl_main_min_off_s.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 60, bounds 0 to 3600.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:5, tunables.yaml:8.
  • Last used: active - from -; latest plan - at -; latest dispatch 60 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 60 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 36, confirmed 36, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
gl_main_min_on_s - planner policy
  • Purpose: Minimum ON dwell for main/overhead lighting state machine.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: set_tunable allowed; ESPHome gl_main_min_on_s via SETPOINT_MAP; readback cfg_gl_main_min_on_s.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 120, bounds 0 to 3600.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:5, tunables.yaml:8.
  • Last used: active - from -; latest plan - at -; latest dispatch 120 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 120 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 36, confirmed 36, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
gl_main_sunrise_hour - planner policy
  • Purpose: Earliest local hour the main/overhead circuit may turn on.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: set_tunable allowed; ESPHome gl_main_sunrise_hour via SETPOINT_MAP; readback cfg_gl_main_sunrise_hour.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 7, bounds 0 to 23.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 6 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 6 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 55, confirmed 55, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
gl_main_sunset_hour - planner policy
  • Purpose: Latest local hour the main/overhead circuit may remain on.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: set_tunable allowed; ESPHome gl_main_sunset_hour via SETPOINT_MAP; readback cfg_gl_main_sunset_hour.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 19, bounds 0 to 23.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 22 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 22 at 2026-05-19 06:35Z (0m old); 7d readbacks 2812.
  • Landing evidence: 7d dispatcher writes 55, confirmed 55, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
gl_main_target_light_minutes - planner policy
  • Purpose: Main/overhead daily qualified-light-minutes target. A minute counts once when natural lux is above threshold or the actual switch is ON.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: set_tunable allowed; ESPHome gl_main_target_light_minutes via SETPOINT_MAP; readback cfg_gl_main_target_light_minutes.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 960, bounds 0 to 1080.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 960 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 960 at 2026-05-19 06:35Z (0m old); 7d readbacks 2026.
  • Landing evidence: 7d dispatcher writes 23, confirmed 23, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
gl_sunrise_hour - controller safety
  • Purpose: Earliest local hour grow lights may turn on.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: MCP rejects planner writes; ESPHome gl_start_hour via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 7, bounds 0 to 23.
  • Firmware evidence: globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 6 at 2026-05-18 02:31Z from band.
  • Readback: latest 7 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 254, confirmed 13, unconfirmed 241, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 13/254 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.
gl_sunset_hour - controller safety
  • Purpose: Latest local hour grow lights may remain on.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: MCP rejects planner writes; ESPHome gl_cutoff_hour via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 19, bounds 0 to 23.
  • Firmware evidence: globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 22 at 2026-05-18 02:31Z from band.
  • Readback: latest 19 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 254, confirmed 13, unconfirmed 241, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 13/254 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.
sw_gl_auto_mode - controller safety
  • Purpose: Grow-light automation master enable.
  • Why it matters: Grow-light settings trade supplemental DLI against electrical cost and light-cycle stability.
  • Implementation: MCP rejects planner writes; ESPHome gl_auto_mode via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind switch, owner operator, tier 2, default 1, bounds switch 0/1.
  • Firmware evidence: no token hit.
  • Last used: active - from -; latest plan iris-dev-gl-fix at 2026-03-25 17:31Z; latest dispatch 1 at 2026-05-18 13:34Z from band.
  • Readback: latest 1 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 244, confirmed 1, unconfirmed 243, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 1/244 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.

Irrigation

irrig_center_days_mask - planner policy
  • Purpose: Explicit center watering day mask, bit0=Sunday through bit6=Saturday.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: set_tunable allowed; ESPHome irrig_center_days_mask via SETPOINT_MAP; readback cfg_irrig_center_days_mask.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 127, bounds 0 to 127.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active 127 from operator-center-fert-aggressive-20260518; latest plan operator-center-fert-aggressive-20260518 at 2026-05-18 23:35Z; latest dispatch 127 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 127 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 2, confirmed 2, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
irrig_center_duration_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_center_duration__min_ via SETPOINT_MAP; readback cfg_irrig_center_duration_min.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 10, bounds 1 to 120.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 10 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 10 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 59, confirmed 59, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_center_fert_days_mask - planner policy
  • Purpose: Explicit center fertigation day mask. Nonzero supersedes irrig_center_fert_every_n.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: set_tunable allowed; ESPHome irrig_center_fert_days_mask via SETPOINT_MAP; readback cfg_irrig_center_fert_days_mask.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 127, bounds 0 to 127.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active 127 from operator-center-fert-aggressive-20260518; latest plan operator-center-fert-aggressive-20260518 at 2026-05-18 23:35Z; latest dispatch 127 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 127 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 7, confirmed 7, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
irrig_center_fert_duration_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_center_fert_duration__min_ via SETPOINT_MAP; readback cfg_irrig_center_fert_duration_min.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 6, bounds 0 to 60.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:2.
  • Last used: active 6 from operator-center-fert-aggressive-20260518; latest plan operator-center-fert-aggressive-20260518 at 2026-05-18 23:35Z; latest dispatch 6 at 2026-05-19 04:35Z from plan.
  • Readback: latest 5 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 103, confirmed 61, unconfirmed 42, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 61/103 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.
irrig_center_fert_every_n - controller safety
  • Purpose: Naming quirk: canonical drops ‘_cycles’ suffix.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_center_fert_every_n_cycles via SETPOINT_MAP; readback cfg_irrig_center_fert_every_n.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 0, bounds 0 to 30.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active 0 from operator-center-fert-aggressive-20260518; latest plan operator-center-fert-aggressive-20260518 at 2026-05-18 23:35Z; latest dispatch 0 at 2026-05-19 04:35Z from plan.
  • Readback: latest 0 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 100, confirmed 58, unconfirmed 42, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 58/100 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.
irrig_center_flush_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_center_flush__min_ via SETPOINT_MAP; readback cfg_irrig_center_flush_min.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 2, bounds 0 to 30.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:2.
  • Last used: active 2 from operator-center-fert-aggressive-20260518; latest plan operator-center-fert-aggressive-20260518 at 2026-05-18 23:35Z; latest dispatch 2 at 2026-05-19 04:35Z from plan.
  • Readback: latest 0 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 100, confirmed 58, unconfirmed 42, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 58/100 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.
irrig_center_interval_days - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_center_interval__days_ via SETPOINT_MAP; readback cfg_irrig_center_interval_days.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 1, bounds 1 to 14.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:2.
  • Last used: active 1 from operator-center-fert-aggressive-20260518; latest plan operator-center-fert-aggressive-20260518 at 2026-05-18 23:35Z; latest dispatch 1 at 2026-05-19 04:35Z from plan.
  • Readback: latest 0 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 100, confirmed 58, unconfirmed 42, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 58/100 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.
irrig_center_start_hour - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_center_start_hour via SETPOINT_MAP; readback cfg_irrig_center_start_hour.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 10, bounds 0 to 23.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active 10 from operator-center-fert-aggressive-20260518; latest plan operator-center-fert-aggressive-20260518 at 2026-05-18 23:35Z; latest dispatch 10 at 2026-05-19 04:35Z from plan.
  • Readback: latest 6 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 103, confirmed 61, unconfirmed 42, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 61/103 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.
irrig_center_start_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_center_start_min via SETPOINT_MAP; readback cfg_irrig_center_start_min.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 30, bounds 0 to 59.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active 30 from operator-center-fert-aggressive-20260518; latest plan operator-center-fert-aggressive-20260518 at 2026-05-18 23:35Z; latest dispatch 30 at 2026-05-19 04:35Z from plan.
  • Readback: latest 0 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 100, confirmed 58, unconfirmed 42, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 58/100 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.
irrig_vpd_boost_pct - controller safety
  • Purpose: Irrigation duration boost after sustained high-VPD stress.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_vpd_boost__ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 25, bounds 0 to 200.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, tunables.yaml:4.
  • Last used: active - from -; latest plan iris-20260409-2105 at 2026-04-13 01:30Z; latest dispatch 25 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 25 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 59, confirmed 59, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_vpd_boost_threshold_hrs - controller safety
  • Purpose: Accumulated high-VPD hours before irrigation boost applies.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_vpd_boost_threshold__hrs_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 3, bounds 0 to 24.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, tunables.yaml:2.
  • Last used: active - from -; latest plan iris-20260409-2105 at 2026-04-13 01:30Z; latest dispatch 3 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 3 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 59, confirmed 59, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
irrig_wall_days_mask - planner policy
  • Purpose: Explicit wall watering day mask, bit0=Sunday through bit6=Saturday.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: set_tunable allowed; ESPHome irrig_wall_days_mask via SETPOINT_MAP; readback cfg_irrig_wall_days_mask.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 127, bounds 0 to 127.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active 127 from operator-wall-fert-all-misters-20260518; latest plan operator-wall-fert-all-misters-20260518 at 2026-05-18 23:48Z; latest dispatch 127 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 127 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 2, confirmed 2, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
irrig_wall_duration_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_wall_duration__min_ via SETPOINT_MAP; readback cfg_irrig_wall_duration_min.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 10, bounds 1 to 120.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:2.
  • Last used: active 10 from operator-wall-fert-all-misters-20260518; latest plan operator-wall-fert-all-misters-20260518 at 2026-05-19 02:10Z; latest dispatch 10 at 2026-05-19 04:35Z from plan.
  • Readback: latest 10 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 69, confirmed 59, unconfirmed 10, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 59/69 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.
irrig_wall_fert_days_mask - planner policy
  • Purpose: Explicit wall fertigation day mask. Nonzero supersedes irrig_wall_fert_every_n.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: set_tunable allowed; ESPHome irrig_wall_fert_days_mask via SETPOINT_MAP; readback cfg_irrig_wall_fert_days_mask.
  • Registry: class planner_policy, kind numeric, owner planner, tier 2, default 127, bounds 0 to 127.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active 127 from operator-wall-fert-all-misters-20260518; latest plan operator-wall-fert-all-misters-20260518 at 2026-05-18 23:48Z; latest dispatch 127 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 127 at 2026-05-19 06:35Z (0m old); 7d readbacks 589.
  • Landing evidence: 7d dispatcher writes 7, confirmed 7, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Planner-policy tunable. Use only when forecast or previous-plan evidence points directly to this control path.
irrig_wall_fert_duration_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_wall_fert_duration__min_ via SETPOINT_MAP; readback cfg_irrig_wall_fert_duration_min.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 6, bounds 0 to 60.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:2.
  • Last used: active 6 from operator-wall-fert-all-misters-20260518; latest plan operator-wall-fert-all-misters-20260518 at 2026-05-18 23:48Z; latest dispatch 6 at 2026-05-19 04:35Z from plan.
  • Readback: latest 5 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 101, confirmed 61, unconfirmed 40, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 61/101 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.
irrig_wall_fert_every_n - controller safety
  • Purpose: Naming quirk: canonical drops ‘_cycles’ suffix that SETPOINT_MAP key carries.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_wall_fert_every_n_cycles via SETPOINT_MAP; readback cfg_irrig_wall_fert_every_n.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 0, bounds 0 to 30.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active 0 from operator-wall-fert-all-misters-20260518; latest plan operator-wall-fert-all-misters-20260518 at 2026-05-18 23:48Z; latest dispatch 0 at 2026-05-19 04:35Z from plan.
  • Readback: latest 0 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 98, confirmed 58, unconfirmed 40, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 58/98 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.
irrig_wall_flush_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_wall_flush__min_ via SETPOINT_MAP; readback cfg_irrig_wall_flush_min.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 2, bounds 0 to 30.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:2.
  • Last used: active 2 from operator-wall-fert-all-misters-20260518; latest plan operator-wall-fert-all-misters-20260518 at 2026-05-18 23:48Z; latest dispatch 2 at 2026-05-19 04:35Z from plan.
  • Readback: latest 2 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 98, confirmed 58, unconfirmed 40, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 58/98 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.
irrig_wall_interval_days - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_wall_interval__days_ via SETPOINT_MAP; readback cfg_irrig_wall_interval_days.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 1, bounds 1 to 14.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:2.
  • Last used: active 1 from operator-wall-fert-all-misters-20260518; latest plan operator-wall-fert-all-misters-20260518 at 2026-05-18 23:48Z; latest dispatch 1 at 2026-05-19 04:35Z from plan.
  • Readback: latest 1 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 98, confirmed 58, unconfirmed 40, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 58/98 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.
irrig_wall_start_hour - controller safety
  • Purpose: Wall-drip schedule — operator configures.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_wall_start_hour via SETPOINT_MAP; readback cfg_irrig_wall_start_hour.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 10, bounds 0 to 23.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active 10 from operator-wall-fert-all-misters-20260518; latest plan operator-wall-fert-all-misters-20260518 at 2026-05-18 23:48Z; latest dispatch 10 at 2026-05-19 04:35Z from plan.
  • Readback: latest 6 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 101, confirmed 61, unconfirmed 40, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 61/101 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.
irrig_wall_start_min - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrig_wall_start_min via SETPOINT_MAP; readback cfg_irrig_wall_start_min.
  • Registry: class controller_safety, kind numeric, owner operator, tier 2, default 30, bounds 0 to 59.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active 30 from operator-wall-fert-all-misters-20260518; latest plan operator-wall-fert-all-misters-20260518 at 2026-05-18 23:48Z; latest dispatch 30 at 2026-05-19 04:35Z from plan.
  • Readback: latest 0 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 101, confirmed 61, unconfirmed 40, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 61/101 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.
sw_irrigation_center_enabled - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrigation_center_enabled via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind switch, owner operator, tier 2, default 1, bounds switch 0/1.
  • Firmware evidence: no token hit.
  • Last used: active - from -; latest plan - at -; latest dispatch 0 at 2026-05-18 13:34Z from manual.
  • Readback: latest - at - (- old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 17, confirmed 3, unconfirmed 14, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 3/17 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.
sw_irrigation_enabled - controller safety
  • Purpose: Master irrigation enable.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrigation_enabled via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind switch, owner operator, tier 2, default 1, bounds switch 0/1.
  • Firmware evidence: no token hit.
  • Last used: active - from -; latest plan - at -; latest dispatch 0 at 2026-05-18 13:34Z from manual.
  • Readback: latest - at - (- old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 17, confirmed 3, unconfirmed 14, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 3/17 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.
sw_irrigation_wall_enabled - controller safety
  • Purpose: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrigation_wall_enabled via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind switch, owner operator, tier 2, default 1, bounds switch 0/1.
  • Firmware evidence: no token hit.
  • Last used: active - from -; latest plan - at -; latest dispatch 0 at 2026-05-18 13:34Z from manual.
  • Readback: latest - at - (- old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 17, confirmed 3, unconfirmed 14, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 3/17 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.
sw_irrigation_weather_skip - controller safety
  • Purpose: Operator-only legacy outdoor weather skip; default off for greenhouse irrigation.
  • Why it matters: Irrigation settings feed crop water availability and fertigation timing, not the 5-second climate mode.
  • Implementation: MCP rejects planner writes; ESPHome irrigation_weather_skip via SETPOINT_MAP; readback no cfg readback.
  • Registry: class controller_safety, kind switch, owner operator, tier 2, default 0, bounds switch 0/1.
  • Firmware evidence: no token hit.
  • Last used: active - from -; latest plan - at -; latest dispatch 1 at 2026-05-18 13:34Z from manual.
  • Readback: latest - at - (- old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 17, confirmed 3, unconfirmed 14, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 3/17 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.

Misting and sealed-humidification

mist_backoff_s - routine
  • Purpose: Controller lockout after sealed humidification times out. Suppresses another SEALED_MIST attempt without forcing venting.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mist_backoff__s_ via SETPOINT_MAP; readback cfg___mist_backoff__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 600, bounds 60 to 3600.
  • Firmware evidence: controls.yaml:5, globals.yaml:2, greenhouse_logic.h:18, greenhouse_types.h:6, sensors.yaml:5, tunables.yaml:8.
  • Last used: active 2400 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 2400 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 2400 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 167, confirmed 130, unconfirmed 37, distinct 7d values 8, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 130/167 7d writes have readbacks.
  • Latest plan rationale: iris-20260515-2010 (validated 2026-05-16 11:46Z, score 10); expected effect: space recovery attempts and protect water budget..
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mist_max_closed_vent_s - routine
  • Purpose: Maximum time vent can stay closed during misting before thermal-relief burst.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mist_max_closed_vent__s_ via SETPOINT_MAP; readback cfg___mist_max_closed_vent__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 600, bounds 120 to 900.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 120 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 120 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 120 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 127, confirmed 118, unconfirmed 9, distinct 7d values 5, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 118/127 7d writes have readbacks.
  • Latest plan rationale: iris-20260518-2012 (pending, score -); expected effect: Maintain dp_risk_hours at 0..
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mist_thermal_relief_s - routine
  • Purpose: Mandatory vent-open relief duration if mist-closed-vent cap hit.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mist_thermal_relief__s_ via SETPOINT_MAP; readback cfg___mist_thermal_relief__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 90, bounds 30 to 300.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 90 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 90 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 90 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 63, confirmed 63, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mist_vent_close_lead_s - reserved/no-op
  • Purpose: Reserved/no-op in current firmware. Exposed/read back but not consumed by the control loop.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome mist_vent_close_lead__s_ via SETPOINT_MAP; readback cfg___mist_vent_close_lead__s_.
  • Registry: class retired, kind numeric, owner planner, tier 2, default 15, bounds 0 to 60.
  • Firmware evidence: globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active - from -; latest plan iris-20260511-0448 at 2026-05-13 15:00Z; latest dispatch 15 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 15 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 59, confirmed 59, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
mist_vent_reopen_delay_s - reserved/no-op
  • Purpose: Reserved/no-op in current firmware. Exposed/read back but not consumed by the control loop.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome mist_vent_reopen_delay__s_ via SETPOINT_MAP; readback cfg___mist_vent_reopen_delay__s_.
  • Registry: class retired, kind numeric, owner planner, tier 2, default 45, bounds 0 to 120.
  • Firmware evidence: globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active - from -; latest plan iris-20260511-0448 at 2026-05-13 15:00Z; latest dispatch 45 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 45 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 59, confirmed 59, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
mister_all_delay_s - routine
  • Purpose: Dwell before physical all-zone rotation. Also feeds the header mist-stage delay.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mister_all_delay__s_ via SETPOINT_MAP; readback cfg___mister_all_delay__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 300, bounds 60 to 900.
  • Firmware evidence: controls.yaml:4, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 600 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 600 at 2026-05-19 02:23Z from plan.
  • Readback: latest 600 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 248, confirmed 208, unconfirmed 40, distinct 7d values 9, 30d clamps 262.
  • Effectiveness: Mostly confirmed: 208/248 7d writes have readbacks.
  • Latest plan rationale: iris-20260518-2012 (pending, score -); expected effect: Avoid all-zone mist rotation overnight..
  • Planner use: Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use shorter delays/gaps so ventilation can cool while misting protects VPD.
mister_all_kpa - routine
  • Purpose: Physical all-zone mister rotation threshold. Keep close to active vpd_high on hot/dry ventilation cycles; dispatcher clamps values that would prevent all-zone assist during live VPD-high or near-edge VENTILATE stress.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome vpd_mister_all_kpa via SETPOINT_MAP; readback cfg_mister_all__kpa_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 1.9, bounds 1 to 2.5.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active 2.5 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 2.5 at 2026-05-19 02:23Z from plan.
  • Readback: latest 2.5 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 286, confirmed 243, unconfirmed 43, distinct 7d values 40, 30d clamps 187.
  • Effectiveness: Mostly confirmed: 243/286 7d writes have readbacks.
  • Latest plan rationale: iris-20260518-2012 (pending, score -); expected effect: Keep all-zone mist unavailable unless an unexpected severe VPD spike occurs..
  • Planner use: Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, keep near max(1.0, vpd_high + 0.25) so all-zone mist assist can engage.
mister_all_off_s - reserved/no-op
  • Purpose: Deprecated legacy all-zone duty-cycle OFF duration. Current pulse controller does not consume it.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome mister_all_off__s_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class retired, kind numeric, owner planner, tier 2, default 420, bounds 120 to 600.
  • Firmware evidence: globals.yaml:2, tunables.yaml:6.
  • Last used: active - from -; latest plan - at -; latest dispatch 420 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 0 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 59, confirmed 59, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
mister_all_on_s - reserved/no-op
  • Purpose: Deprecated legacy all-zone duty-cycle ON duration. Current pulse controller does not consume it.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome mister_all_on__s_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class retired, kind numeric, owner planner, tier 2, default 480, bounds 120 to 600.
  • Firmware evidence: globals.yaml:2, tunables.yaml:6.
  • Last used: active - from -; latest plan - at -; latest dispatch 480 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 0 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 59, confirmed 59, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
mister_center_penalty - controller safety
  • Purpose: Score penalty on center zone to discourage over-misting seedlings.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: MCP rejects planner writes; ESPHome mister_center_penalty via SETPOINT_MAP; readback cfg___mister_center_penalty.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 0.5, bounds 0 to 1.
  • Firmware evidence: controls.yaml:1, globals.yaml:1, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 0.5 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 0.5 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 63, confirmed 63, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
mister_engage_delay_s - routine
  • Purpose: Delay before first physical mister pulse during a sealed or vent-assist moisture cycle.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mister_engage_delay__s_ via SETPOINT_MAP; readback cfg___mister_engage_delay__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 45, bounds 30 to 900.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 300 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 300 at 2026-05-19 02:23Z from plan.
  • Readback: latest 300 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 232, confirmed 197, unconfirmed 35, distinct 7d values 10, 30d clamps 262.
  • Effectiveness: Mostly confirmed: 197/232 7d writes have readbacks.
  • Latest plan rationale: iris-20260518-2012 (pending, score -); expected effect: Avoid short humidity pulses during transient VPD noise..
  • Planner use: Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use shorter delays/gaps so ventilation can cool while misting protects VPD.
mister_engage_kpa - routine
  • Purpose: Physical S1 mister-pulse threshold once humidity/zone demand exists. SEALED_MIST entry is vpd_high plus vpd_watch_dwell_s. During live VPD-high stress with healthy dew margin, dispatcher clamps overly conservative values back near the active vpd_high band.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome vpd_mister_engage_kpa via SETPOINT_MAP; readback cfg_mister_engage__kpa_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 1.6, bounds 0.5 to 2.5.
  • Firmware evidence: controls.yaml:3, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active 2.4 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 2.4 at 2026-05-19 02:23Z from plan.
  • Readback: latest 2.4 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 310, confirmed 263, unconfirmed 47, distinct 7d values 42, 30d clamps 198.
  • Effectiveness: Mostly confirmed: 263/310 7d writes have readbacks.
  • Latest plan rationale: iris-20260518-2012 (pending, score -); expected effect: Prevent physical misting overnight and keep VPD-low under 0.25h with dp-risk at 0h..
  • Planner use: Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, keep near active vpd_high + 0.05; dispatcher clamps overly conservative values.
mister_max_runtime_min - reserved/no-op
  • Purpose: Deprecated legacy runtime cap. Current water-budget logic uses mister_water_budget_gal.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome mister_max_runtime__min_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class retired, kind numeric, owner planner, tier 2, default 120, bounds 5 to 480.
  • Firmware evidence: globals.yaml:1, tunables.yaml:2.
  • Last used: active - from -; latest plan - at -; latest dispatch 120 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 120 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 59, confirmed 59, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
mister_off_s - reserved/no-op
  • Purpose: Deprecated legacy duty-cycle OFF duration. Current pulse controller does not consume it.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome mister_off__s_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class retired, kind numeric, owner planner, tier 2, default 600, bounds 120 to 900.
  • Firmware evidence: globals.yaml:2, tunables.yaml:6.
  • Last used: active - from -; latest plan - at -; latest dispatch 600 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 600 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 59, confirmed 59, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
mister_on_s - reserved/no-op
  • Purpose: Deprecated legacy duty-cycle ON duration. Current pulse controller does not consume it.
  • Why it matters: It matters mostly as a drift risk: the value can be exposed or read back, but current firmware does not use it for control.
  • Implementation: MCP rejects planner writes; ESPHome mister_on__s_ via SETPOINT_MAP; readback no cfg readback.
  • Registry: class retired, kind numeric, owner planner, tier 2, default 300, bounds 60 to 600.
  • Firmware evidence: globals.yaml:2, tunables.yaml:6.
  • Last used: active - from -; latest plan - at -; latest dispatch 300 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 0 at 2026-03-29 20:00Z (50d old); 7d readbacks 0.
  • Landing evidence: 7d dispatcher writes 59, confirmed 59, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Not effectful in current firmware; removed from planner writes.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not plan with this value until firmware consumes it. Treat existing readbacks as exposure evidence only.
mister_pulse_gap_s - routine
  • Purpose: Pulse-rotation OFF (evap dwell) between zones.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mister_pulse_gap__s_ via SETPOINT_MAP; readback cfg___mister_pulse_gap__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 45, bounds 10 to 60.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 60 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 60 at 2026-05-19 02:23Z from plan.
  • Readback: latest 60 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 268, confirmed 228, unconfirmed 40, distinct 7d values 11, 30d clamps 113.
  • Effectiveness: Mostly confirmed: 228/268 7d writes have readbacks.
  • Latest plan rationale: iris-20260518-2012 (pending, score -); expected effect: Reduce VPD-low and water use without increasing VPD-high stress..
  • Planner use: Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use shorter delays/gaps so ventilation can cool while misting protects VPD.
mister_pulse_on_s - routine
  • Purpose: Pulse-rotation ON duration per zone.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mister_pulse_on__s_ via SETPOINT_MAP; readback cfg___mister_pulse_on__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 60, bounds 30 to 90.
  • Firmware evidence: controls.yaml:6, globals.yaml:2, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 60 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 60 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 60 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 89, confirmed 89, unconfirmed 0, distinct 7d values 3, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: iris-20260512-2007 (pending, score -); expected effect: reduce over-humidification risk while relying on shorter gaps and fog for peak recovery.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mister_vpd_weight - routine
  • Purpose: Weight on VPD gap in zone-selection scoring formula.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mister_vpd_weight via SETPOINT_MAP; readback cfg___mister_vpd_weight.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 1.5, bounds 0.5 to 5.
  • Firmware evidence: controls.yaml:3, globals.yaml:1, sensors.yaml:2, tunables.yaml:4.
  • Last used: active 2 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 2 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 2 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 173, confirmed 163, unconfirmed 10, distinct 7d values 14, 30d clamps 2.
  • Effectiveness: Mostly confirmed: 163/173 7d writes have readbacks.
  • Latest plan rationale: iris-20260516-0545 (validated 2026-05-17 11:44Z, score 2); expected effect: prioritize productive zones during peak without over-watering overnight.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
mister_water_budget_gal - routine
  • Purpose: Daily mister water cap. In MCP TIER1 — planner trims on drought regimes.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mister_water_budget__gal_ via SETPOINT_MAP; readback cfg___mister_water_budget__gal_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 500, bounds 100 to 600.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, sensors.yaml:2, tunables.yaml:2.
  • Last used: active 600 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 600 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 600 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 111, confirmed 111, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
sw_mister_closes_vent - routine
  • Purpose: Normal mister pulses are suppressed while the vent is physically open. The explicit VENTILATE vent-mist assist path bypasses this interlock.
  • Why it matters: Misting trades water and heat retention against VPD stress. Bad settings either waste water or leave plants dry.
  • Implementation: routine set_plan required; ESPHome mister_closes_vent via SETPOINT_MAP; readback mister_closes_vent.
  • Registry: class planner_policy, kind switch, owner planner, tier 1, default 0, bounds switch 0/1.
  • Firmware evidence: controls.yaml:6, globals.yaml:1, tunables.yaml:9.
  • Last used: active 1 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 1 at 2026-05-18 19:44Z from plan.
  • Readback: latest 1 at 2026-05-19 06:35Z (0m old); 7d readbacks 10048.
  • Landing evidence: 7d dispatcher writes 20, confirmed 20, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.

Operator

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

Planner

bias_cool - routine
  • Purpose: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Why it matters: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Implementation: routine set_plan required; ESPHome bias_cool__f via SETPOINT_MAP; readback cfg___bias_cool___f_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 0, bounds -10 to 10.
  • Firmware evidence: controls.yaml:3, globals.yaml:1, greenhouse_logic.h:3, greenhouse_types.h:5, sensors.yaml:2, tunables.yaml:4.
  • Last used: active 4 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 4 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 4 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 166, confirmed 134, unconfirmed 32, distinct 7d values 14, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 134/166 7d writes have readbacks.
  • Latest plan rationale: iris-20260518-2012 (pending, score -); expected effect: Avoid vent dumps after heater overshoot and keep heat/cold whipsaw low..
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
bias_heat - routine
  • Purpose: Note: validate_setpoints tightens this to [-5, +5] at ingest; controls.yaml accepts [-10, +10]. Registry uses the wider value.
  • Why it matters: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Implementation: routine set_plan required; ESPHome bias_heat__f via SETPOINT_MAP; readback cfg___bias_heat___f_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 0, bounds -10 to 10.
  • Firmware evidence: controls.yaml:3, globals.yaml:1, greenhouse_logic.h:5, greenhouse_types.h:6, sensors.yaml:2, tunables.yaml:4.
  • Last used: active 1.85 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 1.85 at 2026-05-19 04:30Z from plan.
  • Readback: latest 1.85 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 140, confirmed 107, unconfirmed 33, distinct 7d values 9, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 107/140 7d writes have readbacks.
  • Latest plan rationale: iris-20260518-2012 (pending, score -); expected effect: Keep cold stress near or below 1h overnight while maintaining dew margin above 5F..
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
dehum_aggressive_kpa - controller safety
  • Purpose: Margin below vpd_low that upgrades dehumidification demand; validate_setpoints also caps it below vpd_low.
  • Why it matters: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Implementation: MCP rejects planner writes; ESPHome dehum_aggressive_kpa via SETPOINT_MAP; readback cfg___dehum_aggressive__kpa_.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 0.6, bounds 0.05 to 1.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, greenhouse_logic.h:2, greenhouse_types.h:5, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 0.6 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 0.6 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 59, confirmed 59, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
max_relief_cycles - controller safety
  • Purpose: Consecutive sealed→relief cycles before forced ventilation latch.
  • Why it matters: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Implementation: MCP rejects planner writes; ESPHome max_relief_cycles via SETPOINT_MAP; readback cfg___max_relief_cycles.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 3, bounds 1 to 10.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, greenhouse_logic.h:6, greenhouse_types.h:4, sensors.yaml:3, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 3 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 3 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 76, confirmed 76, unconfirmed 0, distinct 7d values 2, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.
vent_latch_timeout_ms - controller safety
  • Purpose: Maximum forced-vent latch duration after relief-cycle breaker trips.
  • Why it matters: It is part of the bounded greenhouse control surface and must stay traceable across schema, DB, dispatcher, firmware, and site docs.
  • Implementation: MCP rejects planner writes; ESPHome vent_latch_timeout__ms_ via SETPOINT_MAP; readback cfg___vent_latch_timeout__ms_.
  • Registry: class controller_safety, kind numeric, owner planner, tier 2, default 1800000, bounds 60000 to 7200000.
  • Firmware evidence: controls.yaml:2, globals.yaml:1, greenhouse_logic.h:2, greenhouse_types.h:4, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 1800000 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 1800000 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 59, confirmed 59, unconfirmed 0, distinct 7d values 1, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Controller/operator configuration. Keep stable from the planner; promote to planner_policy only after replay evidence proves value.

Readback-only firmware inputs

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

Relay dwell and rotation

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

Safety rails

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

Summer vent gate

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

Temperature band and staging

d_cool_stage_2 - routine
  • Purpose: °F above temp_high at which fan-2 engages. In MCP TIER1 — planner tunes during summer heat.
  • Why it matters: Temperature setpoints drive heater staging, ventilation, fan staging, and heat-stress avoidance.
  • Implementation: routine set_plan required; ESPHome __cool_stage_2__f via SETPOINT_MAP; readback cfg___d_cool_stage_2___f_.
  • Registry: class planner_policy, kind numeric, owner band, tier 1, default 3, bounds 2 to 15.
  • Firmware evidence: greenhouse_logic.h:1, sensors.yaml:2.
  • Last used: active 3 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 3 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 3 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 129, confirmed 124, unconfirmed 5, distinct 7d values 3, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 124/129 7d writes have readbacks.
  • Latest plan rationale: iris-20260515-2010 (validated 2026-05-16 11:46Z, score 10); expected effect: pre-stage full ventilation if sunrise cycle misses and dry ramp arrives..
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
d_heat_stage_2 - routine
  • Purpose: Forecast-tuned heating aggressiveness. °F below the interior heating target (temp_low + 25% band + bias_heat) where heat stage 2 latches.
  • Why it matters: Temperature setpoints drive heater staging, ventilation, fan staging, and heat-stress avoidance.
  • Implementation: routine set_plan required; ESPHome __heat_stage_2__f via SETPOINT_MAP; readback cfg___d_heat_stage_2___f_.
  • Registry: class planner_policy, kind numeric, owner band, tier 1, default 5, bounds 2 to 15.
  • Firmware evidence: greenhouse_logic.h:1, sensors.yaml:2.
  • Last used: active 3 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 3 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 3 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 75, confirmed 75, unconfirmed 0, distinct 7d values 4, 30d clamps 0.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: iris-20260517-2014 (validated 2026-05-18 11:45Z, score 5); expected effect: Shift sustained cold support to gas staging and avoid excessive electric-only runtime..
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
heat_hysteresis - routine
  • Purpose: Forecast-tuned heat-stage clear margin above the interior heating target. Higher values hold heat longer.
  • Why it matters: Temperature setpoints drive heater staging, ventilation, fan staging, and heat-stress avoidance.
  • Implementation: routine set_plan required; ESPHome heat_hysteresis__f via SETPOINT_MAP; readback cfg___heat_hyst___f_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 1, bounds 0 to 3.
  • Firmware evidence: controls.yaml:4, globals.yaml:1, greenhouse_logic.h:5, greenhouse_types.h:5, sensors.yaml:2, tunables.yaml:4.
  • Last used: active 1.5 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 1.5 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 1.5 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 153, confirmed 116, unconfirmed 37, distinct 7d values 7, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 116/153 7d writes have readbacks.
  • Latest plan rationale: iris-20260517-2014 (validated 2026-05-18 11:45Z, score 5); expected effect: Restore stable heater clearing behavior and prevent rapid heat cycling..
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
temp_high - crop band
  • Purpose: Crop band — dispatcher pushes every cycle.
  • Why it matters: Temperature setpoints drive heater staging, ventilation, fan staging, and heat-stress avoidance.
  • Implementation: MCP rejects planner writes; ESPHome set_temp_high__f via SETPOINT_MAP; readback cfg___temp_high___f_.
  • Registry: class crop_band, kind numeric, owner band, tier 2, default 95, bounds 40 to 100.
  • Firmware evidence: controls.yaml:5, globals.yaml:2, greenhouse_logic.h:18, greenhouse_types.h:9, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan preemptive-20260512-2036 at 2026-05-12 20:36Z; latest dispatch 65 at 2026-05-19 04:35Z from band.
  • Readback: latest 65 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 1187, confirmed 1187, unconfirmed 0, distinct 7d values 134, 30d clamps 493.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not push from Iris. Crop profiles and dispatcher own this value; use planner-policy bias/staging knobs instead.
temp_hysteresis - routine
  • Purpose: Forecast-tuned temperature transition hysteresis. Wider values reduce mode churn; narrower values tighten band tracking.
  • Why it matters: Temperature setpoints drive heater staging, ventilation, fan staging, and heat-stress avoidance.
  • Implementation: routine set_plan required; ESPHome temp_hysteresis__f via SETPOINT_MAP; readback cfg___temp_hyst___f_.
  • Registry: class planner_policy, kind numeric, owner band, tier 1, default 1.5, bounds 0.5 to 3.
  • Firmware evidence: controls.yaml:1, greenhouse_logic.h:7, greenhouse_types.h:5.
  • Last used: active 2 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 2 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 2 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 164, confirmed 126, unconfirmed 38, distinct 7d values 9, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 126/164 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
temp_low - crop band
  • Purpose: Crop band — dispatcher pushes every cycle. Firmware default wide (40) so safety rails govern if dispatcher silent.
  • Why it matters: Temperature setpoints drive heater staging, ventilation, fan staging, and heat-stress avoidance.
  • Implementation: MCP rejects planner writes; ESPHome set_temp_low__f via SETPOINT_MAP; readback cfg___temp_low___f_.
  • Registry: class crop_band, kind numeric, owner band, tier 2, default 40, bounds 30 to 80.
  • Firmware evidence: controls.yaml:4, globals.yaml:2, greenhouse_logic.h:16, greenhouse_types.h:8, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan preemptive-20260418-0730 at 2026-04-18 07:30Z; latest dispatch 62 at 2026-05-19 04:35Z from band.
  • Readback: latest 62 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 1179, confirmed 1179, unconfirmed 0, distinct 7d values 103, 30d clamps 1691.
  • Effectiveness: Route confirmed: every 7d dispatcher write has a matching firmware readback.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not push from Iris. Crop profiles and dispatcher own this value; use planner-policy bias/staging knobs instead.

VPD band

vpd_high - crop band
  • Purpose: Crop band high-VPD threshold; firmware seal entry trigger.
  • Why it matters: VPD control protects transpiration balance; this is usually the limiting axis on hot dry days.
  • Implementation: MCP rejects planner writes; ESPHome set_vpd_high_kpa via SETPOINT_MAP; readback cfg___vpd_high__kpa_.
  • Registry: class crop_band, kind numeric, owner band, tier 2, default 2.8, bounds 0.4 to 3.
  • Firmware evidence: controls.yaml:3, globals.yaml:2, greenhouse_logic.h:36, greenhouse_types.h:10, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan operator-2026-04-25-band-relief at 2026-04-25 22:34Z; latest dispatch 0.8 at 2026-05-19 04:35Z from band.
  • Readback: latest 0.8 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 1213, confirmed 1198, unconfirmed 15, distinct 7d values 54, 30d clamps 1496.
  • Effectiveness: Mostly confirmed: 1198/1213 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not push from Iris. Crop profiles and dispatcher own this value; use planner-policy bias/staging knobs instead.
vpd_hysteresis - routine
  • Purpose: In MCP TIER1 — planner tunes to widen/tighten seal exit during humid regimes.
  • Why it matters: VPD control protects transpiration balance; this is usually the limiting axis on hot dry days.
  • Implementation: routine set_plan required; ESPHome vpd_hysteresis_kpa via SETPOINT_MAP; readback cfg___vpd_hyst__kpa_.
  • Registry: class planner_policy, kind numeric, owner band, tier 1, default 0.3, bounds 0.05 to 0.5.
  • Firmware evidence: controls.yaml:1, greenhouse_logic.h:5, greenhouse_types.h:4.
  • Last used: active 0.5 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 0.5 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 0.5 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 167, confirmed 157, unconfirmed 10, distinct 7d values 6, 30d clamps 2.
  • Effectiveness: Mostly confirmed: 157/167 7d writes have readbacks.
  • Latest plan rationale: iris-20260518-2012 (pending, score -); expected effect: Reduce dehum/mist chatter while preserving safety..
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.
vpd_low - crop band
  • Purpose: Crop band low-VPD threshold. Dispatcher pushes every cycle.
  • Why it matters: VPD control protects transpiration balance; this is usually the limiting axis on hot dry days.
  • Implementation: MCP rejects planner writes; ESPHome set_vpd_low_kpa via SETPOINT_MAP; readback cfg___vpd_low__kpa_.
  • Registry: class crop_band, kind numeric, owner band, tier 2, default 0.35, bounds 0.1 to 1.
  • Firmware evidence: controls.yaml:2, globals.yaml:2, greenhouse_logic.h:17, greenhouse_types.h:13, sensors.yaml:2, tunables.yaml:4.
  • Last used: active - from -; latest plan - at -; latest dispatch 0.25 at 2026-05-19 04:35Z from band.
  • Readback: latest 0.25 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 1323, confirmed 1296, unconfirmed 27, distinct 7d values 78, 30d clamps 65.
  • Effectiveness: Mostly confirmed: 1296/1323 7d writes have readbacks.
  • Latest plan rationale: -; expected effect: -.
  • Planner use: Do not push from Iris. Crop profiles and dispatcher own this value; use planner-policy bias/staging knobs instead.
vpd_watch_dwell_s - routine
  • Purpose: VPD_WATCH observation window before engaging mist.
  • Why it matters: VPD control protects transpiration balance; this is usually the limiting axis on hot dry days.
  • Implementation: routine set_plan required; ESPHome vpd_watch_dwell__s_ via SETPOINT_MAP; readback cfg___vpd_watch_dwell__s_.
  • Registry: class planner_policy, kind numeric, owner planner, tier 1, default 60, bounds 15 to 120.
  • Firmware evidence: controls.yaml:4, globals.yaml:2, greenhouse_logic.h:4, greenhouse_types.h:5, sensors.yaml:4, tunables.yaml:6.
  • Last used: active 120 from iris-20260518-2012; latest plan iris-20260518-2012 at 2026-05-19 14:15Z; latest dispatch 120 at 2026-05-19 01:58Z from esp32.
  • Readback: latest 120 at 2026-05-19 06:35Z (0m old); 7d readbacks 10038.
  • Landing evidence: 7d dispatcher writes 180, confirmed 141, unconfirmed 39, distinct 7d values 6, 30d clamps 0.
  • Effectiveness: Mostly confirmed: 141/180 7d writes have readbacks.
  • Latest plan rationale: iris-20260516-0545 (validated 2026-05-17 11:44Z, score 2); expected effect: enter bounded recovery promptly during confirmed dry stress while restoring longer dwell overnight.
  • Planner use: Include this in every routine set_plan waypoint. Change it only with a forecast-backed hypothesis and validate the next scorecard.

Zone scoring

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