Lewis
Lewis - Let's write intricate simulators.
Lewis is a Python framework for simulating hardware devices.
Lewis can be installed via pip or ran from source. See relevant usage sections of the docs for more details.
Resources: GitHub PyPI ISIS-developed device emulators
Lewis was previously named "Plankton" but, due to a package with the same name on PyPI, we decided to rename the project.
Lewis is licensed under GPL v3 or later.
Purpose and Use Cases
Lewis is being developed in the context of instrument control at the ESS, but it is general enough to be used in many other contexts that require detailed, stateful software simulations of hardware devices.
We consider a detailed device simulation to be one that can communicate using the same protocol as the real device, and that can very closely approximate real device behaviour in terms of what is seen through this protocol. This includes gradual processes, side-effects and error conditions.
The purpose of Lewis is to provide a common framework to facilitate the development of such simulators. The framework provides a common set of tools, including communication protocol services, which helps minimize code replication and allows the developer of a simulated device to focus on capturing device behaviour.
Potential use cases for detailed device simulators include:
- Replacing the physical device when developing and testing software that interfaces with the device
- Testing failure conditions without risking damage to the physical device
- Automated system and unit tests of software that communicates with the device
- Perform "dry runs" against test scripts that are to be run on the real device
Using a simulation for the above has the added benefit that, unlike most real devices, a simulation may be sped up / fast-forwarded past any lengthy delays or processes that occur in the device.
Features
Brief Terminology
Device\ s and Interface\ s are two independent concepts in
Lewis. The Device is model for the device behaviour and internal
memory. A Device can be represented using a StateMachine, but it
does not have to be. A Device does not include anything specific to
the communication protocol with the Device. An Interface
provides bindings from a protocol Adapter to a Device.
Common Adapter\ s, , such as TCP stream, Modbus and EPICS, are provided
by Lewis. The Device and Interface are instantiated as part of a
Simulation that provides a cycle "heart beat" and manages other
environmental aspects and services.
What Can You Do With Lewis?
- Create new
Device\ s to closely imitate the internal behaviour and memory of something - Optionally make a
Devicework as aStateMachineviaStateMachineDeviceto give rich behaviours - Create one or more
Interface\ s over yourDeviceto expose it as an EPICS IOC, a TCP listener, or on any other bespoke protocol you like - Access and control the
Devicewhile it is running via a control server - Access and control the
Simulationwhile it is running via a control server - Control server can be accessed via command-line utility, Python bindings, or JSON RPC.
Metadata
Release files for lewis 1.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| lewis-1.4.0.tar.gz | 237.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| lewis-1.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 503.8 kB
Release files / lewis-1.4.0.tar.gz
| Download URL | lewis-1.4.0.tar.gz |
|---|---|
| Size | 237.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fd165f558e69a6447b66089bf055290f6c2c4be7db604e20bde2337df87036f0
|
|
BLAKE2b-256 checksum How to use checksums |
795271dc416d28884a04e2a879632a639f8fd1648916ea02dac1bfb425b5e592
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 25, 2026.
Transparency logRelease files / lewis-1.4.0-py3-none-any.whl
| Download URL | lewis-1.4.0-py3-none-any.whl |
|---|---|
| Size | 266.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
954baf2c53e9fa51a946e0132d3732ce1f643df7103530ae942c22bf33bcbdb0
|
|
BLAKE2b-256 checksum How to use checksums |
adc2a4e8c2fc239a028c673f66ae7ca890d0a83288bde70b8a7cf83b91c0f2c6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 25, 2026.
Transparency log