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.

Hi @CamDavidsonPilon ,

We’ve just updated to 26.2.23. We have a leader-only + workers setup. On our leaders, when we run:

pio version -v

We get:

It looks like pioreactor/core/pioreactor/whoami.py at 754ebad2224a9666ab90b126ecfbcee1a50ab183 · Pioreactor/pioreactor · GitHub assumes that leaders are workers also. Would it be possible to fix in the next update you do please? No rush as it doesn’t seem to impact anything else as far as I can tell yet but thought I’d let you know!

Thanks very much

:+1: ty for reporting this - fixed for the next release!

Thank you! Just one other weird thing I’ve noticed with version 26.3.23. For translating my raw od readings to od readings using the calibration, I’m getting a strange bump in the calibrated od readings even though the raw is the same. This was the case for more than just this pioreactor but using pio22 as an example:



I would expect all the readings to map to 0 given that it’s below the calibration curve. Any ideas? I’ll send over data by email.

Many thanks,

Vicky