main · 59 commits · 7 merged PRs · 3 contributors🔗 The Open live buttons (↗) deep-link into the deployed dashboards. Blue and Red require a login on first open; Grey is a public demo (no login).
The blueberry farm receives data by hand — trap counts and annual plant measurements — that no automated pipeline collects. This month it became first-class data.
Red's "Sijia" Excel-ingest flow was extracted into a twin-agnostic shared/manual_ingest/ capability: content-addressed file storage, transactional all-or-nothing apply, a shared manual_uploads audit trail, file pruning, and the preview/apply/history UI. Red now runs on it unchanged; Blue gained the whole pipeline it never had.
Onboarding a new manual source is now "write one parser + descriptor and wire it into a twin" — everything else is shared. Blue's insect feed was the second consumer; long_data the third.
Admins upload a trap-counts CSV (total insects + Drosophila suzukii, a primary blueberry pest), see a validation preview (parsed rows, devices, date range, regressions vs. existing data, skipped rows), then apply atomically. Counts then plot on the dashboard like any other sensor, and "last insect upload" freshness shows on the home page.
Annual lab/field measurements (shoot length, Brix, firmness, berry weights, per-plant yield, phenology scores) arrive once a year as Long_Data <year>.xlsx — 2024 (English labels) and 2025 (Dutch labels, finer treatment codes) exist today. Modelled as one device per treatment, harmonising the differing yearly vocabularies, and ingestible per-year without disturbing prior years.
Light in the greenhouse varies sharply with height (the natural-light sensor above the lamps vs. total-light below). A new section makes that vertical structure visible.
A landing hub under /multi_height gathers height-based views as cards — new views slot in by adding one entry. Cumulative DLI charting and a date parameter landed alongside it.
The underlying model switched to wire_sensors — each height on the wire is its own device, supporting multiple wires. Directional reference images of the physical twin were added to the docs.
⚠︎ Note for the meeting: the wire sensors are physically deployed outside for testing (~June 2026), so current values are not representative — risk-threshold tuning is intentionally deferred.
2dbc43c feat(multi-height): switch to wire_sensors, multi-wire per-height devicesf131630 feat(multi-height): add section hub, cumulative DLI chart, and date paramc580f37 docs: add red twin directional images
Faster charts that scale to long date ranges, and richer reading of the data.
Explore was consolidated into 3 source-aware tabs; a hero card and template card were added to the home page; PAR dashboard, dark-theme fixes and stronger, de-duplicated colours landed. These generic platform capabilities are best seen on the public Grey demo (no login needed).
The /status pages now distinguish where data comes from.
Both twins' status pages now split coverage into manual and sensor sources, so a manual upload's freshness reads separately from live sensor feeds. Unmeasured weeks were softened from solid to translucent grey for clarity.
Less visible, but it's what keeps the twins fast and the codebase maintainable.