signalino
signalino is the high-level Python API for Signalino 4 EEG devices. It wraps
the Signalino board implemented in BrainFlow and adds a non-destructive sample
buffer, typed battery and impedance results, Lab Streaming Layer publishing,
and conversion to MNE-Python.
This is research software. It is not a medical device and must not be used for diagnosis or patient monitoring.
Installation
Linux x86_64 (Intel/AMD 64-bit)
Python 3.10+ and glibc 2.35+ are required for the current Linux wheels.
python -m pip install --upgrade signalino
Starting with 0.1.2, this installs brainflow-signalino==0.1.0 automatically.
It contains the compiled Signalino driver and uses the brainflow_signalino
Python module, so it can coexist with official brainflow without overwriting
files. No compiler, CMake or private repository access is required.
ARM/Raspberry Pi, Alpine/musl and older glibc are not covered by these wheels.
USB/RFCOMM permissions and Bluetooth adapter setup remain host OS requirements.
macOS and Windows
Precompiled brainflow-signalino wheels are not available for these platforms
in this release. Keep using the existing Signalino-enabled BrainFlow build from
JABarios/brainflow-signalino.
The wrapper uses the existing brainflow module on these platforms. Official
BrainFlow alone does not yet include board 69; a matching native build is needed.
Optional integrations and examples
python -m pip install 'signalino[viewer]'
python -m pip install 'signalino[lsl]'
python -m pip install 'signalino[mne]'
Examples live in this repository's examples/ directory and are not included
in the installed wheel. examples/check_import.py does not connect hardware.
For development, install .[dev,all] and run pytest.
USB
import time
from signalino import Signalino
with Signalino.usb() as device: # Automatically chooses the most probable port
device.start_streaming()
time.sleep(2)
eeg_uv = device.get_data()
print(eeg_uv.shape) # (8, approximately 500)
Use COM3-style names on Windows and /dev/ttyACM0-style names on Linux.
Pass one explicitly as Signalino.usb("/dev/cu.usbmodem1101") when needed.
Discovery only examines port names and USB descriptors; it does not open ports.
Use find_usb_ports() to display every probable candidate. If two devices are
equally likely, automatic selection refuses to guess.
Bluetooth LE
from signalino import Signalino
device = Signalino.ble("Signalino-852960")
device.connect()
device.start_streaming()
When only one Signalino is advertising, Signalino.ble() lets BrainFlow choose
it automatically. Provide the advertised name whenever multiple devices may be
present.
Bluetooth Classic
Signalino devices fitted with an HC-06 appear as a serial port after pairing. The example can locate a probable paired port automatically:
python examples/basic_classic_bluetooth.py
The example automatically selects a probable Signalino port. Pass the port as
an argument if several paired devices are plausible. On Linux the port is
commonly /dev/rfcomm0; on Windows it is a COM port. On macOS the example
uses the RFCOMM bridge bundled with Signalino Suite.
Measure the effective rate and detect packet-counter gaps over 30 seconds:
python examples/measure_classic_bluetooth.py
Live viewer
Install the viewer extra and open the eight-channel rolling display:
python -m pip install "matplotlib>=3.9,<4"
python examples/live_viewer.py
Bluetooth Classic is selected by default. Use --transport usb or
--transport ble for the other connections. Press Space to pause the display
without stopping acquisition, and press Q or Escape to close it.
Data
get_data() returns a NumPy array in microvolts with shape
(channels, samples). Data is consumed oldest first by default:
latest_copy = device.get_data(250, clear=False)
oldest_consumed = device.get_data(250)
For timestamps, use get_data_batch():
batch = device.get_data_batch()
print(batch.samples_uv.shape)
print(batch.timestamps)
The package continuously drains BrainFlow into its own bounded buffer. LSL and
get_data() therefore receive the same samples without stealing data from one
another.
Public API
The stable top-level API is:
Signalino.usb(...) / Signalino.ble(...)
find_usb_port() / find_usb_ports()
connect() / disconnect()
start_streaming() / stop_streaming()
get_data() / get_data_batch() / clear_data()
battery() / impedance()
start_lsl() / stop_lsl()
to_mne()
Public result types and exceptions are importable directly from signalino.
Implementation modules whose names begin with an underscore are private.
Battery
status = device.battery()
print(status.volts, status.percent, status.charging)
With the current USB BrainFlow bridge, battery replies cannot be collected while binary EEG is streaming. Stop USB streaming before refreshing the value. BLE uses a separate control characteristic and can refresh battery state while EEG is active.
Impedance
reading = device.impedance()
print(reading.kiloohms)
The ADS1299 cannot emit normal EEG while measuring impedance. If streaming is
active, impedance() pauses EEG, takes one reading, exits impedance mode, and
restores both EEG acquisition and the previous LSL outlet. This produces a
short, timestamp-visible gap by design.
LSL
device.start_streaming()
stream = device.start_lsl()
print(stream.name, stream.source_id)
The outlet contains eight float32 EEG channels in microvolts. It is closed
automatically before acquisition stops, so Signalino never leaves an advertised
but empty LSL stream behind.
MNE
raw = device.to_mne(clear=False)
print(raw.info["sfreq"])
MNE stores EEG in volts; conversion from Signalino's microvolts is automatic.
Pass an MNE montage with device.to_mne(montage=montage) when channel names have
been assigned to physical electrode positions.
Development and release checks
ruff check .
ruff format --check .
pytest --cov=signalino
python -m build
python -m twine check dist/*
Building creates an sdist and a platform-independent wheel. Publishing is deliberately not part of the build process.
License
MIT
Release files for signalino 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| signalino-0.1.2.tar.gz | 24.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| signalino-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size:41.1 kB
Release files / signalino-0.1.2.tar.gz
| Download URL | signalino-0.1.2.tar.gz |
|---|---|
| Size | 24.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bdd42f752297a46e8b1a20e34873862e5f0eaa8846ece16ceec0827d0162ffdc
|
|
BLAKE2b-256 checksum How to use checksums |
ddc6c6382720b7a96947330cd0764eca0f82169122f4a156ceabf28c50a0d9ca
|
| 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 Sep 12, 2026.
Transparency logRelease files / signalino-0.1.2-py3-none-any.whl
| Download URL | signalino-0.1.2-py3-none-any.whl |
|---|---|
| Size | 16.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dd7446b6ad8dfb657d8eec88de54f5eff89d28d0dbf864c3b79952ed6455c8d7
|
|
BLAKE2b-256 checksum How to use checksums |
c69c6de9b28d0f9c883f39a5247f1038413ec9cdc379b5528e9fd7439cdf7e6b
|
| 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 Sep 12, 2026.
Transparency log