New Pioreactor release: 26.2.23

:wave: this release has some important bug fixes, great UX improvements, and a very important update to the turbidostat automation.

:arrow_down: Download the update here

26.2.23

Enhancements

  • Added pios jobs list and pios jobs list running to inspect worker job history and running jobs from the leader CLI.
  • Added --config-override <section> <param> <value> to pios run to temporarily override config values when launching worker jobs.
  • Added GET /unit_api/jobs for per-unit job history (ordered by newest first), complementing the existing GET /unit_api/jobs/running endpoint.
  • Updated pio cache view to accept an optional key filter: pio cache view <cache> <key> now returns only that key when provided.
  • Added pio update --sha <commit> (and pio update app --sha <commit>) to install from a specific git commit.
  • Added a new calibration coverage matrix page in the UI (linked from Calibrations) to show cluster-wide per-unit/per-device coverage and quick actions: open active calibration details, view available calibrations for a device, or create missing calibrations via /protocols/<unit>/<device>.
  • Added card-level quick controls to both /pioreactors and /pioreactor/<unit>: clicking an activity state now runs contextual actions (start, stop, pause, resume), and shows an in-place spinner until MQTT reports the expected state transition.
  • Added inline quick-edit popovers for card settings values.
  • Improved the UI’s “Assign Pioreactors” dialog: units already assigned to another experiment can now be selected for reassignment, and “Select all” now applies consistently to all listed units.
  • Automation advanced config now discovers and displays both [<x>_automation.config] and per-automation sections like [<x>_automation.<automation_name>], enabling section-specific overrides from the UI.

Breaking changes

  • Changed Turbidostat biomass signal behavior:
    • Default behavior is now biomass_signal=auto, with selection order:
      1. active od_fused estimator
      2. active OD calibration for the configured angle (od)
      3. normalized OD
    • You can still explicitly override biomass_signal in config (including via profiles).
    • Moved config from [turbidostat.config] to [dosing_automation.turbidostat].
    • Update scripts migrate existing values from the legacy section/key when present.
  • Renamed pio cache clear to pio cache purge.
  • Renamed /api/is_local_access_point_active to /api/local_access_point (now returns {active: <bool>}).
  • Consolidated experiment profile routes:
    • Kept /api/experiment_profiles and /api/experiments/<experiment>/experiment_profiles/*.
    • Removed /api/contrib/experiment_profiles and /api/experiment_profiles/running/experiments/<experiment>.
    • PATCH now targets /api/experiment_profiles/<filename>.
  • Consolidated config API routes under /api/config/*:
    • /api/units/<pioreactor_unit>/configuration is now /api/config/units/<pioreactor_unit>.
    • /api/configs + /api/configs/<filename> + /api/configs/<filename>/history are now /api/config/files + /api/config/files/<filename> + /api/config/files/<filename>/history.
  • Removed /api/contrib/* endpoints in favor of resource-scoped routes: /api/automations/descriptors/<automation_type>, /api/jobs/descriptors, /api/charts/descriptors, and /api/datasets/exportable*.
  • Renamed pio jobs remove to pio jobs purge.
  • Replaced pio jobs running with pio jobs list running (list running is now a running-only filter of pio jobs list output).

Bug fixes

  • Fixed usage of the duration_between_led_off_and_od_reading config.
  • OD reading now uses a trimmed-mean + prior smoother on ADS1114-based units (v1.5s), while keeping sinusoidal regression on non-ADS1114 units where AC hum is present. This also skips unnecessary AC frequency detection on ADS1114 channels.
  • Simplified ADS1114 reads in pioreactor.utils.adcs to use continuous conversion mode, replacing per-sample config-write + ready-poll cycles with paced conversion-register reads. This reduces I2C traffic and lowers cross-process bus contention risk on ADS1114-based units.
  • Fixed /api/config/units/$broadcast to correctly merge each unit’s own config_<unit>.ini instead of using a shared (and wrong) config_$broadcast.ini path.
  • Bumped rpi_hardware_pwm to avoid a race condition setting up PWMs.
  • Fixed calibration detail pages so Set active / Set inactive waits for backend task completion before refetching, preventing stale “Set active” and missing “Active” status until manual refresh.
  • Made IR reference-noise gating in OD reading scale with the configured reading interval (baseline std <= 0.01 at 5.0s), including when the interval is changed at runtime.
  • Fixed Inventory model updates and active/inactive toggles to show success only after confirmed backend 2xx responses, with explicit error feedback on failure.
  • Fixed an issue where changing RPM while stirring was paused would restart stirring.
  • self_test now cleans up better when interrupted.
  • CLI change gives plugin-registered commands precedence, enabling intentional overrides to existing pio run commands.
  • Fixed UI bugs on the Configuration page
  • Fixed HAT_PRESENT not being respected in the UI flow.
  • PWMs clean up better, and display a warning if something looks wrong.

How to update

1 Like

Known issues

  • HAT_PRESENT isn’t being applied in jobs started from the UI
  • OD Reading penalizer is always 0
  • If your UI doesn’t look right after updating via pio update app, try rebooting the leader, or try sudo systemctrl restart pioreactor-web.target on the leader.

Small bug fix update: Download here

26.2.26

Bug fixes

  • pio update app now always schedules systemctl restart pioreactor-web.target after a successful default release-asset update, matching other update paths.
  • Actually ship the HAT_PRESENT change from last time
  • OD reading now correctly uses the smoothing penalizer.
  • pio status now handles unassigned experiments and other local check failures gracefully, leaving unassigned experiments blank and avoiding early aborts.
  • fix self-test “Reference photodiode is correct magnitude” for v1.5s
  • Updated the REF-position self-test logic:
    • Previously, it compared normalized variances over a time series.
    • Now, it directly compares stirring ON/OFF deltas from controlled snapshots, aligned with the core idea: stirring should not materially change REF, while SIGNAL channels should respond.