Releases: Pioreactor/pioreactor
24.9.18rc0
Upcoming
Highlights
- Workers now have a webserver on them. This is one of the largest architectural changes to Pioreactor, and lays the foundation for better plugin, version, and calibration cluster management, plus future features.
- As an example, in your browser, you can enter the url: http://some-worker.local/unit_api/jobs/running to see a list of jobs running on a worker.
- Note: there is no interactive user interface for workers, just a web API
- Previous actions that would involve SSHing from leader to a worker are replaced by web requests.
Bug fixes
- fixed an issue where a calibrated OD reading would be mapped to max OD signal if it was too low.
- fixed an issue where the Pioreactor UI would lock up if trying to create a new experiment with an existing name.
- fixed Hours Elapsed not updating in Overview
Breaking changes
- Lots and lots of web API changes. You'll want to review them on our docs: https://docs.pioreactor.com/developer-guide/web-ui-api
- We no longer recommend the Raspberry Pi Zero (the original Zero, not the Zero 2.) since supporting a web server + pioreactor functions is too much for a single core.
watchdog
is neutered. It used to try to "wake-up" a job, but this was flaky and causing more problems than it solved.- removed python library dependency
sh
- APIs that initiate a background task either return with the result, or return a task id that be be looked up at
/api/task_status/
. pios update
now updates the UI too.
Enhancements
- Better MQTT re-connection logic.
- New
Manage Inventory
menu on the Inventory page that can be used for bulk actions. pio update
is a new command to update both the UI and app.
24.9.17rc0
Upcoming
Highlights
- Workers now have a webserver on them. This is one of the largest architectural changes to Pioreactor, and lays the foundation for better plugin, version, and calibration cluster management, plus future features.
- As an example, in your browser, you can enter the url: http://some-worker.local/unit_api/jobs/running to see a list of jobs running on a worker.
- Note: there is no interactive user interface for workers, just an API
- Previous actions that would involve SSHing from leader to a worker are replaced by web requests.
Bug fixes
- fixed an issue where a calibrated OD reading would be mapped to max OD signal if it was too low.
- fixed an issue where the Pioreactor UI would lock up if trying to create a new experiment with an existing name.
- fixed Hours Elapsed not updating in Overview
Breaking changes
- Lots and lots of API changes. You'll want to review them on our docs: https://docs.pioreactor.com/developer-guide/web-ui-api
- We no longer recommend the Raspberry Pi Zero (the original Zero, not the Zero 2.) since supporting a web server + pioreactor functions is too much for a single core.
watchdog
is neutered. It used to try to "wake-up" a job, but this was flaky and causing more problems than it solved.- removed python library dependency
sh
- APIs that initiate a background task either return with the result, or return a task id that be be looked up at
/api/task_status/
.
Enhancements
- Better MQTT re-connection logic.
- New
Manage Inventory
menu on the Inventory page that can be used for bulk actions.
24.9.16rc0
Upcoming
Highlights
- Workers now have a webserver on them. This is one of the largest architectural changes to Pioreactor, and lays the foundation for better plugin, version, and calibration cluster management, plus future features.
- As an example, in your browser, you can enter the url: http://some-worker.local/unit_api/jobs/running to see a list of jobs running on a worker.
- Note: there is no interactive user interface for workers, just an API
- Previous actions that would involve SSHing from leader to a worker are replaced by web requests.
Bug fixes
- fixed an issue where a calibrated OD reading would be mapped to max OD signal if it was too low.
- fixed an issue where the Pioreactor UI would lock up if trying to create a new experiment with an existing name.
- fixed Hours Elapsed not updating in Overview
Breaking changes
- Lots and lots of API changes. You'll want to review them on our docs: https://docs.pioreactor.com/developer-guide/web-ui-api
- We no longer recommend the Raspberry Pi Zero (the original Zero, not the Zero 2.) since supporting a web server + pioreactor functions is too much for a single core.
watchdog
is neutered. It used to try to "wake-up" a job, but this was flaky and causing more problems than it solved.- removed python library dependency
sh
- APIs that initiate a background task either return with the result, or return a task id that be be looked up at
/api/task_status/
.
Enhancements
- Better MQTT re-connection logic.
- New
Manage Inventory
menu on the Inventory page that can be used for bulk actions.
24.9.15rc0
bump rc version
24.8.22
24.8.22
Important
We highly recommend you be on version 24.7.18 before updating!
Enhancements
pio logs
now includes the UI logs (if run on leader).- introduce a new od_reading config,
turn_off_leds_during_reading
, which enables / disables turning off the other LEDS during an OD snapshot. By default, it is set to 1 (enables). - leader-only Pioreactors also have a
config_<hostname>.local
file now. - a new top-level section in experiment profiles,
inputs
, allows you to define parameters that can be used in expressions. This is useful if you are copy the same constant over an over again, and want a quick way to change it once. Example:
inputs:
growth_phase_temp: 37.0
stationary_phase_temp: 30.0
od_threshold: 1.6
common:
jobs:
temperature_automation:
actions:
...
- type: update
hours_elapsed: 12.0
if: ${{ ::od_reading:od1.od < od_threshold }}
options:
target_temperature: ${{ stationary_phase_temp }}
- type: update
hours_elapsed: 12.0
if: ${{ ::od_reading:od1.od >= od_threshold }}
options:
target_temperature: ${{ growth_phase_temp }}
Bug fixes
- more resilience to "UI state" diverging from "bioreactor state". Often, this occurred when two jobs stared almost immediately (often a networking issue), and the last job would halt since it couldn't get the required resources, however any MQTT data would be overwritten by the last job. Now, multiple places in the request pipeline will reduce duplication and prevent two jobs from starting too close to each other.
- improved stirring clean up when stopped in quick succession after starting.
- if a network isn't found, the
monitor
job will not stall, but warn and continue. - fixed HAT warning for HAT-less leaders.
Breaking changes
- the RP2040 firmware is now on i2c channel 0x2C (previously 0x30). This is to solve an annoying
i2cdetect
issue where the i2c channel would lock up. - the web server now writes its logs to the same location as the app:
/var/log/pioreactor.log
. Those wishing to keep the old location can use a new configuration parameterui_log_file
to[logging]
section and set it to/var/log/pioreactorui.log
. - removed
psutil
andzeroconf
Python packages from new images. We replaced their functionality with built-in routines. - in config.ini, the section
od_config
renamed tood_reading.config
, andstirring
isstirring.config
. When you update, a script will run to automatically update these names in your config.inis.
24.8.21rc0
Upcoming
Enhancements
pio logs
now includes the UI logs (if run on leader).- introduce a new od_reading config,
turn_off_leds_during_reading
, which enables / disables turning off the other LEDS during an OD snapshot. By default, it is set to 1 (enables). - leader-only Pioreactors also have a
config_<hostname>.local
file now. - a new top-level section in experiment profiles,
inputs
, allows you to define parameters that can be used in expressions. This is useful if you are copy the same constant over an over again, and want a quick way to change it once. Example:
inputs:
growth_phase_temp: 37.0
stationary_phase_temp: 30.0
od_threshold: 1.6
common:
jobs:
temperature_automation:
actions:
...
- type: update
hours_elapsed: 12.0
if: ${{ ::od_reading:od1.od < od_threshold }}
options:
target_temperature: ${{ stationary_phase_temp }}
- type: update
hours_elapsed: 12.0
if: ${{ ::od_reading:od1.od >= od_threshold }}
options:
target_temperature: ${{ growth_phase_temp }}
Bug fixes
- more resilience to "UI state" diverging from "bioreactor state". Often, this occurred when two jobs stared almost immediately (often a networking issue), and the last job would halt since it couldn't get the required resources, however any MQTT data would be overwritten by the last job. Now, multiple places in the request pipeline will reduce duplication and prevent two jobs from starting too close to each other.
- improved stirring clean up when stopped in quick succession after starting.
- if a network isn't found, the
monitor
job will not stall, but warn and continue. - fixed HAT warning for HAT-less leaders.
Breaking changes
- the RP2040 firmware is now on i2c channel 0x2C (previously 0x30). This is to solve an annoying
i2cdetect
issue where the i2c channel would lock up. - the web server now writes its logs to the same location as the app:
/var/log/pioreactor.log
. Those wishing to keep the old location can use a new configuration parameterui_log_file
to[logging]
section and set it to/var/log/pioreactorui.log
. - removed
psutil
andzeroconf
Python packages from new images. We replaced their functionality with built-in routines. - in config.ini, the section
od_config
renamed tood_reading.config
, andstirring
isstirring.config
. When you update, a script will run to automatically update these names in your config.inis.
24.8.19rc0
Upcoming
Enhancements
pio logs
now includes the UI logs (if run on leader).- introduce a new od_reading config,
turn_off_leds_during_reading
, which enables / disables turning off the other LEDS during an OD snapshot. By default, it is set to 1 (enables). - leader-only Pioreactors also have a
config_<hostname>.local
file now. - a new top-level section in experiment profiles,
inputs
, allows you to define parameters that can be used in expressions. This is useful if you are copy the same constant over an over again, and want a quick way to change it once. Example:
inputs:
growth_phase_temp: 37.0
stationary_phase_temp: 30.0
od_threshold: 1.6
common:
jobs:
temperature_automation:
actions:
...
- type: update
hours_elapsed: 12.0
if: ${{ ::od_reading:od1.od < od_threshold }}
options:
target_temperature: ${{ stationary_phase_temp }}
- type: update
hours_elapsed: 12.0
if: ${{ ::od_reading:od1.od >= od_threshold }}
options:
target_temperature: ${{ growth_phase_temp }}
Bug fixes
- more resilience to "UI state" diverging from "bioreactor state". Often, this occurred when two jobs stared almost immediately (often a networking issue), and the last job would halt since it couldn't get the required resources, however any MQTT data would be overwritten by the last job. Now, multiple places in the request pipeline will reduce duplication and prevent two jobs from starting too close to each other.
- improved stirring clean up when stopped in quick succession after starting.
- if a network isn't found, the
monitor
job will not stall, but warn and continue. - fixed HAT warning for HAT-less leaders.
Breaking changes
- the RP2040 firmware is now on i2c channel 0x2C (previously 0x30). This is to solve an annoying
i2cdetect
issue where the i2c channel would lock up. - the web server now writes its logs to the same location as the app:
/var/log/pioreactor.log
. Those wishing to keep the old location can use a new configuration parameterui_log_file
to[logging]
section and set it to/var/log/pioreactorui.log
. - removed
psutil
andzeroconf
Python packages from new images. We replaced their functionality with built-in routines. - in config.ini, the section
od_config
renamed tood_reading.config
, andstirring
isstirring.config
. When you update, a script will run to automatically update these names in your config.inis.
24.8.16rc0
Upcoming
Enhancements
pio logs
now includes the UI logs (if run on leader).- introduce a new od_reading config,
turn_off_leds_during_reading
, which enables / disables turning off the other LEDS during an OD snapshot. By default, it is set to 1 (enables). - leader-only Pioreactors also have a
config_<hostname>.local
file now. - a new top-level section in experiment profiles,
inputs
, allows you to define parameters that can be used in expressions. This is useful if you are copy the same constant over an over again, and want a quick way to change it once. Example:
inputs:
growth_phase_temp: 37.0
stationary_phase_temp: 30.0
od_threshold: 1.6
common:
jobs:
temperature_automation:
actions:
...
- type: update
hours_elapsed: 12.0
if: ${{ ::od_reading:od1.od < od_threshold }}
options:
target_temperature: ${{ stationary_phase_temp }}
- type: update
hours_elapsed: 12.0
if: ${{ ::od_reading:od1.od >= od_threshold }}
options:
target_temperature: ${{ growth_phase_temp }}
Bug fixes
- more resilience to "UI state" diverging from "bioreactor state". Often, this occurred when two jobs stared almost immediately (often a networking issue), and the last job would halt since it couldn't get the required resources, however any MQTT data would be overwritten by the last job. Now, multiple places in the request pipeline will reduce duplication and prevent two jobs from starting too close to each other.
- improved stirring clean up when stopped in quick succession after starting.
- if a network isn't found, the
monitor
job will not stall, but warn and continue. - fixed HAT warning for HAT-less leaders.
Breaking changes
- the web server now writes its logs to the same location as the app:
/var/log/pioreactor.log
. Those wishing to keep the old location can use a new configuration parameterui_log_file
to[logging]
section and set it to/var/log/pioreactorui.log
. - removed
psutil
andzeroconf
Python packages from new images. We replaced their functionality with built-in routines. - in config.ini, the section
od_config
renamed tood_reading.config
, andstirring
isstirring.config
. When you update, a script will run to automatically update these names in your config.inis.
24.7.18
24.7.18
Important
This release intentionally breaks the high-temp plugin, and temperature-expansion plugin. Don't update until you're prepared to update those (and the plugins have been updated, follow along on our forums
Enhancements
- improvements to the UI's experiment profile preview.
hours_elapsed()
is a function in profile expressions, which returns the hours since the profile started.unit()
can be used in mqtt fetch expressions. Example:unit():stirring:target_rpm
is identical to::stirring:target_rpm
. The latter can be seen as a shortened version of the former.- experiment profiles can have a
description
in thejob
field (i.e. at the same level asactions
). - Updated Raspberry Pi OS image to 2024-07-04.
- Vendoring the TMP1075 library, which also fixes the RPi5 error.
- In places where the ipv4 is displayed (Inventory page, System tab, pio workers status, etc), all ipv4 addresses are displayed.
Breaking changes
-
remove the temperature_control, dosing_control, and led_control abstractions. These were introduced early in the Pioreactor software as a way to quickly change automations, but they have been more of a wort than a win. While working on the internals of experiment profiles recently, it became more and more clear how poor this abstraction was. The removal of them has some consequences and some backward incompatibilities:
-
updating experiment profiles: experiment profiles that have a
*_control
job will need to be updated to use*_automation
, eventually. For now, we are allowing*_control
in profiles: in the backend, we are renaming*_control
to*_automations
, but a warning will be produced. Later, we'll remove this renaming and profiles will need to be completely updated. Example:experiment_profile_name: start_temp_control metadata: author: Cam DP common: jobs: temperature_control: actions: - type: start hours_elapsed: 0 options: automation_name: thermostat target_temperature: 30 - type: stop hours_elapsed: 12 temperature_automation: actions: - type: update hours_elapsed: 6 options: target_temperature: 35
becomes:
experiment_profile_name: start_temp_control metadata: author: Cam DP common: jobs: temperature_automation: actions: - type: start hours_elapsed: 0 options: automation_name: thermostat target_temperature: 30 - type: stop hours_elapsed: 12 - type: update hours_elapsed: 6 options: target_temperature: 35
- update plugins. For users using, specifically, the high-temp plugin, or temperature-expansion-kit plugin, new plugins will be released. Look on the forums, or documentation, for update instructions.
The benefits of removing this abstraction is much less code, less overhead, easier developer experience, and overall simplification. Later, we may create a new abstraction, but now we are moving abstractions back to level 0.
log
in experiment profiles now uses expressions instead of Python string formatting. For example:The unit {unit} is running {job} in experiment {experiment}
should be replaced by expressions in the string:The unit ${{unit()}} is running ${{job_name()}} in the experiment ${{experiment}}
. Note:{job}
is now${{job_name()}}
.cycle_media
andcycle_alt_media
now publish dosing events, and will be recorded by dosing automations, and the db.
Bug fixes
- When pausing temperature automations, the heater now turns off and stays off until unpaused. This is the intended behaviour.
24.7.18rc0
Upcoming
Enhancements
- improvements to the UI's experiment profile preview.
hours_elapsed()
is a function in profile expressions, which returns the hours since the profile started.unit()
can be used in mqtt fetch expressions. Example:unit():stirring:target_rpm
is identical to::stirring:target_rpm
. The latter can be seen as a shortened version of the former.- experiment profiles can have a
description
in thejob
field (i.e. at the same level asactions
). - Updated Raspberry Pi OS image to 2024-07-04.
- Vendoring the TMP1075 library, which also fixes the RPi5 error.
- In places where the ipv4 is displayed (Inventory page, System tab, pio workers status, etc), all ipv4 addresses are displayed.
Breaking changes
-
remove the temperature_control, dosing_control, and led_control abstractions. These were introduced early in the Pioreactor software as a way to quickly change automations, but they have been more of a wort than a win. While working on the internals of experiment profiles recently, it became more and more clear how poor this abstraction was. The removal of them has some consequences and some backward incompatibilities:
-
updating experiment profiles: experiment profiles that have a
*_control
job will need to be updated to use*_automation
, eventually. For now, we are allowing*_control
in profiles: in the backend, we are renaming*_control
to*_automations
, but a warning will be produced. Later, we'll remove this renaming and profiles will need to be completely updated. Example:experiment_profile_name: start_temp_control metadata: author: Cam DP common: jobs: temperature_control: actions: - type: start hours_elapsed: 0 options: automation_name: thermostat target_temperature: 30 - type: stop hours_elapsed: 12 temperature_automation: actions: - type: update hours_elapsed: 6 options: target_temperature: 35
becomes:
experiment_profile_name: start_temp_control metadata: author: Cam DP common: jobs: temperature_automation: actions: - type: start hours_elapsed: 0 options: automation_name: thermostat target_temperature: 30 - type: stop hours_elapsed: 12 - type: update hours_elapsed: 6 options: target_temperature: 35
- update plugins. For users using, specifically, the high-temp plugin, or temperature-expansion-kit plugin, new plugins will be released. Look on the forums, or documentation, for update instructions.
The benefits of removing this abstraction is much less code, less overhead, easier developer experience, and overall simplification. Later, we may create a new abstraction, but now we are moving abstractions back to level 0.
log
in experiment profiles now uses expressions instead of Python string formatting. For example:The unit {unit} is running {job} in experiment {experiment}
should be replaced by expressions in the string:The unit ${{unit()}} is running ${{job_name()}} in the experiment ${{experiment}}
. Note:{job}
is now${{job_name()}}
.cycle_media
andcycle_alt_media
now publish dosing events, and will be recorded by dosing automations, and the db.
Bug fixes
- When pausing temperature automations, the heater now turns off and stays off until unpaused. This is the intended behaviour.