Skip to content

Releases: Pioreactor/pioreactor

26.2.15rc0

16 Feb 01:40

Choose a tag to compare

26.2.15rc0 Pre-release
Pre-release

Upcoming

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 /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).

Enhancements

  • Added pios jobs list and pios jobs list running to inspect worker job history and running jobs from the leader CLI.
  • 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 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.

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.

26.2.3

03 Feb 19:57

Choose a tag to compare

26.2.3

Enhancements

  • removed System tab from the Pioreactor's "Control" dialog. You can see (most) of this data on the Inventory page
  • added a Self-test tab back to the Pioreactor's "Control" dialog, and to the "Control all Pioreactors"
  • added pio status for a quick local health summary (identity, versions, MQTT, web API, Huey, jobs, storage)
  • improved pio db, pio cache, and pio log help output with clearer descriptions and examples
  • improved pio workers status to use unit API health checks for reachability and provide brief reasons when state/version are unknown
  • improved pios help output with clearer descriptions and examples for cluster actions
  • removed the redundant --job flag from pios kill (use --job-name)

Bug fixes

  • reused cached IR LED reference normalization per experiment when ref_normalization=unity, instead of always taking the first reading
  • improved unit API retry safety by returning in-progress responses when Huey task locks are held
  • improved API error messages with structured causes and remediation hints for agents and UI clients
  • fixed pio run command resolution to load plugins before looking up job commands

26.1.30

30 Jan 16:55

Choose a tag to compare

26.1.30

Highlights

  • Run calibrations from the UI.
  • New Protocols page with guided calibration sessions, step-by-step instructions, and live charts.

Enhancements

  • Support for Pioreactor XR.
  • Faster Stop commands in the UI, plugin listing, and data exports.
  • Added dosing start/stop events to dosing_automation_events, including exports.
  • Added unit-relative IR LED reference normalization for OD readings via ref_normalization=unity. This should align different Pioreactors to similar starting values, especially v1.5 models. However, this changes OD levels, so existing OD calibrations are not adjusted automatically.
  • New query pattern for faster Experiment Overview chart loading; large datasets may show randomized sampling in time series. Let us know if this is too distracting. Max point targets per series increased to 1400.
  • OD calibrations now support multiple photodiode angles; pio calibrations run --device od can emit per-angle calibrations for 45/90/135.
    • Added an update helper to migrate legacy OD calibrations into per-angle devices.
  • Calibration protocols are now exposed via API.
  • When a Pioreactor model is changed, a (non-blocking) hardware check is performed.
  • You can now restart the web server (lighttpd) and the background task queue, Huey, from the UI. Go to Leader -> "Long-running jobs", and see the "web server and queue" line.
  • Added spline and akima curve support for calibrations, including OD standards sessions and calibration charts.
  • pio calibrations analyze now supports --fit poly|spline|akima. You can use this to refit a dataset to a spline or akima curve.
  • Added estimator artifacts alongside calibrations, including OD fusion estimators stored under storage/estimators and managed via the calibration session flow. Estimators are a generalized calibration for more complex algorithms. Calibrations will be restricted to 1D models.
  • New unit APIs for estimators:
    • /unit_api/estimators/<device>
    • /unit_api/estimators/<device>/<estimator_name>
  • Faster startup and shutdown of Pioreactor jobs.
  • Charts on Experiment Overview now scale with window size.
  • New Estimators page in the UI.

Breaking changes

  • Moved Self-test to the Inventory page. Pioreactors no longer need to be assigned to an experiment to run self-test.
  • Removed /api/workers/<pioreactor_unit>/configuration; use /api/units/<pioreactor_unit>/configuration.
  • Self-test logs are now part of $experiment.
  • Calibration flow modules were merged into protocol modules; old import paths like pioreactor.calibrations.pump_calibration and pioreactor.calibrations.od_calibration_* are removed.
  • Removed experimental pump-detection failure handling from chemostat and turbidostat.
  • OD calibration devices are now per-angle (od45, od90, od135) instead of just od. Physically, this changes the calibration directory in ~/.pioreactor/storage/calibrations/od to ~/.pioreactor/storage/calibrations/{od45,od90,od135}. Existing od calibration files and active calibrations are migrated during the update.
  • Self-test no longer creates a stirring calibration.
  • OD reading charts in the UI previously had a sensor label next to the unit, ex: worker01-2. Now it is the corresponding angle from config.ini. Note: only the global config.ini is used, not specific unit_config.ini files.
  • New OD and stirring calibrations are now fit with a akima, and not a polynomial.
  • Calibration curve data is now serialized as tagged structs (poly/spline/akima) instead of raw lists. curve_type is removed and existing calibration files are migrated during the update.
  • Reorganized calibration protocol modules into core/pioreactor/calibrations/protocols/ and extracted a registry.py for protocol registration.
  • Removed OD calibration using a single vial.

Bug fixes

  • Fix self-test logging closing prematurely.
  • Fix floating point error at the boundary of OD calibrations.
  • Fix runtime forward-reference errors in type annotations after dropping __future__ imports.
  • Fix timeouts being too short on some UI export operations.
  • Re-save calibration files on pio calibrations analyze confirmation even when the curve is unchanged.
  • UI now logs all warnings and errors, including from the web backend.
  • Fix Mosquitto's pw.txt file.

26.1.29rc0

29 Jan 17:48

Choose a tag to compare

26.1.29rc0 Pre-release
Pre-release

Highlights

  • Run calibrations from the UI.
  • New Protocols page with guided calibration sessions, step-by-step instructions, and live charts.

Enhancements

  • Support for Pioreactor XR.
  • Faster Stop commands in the UI, plugin listing, and data exports.
  • Added dosing start/stop events to dosing_automation_events, including exports.
  • Added unit-relative IR LED reference normalization for OD readings via ref_normalization=unity. This should align different Pioreactors to similar starting values, especially v1.5 models. However, this changes OD levels, so existing OD calibrations are not adjusted automatically.
  • New query pattern for faster Experiment Overview chart loading; large datasets may show randomized sampling in time series. Let us know if this is too distracting. Max point targets per series increased to 1400.
  • OD calibrations now support multiple photodiode angles; pio calibrations run --device od can emit per-angle calibrations for 45/90/135.
    • Added an update helper to migrate legacy OD calibrations into per-angle devices.
  • Calibration protocols are now exposed via API.
  • When a Pioreactor model is changed, a (non-blocking) hardware check is performed.
  • You can now restart the web server (lighttpd) and the background task queue, Huey, from the UI. Go to Leader -> "Long-running jobs", and see the "web server and queue" line.
  • Added spline and akima curve support for calibrations, including OD standards sessions and calibration charts.
  • pio calibrations analyze now supports --fit poly|spline|akima. You can use this to refit a dataset to a spline or akima curve.
  • Added estimator artifacts alongside calibrations, including OD fusion estimators stored under storage/estimators and managed via the calibration session flow. Estimators are a generalized calibration for more complex algorithms. Calibrations will be restricted to 1D models.
  • New unit APIs for estimators:
    • /unit_api/estimators/<device>
    • /unit_api/estimators/<device>/<estimator_name>
  • Faster startup and shutdown of Pioreactor jobs.
  • Charts on Experiment Overview now scale with window size.
  • New Estimators page in the UI.

Breaking changes

  • Moved Self-test to the Inventory page. Pioreactors no longer need to be assigned to an experiment to run self-test.
  • Removed /api/workers/<pioreactor_unit>/configuration; use /api/units/<pioreactor_unit>/configuration.
  • Self-test logs are now part of $experiment.
  • Calibration flow modules were merged into protocol modules; old import paths like pioreactor.calibrations.pump_calibration and pioreactor.calibrations.od_calibration_* are removed.
  • Removed experimental pump-detection failure handling from chemostat and turbidostat.
  • OD calibration devices are now per-angle (od45, od90, od135) instead of just od. Physically, this changes the calibration directory in ~/.pioreactor/storage/calibrations/od to ~/.pioreactor/storage/calibrations/{od45,od90,od135}. Existing od calibration files and active calibrations are migrated during the update.
  • Self-test no longer creates a stirring calibration.
  • OD reading charts in the UI previously had a sensor label next to the unit, ex: worker01-2. Now it is the corresponding angle from config.ini. Note: only the global config.ini is used, not specific unit_config.ini files.
  • New OD and stirring calibrations are now fit with a akima, and not a polynomial.
  • Calibration curve data is now serialized as tagged structs (poly/spline/akima) instead of raw lists. curve_type is removed and existing calibration files are migrated during the update.
  • Reorganized calibration protocol modules into core/pioreactor/calibrations/protocols/ and extracted a registry.py for protocol registration.
  • Removed OD calibration using a single vial.

Bug fixes

  • Fix self-test logging closing prematurely.
  • Fix floating point error at the boundary of OD calibrations.
  • Fix runtime forward-reference errors in type annotations after dropping __future__ imports.
  • Fix timeouts being too short on some UI export operations.
  • Re-save calibration files on pio calibrations analyze confirmation even when the curve is unchanged.
  • UI now logs all warnings and errors, including from the web backend.
  • Fix Mosquitto's pw.txt file.

26.1.26rc0

26 Jan 18:12

Choose a tag to compare

26.1.26rc0 Pre-release
Pre-release

Upcoming

Highlights

  • Run calibrations from the UI.
  • New Protocols page with guided calibration sessions, including step-by-step instructions and live charts.

Enhancements

  • Support for Pioreactor XR.
  • Faster Stop commands in the UI, plugin listing, and data exports.
  • Added dosing start/stop events to dosing_automation_events, including exports.
  • Added unit-relative IR LED reference normalization for OD readings via ref_normalization=unity. This should significantly align different Pioreactors to the same starting values, especially v1.5 models. However, this does change the OD readings levels, so if you have an OD calibration, this isn't applied to you automatically.
  • New query pattern for faster Experiment Overview chart loading; large datasets may show randomized sampling in time series. Let us know if this is too distracting. Max point targets per series increased to 1400.
  • OD calibrations now support multiple photodiode angles; pio calibrations run --device od can emit per-angle calibrations for 45/90/135.
    • Added an update helper to migrate legacy OD calibrations into per-angle devices.
  • Calibration protocols are now exposed via API.
  • When a Pioreactor model is changed, a (non-blocking) hardware check is performed.
  • You can now restart the web server (lighttpd), and the background task queue, Huey, from the UI. Go to Leader -> "Long-running jobs", and see the "web server and queue" line.
  • Added spline curve support for calibrations, including OD standards sessions and calibration charts.
  • pio calibrations analyze now supports --fit poly|spline (default poly). You can use this to re-fit a dataset to a spline curve.
  • Added estimator artifacts alongside calibrations, including OD fusion estimators stored under storage/estimators and managed via the calibration session flow.
  • Faster start up and shutdown of pioreactor jobs.

Breaking changes

  • Moved Self-test to the Inventory page. Pioreactors no longer need to be assigned to an experiment to run self-test.
  • Removed /api/workers/<pioreactor_unit>/configuration; use /api/units/<pioreactor_unit>/configuration.
  • Self-test logs are now part of $experiment.
  • Calibration flow modules were merged into protocol modules; old import paths like pioreactor.calibrations.pump_calibration and pioreactor.calibrations.od_calibration_* are removed.
  • Removed experimental pump-detection failure handling from chemostat and turbidostat.
  • OD calibration devices are now per-angle (od45, od90, od135) instead of just od. Physically, this changes the calibration directory in ~/.pioreactor/storage/calibrations/od to ~/.pioreactor/storage/calibrations/{od45,od90,od135}. Existing od calibration files and active calibrations are migrated during the update.
  • Self-test no longer creates a stirring calibration.
  • OD Reading charts in the UI previously had a sensor label next to the unit, ex: worker01-2. Now it is the corresponding angle from config.ini. Note: only the global config.ini is used, not specific unit_config.inis.
  • New OD and stirring calibrations are now fit with a spline, and not a polynomial.
  • Calibration curve data is now serialized as tagged structs (poly/spline) instead of raw lists. curve_type is removed and existing calibration files are migrated during the update.
  • Reorganized calibration protocol modules into core/pioreactor/calibrations/protocols/ and extracted a registry.py for protocol registration.

Bug fixes

  • Fix self-test logging closing prematurely.
  • Fix floating point error at the boundary of OD calibrations.
  • Fix runtime forward-reference errors in type annotations after dropping __future__ imports.
  • Fix timeouts being too short on some UI export operations
  • Re-save calibration files on pio calibrations analyze confirmation even when the curve is unchanged.
  • UI now logs all warning and errors, including from the web backend.
  • fix Mosquitto's pw.txt file

26.1.16rc0

16 Jan 20:45

Choose a tag to compare

26.1.16rc0 Pre-release
Pre-release
bump rc version

26.1.15rc2

16 Jan 01:27

Choose a tag to compare

26.1.15rc2 Pre-release
Pre-release
bump rc version

26.1.15rc1

16 Jan 01:03

Choose a tag to compare

26.1.15rc1 Pre-release
Pre-release
bump rc version

26.1.15rc0

15 Jan 18:52

Choose a tag to compare

26.1.15rc0 Pre-release
Pre-release
bump rc version

26.1.14rc0

14 Jan 23:41

Choose a tag to compare

26.1.14rc0 Pre-release
Pre-release

Upcoming

Highlights

  • Run calibrations from the UI.
  • New Protocols page with guided calibration sessions, including step-by-step instructions and live charts.

Enhancements

  • Support for Pioreactor XR.
  • Support for the optics calibration jig.
  • Faster Stop commands in the UI, plugin listing, and data exports.
  • Added dosing start/stop events to dosing_automation_events, including exports.
  • New query pattern for faster Experiment Overview chart loading; large datasets may show randomized sampling in time series. Let us know if this is too distracting. Max point targets per series increased to 1400.
  • OD calibrations now support multiple photodiode angles; pio calibrations run --device od can emit per-angle calibrations for 45/90/135.
    • Added an update helper to migrate legacy OD calibrations into per-angle devices.
  • Reorganized calibration protocol modules into core/pioreactor/calibrations/protocols/ and extracted a registry.py for protocol registration.
  • Calibration protocols are now exposed via API for the UI and CLI, with session IDs that can be advanced or aborted.
  • Self-test results now surface per-check pass/fail status in the Inventory page and support retrying failed checks.
  • Removed redundant from __future__ import annotations usage now that we run on Python 3.13.

Breaking changes

  • Moved Self-test to the Inventory page. Pioreactors no longer need to be assigned to an experiment to run self-test.
  • Removed /api/workers/<pioreactor_unit>/configuration; use /api/units/<pioreactor_unit>/configuration.
  • Self-test logs are now part of $experiment.
  • Calibration flow modules were merged into protocol modules; old import paths like pioreactor.calibrations.pump_calibration and pioreactor.calibrations.od_calibration_* are removed.
  • Removed experimental pump-detection failure handling from chemostat and turbidostat.
  • OD calibration devices are now per-angle (od45, od90, od135) instead of just od. Physically, this changes the calibration directory in ~/.pioreactor/storage/calibrations/od to ~/.pioreactor/storage/calibrations/{od45,od90,od135}. Existing od calibration files and active calibrations are migrated during the update.
  • Self-test no longer creates a stirring calibration.

Bug fixes

  • Fix self-test logging closing prematurely.
  • Fix floating point error at the boundary of OD calibrations.
  • Fix runtime forward-reference errors in type annotations after dropping __future__ imports.
  • Fix timeouts being too short on some UI export operations