main · 9 commits · 0 merged PRs · 1 contributor · 1 open PR in review🔗 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).
Not merged yet, so it isn't live. Open pull request #31 by Tim Riebner, opened 16 October.
LetsGrow is Neurath's own climate computer, the system the grower uses to steer the greenhouse. It records climate, water, lighting and weather-station values. It also records the actuators and their setpoints: heating pipes, vents, screens, lamps and irrigation. Red's own sensors cannot see any of these. The SPoHF relay already serves this data as letsgrow-data. This PR passes it through the same client and sync orchestrator that Blue uses for yookr-data, and writes it into Red's database.
letsgrow-climate-b4), and each column becomes an lg_* sensor. The prefix keeps the names apart from Red's existing MySQL sensors, because Red routes queries by sensor name.lg_col_<id>) and logged.wp6-data-sync-letsgrow CronJob. Loading the history is a one-off full sync going back to at least 1 January 2024 (about 14 million rows).Status: the CI check passed against its base (15 October). main has moved 7 commits since then, but the PR still merges without conflicts. It is waiting for review. Open question: where exactly Neurath's LetsGrow sensors hang has not been confirmed yet, so for now lg_par and lg_temp_greenhouse shouldn't be compared directly with Red's own s2100/s2101 sensors.
The per-height sensors are where Red's predictions are headed, so knowing which wire a reading came from matters.
Three sensor wires are now installed in the greenhouse and behaving as they should. Getting there meant untangling a mix-up: from 13 July to 2 October, upstream's wire sensor map filed wire WS_01_03's climate sensors and its top PAR sensor under WS_01_01, which wasn't up at that time. Over that period Red showed three wires with gaps instead of two complete ones.
96864be feat(red): wires come from upstream's wire_sensor_map — WS_01_01 never existedLast month the models moved to object storage so deploys need no disks. This month the dashboards learned to keep working when that storage, or the database, goes down.
When the educloud storage bucket refused connections, /dli returned an error on every request: the page went back to storage each time and failed. Startup could not recover either, and the nightly refit trained the climate model and then lost it.
205d355 fix(red): keep fitted models in memory when the object store is downEvery climate forecast used to download the trained model chain from storage again, which took about 600 ms per request, and a storage outage made the page fail. The model is now read once per process and kept. A retrain, the nightly refit and startup all update that copy directly. If storage is unreachable before any model has loaded, both climate pages say so instead of crashing.
e648828 feat(red): hold the climate artifact in the process that reads itRestarting the database closed every connection, but the dashboards' connection pool kept the dead ones and handed the next one to a visitor, who got an error. Each connection is now checked before use and quietly replaced if it has died.
1a92043 fix(db): check pooled connections on checkout so a TimescaleDB restart isn't a 500Most noticeable on Blue, whose readings table holds the full datalake history.
On every visit, the home page looked up the latest manual reading per sensor by scanning the whole readings table. A small index of only the manual rows makes this lookup fast. Export information is now cached for a few minutes (including the answer "storage unreachable", so an outage no longer slows every visit). The three home-page lookups now run at the same time and are warmed up at startup.
b52e78c perf(home): index manual readings, cache export metadata, load in parallelThe crop-cycles page showed two back links that both went to the home page. It now has one, the same as every other page.
e88d59b fix(red): one back link on crop-cycles, not twoLess visible, but it keeps the twins observable and makes the pre-push check something people actually run.
wp6_blue_e2e, wp6_red_e2e), which are created automatically on an existing setup../scripts/check.sh runs lint, unit tests and end-to-end tests in one go (about 75 s) and starts the services it needs. It is the same gate CI uses before building the app image.b30c4d5 test(e2e): give the suite its own databases, not the dashboards'd700e36 build(scripts): one gate to run before a push, e2e includedAll three dashboards are now enrolled in the cluster's Dash0 auto-instrumentation. This builds on the OpenTelemetry tracing that shipped in the summer.
727861a feat(helm): opt the dashboards into Dash0 auto-instrumentation