Data Format
EEG Frame
Every frame from the WebSocket is a JSON object:
{ "t": 1711234567.123, "n": 42, "channels": [12.34, -5.67, 8.90, ...] }| Field | Type | Description |
|---|---|---|
t | float | Unix timestamp (seconds, 6-decimal precision) |
n | int | Sample number (monotonic, incremental) |
channels | float[] | µV per channel — 8 elements for pieeg8 / ironbci8, 16 for pieeg16 (default) |
Frequency Bands
| Band | Range | Color |
|---|---|---|
| Delta (δ) | 0.5–4 Hz | #8b5cf6 purple |
| Theta (θ) | 4–8 Hz | #06b6d4 cyan |
| Alpha (α) | 8–13 Hz | #22c55e green |
| Beta (β) | 13–30 Hz | #f59e0b amber |
| Gamma (γ) | 30–100 Hz | #ef4444 red |
FFT Output
256-point Cooley-Tukey radix-2 FFT with Hanning window:
- FFT Size: 256 samples ≈ 1.024 seconds at 250 Hz
- Frequency resolution: 250 Hz / 256 = ~0.977 Hz per bin
- Output bins: 129 frequency bins (0 to 125 Hz)
- Output PSD: µV²/Hz (absolute units, not dB)
TypeScript Types
Core EEG
interface EEGData {
buffers: MutableRefObject<Float32Array[]>;
writeIndex: MutableRefObject<number>;
samplesInBuffer: MutableRefObject<number>;
bufferSize: number;
numChannels: number;
gridSuspended: boolean;
}
interface FFTResult {
frequencies: Float64Array;
psd: Float64Array;
bandPowers: BandPowers;
dominantFrequency: number;
totalPower: number;
}
type BandPowers = Record<"Delta" | "Theta" | "Alpha" | "Beta" | "Gamma", number>;Webhook Types
type TriggerType =
| "band_power_above" | "band_power_below"
| "amplitude_above" | "amplitude_below"
| "band_ratio_above" | "band_ratio_below";
type Band = "delta" | "theta" | "alpha" | "beta" | "gamma";
interface WebhookRule {
id: string;
name: string;
enabled: boolean;
trigger_type: TriggerType;
params: Record<string, unknown>;
url: string;
method: string;
headers: Record<string, string>;
cooldown: number;
last_fired: number;
fire_count: number;
}
interface WebhookEvent {
rule_id: string;
rule_name: string;
trigger_type: string;
value: number;
threshold: number;
ts: number;
}