New Pioreactor release: 25.5.22 and 25.6.3

Hotfix patch for 25.5.22! See notes below:

:arrow_down: Download release here: release_25.6.3.zip

25.6.3

Bug fixes

  • update Adafruit-Blinka to fix USB issue.
  • Fix for HardwarePWM on RPi5 on linux kernel 6.6

25.5.22

Enhancements

  • new System logs under Inventory to track logs happening outside of experiments in your cluster.
  • Better organization of logs in the UI. System logs, like calibrations, worker additions, etc. won’t show up on the Overview page.
  • Exported data zips have folders for each dataset requested.
  • Improvements to the Kalman filter. For users using the growth-rate model with media dosing, you should see improvements to your growth-rate time series. We recommend the following configuration:
    [growth_rate_kalman]
    # obs_std ↑ smooths growth rate, rate_std ↑ more responsive growth rate
    obs_std=1.5
    od_std=0.0025
    rate_std=0.25
    
    Note: the acceleration term is removed
  • Added the column hours_since_experiment_created to dataset exports that details hours since experiment was created.
  • A running pump now fires off an incremental dosing event every N seconds (N=0.5 currently) to tell the software its progress. Previously, we would fire off a single event that represented the total amount moved. This is most noticeable when watching the vial volume change over time (looks more accurate over a short period).
  • When a pump runs, it first fires off a dosing_event, which stores information about how much liquid is moved. However, if the pump is stopped early, there was no correction issued to the amount of liquid actually moved. Now, when a pump is stopped early, a negative volume is sent s.t. the delta between the initial amount and new amount is equal to the dosed amount (so when you sum up the volume changes, you get the actual change, as expected).
  • Performance optimizations
  • New image installs only:
    • updated base OS to the latest 25-05-06 Raspberry Pi OS. The big change is using Linux kernel 6.12.

Bug fixes

  • fixed stir bar not spinning on Pioreactor page (UI) in some cases
  • alert user if their OD reading is constant before starting the growth-rate calculator, which would break things.
  • alert user if their software is installed in a non-standard location. If so, try pip uninstall pioreactor -y.
  • Added a warning if the OD calibration is invalid (ex: a constant line)
  • Fix for Raspberry Pi 5 using upstream Adafruit libraries.

How to update

2 Likes

Known issues:

  • pioreactor-air-bubbler and pioreactor-relay plugin broke with this release. Please update them to versions 0.9.0 and 0.7.0 respectively.
  • USBs attached might break specific jobs (see below)
  • RPi5 hardware PWMs might not work (check your kernel: kernel 6.6 is broken, 6.12+ is okay).

Hi Cam,

Some strange things happened to my cluster after this update:

I have pH probe that is connected to the raspberry pi via usb. After the update, whenever the probe is connected, this message shows:

All my self-tests fail and when I run > version -v, I see firmware 0.0.

Any help on this is greatly appreciated.

Best,
Daniel

Hi @DanielGarza,

Hm, did you update RPiOS too, or rewrite the image? (not necessary, just curious)

The error looks like a kernel issue, which we didn’t touch except for new images.

Can you see any get more error logs from your System Logs page (http://pioreactor.local/system-logs)?

Interesting,

I updated via the web interface with the release zip file. This is the log:
(when I plug in the pH sensor, everything crashes, but I have been working with this sensor for months before the update).

2025-05-27T14:01:03+0200 [monitor] DEBUG Pioreactor UI version: 25.5.22
2025-05-27T14:01:03+0200 [monitor] DEBUG [Errno 2] No such file or directory: ‘/sys/bus/gpio/devices/gpiochip14/of_node/compatible’
Traceback (most recent call last):
File “/usr/local/lib/python3.11/dist-packages/pioreactor/utils/timing.py”, line 156, in _execute_function
self.function(*self.args, **self.kwargs)
File “/usr/local/lib/python3.11/dist-packages/pioreactor/background_jobs/monitor.py”, line 265, in self_checks
self.check_for_power_problems()
File “/usr/local/lib/python3.11/dist-packages/pioreactor/background_jobs/monitor.py”, line 492, in check_for_power_problems
is_rpi_having_power_probems, voltage = self.rpi_is_having_power_problems()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.11/dist-packages/pioreactor/background_jobs/monitor.py”, line 477, in rpi_is_having_power_problems
voltage_read = voltage_in_aux(precision=0.05)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.11/dist-packages/pioreactor/hardware.py”, line 161, in voltage_in_aux
adc = ADC_class() # type: ignore
^^^^^^^^^^^
File “/usr/local/lib/python3.11/dist-packages/pioreactor/utils/adcs.py”, line 96, in init
self.i2c = I2C(hardware.SCL, hardware.SDA)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.11/dist-packages/busio.py”, line 36, in init
self.init(scl, sda, frequency)
File “/usr/local/lib/python3.11/dist-packages/busio.py”, line 160, in init
from microcontroller.pin import i2cPorts
File “/usr/local/lib/python3.11/dist-packages/microcontroller/init.py”, line 16, in
from microcontroller import pin # pylint: disable=unused-import
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.11/dist-packages/microcontroller/pin.py”, line 20, in
from adafruit_blinka.microcontroller.bcm2712.pin import *
File “/usr/local/lib/python3.11/dist-packages/adafruit_blinka/microcontroller/bcm2712/pin.py”, line 7, in
from adafruit_blinka.microcontroller.generic_linux.lgpio_pin import Pin
File “/usr/local/lib/python3.11/dist-packages/adafruit_blinka/microcontroller/generic_linux/lgpio_pin.py”, line 30, in
CHIP = _get_gpiochip()
^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.11/dist-packages/adafruit_blinka/microcontroller/generic_linux/lgpio_pin.py”, line 18, in _get_gpiochip
drivers = set((dev / “of_node/compatible”).read_text().split(“\0”))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3.11/pathlib.py”, line 1059, in read_text
with self.open(mode=‘r’, encoding=encoding, errors=errors) as f:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3.11/pathlib.py”, line 1045, in open
return io.open(self, mode, buffering, encoding, errors, newline)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: ‘/sys/bus/gpio/devices/gpiochip14/of_node/compatible’
2025-05-27T14:01:03+0200 [monitor] ERROR [Errno 2] No such file or directory: ‘/sys/bus/gpio/devices/gpiochip14/of_node/compatible’
2025-05-27T14:03:18+0200 [huey.consumer] INFO Executing nohup /usr/local/bin/pio run ph_reading, env={‘EXPERIMENT’: ‘test pH 27_05’, ‘JOB_SOURCE’: ‘user’, ‘MODEL_NAME’: ‘pioreactor_20ml’, ‘MODEL_VERSION’: ‘1.1’, ‘ACTIVE’: ‘1’}
2025-05-27T14:03:18+0200 [ph_reading] DEBUG Init.
2025-05-27T14:03:18+0200 [ph_reading] INFO Ready.
2025-05-27T14:03:18+0200 [ph_reading] DEBUG ph_reading is blocking until disconnected.

This really helps, thanks! I’ll get back shortly with some ideas

We updated a library adafruit_blinka to 8.57.0 in this release, but your error looks identical to: fix compatibility with differing `/sys/bus/gpio/devices/gpiochip*` by mrossington · Pull Request #967 · adafruit/Adafruit_Blinka · GitHub. This was fixed in 8.58.1.

Solution is to update this library again =\

Do your workers have access to the internet? If so, you can run:

sudo pip install -U adafruit-blinka

If no internet, try:

  1. Download the adafruit_blinka-8.58.1-py3-none-any.whl file here

  2. scp to each Pioreactor with the issue. Something like:

    scp /PATH/TO/adafruit_blinka-8.58.1-py3-none-any.whl pioreactor@MY_PIOREACTORS_HOSTNAME.local:~/
    

    (fill in the blanks though!)

  3. SSH into that Pioreactor, and run:

    sudo pip install adafruit_blinka-8.58.1-py3-none-any.whl 
    

Let me know if you encounter any errors! I may also create a hotfix release this week to address this.

1 Like

Thanks a lot. This worked!

1 Like