Version 2.3.1 — Last updated March 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.
Autonomous phase transitions, advanced dryback detection, and ML-based irrigation prediction. Needs separate setup (see Section 9).
Physical probes (ESPHome)
↓
Raw sensor entities (e.g. sensor.substrate_1_substrate_1_vwc_coco_coir)
↓ [10_mapping.yaml averages + rounds values]
GW 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)
| 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 |
Every cycle follows this sequence:
| Setting | Where to Change It | Default |
|---|---|---|
| Irrigation window start | Schedule tab → Window Start | Set in HA |
| Irrigation window end | Schedule tab → Window End | Set in HA |
| Time between cycles | Schedule tab → Interval | 60 minutes |
| Duration per table | Schedule tab → Duration | 60 seconds |
| Which tables are active | Zone Control tab → Enabled toggle per table | All off |
| Master on/off | Command Center → GW 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.
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 threshold (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.
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.Go to Zone Control and toggle the Enabled switch for each table. Disabled tables are skipped during irrigation cycles.
If anything goes wrong:
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 |
These must match your physical setup. Find them in Settings → Devices → Crop Steering System or edit /config/crop_steering.env.
| Parameter | What It Means | Default | How To Measure |
|---|---|---|---|
| Substrate Volume | Volume of growing media per pot (litres) | 10.0 L | Check your pot size |
| Dripper Flow Rate | How fast each dripper delivers water (L/hr) | 2.0 L/hr | Time how long to fill a measuring cup |
| Drippers Per Plant | Number of drippers in each pot | 2 | Count them |
| Field Capacity | Maximum VWC your substrate can hold | 70% | Saturate substrate, read VWC when dripping stops |
| 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 |
AppDaemon adds autonomous phase transitions — the system automatically moves through P0→P1→P2→P3 based on live sensor data instead of requiring manual phase selection.
scipy, numpy.cp -r /config/repos/HA-Irrigation-Strategy/appdaemon/apps/crop_steering /config/appdaemon/apps/
cp /config/repos/HA-Irrigation-Strategy/appdaemon/apps/crop_steering/apps.yaml /config/appdaemon/apps/crop_steering/
/config/appdaemon/apps/crop_steering/apps.yaml and verify the entity IDs match your setup (they should reference irrigation_* entities).sensor.crop_steering_app_status, sensor.crop_steering_app_current_phase, etc.sensor.crop_steering_app_status — should show "running".The system has multiple layers of protection. These run independently — if one fails, others still protect your grow.
| Protection | What It Does | Automatic? |
|---|---|---|
| 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 |
| 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.
binary_sensor.irrigation_irrigation_allowed — should be "on". If "off", check each condition above.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).| 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 |
| Entity | What It Controls |
|---|---|
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 |
Irrigation System Manual v2.3.1 — Generated March 2026