Python interface for the JETI specbos 1201 and 1211 spectroradiometers
Project description
PyJETI
Python interface for the JETI specbos 1201 (tested) and JETI specbos 1211 (untested) spectroradiometers on Windows.
The package bundles the JETI RadioEx SDK DLLs so no separate SDK installation is needed. See License for details.
Requirements
- Windows (32-bit or 64-bit)
- Python ≥ 3.10
- FTDI D2XX USB driver — typically installed automatically by Windows when you first connect the instrument. If measurements fail or no devices are detected, download the driver manually from ftdichip.com/drivers/d2xx-drivers.
Installation
pip install pyjeti
Or directly from GitHub:
pip install git+https://github.com/SBelgers/pyjeti.git@main
Quick Start
from pyjeti.jeti import Spectrometer
with Spectrometer() as jeti:
print("DLL version:", jeti.get_dll_version())
print("Connected devices:", jeti.count_connected_devices())
serials = jeti.get_serial()
print("Board serial: ", serials["board_serial"])
print("Spectrometer serial:", serials["spec_serial"])
print("Device serial: ", serials["device_serial"])
spd = jeti.measure()
print("Wavelengths (nm): ", spd[0])
print("Irradiance (W/m²/nm):", spd[1])
API Reference
Spectrometer(radio_ex_dll_path=None, simulate=False)
Create a spectrometer handle. Intended to be used as a context manager so the device connection is properly opened and closed.
| Parameter | Type | Default | Description |
|---|---|---|---|
radio_ex_dll_path |
str | None |
None |
Path to a custom jeti_radio_ex64.dll. Uses the bundled DLL when None. |
simulate |
bool |
False |
Simulation mode — no hardware required; returns random spectral data. |
Methods
| Method | Returns | Description |
|---|---|---|
open(device_id=0) |
None |
Open connection to the device. Called automatically by the context manager. |
close() |
None |
Close the connection. Called automatically by the context manager. |
get_dll_version() |
tuple[int, int, int] |
JETI RadioEx DLL version (major, minor, build). |
count_connected_devices() |
int |
Number of connected JETI specbos devices. |
get_serial(device_id=0) |
dict |
Serial numbers: keys board_serial, spec_serial, device_serial. |
measure(integration_time_ms=0, averaging=1, step_nm=1) |
np.ndarray |
2×N array of [wavelengths_nm, irradiance_W_m2_nm]. |
validate_device_id(device_id) |
bool |
Raises if the device ID is out of range. |
measure() parameters
| Parameter | Default | Description |
|---|---|---|
integration_time_ms |
0 |
Integration time in ms. 0 triggers auto-exposure. |
averaging |
1 |
Number of measurements to average. |
step_nm |
1 |
Wavelength step size in nm. 1 gives 401 points (380–780 nm). |
Return value of measure()
A (2, N) NumPy array:
spd = jeti.measure()
wavelengths = spd[0] # e.g. [380., 381., ..., 780.] nm
irradiance = spd[1] # W m⁻² nm⁻¹
Simulation Mode
Useful for development and testing without hardware:
with Spectrometer(simulate=True) as jeti:
spd = jeti.measure()
print(spd.shape) # (2, 401)
All methods work in simulation mode but return placeholder or random data and
emit a UserWarning.
Hardware Notes
specbos 1201
Handheld spectroradiometer, 380–780 nm, 1 nm resolution. Fully tested.
specbos 1211
Similar form factor with extended UV/NIR range. The same API applies, but
untested. The current measure() implementation hardcodes 380–780 nm, so
wavelengths outside that range will not be captured.
Troubleshooting
count_connected_devices() returns 0
→ The FTDI D2XX USB driver may be missing. Download from
ftdichip.com/drivers/d2xx-drivers
and install, then reconnect the instrument.
DLL load error / OSError on import
→ If you have a newer version of the JETI SDK installed, pass the path to its
DLL explicitly:
Spectrometer(radio_ex_dll_path=r"C:\path\to\jeti_radio_ex64.dll")
Error code exceptions
All JETI error codes are mapped to descriptive messages. The exception text
includes the hex code, name, and description, e.g.:
Error: 0x03 (JETI_ERR_DEVICE_NOT_OPEN - Device handle is invalid).
License
The Python source code is released under the MIT License (see LICENSE).
The JETI RadioEx SDK DLLs in pyjeti/jeti_drivers/ are governed by the
JETI SDK EULA.
Distribution as part of an integrated software product is permitted under
clause 2a of that agreement. You may not disassemble, decompile,
reverse-engineer, transfer, modify, sell, lease, or sublicense those DLLs.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyjeti-0.1.0.tar.gz.
File metadata
- Download URL: pyjeti-0.1.0.tar.gz
- Upload date:
- Size: 6.5 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
577a07c7bfeb1a936479ff3ae0cebd5541daf89d41261c6ebccda7c66bf30ddf
|
|
| MD5 |
bbe70def89a8676942bf3b3c3819bb43
|
|
| BLAKE2b-256 |
4ca3112bea638d250d6d46d7cfedf0910e1fd064b9d6884785e1f5d80570a694
|
File details
Details for the file pyjeti-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pyjeti-0.1.0-py3-none-any.whl
- Upload date:
- Size: 6.6 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8d9f03a0813e6d73b8d77328162ba6f1aa8afe2bc7f51574d39bec33f89cc1a6
|
|
| MD5 |
78cff7275685511f5ca540f982e499b2
|
|
| BLAKE2b-256 |
80384a69c64d791c73a4a40e8bf83b4e02bbeee98b12af74587b4ce35aa0ddbf
|