led-ctrl-v3
LED-Ring-Steuerung für den reSpeaker XVF3800 — das LEFX-V3-System.
pip install led-ctrl-v3
Das ist die Normalversion und für sich vollständig: Schema, Laufzeit,
Steuerungsoberfläche, die Hardware-Anbindung und beide Effektkataloge. Sie
spielt fertige .lefx- und .lefxset-Dateien auf einem reSpeaker ab und
braucht keines der optionalen Pakete.
lefx serve --sink respeaker
lefx list states
lefx set state listening
lefx emit event notification
Optionen
pip install "led-ctrl-v3[simulated-respeaker]" # Software-Geräteersatz mit Ringfenster
pip install "led-ctrl-v3[effect-creation]" # Effekte erstellen: lefx-pack und lefx-studio
pip install "led-ctrl-v3[all]" # beides
Beide sind eigene Distributionen, keine Schalter. Was nicht installiert ist, existiert im laufenden System nicht — Geräte werden über Entry Points gefunden, nicht importiert.
Ohne Hardware:
pip install "led-ctrl-v3[simulated-respeaker]"
lefx-simulator
lefx serve --sink simulator
Was drin ist
| Modul | Rolle |
|---|---|
lefx.sdk |
Der Vertrag zwischen Effektpaketen und der Engine |
lefx.engine |
Layer, Komposition, Lebenszyklen, Registry, Paketformat lefx/3 |
lefx.interfaces |
HTTP-API v3, CLI, Client, Prozess-Hosting, Konfiguration |
lefx.device.respeaker |
USB-Transport, LED-Senke, DoA-Provider |
lefx.sets.core_set |
Referenzkatalog, gebaut als .lefxset |
lefx.sets.smartspeaker_set |
Sprachassistenz-Katalog |
lefx.sdk ist das Einzige, was ein Effektautor importiert: die
typ-spezifischen Definitionsklassen, die Parametertypen und ihre
Zulässigkeitsregeln, die kanonische Wertnormalisierung, die Farbmathematik, die
Kontexte und die Ports FrameSink und InputProvider. Es hängt an nichts. Eine
ungültige Definition ist nicht konstruierbar — geprüft wird im Konstruktor,
nicht in einem eigenen Validierungsschritt.
lefx.engine kennt Typen, Lebenszyklen und Layer, aber niemals eine
konkrete Definition-ID: Layerstapel und Komposition, die vier Lebenszyklusformen,
die Event-Warteschlange mit Priorität und FIFO, Runtime-Eingaben mit
Input-Health, die Registry und das Laden von lefx/3- und lefxset/3-Paketen.
lefx.interfaces trägt CLI und HTTP-API mit denselben Kommandos; keine der
beiden hat eigene Fachlogik. Dazu der Client, das Prozess-Hosting und die
Konfiguration.
Effektsätze
Beide Kataloge sind enthalten. Welche geladen werden, entscheidet
included_lefxset:
included_lefxset: [core, smartspeaker]
INCLUDED_LEFXSET=[core] lefx serve --sink respeaker
Leer heißt: alle. Namen dürfen mit oder ohne -set-Suffix geschrieben werden.
Konfiguration
Alles Projektweite steht in einer config.yaml im Arbeitsverzeichnis, unter
~/.lefx/config.yaml, oder wohin LEFX_CONFIG zeigt. Jeder Schlüssel lässt
sich als Umgebungsvariable in Großbuchstaben überschreiben — mit LEFX_-Präfix
oder ohne; ein Kommandozeilenschalter schlägt beides.
led_count: 12
sink: respeaker
port: 8765
included_lefxset: [core, smartspeaker]
lefx config zeigt, welcher Wert gerade gilt und woher er kommt.
Wenn das Gerät belegt ist
Ein WinUSB-Handle ist exklusiv. Ein zweiter Prozess reiht sich nicht ein, er
bekommt Errno 13 — das liest sich wie ein Treiber- oder Rechteproblem und
schickt einen in die falsche Richtung. Meistens läuft schlicht noch ein anderer
Controller.
lefx-respeaker probe
probe sagt, ob das Gerät ansprechbar ist, und listet andernfalls die Prozesse,
die ein USB-Gerät halten — mit Kommandozeile, denn erfahrungsgemäß heißen alle
Kandidaten python.exe.
lefx-respeaker claim --dry-run
claim beendet, was im Weg steht, und prüft danach nach. Zwei Dinge begrenzen
den Schaden:
- Es wird einzeln beendet und nach jedem Schritt neu geprüft. Sobald das Gerät antwortet, hört es auf. Der Prozess, der wirklich im Weg war, ist damit der letzte, den es trifft.
- Fremde USB-Software wird nicht angefasst. Maus-, Tastatur- und
RGB-Software hält dauerhaft offene WinUSB-Handles und taucht in derselben
Suche auf. Sie wird aufgelistet und in Ruhe gelassen; nur Prozesse, die sich
als reSpeaker-Software zu erkennen geben, kommen in Frage.
--include-unrelatedhebt das auf — bewusst und einzeln.
Im Dienst ist dasselbe als Senken-Option verfügbar:
lefx serve --sink respeaker --sink-option force_claim=true
Eine Senken-Option und kein lefx-Schalter, weil lefx nichts über reSpeaker
wissen soll. Der Transport ruft es höchstens einmal pro Verbindungszyklus
auf, nur bei einem Zugriffsfehler: der Wiederholungsversuch läuft alle paar
Sekunden, und etwas, das in diesem Takt Prozesse beendet, wäre eine Plage. Ein
fehlendes Gerät gilt nicht als Konkurrenz — ein gezogenes Kabel ist kein fremder
Prozess.
Release files for led-ctrl-v3 3.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| led_ctrl_v3-3.0.1.tar.gz | 187.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| led_ctrl_v3-3.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 397.1 kB
Release files / led_ctrl_v3-3.0.1.tar.gz
| Download URL | led_ctrl_v3-3.0.1.tar.gz |
|---|---|
| Size | 187.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e7a8a1becfc61c3f9aa6dd51f6ec2834ce191e320fd85450e45d1d1931a1f93b
|
|
BLAKE2b-256 checksum How to use checksums |
4bbbe1ea5a130e3f1640ec7914854d15457b1717b04fc98d841724506dd73185
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / led_ctrl_v3-3.0.1-py3-none-any.whl
| Download URL | led_ctrl_v3-3.0.1-py3-none-any.whl |
|---|---|
| Size | 209.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0fdf9c25a13fd254b0e32d8c4f21394ea0cb00ad56931d28e0225e47973e955f
|
|
BLAKE2b-256 checksum How to use checksums |
7ae240a8fa95247b7f2ec361d83fd967d5618aaf076c9484ce57d6b2428fc674
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|