Skip to content
Crop Steering
Browse the documents

Validated feature matrix

On this page

Evidence reviewed: 8 September 2026; the 2.17 rows and the live deployment row on 20 September 2026. This table distinguishes implemented source, automated checks and live verification. The deployed 2.16.0 installation passed tank mapping through reviewed MCP preview/apply/readback in both rooms, with setup revision 1 acknowledged by healthy controller reports. The native panel and HA menu button were also checked live. The unified Irrigation plan → Today / Schedule navigation and overnight-curve update are published in 2.16.1 / controller 0.13.3 and verified in the native HA panel. Installed dashboard files match the public demo, and all 398 existing control values were preserved. See the follow-up verification. Earlier retention evidence remains in the recipe-library release audit and live upgrade record.

Physical water delivery, a completely blank HA installation and a complete live grow-plan boundary handoff remain uncommissioned. Use the user guide for daily workflows and installation guide for prerequisites.

FeatureResultEvidence and limits
Interactive demoUnit and compiled browser tests passSynthetic rooms/readings, two sample recipes for untouched demo libraries, and current/previous/archived run examples. Reset restores in-memory examples while retaining browser recipes/live connection data. Production libraries remain unseeded. The compiled browser checks verify initial current/prior curves across day/week/month/run ranges, reset confirmation, and recipe/live-storage preservation.
Complete usage documentationSource workflow auditUSER_GUIDE.md covers mapping, overview/tank/zone status, local edits, HA drafts, recipes, runs, water estimates and failure states. Documentation is not physical commissioning.
Optional scoped MCP server18 protocol tests, six live reads and reviewed live setup saves passLocal stdio tools are documented in MCP.md. On 2.16.0, tank-mapping proposals completed preview/apply/readback for both rooms at setup revision 1; healthy controllers acknowledged revision 1. Other writes remain limited to reviewed setup or draft-plan saves. No generic actuation, engine enabling or plan activation.
Native Home Assistant appearanceImplemented; locally testedSame-origin iframe inherits theme variables and reacts to host theme changes. Roboto and its license are bundled. Explicit light/dark overrides and standalone fallback are supported. Cross-origin inheritance is unavailable by browser design.
HA sidebar integrationFive host-fixture checks and live 2.16.0 panel check passThe actual native HA panel hid the HA sidebar and the Home Assistant button revealed it. Fixture checks cover desktop/mobile recovery, restoring the prior temporary state and preexisting kiosk state. Saved sidebar preferences are unchanged; unsupported embeddings retain normal navigation. See HA_SIDEBAR.md.
All advanced pages in one workspaceImplemented; live 2.16.1 navigation verifiedOne Irrigation plan entry opens Today and Schedule with shared room context and draft protection. Today edits current targets when no schedule owns the room; an active schedule shows effective read-only targets and its graph, with manual fallback fields hidden. Old #/strategy and #/grow-plan bookmarks remain valid. Native-panel Today and Schedule navigation was verified after installation.
Combined recorded VWC + EC historyImplemented; browser testedIndependent axes/units, zone selection, HA Recorder data and honest missing-history states. Sensor history requires Recorder retention.
Today: current targets and daily graphUnit/browser checks and live 2.16.1 navigation passWhen no schedule owns the room, numeric edits and draggable targets share one local draft with the saved reference visible. Active schedules show their effective targets and read-only graph, hiding fallback manual inputs. Missing/stale required snapshots remain unavailable. Existing bounds, mode mapping, room/zone scope and draft/readback protections remain.
Today graph: recorded zone and projected dayUnit and compiled browser tests pass; seen in the live panel on 2.17.1The draggable Today graph draws the zone's recorded VWC (this grow-day and the previous one) and pore EC under the targets, with now, peak and trough, on an axis scaled to the readings. P0 dry-on, one P1 riser per shot, the P2 sawtooth and the P3 overnight dry-down are projected from the zone's measured dry-down rate, or a stated nominal rate until it has history. When few or no P2 shots project, the graph says why and names the threshold that gives them. It is a projection, not a schedule or a forecast of plant response. The installed file was verified byte-identical to the release; rendering in the live panel was seen by the operator, not by an automated check.
Room on / offUnit and controller tests pass; verified live on 2.17.1 / 0.14.0switch.crop_steering_<prefix>room_active off stops all irrigation for that room, including emergency shots and the no-probe fallback, raises no alerts and clears its repair issues. Live on 20 September an empty room was switched off: the controller reported room_off, every zone read "Room off", and its heartbeat carried room_active: false. Switching back on starts a clean cycle in order and keeps water history (tested; not yet exercised live).
P1 runs its full rampEngine and controller tests pass; not yet observed through a live lights-onP1 no longer ends on a clock. It ends when the target is recovered after at least p1_minimum_shots, or at p1_maximum_shots. Deployed live after that day's ramp had passed, so the first live ramp under this rule is still to be observed.
Auto SetpointsUnit, runtime and engine-twin tests pass; learning runs live, writing is not enabled liveOff by default. The learner (ceiling, gain, dry-down) always runs and is published per zone. With the room's switch on it rewrites only that zone's own target numbers in bounded steps, never while a dated plan owns the room. The optional Cloudflare typesafe/jev check is consulted on a plateau and once an hour in P2 (bounded nudges to P2 shot size and the working peak); irrigation never waits on it. No live setpoint has been written by it.
Restart-safe setup10 regression tests; verified live on 0.14.0The accepted setup revision is saved with a fingerprint. Live on 20 September the controller was restarted with the engine flag left on and logged "setup revision 4 resumed after restart", then fired its next shot. A newer revision, a changed hardware map under the same number, or a missing or malformed record still needs the engine switched off to accept it, and now says so with a notification. The first start after updating from 0.13.x needs that off-and-on once.
Patient switch read-backRegression tests; four consecutive live shots closed without a false holdAfter a shot the controller reads pump, mainline and valve at 1 s, then every 0.5 s up to 6 s. A Zigbee plug that reported off after 1.6 s had latched false hardware holds on the fixed 1 s read. A pump that never reports off still latches, within a bounded time (tested, not provoked live).
Run comparison with daily target overlaysImplemented; browser, unit and metadata-service testedDay/week/month/run-to-date/custom Recorder ranges; previous run aligned to grow age; repeated full-day target references clipped at now. Stored references are timestamped, not a historical setpoint audit. Retention gaps, stale carry-in, daylight saving, request cancellation and room scope are covered.
Reactive combined planning curve221 frontend tests and 56 browser workflow groups passToday and Schedule connect VWC/EC references through lights-off and overnight to the next lights-on. Dashed EC interpolates configured phase anchors; it is not a predicted physical EC or salt trajectory. VWC dryback and the separate P3 emergency floor remain explicit. Missing values stay gaps.
Continuous vegetative/generative steeringImplemented; both legacy modes testedExplicit endpoint profiles interpolate and quantize against HA parameter bounds/steps; canonical scheduled dryback/EC overrides work regardless of the old mode select. Endpoints need grower review.
Different setpoints per zoneLive preservation verifiedThe 2.14.0 upgrade retained all 303 captured numeric settings and 397 total captured controls after engine-state restoration. Room/zone sizing and mappings are preserved. See the visible-steering audit.
Whole-grow day/week scheduleImplemented; browser and unit testedDays1–366, independent zone start dates, inclusive range splitting, weekly overview, daily exceptions, import/export and explicit plan-zone synchronization after setup changes.
User-authored recipe libraryUnit and compiled browser tests passProduction libraries start empty; named plan copies remain separate by room and demo/live mode. Loading is a local draft operation with zone/date protection and existing validation/review. Import bounds, storage corruption and HTTP LAN UUIDs are covered. No source-guide numerical presets are included. See library and references.
Persistent plans and safe activationImplemented; fake-HA tests and independent reviewDraft storage, revision conflicts, preview, explicit arming, next lights-on activation/disarm, coherent expiring snapshots and durable required-plan holds. Live draft reads and controller capability are verified. Recipe activation and a full lights-on handoff remain uncommissioned.
Room and zone creation/removalImplemented; flow/API/browser testedRemoval archives stable IDs; restoration preserves identifiers. No automatic renumbering or reuse. Engines and implicated equipment must be readable OFF for mapping mutations.
Sensor mappingImplemented; locally testedSearch existing HA entities by name/ID and inspect readings/units; multi-probe VWC/EC selection. Backend validates domains, units and conflicting valve roles. Device pairing/firmware provisioning is external.
Installation shortcuts and sidebarLive in-place upgrade verifiedHACS download, Supervisor app update, HA restart, both room entries loading and the automatic native sidebar passed. First installation on a blank HA instance remains untested.
Water per zone, plant and proposed runtimeImplemented; unit/browser/controller testedTotal zone litres, average mL per plant and substrate capacity are distinct. Runtime and phase estimates include engine bounds, duration caps, minimum time and truncation; P1 budgets remain conditional. New counters freeze configured flow per shot and use elapsed runtime, including partial aborts. Old totals are preserved. Missing producer data remains unknown.
Catch-test calculatorImplemented; unit/browser testedCatch-test output is a local proposal; no automatic calibration write or proof of flow.
Graphical tank and pump overviewUnit/browser tests and live 2.16.0 panel verificationExplicit per-room mappings were saved and adopted. The recorded F2 panel showed tank 42%, EC 3.06 mS/cm, pH 5.66 and temperature 17.9 °C, plus an explicit recorded-fill time. These dated values are not current readings. Unknown stays distinct from off/empty; a displayed percentage or fill record does not prove physical filling.
Zone current state and last irrigationUnit/browser tests and live 2.16.0 verificationController status, exact mapped valve state, scheduling phase and timezone-aware last-irrigation events were displayed. Missing/invalid events remain Not reported; sensor update times are not substituted. Switch reports do not prove physical flow.
Sensor diagnostics and equipment mapImplemented; browser testedMeasured values, freshness/coverage and configured devices; no unsupported yield/potency score.
Reviewed manual setpoint writesImplemented; mocked-HA browser testedSelected-room bounds, steps and readback remain enforced; partial failures retain drafts. The Today view hides fallback manual inputs while a schedule owns the room and shows effective read-only targets. Dated changes belong in Schedule.
Source-water/interlock/volume/duration gatesImplemented; controller regressionsIncludes request-latency duration accounting, blind-path caps, shared-hardware fault latch and recovery. Physical valve/pump behavior remains unverified.
Missing or invalid ECImplemented; controller/core regressionsUnscaled base VWC watering, suspended EC learning/offset application and degraded status. Salt protection is unverified until EC returns. Configured feed-water gates still apply.
Sensor fusionImplemented; arithmetic meanFinite readings are averaged. No automatic outlier rejection or probe weighting is claimed.
Timed manual overrideImplemented; lifecycle/service testsPer-room/zone deadline expires and survives graceful restart/reload. Retrigger/direct switch changes cancel obsolete callbacks. Noncanonical entity IDs are rejected because the controller consumes canonical IDs. Abrupt power-loss persistence follows HA RestoreEntity checkpoints.
Weekly water usageImplemented; migration/rollover testsSeven grow-day controller delivery estimates, including partial aborts; old/missing history is marked incomplete. External irrigation and measured flow are not included.
Activity view and CSV exportImplemented with evidence limitsExports available controller/state information. This is not a complete immutable history of all physical irrigation events.
Legacy manual-shot/phase-override eventsNot validated as actuator commandsExisting services can publish events; this controller is not proven to consume those events. The new UI does not claim these are working physical controls.
Tank dosing and climate actuationNot implemented by this controllerEC values are root-zone references, not tank dosing commands. Environment controls remain external HA workflows.
Yield/potency prediction or autonomous crop optimisationNot implementedRemoved misleading claims from the active UI. Neither setpoints nor a schematic establish expected yield.
Live deployment2.17.1 / controller 0.14.0 installed and verifiedOn 20 September 2026 all 29 integration files on the installation were verified byte-identical to the 2.17.1 commit, controller 0.14.0 was installed from the published add-on repository, and the installed dashboard matched the public demo. Room off, restart-safe setup and the patient read-back were exercised live as described in their rows; the controller add-on was set to start on boot with its watchdog on. Earlier evidence still stands: both room tank mappings completed MCP preview/apply/readback at setup revision 1, and the real F2 tank panel, recorded-fill source, timezone-aware irrigation events, HA sidebar/menu recovery and Today/Schedule navigation were verified on 2.16.x. Physical water delivery and full recipe-boundary commissioning remain outside these software checks.

Improvements that are now practical#

  • Plan every zone across the grow without rewriting daily setpoints by hand.
  • See what a steering change means before saving, including actual hydraulic assumptions.
  • Use one curve for planning and a separate combined history for measured behavior.
  • Keep room/zone identities stable as a facility changes.
  • Detect unsupported/stale control snapshots and setup adoption gaps instead of displaying false success.
  • Check dripper output locally and review the proposed correction before changing configuration.

Valuable next additions#

Measured-flow reconciliation is the strongest next step: compare commanded litres with independent water-meter deltas and identify blocked/leaking lines. Next, align recorded shot events with VWC/EC history, then quantify planned versus observed dryback over repeated days beyond the available visual comparisons. Reliable measurements would support proposal-only recipe adjustments and cultivar-specific profiles. Those features require clean real observations and have not been claimed as implemented here.

Evidence#

Reproduce the checks using TESTING.md. Machine-readable browser results and screenshots are generated in the ignored output/playwright folder. The archive retains older reports as dated historical evidence.