this is an important release for an upcoming 2.0 launch. It starts to give back some “authority” to workers (part of a longer trend to decouple leaders and workers). It also has some useful performance fixes, bug fixes, and UX improvements.
26.11.0
Breaking changes
- Replaced
pio workers update-model WORKER -m NAME -v VERSIONwithpio workers model set WORKER NAME VERSION. Addedpio workers model get WORKERto print the worker’s model assignment as JSON. - Adding a worker now requires it to run the same software version as the leader; an older worker is rejected with a message to update it first.
- Changing a Pioreactor’s model now requires the unit to be reachable and its activities to be stopped. Update workers before changing their models through the leader.
- Bioreactor MQTT topics,
pioreactor/<unit>/<experiment>/bioreactor/<variable>, now publish{"timestamp": ..., "value": ...}instead of a bare number. Experiment profile expressions that read these topics need.value, for example${{ ::bioreactor:current_volume_ml.value }}. - Replaced the PWM MQTT topic
pioreactor/<unit>/<experiment>/pwms/dcwithpioreactor/<unit>/<experiment>/pwms/channel_dc, keyed by PWM channel instead of GPIO pin. Update any plugins or scripts that consume this topic. Upgrade the leader and all workers together, then reload browser tabs.
Enhancements
-
Added
pio cluster leaveto remove a worker from its cluster from the worker itself, for example before moving it to another lab. It keeps the worker’s model, calibrations, estimators andunit_config.ini. -
Adding a worker is more reliable: a failed step can be retried, a wrong SSH password fails right away, and the UI no longer gives up after 90 seconds while setup is still running.
-
Added automatic imports from the SD card’s boot partition. Place files in these folders on the boot partition, then reboot:
pioreactor/plugins/: plugin.whlfiles (and any dependency wheels) are installed.pioreactor/experiment_profiles/(leaders only),pioreactor/models/,pioreactor/hardware/:.yamlfiles are imported.
Successful imports are removed from the boot partition; failed ones are kept with a
.logfile explaining why. -
Each Pioreactor now stores its own model, so it survives reboots and is available when the leader is unreachable. Custom models defined only on a worker can now be assigned to it. New CLI commands to inspect or change the local model:
pio model get pio model set pioreactor_20ml 1.5 -
Jobs now buffer up to 10,000 MQTT messages (was 100) while the broker is unreachable, so a leader reboot or short Wi-Fi drop loses far fewer readings.
-
Workers now log a warning at startup if the system clock isn’t synchronised, since measurement timestamps may be wrong.
-
Faster data exports and chart loading, and lower browser memory use for live charts and logs during long experiments.
-
Added Mount and Eject buttons for USB drives on the Plugins page, with clearer guidance when a drive is missing, unmounted, or has no plugins.
Bug fixes
- Fixed
pio workers add -p <password>writing the worker’s SSH password to the logs when setup failed. - Fixed commands from the leader possibly running on the wrong Pioreactor when an address is stale or reused.
- Fixed dosing events being discarded when an addition would overfill the vial, which could stop dosing automations from pausing correctly.
- Fixed jobs failing immediately when the leader’s web server is briefly unavailable, for example while restarting.
- Automation events, bioreactor values and PWM duty cycles are now stored with the time they were produced on the worker, not the time the leader received them.
- Fixed a re-added worker still pointing at its previous leader’s MQTT broker.
- Fixed configuration editing being blocked when configuration history is slow or unavailable.
- Fixed the Plugins page hiding plugins on read-only USB drives.
- Fixed PWM duty-cycle history failing to save on a leader-only unit with no assigned model.
- Fixed the monitor’s self-checks erroring when the leader is unreachable.
- Fixed Akima calibration fitting with only two data points.