Releases: Pioreactor/pioreactor
26.3.3
26.3.3
Breaking changes
- Changed the leader API route for updating per-unit bioreactor values.
PATCH /api/workers/<unit>/experiments/<experiment>/bioreactorhas been removed; usePATCH /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_eventsMQTT publishes for very small dosing volumes, where fast runs could finish before an event was emitted. - Fixed missed pump
dosing_eventsobservations by publishing them with MQTT QoS 2 (EXACTLY_ONCE), and updatedpio mqttto 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
Upcoming
Breaking changes
- Changed the leader API route for updating per-unit bioreactor values.
PATCH /api/workers/<unit>/experiments/<experiment>/bioreactorhas been removed; usePATCH /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_eventsMQTT publishes for very small dosing volumes, where fast runs could finish before an event was emitted. - Fixed missed pump
dosing_eventsobservations by publishing them with MQTT QoS 2 (EXACTLY_ONCE), and updatedpio mqttto 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
26.3.2
Bug fixes
- Adjusted the UI's "Assign Pioreactors" dialog so
Select all availableno longer includes workers already assigned to another experiment, reducing accidental bulk reassignments while preserving individual reassignment. - fixed new images now having the
experiment_tagstable. New users should reflash their images if having trouble. - fixed some UI bugs
26.3.1
26.3.1
Bug fixes
- Fix temperature automation not recognizing Pioreactor 20ml v1.0 correctly
- Fix bug that was causing
/api/bioreactor/descriptorsto fail on leader-only units.
26.3.0
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 protocolaction instead of losing the in-progress session. -
Added persisted bioreactor state for each experiment, including
current_volume_ml,max_working_volume_ml, andalt_media_fraction. These values are now exposed over MQTT plus new API endpoints:GET /api/bioreactor/descriptorsGET|PATCH /api/workers/<unit>/experiments/<experiment>/bioreactorGET /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_mlandbioreactor/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, andalt_media_fractionare no longer published asdosing_automationsettings or exposed as dosing-automation capability flags. Use the retainedbioreactortopics 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_downevents 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
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 protocolaction instead of losing the in-progress session. -
Added persisted bioreactor state for each experiment, including
current_volume_ml,max_working_volume_ml, andalt_media_fraction. These values are now exposed over MQTT plus new API endpoints:GET /api/bioreactor/descriptorsGET|PATCH /api/workers/<unit>/experiments/<experiment>/bioreactorGET /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_mlandbioreactor/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, andalt_media_fractionare no longer published asdosing_automationsettings or exposed as dosing-automation capability flags. Use the retainedbioreactortopics 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_downevents 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.2.26
Mostly a bug fix release!
Bug fixes
pio update appnow always schedulessystemctl restart pioreactor-web.targetafter a successful default release-asset update, matching other update paths.- Actually ship the
HAT_PRESENTchange from last time - OD reading now correctly uses the smoothing penalizer.
pio statusnow 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
26.2.23
Enhancements
- Added
pios jobs listandpios jobs list runningto inspect worker job history and running jobs from the leader CLI. - Added
--config-override <section> <param> <value>topios runto temporarily override config values when launching worker jobs. - Added
GET /unit_api/jobsfor per-unit job history (ordered by newest first), complementing the existingGET /unit_api/jobs/runningendpoint. - Updated
pio cache viewto accept an optional key filter:pio cache view <cache> <key>now returns only that key when provided. - Added
pio update --sha <commit>(andpio 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
/pioreactorsand/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:- active
od_fusedestimator - active OD calibration for the configured angle (
od) - normalized OD
- active
- You can still explicitly override
biomass_signalin 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.
- Default behavior is now
- Renamed
pio cache cleartopio cache purge. - Renamed
/api/is_local_access_point_activeto/api/local_access_point(now returns{active: <bool>}). - Consolidated experiment profile routes:
- Kept
/api/experiment_profilesand/api/experiments/<experiment>/experiment_profiles/*. - Removed
/api/contrib/experiment_profilesand/api/experiment_profiles/running/experiments/<experiment>. PATCHnow targets/api/experiment_profiles/<filename>.
- Kept
- Consolidated config API routes under
/api/config/*:/api/units/<pioreactor_unit>/configurationis now/api/config/units/<pioreactor_unit>./api/configs+/api/configs/<filename>+/api/configs/<filename>/historyare 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 removetopio jobs purge. - Replaced
pio jobs runningwithpio jobs list running(list runningis now a running-only filter ofpio jobs listoutput).
Bug fixes
- Fixed usage of the
duration_between_led_off_and_od_readingconfig. - 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.adcsto 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/$broadcastto correctly merge each unit's ownconfig_<unit>.iniinstead of using a shared (and wrong)config_$broadcast.inipath. - Bumped rpi_hardware_pwm to avoid a race condition setting up PWMs.
- Fixed calibration detail pages so
Set active/Set inactivewaits 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.01at5.0s), including when the interval is changed at runtime. - Fixed Inventory model updates and active/inactive toggles to show success only after confirmed backend
2xxresponses, with explicit error feedback on failure. - Fixed an issue where changing RPM while stirring was paused would restart stirring.
self_testnow cleans up better when interrupted.- CLI change gives plugin-registered commands precedence, enabling intentional overrides to existing
pio runcommands. - Fixed UI bugs on the Configuration page
- Fixed
HAT_PRESENTnot being respected in the UI flow. - PWMs clean up better, and display a warning if something looks wrong.
26.2.23rc0
bump rc version
26.2.19rc0
Upcoming
Breaking changes
- Changed Turbidostat biomass signal behavior:
- Default behavior is now
biomass_signal=auto, with selection order:- active
od_fusedestimator - active OD calibration for the configured angle (
od) - normalized OD
- active
- You can still explicitly override
biomass_signalin 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.
- Default behavior is now
- Renamed
/api/is_local_access_point_activeto/api/local_access_point(now returns{active: <bool>}). - Consolidated experiment profile routes:
- Kept
/api/experiment_profilesand/api/experiments/<experiment>/experiment_profiles/*. - Removed
/api/contrib/experiment_profilesand/api/experiment_profiles/running/experiments/<experiment>. PATCHnow targets/api/experiment_profiles/<filename>.
- Kept
- Consolidated config API routes under
/api/config/*:/api/units/<pioreactor_unit>/configurationis now/api/config/units/<pioreactor_unit>./api/configs+/api/configs/<filename>+/api/configs/<filename>/historyare 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 removetopio jobs purge. - Replaced
pio jobs runningwithpio jobs list running(list runningis now a running-only filter ofpio jobs listoutput).
Enhancements
- Added
pios jobs listandpios jobs list runningto inspect worker job history and running jobs from the leader CLI. - Added
GET /unit_api/jobsfor per-unit job history (ordered by newest first), complementing the existingGET /unit_api/jobs/runningendpoint. - Updated
pio cache viewto 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
/pioreactorsand/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_readingconfig. - 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.adcsto 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/$broadcastto correctly merge each unit's ownconfig_<unit>.iniinstead of using a shared (and wrong)config_$broadcast.inipath. - Bumped rpi_hardware_pwm to avoid a race condition setting up PWMs.
- Fixed calibration detail pages so
Set active/Set inactivewaits 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.01at5.0s), including when the interval is changed at runtime. - Fixed Inventory model updates and active/inactive toggles to show success only after confirmed backend
2xxresponses, with explicit error feedback on failure. - Fixed an issue where changing RPM while stirring was paused would restart stirring.
self_testnow cleans up better when interrupted.- CLI change gives plugin-registered commands precedence, enabling intentional overrides to existing
pio runcommands. - Fixed UI bugs on the Configuration page
- Fixed
HAT_PRESENTnot being respected in the UI flow.