You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: developer-guide/03-Background jobs/03-avoiding-od.md
+5-5Lines changed: 5 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -22,7 +22,7 @@ class JustPause(BackgroundJobWithDodgingContrib):
22
22
classJustPause(BackgroundJobWithDodgingContrib):
23
23
24
24
def__init__(self, ...):
25
-
super().__init__(..., enable_dodging_od=TrueorFalse) # set to True if you want the dodging behaviour right away.
25
+
super().__init__(..., enable_dodging_od=False, plugin_name="just-pause") # set to True if you want the dodging behaviour right away.
26
26
27
27
28
28
defaction_to_do_before_od_reading(self):
@@ -45,15 +45,15 @@ You can handle the "dodging" case and "continuous" with the `initialize_*` metho
45
45
classJustPause(BackgroundJobWithDodgingContrib):
46
46
47
47
def__init__(self, ...):
48
-
super().__init__(..., enable_dodging_od=TrueorFalse) # set to True if you want the dodging behaviour right away.
48
+
super().__init__(..., enable_dodging_od=False, plugin_name="just-pause") # set to True if you want the dodging behaviour right away.
49
49
50
50
...
51
51
52
52
definitialize_dodging_operation(self):
53
-
self.logger("OD reading is ON and I'm enabled for dodging, so set up what I need...")
53
+
self.logger.debug("OD reading is ON and I'm enabled for dodging, so set up what I need...")
54
54
55
55
definitialize_continuous_operation(self):
56
-
self.logger("OD reading is off, or being ignored, so set up what I need for that...")
56
+
self.logger.debug("OD reading is off, or being ignored, so set up what I need for that...")
57
57
58
58
defaction_to_do_before_od_reading(self):
59
59
# example
@@ -69,7 +69,7 @@ class JustPause(BackgroundJobWithDodgingContrib):
69
69
4. We also want some "buffer" time before and after an OD reading. For example, if using a bubbler, we want the bubbles to dissipate completely before taking an OD reading. We should stop bubbling early then. To set these times, add the following to your config.ini:
Copy file name to clipboardExpand all lines: developer-guide/04-Automations/02-writing-automations-1.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -104,7 +104,7 @@ class NaiveTurbidostat(DosingAutomationJobContrib):
104
104
105
105
```
106
106
107
-
Run the script with `pio run dosing_atomation --automation-name naive_turbidostat --target-od 0.5`. This will start the job. After a moment, you may notice that warnings are thrown - that's because there's no optical density measurements being produced! You can use crtl-c to stop the job.
107
+
Run the script with `pio run dosing_automation --automation-name naive_turbidostat --target-od 0.5`. This will start the job. After a moment, you may notice that warnings are thrown - that's because there's no optical density measurements being produced! You can use crtl-c to stop the job.
description: Adjust the Pioreactor model in the Inventory page and register custom models that appear in the UI.
6
+
---
7
+
8
+
9
+
## Update a Pioreactor's model from the UI
10
+
11
+
You can update the model that the software uses for each unit from the **Inventory** page.
12
+
13
+
1. Navigate to **Inventory** in the sidebar.
14
+
2. Locate the Pioreactor you want to configure and open the **Model** dropdown.
15
+
3. Pick the correct entry. The change is saved immediately.
16
+
17
+

18
+
19
+
Changes to the model update any UI text, configuration safety limits, and workflows that depend on vessel geometry.
20
+
21
+
## Add a custom model
22
+
23
+
The UI lists every YAML definition stored in `.pioreactor/models/`. Each file represents a single model.
24
+
25
+
1. Create the directory if it does not already exist:
26
+
27
+
```bash
28
+
mkdir -p ~/.pioreactor/models
29
+
```
30
+
31
+
2. Add a new YAML file. Use a descriptive file name such as `my_custom_model.yaml`.
32
+
33
+
```yaml
34
+
model_name: custom_100ml
35
+
model_version: "1.0"
36
+
display_name: "Custom 100 mL, v1.0"
37
+
reactor_capacity_ml: 100.0
38
+
reactor_max_fill_volume_ml: 95.0
39
+
reactor_diameter_mm: 50.0
40
+
max_temp_to_reduce_heating: 80.0
41
+
max_temp_to_disable_heating: 85.0
42
+
max_temp_to_shutdown: 90.0
43
+
```
44
+
45
+
### Required fields
46
+
47
+
| Field | Description |
48
+
| --- | --- |
49
+
| `model_name` | A unique identifier. Use lowercase letters, numbers, and underscores. Example `pioreactor_20ml` |
50
+
| `model_version` | Semantic version string that differentiates variants of the same model. Example: `1.1`|
51
+
| `display_name` | What appears in the UI dropdown. Example: `Pioreactor 20ml, v1.1`|
52
+
| Capacity and geometry fields | Used by dosing and safety calculations. Provide real measurements in millilitres and millimetres. |
53
+
| Temperature limits | Guardrails for the heater. Adjust them to match your hardware. |
54
+
55
+
If any field fails validation, the Pioreactor logs an error in `pioreactor.log` and skips the file. Double-check spelling and numeric values if your model does not appear.
56
+
57
+
### Reload the web UI
58
+
59
+
After adding or editing model files, restart the web UI service so it picks up the new definitions:
60
+
61
+
```bash
62
+
sudo systemctl restart pioreactor-web.target
63
+
```
64
+
65
+
Return to the Inventory page and reopen the **Model** dropdown. Your custom entry should now be available alongside the built-in models.
66
+
67
+
## Troubleshooting
68
+
69
+
- **No new dropdown entries:** confirm the YAML file lives in `/home/pioreactor/.pioreactor/models/` on the leader and that the file extension is `.yaml` or `.yml`. Restart the `pioreactor-web.target` service once more.
70
+
- **Validation errors in the logs:** open `pioreactor.log` or run `journalctl -u pioreactor-web.target` to view the message, then update the YAML file accordingly.
71
+
- **Distribute to workers**: workers need these files to, so if you've added it to your leader, you can run `pios cp ~/.pioreactor/models/my_custom_model.yaml` to distribute it to workers.
Copy file name to clipboardExpand all lines: user-guide/29-Automations/02-dosing-automations.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -46,7 +46,7 @@ The chemostat automation is the second simplest dosing automation. Every `durati
46
46
* one labelled "media"
47
47
48
48
49
-
A turbidostat ("turbidity-static") tries to keep the turbidity (the optical density, or OD), constant over time. This is usually accomplished by taking frequent measurements of the turbidity (every 30 seconds), and performing a set media/waste pump cycle if the optical density (or normalized optical density) exceeds a `target OD` (or `target nOD`). The amount exchanged is the `volume` parameter (mL). For very fast growing cultures, we recommend a `volume` between 1.0 ml and 2.0 ml.
49
+
A turbidostat ("turbidity-static") tries to keep the turbidity (the optical density, or OD), constant over time. This is usually accomplished by taking frequent measurements of the turbidity (every 15 seconds), and performing a set media/waste pump cycle if the optical density (or normalized optical density) exceeds a `target OD` (or `target nOD`). The amount exchanged is the `volume` parameter (mL). For very fast growing cultures, we recommend a `volume` between 1.0 ml and 2.0 ml.
50
50
51
51
This automation will always dose the `volume` parameter, even if it's not enough for the OD to drop below the `target OD`. If that happens, then `OD > target OD`, and so the automation will trigger after the next check (30 seconds).
52
52
@@ -104,7 +104,7 @@ To further avoid overflow, we limit how much liquid is added in a single pump cy
104
104
You can edit these parameters in your config.ini files.
105
105
106
106
107
-
#### Section `[dosing_auomation.config]`
107
+
#### Section `[dosing_automation.config]`
108
108
109
109
-`pause_between_subdoses_seconds`: time to wait between doses - this is useful if you want to be sure the newly added liquid is sufficiently mixed before running the waste pump.
110
110
-`waste_removal_multiplier`: the amount of additional time to run the waste pump after the influx pump has run. This is to ensure that the volume of liquid in the vial never exceeds the end of the efflux tube. Ex: if media ran for `0.75` seconds, then the waste will run for `waste_removal_multiplier * 0.75 seconds`
0 commit comments