Skip to content

Releases: Pioreactor/pioreactor

26.3.3

24 Mar 15:33

Choose a tag to compare

26.3.3

Breaking changes

  • Changed the leader API route for updating per-unit bioreactor values. PATCH /api/workers/<unit>/experiments/<experiment>/bioreactor has been removed; use PATCH /api/workers/<unit>/bioreactor/update/experiments/<experiment> instead.

Bug fixes

  • Fixed reassignment history tracking in the leader web app's SQLite connection by enabling recursive triggers, preventing stale open rows from accumulating in experiment_worker_assignments_history.
  • Added an app-update database migration to repair stale open assignment-history rows in existing leader databases. This was caused by the new "re-assignment" dialog box in the Pioreactor's page. The biggest impact was duplicate logs showing up on the Logs UI page.
  • Fixed worker reassignment so moving a Pioreactor from one experiment to another now stops jobs still running under the previous experiment.
  • Fixed pump dosing_events MQTT publishes for very small dosing volumes, where fast runs could finish before an event was emitted.
  • Fixed missed pump dosing_events observations by publishing them with MQTT QoS 2 (EXACTLY_ONCE), and updated pio mqtt to subscribe at the same QoS when tailing topics.
  • Fixed recent log tables in the UI so live MQTT log events stay sorted by timestamp even if they arrive slightly out of order, instead of appearing under older events until refresh.
  • Fixed experiment profile previews so inline YAML comments like # 1/h, # mL, and timing notes now appear in the human-readable display in the create, edit, and profile preview UIs.

26.3.3rc2

24 Mar 15:14

Choose a tag to compare

26.3.3rc2 Pre-release
Pre-release

Upcoming

Breaking changes

  • Changed the leader API route for updating per-unit bioreactor values. PATCH /api/workers/<unit>/experiments/<experiment>/bioreactor has been removed; use PATCH /api/workers/<unit>/bioreactor/update/experiments/<experiment> instead.

Bug fixes

  • Fixed reassignment history tracking in the leader web app's SQLite connection by enabling recursive triggers, preventing stale open rows from accumulating in experiment_worker_assignments_history.
  • Added an app-update database migration to repair stale open assignment-history rows in existing leader databases. This was caused by the new "re-assignment" dialog box in the Pioreactor's page. The biggest impact was duplicate logs showing up on the Logs UI page.
  • Fixed worker reassignment so moving a Pioreactor from one experiment to another now stops jobs still running under the previous experiment.
  • Fixed pump dosing_events MQTT publishes for very small dosing volumes, where fast runs could finish before an event was emitted.
  • Fixed missed pump dosing_events observations by publishing them with MQTT QoS 2 (EXACTLY_ONCE), and updated pio mqtt to subscribe at the same QoS when tailing topics.
  • Fixed recent log tables in the UI so live MQTT log events stay sorted by timestamp even if they arrive slightly out of order, instead of appearing under older events until refresh.
  • Fixed experiment profile previews so inline YAML comments like # 1/h, # mL, and timing notes now appear in the human-readable display in the create, edit, and profile preview UIs.

26.3.2

19 Mar 01:54

Choose a tag to compare

26.3.2

Bug fixes

  • Adjusted the UI's "Assign Pioreactors" dialog so Select all available no longer includes workers already assigned to another experiment, reducing accidental bulk reassignments while preserving individual reassignment.
  • fixed new images now having the experiment_tags table. New users should reflash their images if having trouble.
  • fixed some UI bugs

26.3.1

16 Mar 17:47

Choose a tag to compare

26.3.1

Bug fixes

  • Fix temperature automation not recognizing Pioreactor 20ml v1.0 correctly
  • Fix bug that was causing /api/bioreactor/descriptors to fail on leader-only units.

26.3.0

12 Mar 18:18

Choose a tag to compare

26.3.0

Going forward, we are changing our versioning scheme from YY.M.D to YY.M.N, where N is a release counter within the month starting at 0.

We expect YY.M.0 releases to carry the larger changes, including system-level updates when needed. Subsequent releases in the same month, such as YY.M.1, YY.M.2, and so on, will typically be smaller bug-fix or incremental releases.

Enhancements

  • Redesigned the Experiments UI page into a management-focused table with search, status/tag filters, tag editing, and quick actions for exporting, ending, or deleting experiments.

  • Added experiment tags to the UI and API: tags can now be created when starting a new experiment, edited later from the Experiments and Overview page, and used to organize/filter experiments.

  • Calibration protocol sessions now persist a tab-scoped resume handle in the UI, so reloading the Protocols page in the same browser tab restores the existing Resume protocol action instead of losing the in-progress session.

  • Added persisted bioreactor state for each experiment, including current_volume_ml, max_working_volume_ml, and alt_media_fraction. These values are now exposed over MQTT plus new API endpoints:

    • GET /api/bioreactor/descriptors
    • GET|PATCH /api/workers/<unit>/experiments/<experiment>/bioreactor
    • GET /unit_api/bioreactor/experiments/<experiment>
  • Added live bioreactor controls to the Pioreactor UI so users can inspect and edit per-unit bioreactor values, with updated vessel diagrams for supported 20 mL and 40 mL models.

  • Added plugin hooks for custom self-tests. Plugins can now register additional checks that run with pio run self_test, for example:

    from pioreactor.actions.self_test import register_self_tests
    
    
    def test_air_bubble_is_running(managed_state, logger, unit, experiment):
        assert ...
    
    
    register_self_tests(test_air_bubble_is_running)

Breaking changes

  • Updated the leader UI's dosing-related chart and job descriptors to read live bioreactor state from bioreactor/current_volume_ml and bioreactor/alt_media_fraction, and to stop exposing the hidden duplicate dosing-automation volume settings. The app update also refreshes the deployed YAML descriptors automatically on leaders.

  • Removed the legacy dosing-automation MQTT settings/topic surface for bioreactor values. current_volume_ml, max_working_volume_ml, and alt_media_fraction are no longer published as dosing_automation settings or exposed as dosing-automation capability flags. Use the retained bioreactor topics and APIs instead:

    pioreactor/<unit>/<experiment>/bioreactor/current_volume_ml
    pioreactor/<unit>/<experiment>/bioreactor/max_working_volume_ml
    pioreactor/<unit>/<experiment>/bioreactor/alt_media_fraction
    

Bug fixes

  • Fixed a UI crash when MQTT button_down events triggered tactile-button notifications.
  • Fix plugins not being loaded correctly in the background task worker. This affected mostly plugin-sourced calibrations.
  • Added a <System> experiment option in Export Data and mapped it to "$experiment" so users can export system logs from the UI.
  • Fixed calibration session resume so reopening a saved protocol session returns to the current step instead of accidentally starting the protocol from the beginning again.
  • Fix leaking of self-test logs into the experiment.

26.3.0rc0

12 Mar 17:19

Choose a tag to compare

26.3.0rc0 Pre-release
Pre-release

Upcoming

Going forward, we are changing our versioning scheme from YY.M.D to YY.M.N, where N is a release counter within the month starting at 0.

We expect YY.M.0 releases to carry the larger changes, including system-level updates when needed. Subsequent releases in the same month, such as YY.M.1, YY.M.2, and so on, will typically be smaller bug-fix or incremental releases.

Enhancements

  • Redesigned the Experiments UI page into a management-focused table with search, status/tag filters, tag editing, and quick actions for exporting, ending, or deleting experiments.

  • Added experiment tags to the UI and API: tags can now be created when starting a new experiment, edited later from the Experiments and Overview page, and used to organize/filter experiments.

  • Calibration protocol sessions now persist a tab-scoped resume handle in the UI, so reloading the Protocols page in the same browser tab restores the existing Resume protocol action instead of losing the in-progress session.

  • Added persisted bioreactor state for each experiment, including current_volume_ml, max_working_volume_ml, and alt_media_fraction. These values are now exposed over MQTT plus new API endpoints:

    • GET /api/bioreactor/descriptors
    • GET|PATCH /api/workers/<unit>/experiments/<experiment>/bioreactor
    • GET /unit_api/bioreactor/experiments/<experiment>
  • Added live bioreactor controls to the Pioreactor UI so users can inspect and edit per-unit bioreactor values, with updated vessel diagrams for supported 20 mL and 40 mL models.

  • Added plugin hooks for custom self-tests. Plugins can now register additional checks that run with pio run self_test, for example:

    from pioreactor.actions.self_test import register_self_tests
    
    
    def test_air_bubble_is_running(managed_state, logger, unit, experiment):
        assert ...
    
    
    register_self_tests(test_air_bubble_is_running)

Breaking changes

  • Updated the leader UI's dosing-related chart and job descriptors to read live bioreactor state from bioreactor/current_volume_ml and bioreactor/alt_media_fraction, and to stop exposing the hidden duplicate dosing-automation volume settings. The app update also refreshes the deployed YAML descriptors automatically on leaders.

  • Removed the legacy dosing-automation MQTT settings/topic surface for bioreactor values. current_volume_ml, max_working_volume_ml, and alt_media_fraction are no longer published as dosing_automation settings or exposed as dosing-automation capability flags. Use the retained bioreactor topics and APIs instead:

    pioreactor/<unit>/<experiment>/bioreactor/current_volume_ml
    pioreactor/<unit>/<experiment>/bioreactor/max_working_volume_ml
    pioreactor/<unit>/<experiment>/bioreactor/alt_media_fraction
    

Bug fixes

  • Fixed a UI crash when MQTT button_down events triggered tactile-button notifications.
  • Fix plugins not being loaded correctly in the background task worker. This affected mostly plugin-sourced calibrations.
  • Added a <System> experiment option in Export Data and mapped it to "$experiment" so users can export system logs from the UI.
  • Fixed calibration session resume so reopening a saved protocol session returns to the current step instead of accidentally starting the protocol from the beginning again.
  • Fix leaking of self-test logs into the experiment.

26.2.26

26 Feb 18:12

Choose a tag to compare

26.2.26

Mostly a bug fix release!

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.

26.2.23

23 Feb 15:19

Choose a tag to compare

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.

26.2.23rc0

23 Feb 14:53

Choose a tag to compare

26.2.23rc0 Pre-release
Pre-release
bump rc version

26.2.19rc0

19 Feb 19:29

Choose a tag to compare

26.2.19rc0 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.
  • 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.