Version 2.5.0 — Last updated June 2026
The irrigation system automates irrigation for 6 grow tables using sensor-driven decisions. It has three layers:
Time-based irrigation scheduling, environment control (AC, humidity, CO2), and safety watchdogs. This is the production workhorse. It runs entirely inside Home Assistant — no extra software needed.
Adds 90+ entities for sensor-driven irrigation decisions. Calculates shot sizes, tracks EC ratios, and provides per-zone controls. Installed as a custom component.
The f2-control Home Assistant add-on is the deployed autonomous control layer. It is a single synchronous Python process that polls HA over REST every 60 seconds, runs the 4-phase P0–P3 crop-steering engine per zone, fires irrigation shots with hardware readback, republishes the sensor.crop_steering_* surface, and sends 30-minute vitals to the operator's phone. It is gated by a hard kill switch — input_boolean.f2_control_enabled — so you can disable autonomous actuation without removing the add-on. See Section 9 for setup.
input_boolean.f2_control_enabled — when OFF, the add-on continues to read sensors and compute decisions but never actuates any valve or pump. Flip it OFF to pause autonomous watering at any time without restarting the add-on.
Physical probes (ESPHome)
↓
Raw sensor entities (e.g. sensor.substrate_1_substrate_1_vwc_coco_coir)
↓ [10_mapping.yaml averages + rounds values]
Irrigation contract entities (e.g. sensor.irrigation_table_1_vwc)
↓ [crop_steering.env tells the integration where to look]
Crop Steering entities (e.g. sensor.zone_1_vwc)
↓ [f2-control add-on reads these every 60 s]
Autonomous P0–P3 decisions → valve actuation
| Device | What It Does | Connection |
|---|---|---|
| KC868 E16S relay board | Controls all valves (6 tables + mains + mainline + manifold) | Ethernet (ESPHome) |
| 6x Substrate probes | Measure VWC, EC, and temperature per table | SDI-12 via Ethernet (ESPHome) |
| 4x Environmental sensors | Room temperature and humidity | Ethernet (ESPHome) |
| 3x CO2 sensors | CO2 levels + VPD | Ethernet (ESPHome) |
| 4x AC units | Temperature control | IR via ESPHome |
| CO2 solenoid | CO2 injection during lights-on | Solid state relay (ESPHome) |
| Humidifier | Raise humidity | Solid state relay (ESPHome) |
| 4x Dehumidifier relays | Lower humidity | Relay board (ESPHome) |
| Grow lights | Light group for all tables | ESPHome |
Nutrient Tank
↓
[switch.mainline opens] → Pressure switch auto-starts pump
↓
Mainline pipe
↓
[switch.table_N opens] → Water flows to table N's drippers
↓
Drippers → Plants → Substrate → Runoff
PUMP_SWITCH is blank in the config.
| Sensor/Device | What It Does | Impact If Missing |
|---|---|---|
| Tank low float switch | Detects low water level | Tank-low safety abort won't trigger |
| Leak sensor | Detects water leaks | Leak safety abort won't trigger |
| Tank pH probe | Monitors nutrient pH | pH shows "Unavailable" on dashboard |
| Tank EC probe | Monitors nutrient EC | EC shows "Unavailable" on dashboard |
| Leaf temp sensor | Accurate VPD calculation | Falls back to room air temp |
The deployed workhorse is the f2-control add-on. Every 60 seconds it polls all zone sensor entities, runs the 4-phase P0–P3 crop-steering logic independently for each zone, and — if the kill switch is ON — actuates valves accordingly. It does not rely on HA automations for phase logic: all steering decisions live inside the add-on's Python engine.
The sequence for each watering shot is:
input_boolean.f2_control_enabled must be ON).sensor.crop_steering_* state. Sends 30-min vitals to operator phone (if configured).When the f2-control kill switch is OFF, the Layer 1 Irrigation Package handles time-based irrigation at the configured interval. This is the safe fallback mode — the crop steering engine is suspended but plants still get watered.
| Setting | Where to Change It | Default |
|---|---|---|
| Kill switch (autonomous mode) | input_boolean.f2_control_enabled | OFF (safe) |
| Irrigation window start | Schedule tab → Window Start | Set in HA |
| Irrigation window end | Schedule tab → Window End | Set in HA |
| Time between cycles (fallback) | Schedule tab → Interval | 60 minutes |
| Duration per table (fallback) | Schedule tab → Duration | 60 seconds |
| Which tables are active | Zone Control tab → Enabled toggle per table | All off |
| Master on/off | Command Center → Irrigation System | Off |
The system also manages grow room climate:
Crop steering divides each day into 4 phases based on substrate moisture and light cycle. The goal is to control how plants use water and nutrients. The f2-control add-on runs this logic autonomously per zone.
When: Lights turn on → First irrigation shot
What happens: No watering. The substrate dries down from overnight levels.
Why: A controlled dry-down signals the plant to focus on root growth (vegetative) or fruit production (generative).
Moves to P1 when: VWC drops by the target percentage (vegetative: 50%, generative: 40%), or max wait time (120 min) expires.
When: After dryback target reached → VWC reaches field capacity target
What happens: Progressive irrigation shots. Starts small (2% of substrate volume), increases by 0.5% each shot.
Why: Gradually rehydrates the substrate without causing runoff or flushing nutrients.
Settings: 15 min between shots, max 10 shots, target VWC 65%.
Moves to P2 when: Target VWC reached or max shots hit.
When: Field capacity reached → Before lights-off
What happens: Fixed-size maintenance shots whenever VWC drops below the per-zone threshold (default 60%).
Smart EC adjustment: If EC is too high (ratio > 1.2), the threshold rises — triggering more frequent irrigation to flush salts. If EC is too low (ratio < 0.8), threshold drops — letting the substrate dry more to concentrate nutrients.
EC targets are per-zone — set via number.crop_steering_zone_X_ec_target_{veg,gen}_pN entities (see Section 8).
Moves to P3 when: Approaching lights-off time.
When: 2–3 hours before lights off → Lights off
What happens: No scheduled irrigation. Emergency-only shots if VWC drops below 40%.
Why: Allows a controlled overnight dryback for the next day's P0.
Moves to P0 when: Lights turn on next day.
Follow these steps to get the system running from scratch.
sensor.irrigation_table_1_vwc. You should see a number (e.g. 47.4). Check all 6 tables.sensor.irrigation_room_1_temp. Should show room temperature. Also check sensor.irrigation_room_1_rh and sensor.irrigation_room_1_co2.switch.turn_on, target switch.irrigation_table_1_valve. You should hear the valve click. Turn it off immediately after confirming. Repeat for all 6 tables.switch.irrigation_mainline on — you should hear the pump start. Turn off immediately.script.irrigation_run_irrigation_cycle.substrate_volume, plant_count, drippers_per_plant, dripper_flow_rate) — these values must be accurate or every shot will be mis-sized.input_boolean.f2_control_enabled is ON if you want autonomous crop-steering active.Go to Zone Control and toggle the Enabled switch for each table. Disabled tables are skipped during irrigation cycles.
If anything goes wrong:
input_boolean.f2_control_enabled. The f2-control add-on will suspend all actuation immediately. This is the primary emergency stop for the autonomous engine.script.irrigation_emergency_stop service from Developer Tools.| Tab | What It Shows | When To Use It |
|---|---|---|
| Command Center | System status, crop steering settings, safety, infrastructure controls, all-table overview | Daily check-in, system on/off, changing steering mode |
| Zone Control | Per-table detail: sensors, valves, irrigation stats, crop profiles | Enabling/disabling tables, checking individual table health |
| Trends | 24-hour graphs: VWC, EC, substrate temp, room environment | Spotting problems, checking irrigation patterns |
| Environment | Room climate gauges, temperature/humidity/CO2 targets, hardware switches | Adjusting climate targets, checking HVAC status |
| Schedule | Irrigation timing, valve controls, table enables, scripts | Changing irrigation timing, manual valve control |
www/overview.html is a compact mobile dashboard designed for a quick status check without opening the full operator console. It has three tabs:
| Tab | What It Shows |
|---|---|
| Steer | Per-zone vitals (VWC, EC, substrate temp) alongside their targets; current P0–P3 phase per zone |
| Controls | Room climate (temp, VPD, CO2, PPFD, DLI); pump, light, and zone control switches |
| Dosing | Veg-room peristaltic dosing pump controls — these drive the nutrient dosing pumps that feed the F2 room from the veg room |
Open overview.html on a phone browser pointed at your HA URL. It auto-refreshes and requires no separate installation.
These must match your physical setup. Find them in Settings → Devices → Crop Steering System or edit /config/crop_steering.env.
substrate_volume × shot_fraction ÷ (plant_count × drippers_per_plant × dripper_flow_rate) on every poll. Stale or default values here directly mis-size every irrigation shot — verify these against your actual hardware before enabling autonomous mode.
| Parameter | What It Means | Default | How To Measure |
|---|---|---|---|
| Substrate Volume | Volume of growing media per pot (litres) | 10.0 L | Check your pot size |
| Plant Count | Number of plants per zone | 1 | Count plants in the zone |
| Drippers Per Plant | Number of drippers in each pot | 2 | Count them |
| Dripper Flow Rate | How fast each dripper delivers water (L/hr) | 2.0 L/hr | Time how long to fill a measuring cup |
| Field Capacity | Maximum VWC your substrate can hold | 70% | Saturate substrate, read VWC when dripping stops |
EC targets are set per zone using the entities number.crop_steering_zone_X_ec_target_{veg,gen}_pN. The table below shows the default Athena values — adjust per zone as needed based on that zone's runoff EC readings.
| Phase | Vegetative | Generative |
|---|---|---|
| P0 (Dryback) | 3.0 mS/cm | 4.0 mS/cm |
| P1 (Ramp-Up) | 3.0 mS/cm | 5.0 mS/cm |
| P2 (Maintenance) | 3.2 mS/cm | 6.0 mS/cm |
| P3 (Pre-Off) | 3.0 mS/cm | 4.5 mS/cm |
input_boolean.f2_control_enabled ON to enable autonomous crop-steering.
The f2-control add-on is the deployed autonomous coordinator. It replaces the earlier engine (now retired; the old master_crop_steering_app.py is kept as a manual rollback only). This section covers installing and enabling f2-control from scratch.
sensor.crop_steering_* entities, and sends 30-minute operator vitals. All actuation is gated by the kill switch.
/addons/f2-control. Click it and choose Install.6)notify.mobile_app_operator)f2_control_enabled (entity ID will be input_boolean.f2_control_enabled). Alternatively add it to a packages/ YAML file.[f2-control] started, kill-switch=OFF. No errors means the add-on is running and reading sensors.input_boolean.f2_control_enabled to ON. The add-on will begin autonomous actuation on the next 60-second poll.sensor.crop_steering_app_status — should show "running".sensor.crop_steering_app_current_phase per zone — phases should transition through P0→P1 after lights-on dryback.The system has multiple layers of protection. These run independently — if one fails, others still protect your grow.
input_boolean.f2_control_enabled (OFF) suspends all autonomous actuation instantly. This is the first thing to flip in any emergency related to the autonomous engine.
| Protection | What It Does | Automatic? |
|---|---|---|
| Kill Switch | input_boolean.f2_control_enabled OFF — add-on reads/computes but never actuates any valve or pump | Manual (instant) |
| Master Gate | Irrigation only runs when: system enabled + not in maintenance + no leak + tank OK + within time window | Yes |
| Valve Watchdog | If any table valve stays open longer than 3 minutes, force-closes it and alerts you | Yes |
| Lights-On Watering Watchdog | Flags any zone that has gone unwatered for more than N hours during lights-on; escalates to operator alert | Yes |
| Anti-Lockout High-EC Flush | When pore EC exceeds the safety ceiling, triggers a dilutive flush shot instead of locking the zone out entirely | Yes |
| Cross-Zone Outlier Detection | Flags a zone whose water uptake deviates significantly from its siblings — indicates probe fault, blocked dripper, or plant stress | Yes |
| Mains Water Watchdog | Kills mains water if open for 24 minutes (8x valve limit) | Yes |
| Leak Abort | Emergency stop on leak detection (needs sensor installed) | Yes* |
| Tank Low Abort | Closes all valves if tank is low (needs float switch installed) | Yes* |
| Maintenance Mode | Closes all valves immediately when toggled on | Manual |
| Sensor Offline Alert | Alerts if temp/RH/CO2 sensors go offline for 10 min. Also closes CO2 if CO2 sensor lost. | Yes |
| Valve-Without-Permission | If the master gate goes false while valves are open, closes everything | Yes |
| Daily Audit (3 AM) | Force-closes all valves and CO2 solenoid as a safety reset | Yes |
| CO2 Lights-Off | CO2 solenoid always closes when lights turn off | Yes |
* Requires physical sensor to be installed and mapped.
crop_steering_source_water_* entities.
number.crop_steering_p2_min_interval_minutes.
An optional PID-based EC correction loop is available but off by default. When enabled, the engine replaces the simple high/low EC threshold adjustments in P2 with a continuous PID controller that trims the VWC target in real time to converge on the zone's EC target.
input_boolean.crop_steering_ec_pid_enabled ON.input_number.crop_steering_ec_pid_kp, …_ki, …_kd.binary_sensor.irrigation_irrigation_allowed — should be "on". If "off", check each condition above.input_boolean.f2_control_enabled is ON and the f2-control add-on is running (Settings → Add-ons → f2-control → Log).sensor.substrate_1_substrate_1_vwc_coco_coir). If this shows a value but the irrigation_table_1_vwc doesn't, reload template entities: Developer Tools → YAML → Template Entities → Reload.number.substrate_volume — should be your pot volume (e.g. 10.0 L).number.dripper_flow_rate — should be your dripper output (e.g. 2.0 L/hr).crop_steering_ prefix. This will be fixed in a future update.switch.turn_off targeting the specific valve entity (e.g. switch.table_1).input_boolean.f2_control_enabled is ON — the add-on silently skips actuation when OFF.| Entity | What It Shows |
|---|---|
sensor.irrigation_table_N_vwc | Table N volumetric water content (%) |
sensor.irrigation_table_N_ec | Table N pore water EC (mS/cm) |
sensor.irrigation_table_N_substrate_temp | Table N substrate temperature (°C) |
sensor.irrigation_room_1_temp | Room temperature (averaged from 4 sensors) |
sensor.irrigation_room_1_rh | Room humidity (averaged) |
sensor.irrigation_room_1_co2 | Room CO2 (averaged from 3 sensors) |
sensor.irrigation_room_1_vpd | Room VPD (averaged) |
sensor.irrigation_average_vwc | Average VWC across all tables |
sensor.irrigation_average_ec | Average EC across all tables |
sensor.crop_steering_app_status | f2-control add-on runtime status |
sensor.crop_steering_app_current_phase | Current P0–P3 phase per zone |
| Entity | What It Controls |
|---|---|
input_boolean.f2_control_enabled | Kill switch — autonomous actuation on/off |
input_boolean.irrigation_enable | Master system on/off |
input_boolean.irrigation_maintenance_mode | Maintenance mode (closes all valves) |
input_boolean.irrigation_table_N_enabled | Enable/disable table N for irrigation |
switch.irrigation_table_N_valve | Table N solenoid valve |
switch.irrigation_mainline | Mainline valve (starts pump) |
switch.irrigation_mains_water | Mains water solenoid |
switch.irrigation_manifold | Manifold valve |
| Script | What It Does |
|---|---|
script.irrigation_run_irrigation_cycle | Runs a full irrigation cycle (all enabled tables) |
script.irrigation_run_table | Runs a single table for configured duration |
script.irrigation_emergency_stop | Emergency stop — closes ALL valves, disables system |
F2 Irrigation System Manual v2.5.0 — June 2026