Petri is a full-stack framework for designing and automating lab research processes.
Petri is designed to be easy to use, and easy to extend. It has a user interface, code generator, and gRPC API.
Individual automata within Petri are defined with elementary Petri Nets. Petri Nets were chosen over finite state machines for system modeling because they are easily composable. Petri Nets have been used to model chemical processes for decades, and are a natural fit for modeling lab processes.
While Petri Nets could theoretically be used to model everything that happens down to the molecular level, we have found it most useful to start to model components at the highest level possible (i.e. the places and transitions that you want to affect other components, rather than every possible thing something can do).
The components in the standard library are a good place to see examples of the components used to automate the author's research.
Currently, code generation in Go is fully supported, and Python is almost there.
Petri currently supports the following serial protocols for communicating with devices:
- Modbus (support up to 255 devices on one bus)
- Marlin (Used to make 3D printers do lab things)
- grbl (Used to quickly make stepper motors do things using a GRBL shield and an arduino, supports up to 4 motors.)
Network protocols:
Run your generated servers and the Petri Daemon will automatically discover them and connect them to the network. This is done using simple heartbeating over RabbitMQ.
You can create a sequence of events using the Petri UI. The Petri Net acts like a contract between devices, so they will always know how to play nicely together once defined.
Single executions are performed with the UI. Batch executions are currently performed using the GraphQL API and the otto python client which incorporates Design of Experiments algorithms, Batch Bayesian Optimization, and a CouchDB database to manage samples, batches, results, analyses, and optimization experiments.