From 6932a34b51fd29a16a83bc87f8a58adcdfa26548 Mon Sep 17 00:00:00 2001 From: CamDavidsonPilon Date: Sun, 22 Jan 2023 18:41:49 -0500 Subject: [PATCH] scripts --- .../05-Scripts/01-writing-scripts.md | 83 +++++++++++++++++++ .../01-intro-plugins.md | 4 +- .../02-adding-plugins-to-ui.md | 0 .../03-plugin-as-python-package.md | 0 .../01-data-stores.md | 0 .../05-i2c-addresses.md | 0 .../{07-Hardware => 10-Hardware}/05-pinout.md | 0 .../06-button-down.md | 0 .../01-introduction.md | 0 .../01-local-development.md | 0 ...{10-architecture.md => 99-architecture.md} | 0 11 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 developer-guide/05-Scripts/01-writing-scripts.md rename developer-guide/{04-Plugins => 07-Plugins}/01-intro-plugins.md (95%) rename developer-guide/{04-Plugins => 07-Plugins}/02-adding-plugins-to-ui.md (100%) rename developer-guide/{04-Plugins => 07-Plugins}/03-plugin-as-python-package.md (100%) rename developer-guide/{05-Storage => 09-Storage}/01-data-stores.md (100%) rename developer-guide/{07-Hardware => 10-Hardware}/05-i2c-addresses.md (100%) rename developer-guide/{07-Hardware => 10-Hardware}/05-pinout.md (100%) rename developer-guide/{07-Hardware => 10-Hardware}/06-button-down.md (100%) rename developer-guide/{08-User inferface => 20-User interface}/01-introduction.md (100%) rename developer-guide/{06-Local development => 30-Local development}/01-local-development.md (100%) rename developer-guide/{10-architecture.md => 99-architecture.md} (100%) diff --git a/developer-guide/05-Scripts/01-writing-scripts.md b/developer-guide/05-Scripts/01-writing-scripts.md new file mode 100644 index 000000000..3dc0b97ee --- /dev/null +++ b/developer-guide/05-Scripts/01-writing-scripts.md @@ -0,0 +1,83 @@ +--- +title: Writing scripts +slug: /writing-scripts +--- + +Since the behaviour of the Pioreactor is controlled by Python objects, you can write scripts that use those objects. Here's a simple example of starting the stirring in a script by creating the `Stirrer` object: + +```python +from pioreactor.background_jobs.stirring import Stirrer, RpmFromFrequency +from pioreactor.whoami import get_unit_name +from pioreactor.whoami import get_latest_experiment_name + +unit = get_unit_name() +experiment = get_latest_experiment_name() + +st = Stirrer( + target_rpm=300, + unit=unit, + experiment=experiment, + rpm_calculator=RpmFromFrequency() +) + +st.block_until_disconnected() # pauses the execution + +``` + +Save this code to a local file on your Pioreactor's Raspberry Pi, called `stirring_script.py`. Then, running `python stirring_scripy.py`, you should see that stirring on the Pioreactor starts. With the script running, you should also updates on the Pioreactor UI (ex: see [pioreactor.local/pioreactors](http://pioreactor.local/pioreactors) page). Typing `ctrl-c` will exit the script. + +:::info +What is `get_unit_name` and `get_latest_experiment_name`? These are helper functions that get the current hostname of the Pioreactor, and the current experiment name, respectively. Using the current experiment name will ensure that your data shows up in the UI, and is correctly stored in the database. +::: + + +#### Automations + +Using automations requires you to invoke them with a `Controller`. For example, below we start a chemostat with some specific parameters, and set the target temperature to 30C. + +```python +from pioreactor.background_jobs.dosing_control import DosingController +from pioreactor.background_jobs.temperature_control import TemperatureController +from pioreactor.whoami import get_latest_experiment_name + +unit = get_unit_name() +experiment = get_latest_experiment_name() + +dc = DosingController( + "chemostat", # automation name + duration=1, # every minute, + volume=1, # dose 1mL + unit=unit, + experiment=experiment, +) + +tc = TemperatureController( + "thermostat", + target_temperature=30, + unit=unit, experiment=experiment +) + +dc.block_until_disconnected() +``` + + +### Running your script + +On the command line, you can run your script with + +``` +python your_script.py +``` + +If you want to run the script in the background (so you can close terminal and the job continues in the background), use + +``` + +python your_script.py >/dev/null 2>&1 & disown + +``` + + +### Useful utility objects + + - [RepeatedTimer](https://github.com/Pioreactor/pioreactor/blob/60875ebe5a35d7ed5c930d46ed7c755eadcb4b74/pioreactor/utils/timing.py#L40): this class allows you to scheduale a function to run every N seconds in a non-blocking manner. diff --git a/developer-guide/04-Plugins/01-intro-plugins.md b/developer-guide/07-Plugins/01-intro-plugins.md similarity index 95% rename from developer-guide/04-Plugins/01-intro-plugins.md rename to developer-guide/07-Plugins/01-intro-plugins.md index 7cba70076..2d9c6bc6f 100644 --- a/developer-guide/04-Plugins/01-intro-plugins.md +++ b/developer-guide/07-Plugins/01-intro-plugins.md @@ -67,9 +67,9 @@ Finally, in your [web interface under plugins](http://pioreactor.local/plugins), How do you add this to your /pioreactors page in the UI? See [here](/developer-guide/adding-plugins-to-ui). ::: -### Simple script using existing jobs +### Scripts -If you are interested in creating a script to control multiple jobs, like in a [previous Python scripting example](/user-guide/intro-python-scripting), you can create a file called `example_script.py` in the `/home/pioreactor/.pioreactor/plugins/` folder: +If you are interested in creating a Python script to control multiple jobs, like in a [previous Python scripting example](/user-guide/intro-python-scripting), you can create a file called `example_script.py` in the `/home/pioreactor/.pioreactor/plugins/` folder: ```python import time diff --git a/developer-guide/04-Plugins/02-adding-plugins-to-ui.md b/developer-guide/07-Plugins/02-adding-plugins-to-ui.md similarity index 100% rename from developer-guide/04-Plugins/02-adding-plugins-to-ui.md rename to developer-guide/07-Plugins/02-adding-plugins-to-ui.md diff --git a/developer-guide/04-Plugins/03-plugin-as-python-package.md b/developer-guide/07-Plugins/03-plugin-as-python-package.md similarity index 100% rename from developer-guide/04-Plugins/03-plugin-as-python-package.md rename to developer-guide/07-Plugins/03-plugin-as-python-package.md diff --git a/developer-guide/05-Storage/01-data-stores.md b/developer-guide/09-Storage/01-data-stores.md similarity index 100% rename from developer-guide/05-Storage/01-data-stores.md rename to developer-guide/09-Storage/01-data-stores.md diff --git a/developer-guide/07-Hardware/05-i2c-addresses.md b/developer-guide/10-Hardware/05-i2c-addresses.md similarity index 100% rename from developer-guide/07-Hardware/05-i2c-addresses.md rename to developer-guide/10-Hardware/05-i2c-addresses.md diff --git a/developer-guide/07-Hardware/05-pinout.md b/developer-guide/10-Hardware/05-pinout.md similarity index 100% rename from developer-guide/07-Hardware/05-pinout.md rename to developer-guide/10-Hardware/05-pinout.md diff --git a/developer-guide/07-Hardware/06-button-down.md b/developer-guide/10-Hardware/06-button-down.md similarity index 100% rename from developer-guide/07-Hardware/06-button-down.md rename to developer-guide/10-Hardware/06-button-down.md diff --git a/developer-guide/08-User inferface/01-introduction.md b/developer-guide/20-User interface/01-introduction.md similarity index 100% rename from developer-guide/08-User inferface/01-introduction.md rename to developer-guide/20-User interface/01-introduction.md diff --git a/developer-guide/06-Local development/01-local-development.md b/developer-guide/30-Local development/01-local-development.md similarity index 100% rename from developer-guide/06-Local development/01-local-development.md rename to developer-guide/30-Local development/01-local-development.md diff --git a/developer-guide/10-architecture.md b/developer-guide/99-architecture.md similarity index 100% rename from developer-guide/10-architecture.md rename to developer-guide/99-architecture.md