OpenMoRFeus
Open implementation and technical documentation for controlling the
Outernet moRFeus RF generator and frequency mixer through USB HID.
Installation
OpenMoRFeus requires Python 3.10 or newer.
Command-line interface
Install the driver and CLI directly from PyPI:
python3 -m pip install openmorfeus
openmorfeus --help
Graphical interface
Install the optional PyQt6 graphical interface:
python3 -m pip install 'openmorfeus[gui]'
openmorfeus-gui
Using a Python virtual environment is recommended:
python3 -m venv .venv
.venv/bin/python -m pip install --upgrade pip
.venv/bin/python -m pip install 'openmorfeus[gui]'
Development installation
Contributors can install the repository in editable mode:
git clone https://github.com/davidaguirresalcedo/OpenMoRFeus.git
cd OpenMoRFeus
python3 -m venv .venv
.venv/bin/python -m pip install -e '.[gui]'
USB access without root privileges
OpenMoRFeus includes a udev rule for the Outernet moRFeus USB HID
identifiers 10c4:eac9.
Install it with:
sudo install -m 0644 packaging/udev/99-openmorfeus.rules /etc/udev/rules.d/99-openmorfeus.rules
sudo udevadm control --reload-rules
sudo udevadm trigger
Disconnect and reconnect the moRFeus after installing the rule.
The device can then be accessed without running the Python application as root.
Project objectives
- Document the moRFeus USB HID protocol.
- Provide a modern Python API.
- Provide a command-line interface.
- Restore compatibility with legacy software.
- Integrate moRFeus into automated RF test benches.
Current status
- USB device enumeration confirmed.
- HID read communication confirmed.
- HID write communication confirmed.
- Frequency control confirmed.
- GET frame format documented.
- SET frame format documented.
- Function selectors 0x81 through 0x85 validated.
- Textual error response observed.
- Modern Python driver.
- Command-line interface.
- Responsive PyQt6 graphical interface.
- Safe frequency sweep generator with automatic restoration.
- Automated unit tests and GitHub Actions CI.
- Legacy morfeus_tool compatibility layer.
- Automated hardware-in-the-loop tests with a physical moRFeus.
- RF laboratory integration.
Device identity
| Property | Value |
|---|---|
| Manufacturer | Outernet |
| Product | moRFeus |
| USB Vendor ID | 0x10C4 |
| USB Product ID | 0xEAC9 |
| USB class | HID |
Repository layout
OpenMoRFeus/
- README.md
- docs/
- HID_PROTOCOL_SPEC.md
- ENGINEERING_LOG.md
- experiments/
- src/
- openmorfeus/
- init.py
- openmorfeus/
- tests/
Safety note
Selector 0x86, historically named Firmware Mode, has not been tested with a SET operation. It may cause a reset or place the device in a firmware-update state. It must not be exercised until a recovery procedure is established.
License
OpenMoRFeus is released under the MIT License. See
LICENSE for the complete terms.
Command-line interface
OpenMoRFeus includes a command-line interface for the documented moRFeus controls.
openmorfeus state
openmorfeus get frequency
openmorfeus get mode
openmorfeus set frequency 1350MHz
openmorfeus set mode generator
openmorfeus set mixer-current 0
openmorfeus set bias-tee off
openmorfeus set lcd-timeout always-on
Bare frequency values are interpreted as MHz. Explicit Hz,
kHz, MHz, and GHz units are supported.
The historical selectors 0x00 and 0x86 are intentionally not
exposed.
Graphical interface
Install the optional PyQt6 dependency and launch the GUI:
python3 -m pip install 'openmorfeus[gui]'
openmorfeus-gui
Hardware transactions run outside the graphical event loop.
The GUI exposes only the documented controls. Historical
selectors 0x00 and 0x86 remain unavailable.
Sweep generator
The graphical interface includes a responsive frequency-sweep dialog with:
- validated start, stop, and step frequencies;
- configurable dwell time;
- live progress and current-frequency display;
- pause, resume, and stop control;
- automatic restoration of the initial frequency.
The sweep runs outside the Qt event thread. Closing the dialog during execution requests a controlled stop before the window is closed.
Metadata
Release files for openmorfeus 0.3.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| openmorfeus-0.3.4.tar.gz | 27.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| openmorfeus-0.3.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 51.7 kB
Release files / openmorfeus-0.3.4.tar.gz
| Download URL | openmorfeus-0.3.4.tar.gz |
|---|---|
| Size | 27.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
17cff0c24b4dee23958221a30565727640313de251f1c3fae2deefb554345548
|
|
BLAKE2b-256 checksum How to use checksums |
52b001b00d2f1c576de1f07700130bd892a9268980877ed5c41ad23ec5abaac5
|
| 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 3, 2026.
Transparency logRelease files / openmorfeus-0.3.4-py3-none-any.whl
| Download URL | openmorfeus-0.3.4-py3-none-any.whl |
|---|---|
| Size | 24.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
022f56052c7ed475e2ee82ddf3a3ae63954b79455ae1da033406878d171010c8
|
|
BLAKE2b-256 checksum How to use checksums |
3b9c4ac2775906c2ab38c72a1126616d7d106c26b22e7304cab20311d9592454
|
| 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 3, 2026.
Transparency log