Daten aus Python & MATLAB importieren
ScryLab stellt eine REST API auf http://localhost:5678 bereit, über die sich Signale aus Python, MATLAB oder jeder anderen Umgebung direkt importieren lassen – alle Parameter und Fehlercodes in der API-Referenz.
Voraussetzung: API erreichbar?
Stellen Sie sicher, dass ScryLab läuft und die API antwortet, bevor Sie Daten senden.
import requests
response = requests.get("http://localhost:5678/api/status")print(response.json())# {"status": "running", "port": 5678}response = webread('http://localhost:5678/api/status');disp(response.status) % runningcurl http://localhost:5678/api/status# {"status": "running", "port": 5678}Schritt 1: Datenquelle-ID ermitteln
Jedes Signal gehört zu einer Datenquelle. Sie benötigen deren ID, bevor Sie Daten senden können.
Option A – vorhandene Datenquelle verwenden
import requests
response = requests.get("http://localhost:5678/api/sources")sources = response.json()["result"]
for source in sources: print(f"{source['name']}: {source['source_id']}")
# Gewünschte Source-ID aus der Liste heraussuchen:source_id = sources[0]["source_id"]response = webread('http://localhost:5678/api/sources');sources = response.result;
for i = 1:length(sources) fprintf('%s: %s\n', sources(i).name, sources(i).source_id);end
% Gewünschte Source-ID aus der Liste heraussuchen:source_id = sources(1).source_id;curl http://localhost:5678/api/sources | jq '.result[] | "\(.name): \(.source_id)"'Option B – neue Datenquelle anlegen
import requests
response = requests.post( "http://localhost:5678/api/sources", json={"name": "Meine Messungen"})source_id = response.json()["result"]["source_id"]print(f"Neue Datenquelle: {source_id}")response = webwrite('http://localhost:5678/api/sources', ... struct('name', 'Meine Messungen'));source_id = response.result.source_id;fprintf('Neue Datenquelle: %s\n', source_id);SOURCE_ID=$(curl -s -X POST http://localhost:5678/api/sources \ -H "Content-Type: application/json" \ -d '{"name": "Meine Messungen"}' | jq -r '.result.source_id')echo "Neue Datenquelle: $SOURCE_ID"Alternativ können Sie auch eine neue Datenquelle über die Benutzeroberfläche anlegen und deren ID im Data Source Browser ablesen (siehe Datenquellen importieren).
Schritt 2: Signale senden
ScryLab unterstützt zwei Übertragungsarten:
- JSON inline – Daten direkt im Request-Body
- Dateiverweis – Pfad zu
.npzoder.matDatei
Performance-Vergleich (1M Samples, float64)
| Methode | Payload-Größe | Parse-Zeit | Empfohlen für |
|---|---|---|---|
| JSON inline | ~16 MB | ~500 ms | < 50k Samples |
| Dateiverweis | ~4–8 MB | ~20 ms | > 50k Samples |
Übertragungsart 1: JSON inline
Übergeben Sie die Signaldaten direkt im Request-Body als Arrays.
Wenn kein x-Array angegeben wird, generiert ScryLab automatisch eine Ganzzahl-Achse (0, 1, 2, …).
import numpy as npimport requests
BASE_URL = "http://localhost:5678"# source_id ← aus Schritt 1
t = np.linspace(0, 1, 1000)y = np.sin(2 * np.pi * 5 * t)
response = requests.post( f"{BASE_URL}/api/signals/send", json={ "name": "Sinus 5Hz", "y": y.tolist(), "x": t.tolist(), "y_unit": "V", "x_unit": "s", "target_source_id": source_id })
print(response.json())# {'status': 'ok', 'result': {'name': 'Sinus 5Hz', 'sample_count': 1000, ...}}BASE_URL = 'http://localhost:5678';% source_id ← aus Schritt 1
t = linspace(0, 1, 1000);y = sin(2*pi*5*t);
body = struct('name', 'Sinus 5Hz', 'y', y, 'x', t, ... 'y_unit', 'V', 'x_unit', 's', ... 'target_source_id', source_id);response = webwrite([BASE_URL '/api/signals/send'], body);disp(response)curl -s -X POST http://localhost:5678/api/signals/send \ -H "Content-Type: application/json" \ -d "{ \"name\": \"Sinus 5Hz\", \"y\": [0, 0.841, 0.909, 0.141, -0.756], \"x\": [0, 0.25, 0.5, 0.75, 1.0], \"y_unit\": \"V\", \"x_unit\": \"s\", \"target_source_id\": \"$SOURCE_ID\" }"Übertragungsart 2: Dateiverweis
Für große Signale speichern Sie die Daten in einer .npz- oder .mat-Datei und senden nur den Pfad. Die Arrays müssen y, x (und optional z) heißen – die Datei wird nach dem Import automatisch gelöscht.
import numpy as npimport requests
FILE_PATH = "/home/user/data/signal.npz" # ← anpassen
# Datei vorbereiten (Arrays müssen y, x heißen)t = np.linspace(0, 1, 1_000_000)y = np.sin(2 * np.pi * 5 * t)np.savez(FILE_PATH, y=y, x=t)
# Nur den Pfad schicken – nicht den InhaltBASE_URL = "http://localhost:5678"# source_id ← aus Schritt 1
response = requests.post( f"{BASE_URL}/api/signals/send", json={ "name": "Großes Signal", "file": FILE_PATH, "y_unit": "V", "x_unit": "s", "target_source_id": source_id })print(response.json())FILE_PATH = '/home/user/data/signal.mat'; % ← anpassen
% Datei vorbereiten (Variablen müssen y, x heißen)t = 0:1e-6:1;y = sin(2*pi*5*t);x = t;save(FILE_PATH, 'y', 'x');
% Nur den Pfad schickenBASE_URL = 'http://localhost:5678';% source_id ← aus Schritt 1
body = struct('name', 'Großes Signal', ... 'file', FILE_PATH, ... 'y_unit', 'V', 'x_unit', 's', ... 'target_source_id', source_id);response = webwrite([BASE_URL '/api/signals/send'], body);disp(response)FILE_PATH="/home/user/data/signal.npz" # ← anpassen
curl -s -X POST http://localhost:5678/api/signals/send \ -H "Content-Type: application/json" \ -d "{ \"name\": \"Großes Signal\", \"file\": \"$FILE_PATH\", \"y_unit\": \"V\", \"x_unit\": \"s\", \"target_source_id\": \"$SOURCE_ID\" }"Linux Flatpak-User
ScryLab Flatpak hat --filesystem=home – Pfade unter ~/ funktionieren. /tmp/ ist nicht geteilt (Sandbox-privat). Verwenden Sie ~/.cache/scrylab/ als temporären Speicher.
Verlaufslinie und Spektrogramm
Durch ein z-Feld lassen sich Signale mit einer dritten Dimension darstellen.
Verlaufslinie (1D Z-Achse)
Aktuell noch nicht implementiert
Die 1D-Z-Achse wird derzeit nicht unterstützt, da die Farbcodierung von Datenpunkten in Linienplots noch in Entwicklung ist.
Ein 1D z-Array gleicher Länge wie x und y – jeder Datenpunkt erhält einen Farbwert.
import numpy as npimport requests
BASE_URL = "http://localhost:5678"# source_id ← aus Schritt 1
t = np.linspace(0, 10, 500)y = np.sin(t)z = np.abs(y) # z.B. Temperatur entlang der Kurve
response = requests.post( f"{BASE_URL}/api/signals/send", json={ "name": "Verlaufssinus", "y": y.tolist(), "x": t.tolist(), "z": z.tolist(), "y_unit": "V", "x_unit": "s", "z_unit": "°C", "target_source_id": source_id })print(response.json())BASE_URL = 'http://localhost:5678';% source_id ← aus Schritt 1
t = linspace(0, 10, 500);y = sin(t);z = abs(y);
body = struct('name', 'Verlaufssinus', 'y', y, 'x', t, 'z', z, ... 'y_unit', 'V', 'x_unit', 's', 'z_unit', '°C', ... 'target_source_id', source_id);response = webwrite([BASE_URL '/api/signals/send'], body);disp(response)Spektrogramm (2D Z-Matrix)
Eine 2D-Matrix z der Form (M, N) mit y als Frequenzachse (Länge M) und x als Zeitachse (Länge N).
import numpy as npimport requests
BASE_URL = "http://localhost:5678"# source_id ← aus Schritt 1
freqs = np.linspace(0, 1000, 128) # M = 128 Frequenzbinstimes = np.linspace(0, 5, 256) # N = 256 Zeitschrittez_matrix = np.random.rand(128, 256) # Shape: (len(y), len(x))
response = requests.post( f"{BASE_URL}/api/signals/send", json={ "name": "Spektrogramm", "y": freqs.tolist(), "x": times.tolist(), "z": z_matrix.tolist(), "y_unit": "Hz", "x_unit": "s", "z_unit": "dB", "target_source_id": source_id })print(response.json())BASE_URL = 'http://localhost:5678';% source_id ← aus Schritt 1
freqs = linspace(0, 1000, 128);times = linspace(0, 5, 256);z_matrix = rand(128, 256);
body = struct('name', 'Spektrogramm', 'y', freqs, 'x', times, 'z', z_matrix, ... 'y_unit', 'Hz', 'x_unit', 's', 'z_unit', 'dB', ... 'target_source_id', source_id);response = webwrite([BASE_URL '/api/signals/send'], body);disp(response)