Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyjeti-0.1.0.tar.gz (6.5 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyjeti-0.1.0-py3-none-any.whl (6.6 MB view details)

Uploaded Python 3

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

Hashes for pyjeti-0.1.0.tar.gz
Algorithm Hash digest
SHA256 577a07c7bfeb1a936479ff3ae0cebd5541daf89d41261c6ebccda7c66bf30ddf
MD5 bbe70def89a8676942bf3b3c3819bb43
BLAKE2b-256 4ca3112bea638d250d6d46d7cfedf0910e1fd064b9d6884785e1f5d80570a694

See more details on using hashes here.

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

Hashes for pyjeti-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8d9f03a0813e6d73b8d77328162ba6f1aa8afe2bc7f51574d39bec33f89cc1a6
MD5 78cff7275685511f5ca540f982e499b2
BLAKE2b-256 80384a69c64d791c73a4a40e8bf83b4e02bbeee98b12af74587b4ce35aa0ddbf

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page