New Pioreactor software release: 26.1.30 and 26.2.3

:wave: This is a big release! We have lots of new improvements in the 26.1.30 release - let me walk you through the big ones:

:arrow_down: Download the update here


Highlights

26.1.30 Full changelog

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.

How to update

4 Likes

Bug fix for plugins not running when using pio run <command> where command is a built in job. This affects plugins not modifying jobs like mqtt_to_db_streaming, so some plugin data would not be saved to the db.

Hi Cameron, I have updated to the latest version. I am still with the 1.1 pioreactor 20 ml. The unity mode very often triggers “The reference PD is very noisy, std=0.33. Is the PD in channel 1 positioned correctly? Is the IR LED behaving as expected?”. Is this to be expected?

@davidhcsic ah! Someone else is private messaging me about the same error =)

Can you tell me two pieces of information:

  1. Did you run a self-test at all? Maybe between starting the experiment → assigning units → SELF TEST OCCURS → start the OD readings job?

  2. If you ssh into the Pioreactor and run:

pio cache view ir_led_reference_normalization

what value is next to your experiment in the resulting list?

pioreactor@pio01:~ $ pio cache view ir_led_reference_normalization

Demo experiment = 0.0002817653

Hi Cameron,

Thank you for the quick reply.

1 - Tests all show as normal.

Using classic and calibrating throung command line solves the issue. If I use the UI calibration I get warnings messages about led intensity.

2 - I have just recalibrated through UI with unity mode and this is waht i get:
pioreactor@pio01:~ $ pio cache view ir_led_reference_normalization
intensity**_testing_Demo experiment** = 0.0002402523

I think you can ignore the warning for now. I’ll fix with an update shortly. However, also try starting a new experiment, and reassigning your Pioreactor to that new experiment. (The core problem is that the cache is stuck at 0.0002402523 until a new experiment is used.