Module M9 - Grow Tracker
File: packages/grow_tracker.yaml
What it does
Tracks the key dates of the current grow cycle and derives the current phase, the number of days spent in that phase, and the expected harvest date - rebuilding the “Grow Tracker” card from the previous dashboard as an actual module rather than a display-only widget.
Inputs you set
input_datetime.grow_tracker_seedling_startinput_datetime.grow_tracker_vegetation_startinput_datetime.grow_tracker_flower_startinput_datetime.grow_tracker_drying_start(optional - only needed once you start drying)input_number.grow_tracker_expected_flower_days(default 60)input_boolean.grow_tracker_harvest_done(flip on once you have harvested)
Derived values
sensor.grow_tracker_phase: one ofNot started,Seedling,Vegetative,Flowering,Drying,Harvested- computed from today’s date against whichever milestone dates you have set (the most advanced phase whose start date has passed wins).sensor.grow_tracker_day_in_phase: how many days you have been in the current phase.sensor.grow_tracker_flower_day: days since flower start specifically (matches the “Flower Tag X” counter from the previous dashboard).sensor.grow_tracker_expected_harvest_date: flower start date +grow_tracker_expected_flower_days.
Grow cycle ID
input_text.grow_tracker_cycle_id is auto-filled (via
automation.grow_tracker_autofill_cycle_id) from the seedling start date the
first time you set it, if you have not already named the cycle yourself.
Editing it stays on Dashboard 1 only (see
dashboard-1-configuration.md); multi-grow management itself (Phase 10)
still isn’t built - this field exists from the start so existing history
already has a grow_cycle_id to group by once that feature is built.
Displayed read-only on the Overview (2026-08-28). sensor. grow_tracker_cycle_name is a trivial read-only mirror of input_text. grow_tracker_cycle_id (“Not set” if empty), added specifically so
Dashboard 2’s Overview can show “the name of the current running batch”
without exposing a second editable copy of the field there - editing the
real input_text stays exclusively on Dashboard 1, per the earlier
Overview redesign’s “editing happens in exactly one place” decision.
Reset / Save buttons (2026-08-28, Dashboard 1 only).
script.grow_tracker_save_cycle_id and script.grow_tracker_reset_cycle_id
back two buttons on Dashboard 1’s Grow Tracker card. Home Assistant’s
input_text already commits whatever you type the instant you tab away
or press Enter - there is no separate “unsaved” state to actually save -
so “Save” is a deliberate, visible confirmation: it posts a persistent
notification echoing the current value back (“Grow Cycle ID saved:
”…"", or a nothing-to-save note if the field is empty), giving you a
concrete “yes, that’s what’s stored” moment instead of relying on the
implicit tab-away commit. “Reset” clears the field back to empty and
posts its own confirmation notification; clearing it also re-arms
automation.grow_tracker_autofill_cycle_id (which only fires while the
field is empty), so the next Seedling / Cutting Start date you set
regenerates a fresh default ID automatically, same as it would on a
brand new deploy.