onairscreen:manual-de

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
onairscreen:manual-de [20.09.2026 05:18] – external edit 127.0.0.1onairscreen:manual-de [27.09.2026 02:22] (current) – external edit 127.0.0.1
Line 2: Line 2:
 # OnAirScreen – Bedienungsanleitung # OnAirScreen – Bedienungsanleitung
  
-**Version:** 1.0.7  +**Version:** 1.0.10  
 **Autor:** Sascha Ludwig, [astrastudio.de](http://www.astrastudio.de)   **Autor:** Sascha Ludwig, [astrastudio.de](http://www.astrastudio.de)  
 **Projekt:** [OnAirScreen](https://www.astrastudio.de/onairscreen/)   **Projekt:** [OnAirScreen](https://www.astrastudio.de/onairscreen/)  
Line 41: Line 41:
 - **Fernsteuerung** per Tastatur, Maus (Doppelklick/Rechtsklick/Lang-Klick), UDP, HTTP, Web-UI, MQTT, OSC, SNMP, REST-API und Bitfocus Companion - **Fernsteuerung** per Tastatur, Maus (Doppelklick/Rechtsklick/Lang-Klick), UDP, HTTP, Web-UI, MQTT, OSC, SNMP, REST-API und Bitfocus Companion
 - **Home-Assistant-Integration** via MQTT Autodiscovery - **Home-Assistant-Integration** via MQTT Autodiscovery
-- **GPIO-Eingänge** auf dem Raspberry Pi (Mixer-GPI über Optokoppler) und **Axia-Livewire-GPIO** (Multicast oder LWRP TCP 93, z. B. Mic-ON-Lampe)+- **GPIO-Eingänge** auf dem Raspberry Pi (Mixer-GPI über Optokoppler), **Axia-Livewire-GPIO** (Multicast oder LWRP TCP 93, z. B. Mic-ON-Lampe) und **MIDI** (Note/CC von einem Interface)
 - **Instanz-Links**: 1→n-Replicas (voller LED/AIR/NOW/NEXT/WARN-Status) und Signal-Mappings (z. B. Flur-Tally von mehreren Studios) - **Instanz-Links**: 1→n-Replicas (voller LED/AIR/NOW/NEXT/WARN-Status) und Signal-Mappings (z. B. Flur-Tally von mehreren Studios)
  
Line 54: Line 54:
 ## 2. Installation und Start ## 2. Installation und Start
  
-Fertige Builds für Windows, macOS, Linux und Raspberry Pi gibt es im [astrastudio-Shop](https://www.astrastudio.de/shop/).+Fertige Builds für Windows, macOS, Linux und Raspberry Pi gibt es im [astrastudio-Shop](https://www.astrastudio.de/shop/). Eine Lizenz gilt für einen PC oder einen Raspberry Pi. Jeder weitere Rechner braucht eine eigene Lizenz. Dieselbe Lizenz kann auf einen Ersatzrechner übertragen werden, wenn der bisherige nicht mehr genutzt wird.
  
 OnAirScreen startet im **Vollbild** mit ausgeblendetem Mauszeiger. Einstellungen: `Ctrl+S` (macOS: `Cmd+S`). Änderungen gelten erst nach **Apply**. OnAirScreen startet im **Vollbild** mit ausgeblendetem Mauszeiger. Einstellungen: `Ctrl+S` (macOS: `Cmd+S`). Änderungen gelten erst nach **Apply**.
Line 69: Line 69:
 Eine ältere portable `.exe` wird vom MSI **nicht** entfernt. Die Datei nach der Installation selbst löschen. Eine ältere portable `.exe` wird vom MSI **nicht** entfernt. Die Datei nach der Installation selbst löschen.
  
-Windows gleicht die Internetzeit standardmäßig nur etwa einmal pro Woche ab. Bei Zeitquelle **Local** kann die Uhr falsch gehen. Sync-Intervall im Betriebssystem verkürzen oder in OnAirScreen NTP / PTP / LTC nutzen (siehe [5.3 Time Source](#time_source)).+Windows gleicht die Internetzeit standardmäßig nur etwa einmal pro Woche ab. Bei Zeitquelle **Local** kann die Uhr falsch gehen. Sync-Intervall im Betriebssystem verkürzen oder in OnAirScreen NTP / PTP / LTC nutzen (siehe [5.8 Time Source](#time_source)).
  
 ### macOS ### macOS
Line 77: Line 77:
 3. OnAirScreen aus Programme, Launchpad oder Spotlight starten. 3. OnAirScreen aus Programme, Launchpad oder Spotlight starten.
  
-macOS versieht Downloads mit einem Quarantäne-Flag. OnAirScreen ist nicht mit einer Apple-Developer-ID signiert, daher blockiert Gatekeeper den ersten Start („Apple kann nicht prüfen, ob Schadsoftware enthalten ist“ / „der Entwickler kann nicht überprüft werden“). +Shop-Builds sind mit einer Apple Developer ID signiert und notariert. Nach dem Kopieren nach Programme startest du die App aus Programme, Launchpad oder Spotlight. Für lokale Audio-Meter die **Mikrofon**-Berechtigung erteilen.
- +
-**Finder:** `OnAirScreen.app` mit Control-Klick (Rechtsklick) → **Öffnen** → nochmals **Öffnen**. macOS merkt sich das für spätere Starts. +
- +
-**Terminal** (wenn die App in Programme liegt): +
- +
-```bash +
-sudo xattr -d com.apple.quarantine /Applications/OnAirScreen.app +
-``` +
- +
-Startet die App weiter nicht: **Systemeinstellungen → Datenschutz & Sicherheit** und **Trotzdem öffnen**. Für lokale Audio-Meter die **Mikrofon**-Berechtigung erteilen.+
  
 ### Linux (Debian / Ubuntu / Raspberry Pi OS) ### Linux (Debian / Ubuntu / Raspberry Pi OS)
  
 Offizielle Builds sind ein `.deb`. Nach der Installation liegt die App in `/opt/onairscreen`, startet als `onairscreen` und erscheint im Anwendungsmenü. Offizielle Builds sind ein `.deb`. Nach der Installation liegt die App in `/opt/onairscreen`, startet als `onairscreen` und erscheint im Anwendungsmenü.
 +
  
 | Shop-ZIP                    | Paket darin                          | Architektur | Für                    | | Shop-ZIP                    | Paket darin                          | Architektur | Für                    |
Line 97: Line 88:
 | `OnAirScreen_Linux_x64.zip` | `OnAirScreen_*_Linux_x64.deb`        | `amd64`     | Debian/Ubuntu-PCs      | | `OnAirScreen_Linux_x64.zip` | `OnAirScreen_*_Linux_x64.deb`        | `amd64`     | Debian/Ubuntu-PCs      |
 | `OnAirScreen_PiOS_x64.zip`  | `OnAirScreen_*_RaspberryPiOSx64.deb` | `arm64`     | Raspberry Pi OS 64-bit | | `OnAirScreen_PiOS_x64.zip`  | `OnAirScreen_*_RaspberryPiOSx64.deb` | `arm64`     | Raspberry Pi OS 64-bit |
 +
  
 Prüfen mit `dpkg --print-architecture`. Die beiden Pakete sind nicht austauschbar. Prüfen mit `dpkg --print-architecture`. Die beiden Pakete sind nicht austauschbar.
Line 163: Line 155:
  
 ![OnAirScreen Hauptbildschirm, beschriftet](https://www.astrastudio.de/wp-content/uploads/2026/09/OAS_Screenshot_annotated_1_0_0beta8.png) ![OnAirScreen Hauptbildschirm, beschriftet](https://www.astrastudio.de/wp-content/uploads/2026/09/OAS_Screenshot_annotated_1_0_0beta8.png)
- 
  
 ### Bereiche im Detail ### Bereiche im Detail
Line 173: Line 164:
 | **Slogan**          | `labelSlogan`             | Untertitel / Claim des Senders                             | | **Slogan**          | `labelSlogan`             | Untertitel / Claim des Senders                             |
 | **Status-LEDs 1–4** | `buttonLED1`–`buttonLED4` | Große farbige Statusanzeigen (ON AIR, PHONE, …)            | | **Status-LEDs 1–4** | `buttonLED1`–`buttonLED4` | Große farbige Statusanzeigen (ON AIR, PHONE, …)            |
-| **Audio-Meter**      | `audioMeterWidget`       | L/R und/oder Programme-LUFS am linken Rand (optional)     |+| **Audio-Meter**     | `audioMeterWidget`        | L/R und/oder Programme-LUFS am linken Rand (optional)      |
 | **Uhr**             | `clockWidget`             | Digital oder analog, mit Logo und optionalem Wetter-Widget | | **Uhr**             | `clockWidget`             | Digital oder analog, mit Logo und optionalem Wetter-Widget |
 | **Lock-LED**        | Clock lock                | Unten rechts: `PTP/NTP/LTC LOCK` oder `LOCAL`              | | **Lock-LED**        | Clock lock                | Unten rechts: `PTP/NTP/LTC LOCK` oder `LOCAL`              |
-| **AIR-Timer 1–4**   | `AirLED_1`–`AirLED_4`     | Stoppuhr-Timer mit Icon, Label, MM:SS; AIR3 mit ▲/▼       | +| **AIR-Timer 1–4**   | `AirLED_1`–`AirLED_4`     | Stoppuhr-Timer mit Icon, Label, MM:SS; AIR3 mit ▲/▼        | 
-| **Datum**           | `labelTextLeft`           | Unten links: Wochentag und Datum                          |+| **Datum**           | `labelTextLeft`           | Unten links: Wochentag und Datum                           |
 | **NOW**             | `labelCurrentSong`        | Erste Fußzeile (z. B. aktueller Songtitel)                 | | **NOW**             | `labelCurrentSong`        | Erste Fußzeile (z. B. aktueller Songtitel)                 |
 | **NEXT**            | `labelNews`               | Zweite Fußzeile (z. B. nächster Titel)                     | | **NEXT**            | `labelNews`               | Zweite Fußzeile (z. B. nächster Titel)                     |
Line 217: Line 208:
 | `Q` / `Ctrl+Q` / `Ctrl+C` / `ESC` | OnAirScreen beenden                              | | `Q` / `Ctrl+Q` / `Ctrl+C` / `ESC` | OnAirScreen beenden                              |
 | `I`                               | IP-Adressen für 10 Sekunden in NOW/NEXT anzeigen | | `I`                               | IP-Adressen für 10 Sekunden in NOW/NEXT anzeigen |
 +
  
 Das Overlay listet diese Tastenkürzel auf dem Hauptbildschirm. Schließen mit `H`, `Esc` oder einem Klick auf den abgedunkelten Hintergrund. Andere Main-Window-Hotkeys sind gesperrt, solange es offen ist; `Esc` beendet OnAirScreen erst, wenn das Overlay geschlossen ist. Rechtsklick / Lang-Klick → **Hotkeys** öffnet dasselbe Overlay. Das Overlay listet diese Tastenkürzel auf dem Hauptbildschirm. Schließen mit `H`, `Esc` oder einem Klick auf den abgedunkelten Hintergrund. Andere Main-Window-Hotkeys sind gesperrt, solange es offen ist; `Esc` beendet OnAirScreen erst, wenn das Overlay geschlossen ist. Rechtsklick / Lang-Klick → **Hotkeys** öffnet dasselbe Overlay.
  
 Beim Beenden erscheint die WARN-Meldung `QUITTING ONAIRSCREEN` auf dem Hauptbildschirm, bis das Fenster schließt. Beim Beenden erscheint die WARN-Meldung `QUITTING ONAIRSCREEN` auf dem Hauptbildschirm, bis das Fenster schließt.
- 
- 
- 
  
 ### Status-LEDs ### Status-LEDs
Line 234: Line 223:
 | `3`   | LED 3 ein/aus | | `3`   | LED 3 ein/aus |
 | `4`   | LED 4 ein/aus | | `4`   | LED 4 ein/aus |
 +
  
 Linksklick auf eine Status-LED schaltet sie ebenso um. Linksklick auf eine Status-LED schaltet sie ebenso um.
- 
- 
- 
  
 ### AIR-Timer ### AIR-Timer
Line 253: Line 240:
 | `T`                     | Top-of-Hour-Countdown ein/aus | AIR3                | | `T`                     | Top-of-Hour-Countdown ein/aus | AIR3                |
 | `Enter` / `Return`      | Timer-Eingabedialog öffnen    | AIR3                | | `Enter` / `Return`      | Timer-Eingabedialog öffnen    | AIR3                |
 +
  
 Linksklick auf einen AIR-Timer startet oder stoppt ihn (wie `M` / `P` / Leertaste / `S`). Reset, TOTH und Timer-Dialog bleiben Tastatur bzw. Fernsteuerung. Linksklick auf einen AIR-Timer startet oder stoppt ihn (wie `M` / `P` / Leertaste / `S`). Reset, TOTH und Timer-Dialog bleiben Tastatur bzw. Fernsteuerung.
- 
- 
- 
  
 ### OAS-USB-Tastatur (Sonderbelegung) ### OAS-USB-Tastatur (Sonderbelegung)
Line 277: Line 262:
  
  
-| Register              | Inhalt                                 | +| Register         | Inhalt                                                                       | 
-| --------------------- | -------------------------------------- | +| ---------------- | ---------------------------------------------------------------------------- | 
-| **General**           | Instanzname, Station, LEDs, Uhr, Logo, Vollbild-Start, Updates | +| **General**      | Instanzname, Station, LEDs, Uhr, Logo, Vollbild-Start                        | 
-| **Network**           | UDP, HTTP, Multicast, MQTT, OSC, SNMP | +| **Updates**      | Update-Prüfung, Update Key, Hardware-Aktivierung                             | 
-| **Links**             | Andere OnAirScreens finden; Replicas (1→n voller Status) und Source-Mappings | +| **Network**      | UDP, HTTP, Multicast, MQTT, OSC, SNMP                                        | 
-| **Time Source**       | Local / NTP / PTPv2 / LTC, NTP-Prüfung | +| **Links**        | Andere OnAirScreens finden; Replicas (1→n voller Status) und Source-Mappings | 
-| **Advanced**          | Formatierung, Wetter                   | +| **Advanced**     | Formatierung, Wetter                                                         | 
-| **Timers**            | AIR-Timer 1–4                          | +| **Timers**       | AIR-Timer 1–4                                                                | 
-| **Fonts**             | Schriftarten für alle Elemente         | +| **Fonts**        | Schriftarten für alle Elemente                                               | 
-| **Audio Meters**      | Pegelanzeige, Quelle, TooLoud, Silence Detection | +| **Time Source**  | Local / NTP / PTPv2 / LTC, NTP-Prüfung                                       | 
-| **GPIO**              | Raspberry Pi und Axia Livewire GPIO (parallel)   | +| **Audio Meters** | Pegelanzeige, Quelle, TooLoud, Silence Detection                             | 
-| **About**             | Version, Lizenzinfo, Log-Level, Log-Ordner, Reset, Host-Reboot/Shutdown | +| **GPIO**         | Raspberry Pi, Axia Livewire und MIDI (parallel)                              | 
-| **License**           | OASL 1.0 und Third-Party-Hinweise (PySide6/Qt, Fonts, Beispiele) |+| **About**        | Version, Lizenzinfo, Log-Level, Log-Ordner, Reset, Host-Reboot/Shutdown      | 
 +| **License**      | OASL 1.0 und Third-Party-Hinweise (PySide6/Qt, Fonts, Beispiele)             |
  
  
Line 318: Line 304:
  
  
-| Einstellung   | Schlüssel              | Standard    | Beschreibung | +| Einstellung   | Schlüssel              | Standard   | Beschreibung                                                                                                                                     | 
-| ------------- | ---------------------- | ----------- | ------------ | +| ------------- | ---------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | 
-| Instance Name | `General/instancename` | `Studio-1`  | DNS-sicheres Label (1–32 Zeichen, Buchstaben/Ziffern/Bindestrich, kein führendes oder nachgestelltes `-`) zur Identifikation dieses OnAirScreens |+| Instance Name | `General/instancename` | `Studio-1` | DNS-sicheres Label (1–32 Zeichen, Buchstaben/Ziffern/Bindestrich, kein führendes oder nachgestelltes `-`) zur Identifikation dieses OnAirScreens |
  
  
Line 391: Line 377:
  
  
-| Einstellung           | Schlüssel                    | Standard         | Beschreibung                          | +| Einstellung           | Schlüssel                    | Standard  | Beschreibung                                                                                                                                            | 
-| --------------------- | ---------------------------- | ---------------- | ------------------------------------- | +| --------------------- | ---------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | 
-| Clock Face            | `Clock/face`                 | `digital`        | `digital`, `analog`, `analog_numbers`, `analog_studio`, `analog_railway`, `analog_24h_smooth`, `analog_24h_ticking` (`analog_24h` ist Alias für Smooth) | +| Clock Face            | `Clock/face`                 | `digital` | `digital`, `analog`, `analog_numbers`, `analog_studio`, `analog_railway`, `analog_24h_smooth`, `analog_24h_ticking` (`analog_24h` ist Alias für Smooth) | 
-| Digital (Legacy)      | `Clock/digital`              | `true`           | Wird mit `Clock/face` mitgeschrieben (`true` = Digital) | +| Digital (Legacy)      | `Clock/digital`              | `true`    | Wird mit `Clock/face` mitgeschrieben (`true` = Digital)                                                                                                 | 
-| Hours LEDs            | `Clock/digitalhourcolor`     | `#3232FF`        | Farbe Stunden-LEDs                    | +| Hours LEDs            | `Clock/digitalhourcolor`     | `#3232FF` | Farbe Stunden-LEDs                                                                                                                                      | 
-| Seconds LEDs          | `Clock/digitalsecondcolor`   | `#FF9900`        | Farbe Sekunden-LEDs                   | +| Seconds LEDs          | `Clock/digitalsecondcolor`   | `#FF9900` | Farbe Sekunden-LEDs                                                                                                                                     | 
-| Digits LEDs           | `Clock/digitaldigitcolor`    | `#3232FF`        | Farbe aller Ziffern                   | +| Digits LEDs           | `Clock/digitaldigitcolor`    | `#3232FF` | Farbe aller Ziffern                                                                                                                                     | 
-| Show seconds          | `Clock/showSeconds`          | `false`          | Sekunden anzeigen                     | +| Show seconds          | `Clock/showSeconds`          | `false`   | Sekunden anzeigen                                                                                                                                       | 
-| Seconds Layout        | `Clock/showSecondsInOneLine` | `false`          | `separate` oder `in one line`         | +| Seconds Layout        | `Clock/showSecondsInOneLine` | `false`   | `separate` oder `in one line`                                                                                                                           | 
-| Static colon          | `Clock/staticColon`          | `false`          | Doppelpunkt statisch (nicht blinkend) | +| Static colon          | `Clock/staticColon`          | `false`   | Doppelpunkt statisch (nicht blinkend)                                                                                                                   | 
-| Use textclock         | `Clock/useTextClock`         | `true`           | Textuhr (z. B. „it's 3 o'clock")      | +| Use textclock         | `Clock/useTextClock`         | `true`    | Textuhr (z. B. „it's 3 o'clock")                                                                                                                        | 
-| Replace IPs after 10s | `General/replacenow`         | `false`          | Nach IP-Anzeige Text ersetzen         | +| Replace IPs after 10s | `General/replacenow`         | `false`   | Nach IP-Anzeige Text ersetzen                                                                                                                           | 
-| Replace with text     | `General/replacenowtext`     | *(leer)*         | Ersatztext für NOW-Zeile              |+| Replace with text     | `General/replacenowtext`     | *(leer)*  | Ersatztext für NOW-Zeile                                                                                                                                | 
 + 
  
  
Line 415: Line 403:
  
 Apply wechselt das aktuelle Fenster nicht; die Option gilt beim nächsten Start. Ohne sie stellt OnAirScreen weiterhin den letzten Vollbild-Zustand wieder her (`General/fullscreen`, Standard an). Apply wechselt das aktuelle Fenster nicht; die Option gilt beim nächsten Start. Ohne sie stellt OnAirScreen weiterhin den letzten Vollbild-Zustand wieder her (`General/fullscreen`, Standard an).
 +
 +### 5.2 Updates
 +
 +
  
 #### Update-Prüfung (kompilierte Versionen) #### Update-Prüfung (kompilierte Versionen)
Line 428: Line 420:
 > Die Update-Funktion ist für **vorkompilierte (kostenpflichtige) Versionen** gedacht. > Die Update-Funktion ist für **vorkompilierte (kostenpflichtige) Versionen** gedacht.
 > >
-> Für die Update-Prüfung in der kostenpflichtigen Version muss ein **Update Key** eingegeben werden. Diesen erhältst du nach der Bestellung im Kundenportal unter [customer.astrastudio.de](https://customer.astrastudio.de). Das Feld ist maskiert; mit dem durchgestrichenen Auge wird es sichtbar.+> Für die Update-Prüfung in der kostenpflichtigen Version muss ein **Update Key** eingegeben werden. Diesen erhältst du nach der Bestellung im Kundenportal unter [customer.astrastudio.de](https://customer.astrastudio.de). Eine Lizenz gilt für einen PC oder einen Raspberry Pi. Das Feld ist maskiert; mit dem durchgestrichenen Auge wird es sichtbar. 
 + 
 + 
 + 
 +#### Aktivierung (kostenpflichtige Builds) 
 + 
 +Shop-Builds müssen aktiviert werden. Selbst gebaute OpenSource-Builds nicht. 
 + 
 +1. Update Key aus dem Kundenportal ins Feld **Update Key** kopieren. 
 +2. **Activate** (mit Internet) oder die **Hardware ID** kopieren, im Portal eine Lizenzdatei laden und **Import license file**. 
 +3. Die Aktivierung gilt ein Jahr, sofern die Bestellung nichts anderes sagt. Der Tab Updates zeigt, ob dieser Rechner jetzt online verlängern kann. Wenn der Lizenzserver nicht erreichbar ist, vor Ablauf im Portal eine neue Lizenzdatei laden und importieren. Der Update Key bleibt derselbe. Es ist kein neuer Kauf. 
 +4. Zum Umziehen **Return license**. Den Return-Code im Portal einlösen (online erledigt das die App). Den neuen Rechner aktivieren. Ein defekter Rechner kann nur vom Support freigegeben werden. 
 +5. Ohne Lizenz läuft OnAirScreen 14 Tage voll. Danach kein Vollbild, kein GPIO, keine Audio-Meter, keine gespeicherten Einstellungen, Fenster höchstens 1280×800, Ende nach 15 Minuten. Dasselbe gilt, wenn eine Lizenz abgelaufen ist. 
 +6. Beim Start wird der Update Key beim Lizenzserver geprüft, auch wenn **Check for Updates** aus ist. Lehnt der Server den Key ab, wird die Lizenz auf diesem Rechner sofort entfernt und es gelten dieselben Grenzen. Weitere Starts wiederholen diese automatische Prüfung und die Meldung nicht. **Check now** prüft weiter. Eine fehlende Netzwerkverbindung entfernt die Lizenz nicht. Eine neue Aktivierung prüft den Key wieder. 
 + 
 +Passt diese Aktivierung für deinen Einsatz nicht, schreib uns über das [Kontaktformular](https://www.astrastudio.de/kontakt/). Wir erarbeiten dann eine maßgeschneiderte Lösung. 
 + 
 +Dieselben Aktionen gibt es in den Web-UI-Einstellungen.
  
 --- ---
  
-### 5.2 Network+ 
 + 
 +### 5.3 Network
  
  
Line 439: Line 450:
  
  
-| Einstellung       | Schlüssel                   | Standard      | Beschreibung              | +| Einstellung       | Schlüssel                   | Standard      | Beschreibung                                                                                                                                                                                                                                                   | 
-| ----------------- | --------------------------- | ------------- | ------------------------- | +| ----------------- | --------------------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 
-| UDP Port          | `Network/udpport`           | `3310`        | Port für UDP-Befehle      | +| UDP Port          | `Network/udpport`           | `3310`        | Port für UDP-Befehle                                                                                                                                                                                                                                           | 
-| HTTP Port         | `Network/httpport`          | `8010`        | Port für HTTP/Web-UI      | +| HTTP Port         | `Network/httpport`          | `8010`        | Port für HTTP/Web-UI                                                                                                                                                                                                                                           | 
-| Multicast Address | `Network/multicast_address` | `239.194.0.1` | Multicast-Adresse für UDP  |+| Multicast Address | `Network/multicast_address` | `239.194.0.1` | Multicast-Adresse für UDP                                                                                                                                                                                                                                      |
 | Web Settings PIN  | `Network/websettingspin`    | *(leer)*      | Optionale PIN für das Settings-Overlay der Web-UI und für HTTP `CMD:REBOOT` / `CMD:SHUTDOWN` (als Hash gespeichert). Leer = keine PIN. Feld leer lassen, um die aktuelle PIN zu behalten; `-` entfernt sie. Andere Remote-Control-Befehle bleiben ungeschützt. | | Web Settings PIN  | `Network/websettingspin`    | *(leer)*      | Optionale PIN für das Settings-Overlay der Web-UI und für HTTP `CMD:REBOOT` / `CMD:SHUTDOWN` (als Hash gespeichert). Leer = keine PIN. Feld leer lassen, um die aktuelle PIN zu behalten; `-` entfernt sie. Andere Remote-Control-Befehle bleiben ungeschützt. |
 +
 +
  
  
Line 450: Line 463:
  
  
-| Einstellung         | Schlüssel             | Standard      | Beschreibung                  | +| Einstellung         | Schlüssel             | Standard      | Beschreibung                 | 
-| ------------------- | --------------------- | ------------- | ----------------------------- | +| ------------------- | --------------------- | ------------- | ---------------------------- | 
-| enable MQTT support | `MQTT/enablemqtt`     | `false`       | MQTT-Integration einschalten  |+| enable MQTT support | `MQTT/enablemqtt`     | `false`       | MQTT-Integration einschalten |
 | MQTT Server         | `MQTT/mqttserver`     | `localhost`   | Broker-Hostname/IP           | | MQTT Server         | `MQTT/mqttserver`     | `localhost`   | Broker-Hostname/IP           |
-| MQTT Server Port    | `MQTT/mqttport`       | `1883`        | Broker-Port                   |+| MQTT Server Port    | `MQTT/mqttport`       | `1883`        | Broker-Port                  |
 | MQTT User           | `MQTT/mqttuser`       | *(leer)*      | Benutzername (optional)      | | MQTT User           | `MQTT/mqttuser`       | *(leer)*      | Benutzername (optional)      |
-| MQTT Password       | `MQTT/mqttpassword`   | *(leer)*      | Passwort (optional)           | +| MQTT Password       | `MQTT/mqttpassword`   | *(leer)*      | Passwort (optional)          | 
-| MQTT Device Name    | `MQTT/mqttdevicename` | `OnAirScreen` | Gerätename in Home Assistant  |+| MQTT Device Name    | `MQTT/mqttdevicename` | `OnAirScreen` | Gerätename in Home Assistant |
  
  
Line 467: Line 480:
  
  
-| Einstellung        | Schlüssel          | Standard  | Beschreibung                                                | +| Einstellung        | Schlüssel         | Standard | Beschreibung                                          | 
-| ------------------ | ------------------ | --------- | ----------------------------------------------------------- | +| ------------------ | ----------------- | -------- | ----------------------------------------------------- | 
-| enable OSC support  | `OSC/enableosc`    | `false`   | OSC-Fernsteuerung einschalten                               | +| enable OSC support | `OSC/enableosc`   | `false`  | OSC-Fernsteuerung einschalten                         | 
-| OSC Listen Port    | `OSC/oscport`      | `8000`    | UDP-Port für eingehende OSC                                 | +| OSC Listen Port    | `OSC/oscport`     | `8000`   | UDP-Port für eingehende OSC                           | 
-| OSC Send Host      | `OSC/oscsendhost`  | *(leer)*  | Ziel für Status-Push (Companion-IP); leer = kein Push       | +| OSC Send Host      | `OSC/oscsendhost` | *(leer)* | Ziel für Status-Push (Companion-IP); leer = kein Push | 
-| OSC Send Port      | `OSC/oscsendport`  | `9000`    | Ziel-UDP-Port (Companion-Feedback-Port)                    |+| OSC Send Port      | `OSC/oscsendport` | `9000`   | Ziel-UDP-Port (Companion-Feedback-Port)               |
  
  
Line 479: Line 492:
 #### SNMP #### SNMP
  
-| Einstellung           | Schlüssel                  | Standard  | Beschreibung                                                                 | + 
-| --------------------- | -------------------------- | --------- | ---------------------------------------------------------------------------- | +| Einstellung         | Schlüssel                 | Standard | Beschreibung                                            | 
-| enable SNMP support   | `SNMP/enablesnmp`          | `false`   | SNMPv2c/v3-Agent einschalten                                                 | +| ------------------- | ------------------------- | -------- | ------------------------------------------------------- | 
-| SNMP Listen Port      | `SNMP/snmpport`            | `1161`    | UDP-Port. 161 braucht OS-Rechte                                              | +| enable SNMP support | `SNMP/enablesnmp`         | `false`  | SNMPv2c/v3-Agent einschalten                            | 
-| sysContact            | `SNMP/syscontact`          | *(leer)*  | MIB-2 sysContact                                                             | +| SNMP Listen Port    | `SNMP/snmpport`           | `1161`   | UDP-Port. 161 braucht OS-Rechte                         | 
-| sysLocation           | `SNMP/syslocation`         | *(leer)*  | MIB-2 sysLocation                                                            | +| sysContact          | `SNMP/syscontact`         | *(leer)* | MIB-2 sysContact                                        | 
-| v2c Read Community    | `SNMP/snmpcommunity`       | `public`  | Leer = v2c aus. Maskiert                                                     | +| sysLocation         | `SNMP/syslocation`        | *(leer)* | MIB-2 sysLocation                                       | 
-| v2c Write Community   | `SNMP/snmpwritecommunity`  | *(leer)*  | Leer = v2c nur lesen. Maskiert                                               | +| v2c Read Community  | `SNMP/snmpcommunity`      | `public` | Leer = v2c aus. Maskiert                                | 
-| v3 User               | `SNMP/snmpv3user`          | *(leer)*  | Leer = v3 aus                                                                | +| v2c Write Community | `SNMP/snmpwritecommunity` | *(leer)* | Leer = v2c nur lesen. Maskiert                          | 
-| v3 Auth Password      | `SNMP/snmpv3authpass`      | *(leer)*  | SHA-256. Leer = noAuthNoPriv (nur Test). Maskiert                            | +| v3 User             | `SNMP/snmpv3user`         | *(leer)* | Leer = v3 aus                                           | 
-| v3 Priv Password      | `SNMP/snmpv3privpass`      | *(leer)*  | AES-128. Leer = authNoPriv, wenn Auth gesetzt. Maskiert                      | +| v3 Auth Password    | `SNMP/snmpv3authpass`     | *(leer)* | SHA-256. Leer = noAuthNoPriv (nur Test). Maskiert       | 
-| enable SNMP traps     | `SNMP/enabletraps`         | `false`   | Traps an das NMS senden                                                      | +| v3 Priv Password    | `SNMP/snmpv3privpass`     | *(leer)* | AES-128. Leer = authNoPriv, wenn Auth gesetzt. Maskiert | 
-| Trap Host             | `SNMP/snmptraphost`        | *(leer)*  | NMS-Hostname/IP                                                              | +| enable SNMP traps   | `SNMP/enabletraps`        | `false`  | Traps an das NMS senden                                 | 
-| Trap Port             | `SNMP/snmptrapport`        | `162`     | NMS-Trap-Port                                                                | +| Trap Host           | `SNMP/snmptraphost`       | *(leer)* | NMS-Hostname/IP                                         | 
-| Trap Version          | `SNMP/snmptrapversion`     | `v2c`     | `v2c` oder `v3`                                                              | +| Trap Port           | `SNMP/snmptrapport`       | `162`    | NMS-Trap-Port                                           | 
-| Trap Community        | `SNMP/snmptrapcommunity`   | `public`  | Community für v2c-Traps. Maskiert                                            | +| Trap Version        | `SNMP/snmptrapversion`    | `v2c`    | `v2c` oder `v3`                                         | 
-| trap on silence       | `SNMP/trap_silence`        | `true`    | Trap bei Silence an/aus                                                      | +| Trap Community      | `SNMP/snmptrapcommunity`  | `public` | Community für v2c-Traps. Maskiert                       | 
-| trap on warning       | `SNMP/trap_warning`        | `true`    | Trap bei WARN-Textwechsel                                                    | +| trap on silence     | `SNMP/trap_silence`       | `true`   | Trap bei Silence an/aus                                 | 
-| trap on LED change    | `SNMP/trap_leds`           | `false`   | Trap bei LED an/aus (kann laut werden)                                       |+| trap on warning     | `SNMP/trap_warning`       | `true`   | Trap bei WARN-Textwechsel                               | 
 +| trap on LED change  | `SNMP/trap_leds`          | `false`  | Trap bei LED an/aus (kann laut werden)                  | 
  
 Mindestens eine v2c-Community oder ein v3-User muss gesetzt sein, sonst startet der Agent nicht. Community- und v3-Passwörter sind maskiert. Mindestens eine v2c-Community oder ein v3-User muss gesetzt sein, sonst startet der Agent nicht. Community- und v3-Passwörter sind maskiert.
Line 503: Line 518:
 --- ---
  
-### Links+ 
 + 
 +### 5.4 Links
  
 Mehrere OnAirScreens im LAN (Multicast-Discovery über den **Instanznamen**) oder per Host/HTTP-Port verbinden. Instanznamen müssen eindeutig sein; eine Kollision wird in Settings und der Web-UI angezeigt, Apply wird abgelehnt. Es gibt keine festen Master/Slave-Rollen: jede Instanz kann Replicas pushen **und** Sources abonnieren. Runtime-Status wird bei Änderung gepusht, nicht per Dauer-HTTP-Poll an alle Peers. Host-lokale WARN-Texte (`QUITTING ONAIRSCREEN`, Reboot/Shutdown, NTP) bleiben auf diesem Screen. Mehrere OnAirScreens im LAN (Multicast-Discovery über den **Instanznamen**) oder per Host/HTTP-Port verbinden. Instanznamen müssen eindeutig sein; eine Kollision wird in Settings und der Web-UI angezeigt, Apply wird abgelehnt. Es gibt keine festen Master/Slave-Rollen: jede Instanz kann Replicas pushen **und** Sources abonnieren. Runtime-Status wird bei Änderung gepusht, nicht per Dauer-HTTP-Poll an alle Peers. Host-lokale WARN-Texte (`QUITTING ONAIRSCREEN`, Reboot/Shutdown, NTP) bleiben auf diesem Screen.
Line 516: Line 533:
  
  
-| Einstellung | Schlüssel | Standard | Beschreibung | +| Einstellung             | Schlüssel               | Standard | Beschreibung                                                                                                                                                                                                                                     | 
-| ----------- | --------- | -------- | ------------ | +| ----------------------- | ----------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | 
-| Enable instance linking | `Links/enabled` | `false` | Replicas pushen und Mappings anwenden. Namens-Discovery für Eindeutigkeit läuft immer. | +| Enable instance linking | `Links/enabled`         | `false`  | Replicas pushen und Mappings anwenden. Namens-Discovery für Eindeutigkeit läuft immer.                                                                                                                                                           | 
-| Replica *n* | `Links/replicaN_*` | aus | Ziel-Instanz (Dropdown der Nearby-Screens, oder Name tippen). Host leer lassen, dann kommt die aktuelle IP vom Namen (DHCP-fest). Host nur als Fallback, wenn Multicast sie nicht erreicht, oder um bei Namenskollision eine Maschine zu wählen. | +| Replica *n*             | `Links/replicaN_`*      | aus      | Ziel-Instanz (Dropdown der Nearby-Screens, oder Name tippen). Host leer lassen, dann kommt die aktuelle IP vom Namen (DHCP-fest). Host nur als Fallback, wenn Multicast sie nicht erreicht, oder um bei Namenskollision eine Maschine zu wählen. | 
-| Map *n* | `Links/mapN_*` | aus | Source-Instanz (Nearby-Dropdown pro Zeile), Signal, lokales Ziel, Invert, Custom-Command. Host leer = per Name finden. | +| Map *n*                 | `Links/mapN_`*          | aus      | Source-Instanz (Nearby-Dropdown pro Zeile), Signal, lokales Ziel, Invert, Custom-Command. Host leer = per Name finden.                                                                                                                           | 
-| Replica of | `Links/follow_instance` | *(leer)* | Wird gesetzt, wenn ein anderer Screen diese Instanz als Replica einträgt |+| Replica of              | `Links/follow_instance` | *(leer)* | Wird gesetzt, wenn ein anderer Screen diese Instanz als Replica einträgt                                                                                                                                                                         |
  
  
 --- ---
  
-### 5.3 Time Source 
  
-Die Anzeigeuhr kann der lokalen Systemuhr, einem NTP-Server, einem PTPv2-Master (IEEE 1588-2008) oder SMPTE-LTC folgen (Leo-Bodnar-LBE-1110-USB-Serial **oder** Dekodierung von einem lokalen Audioeingang). **OnAirScreen ändert die Betriebssystem-Uhr nie.** NTP und PTP steuern eine eigene Zeitbasis (`time.monotonic()`); ein Sprung der Systemuhr bewegt die Studio-Uhr nicht. LTC darf springen, stehenbleiben und enthält Frames (`HH:MM:SS:FF`). 
- 
-Datum, Textuhr und AIR3-Top-of-Hour folgen derselben Wandzeit wie die große Uhr, wenn die Quelle Local, NTP oder PTP ist. Bei LTC bleiben sie auf der Systemzeit, weil LTC kein Kalenderdatum hat. 
- 
- 
-| Einstellung      | Schlüssel              | Standard       | Beschreibung | 
-| ---------------- | ---------------------- | -------------- | ------------ | 
-| Time Source      | `TimeSource/source`    | `local`        | `local`, `ntp`, `ptp` oder `ltc` | 
-| Enable NTP-Check | `NTP/ntpcheck`         | `true`         | Warnung bei Abweichung vom NTP-Server oder wenn der Server nicht erreichbar ist | 
-| NTP Server       | `NTP/ntpcheckserver`   | `pool.ntp.org` | NTP-Server für NTP als Zeitquelle **und** für die optionale NTP-Prüfung | 
-| PTP Interface    | `TimeSource/ptp_iface` | *(leer)*       | IPv4-Adresse des PTP-Netzwerkinterfaces (unabhängig von AoIP) | 
-| PTP Domain       | `TimeSource/ptp_domain`| `0`            | IEEE-1588-Domain (0–255) | 
-| LTC Input        | `TimeSource/ltc_input` | `serial`       | `serial` (LBE-1110) oder `audio` (lokale PortAudio-Dekodierung) | 
-| LTC Serial Port  | `TimeSource/ltc_port`  | *(leer)*       | USB-Serial-Gerät des LBE-1110; leer = Auto | 
-| LTC Audio Device | `TimeSource/ltc_audio_device` | *(leer)* | Lokales Capture-Gerät; leer = System-Default | 
-| LTC Channel      | `TimeSource/ltc_audio_channel` | `0`     | `0` = Links, `1` = Rechts | 
-| LTC-Unlock-Warnung | `TimeSource/ltc_warn` | `false` | WARN-Text bei LTC-Verlust; die LED `LTC NOT LOCKED` bleibt immer aktiv | 
- 
- 
-**Local System Clock:** Anzeige = Systemuhr. Mit NTP-Check wird die Systemuhr mit dem NTP-Server verglichen (Abweichung > 0,3 s oder Fehler → Warnung, Priorität -1). 
- 
-**NTP Server:** OnAirScreen fragt das Feld NTP Server ab und steuert eine eigene Uhr. Nach dem ersten gültigen Sample wird die OS-Zeit nicht mehr verwendet. Das Feld bleibt editierbar, auch wenn NTP-Check aus ist. Bei NTP-Verlust läuft die letzte Zeit weiter, plus Warnung. 
- 
-**PTPv2 IEEE 1588-2008:** Software-Slave auf Multicast `224.0.1.129` UDP 319/320, Delay-Mechanismus E2E. Typische Genauigkeit im Millisekundenbereich (kein Hardware-Timestamping). Das Interface unabhängig vom AoIP-Interface der Audio Meters wählen. Bei Sync-Verlust: letzte Zeit läuft weiter, plus Warnung. Wenn UDP 319/320 nicht gebunden werden kann (Ports schon belegt), versucht der Slave alle paar Sekunden erneut; Lock-LED und WARN zeigen `PTP ERROR`, bis die Ports frei sind. Details stehen im Log. Unter Linux und Raspberry Pi OS installieren Shop-`.deb`/`.rpm`/SD-Images den Helper `/usr/lib/onairscreen/oas-ptp-bind` für UDP 319/320. 
- 
-**LTC:** Eine Zeitquelle mit zwei Eingängen. Die Framerate wird aus den eingehenden Frames abgeleitet (24 / 25 / 30). Bei LTC-Verlust wird der letzte Timecode gehalten (`LTC NOT LOCKED`). Die großen WARN-Meldungen (`waiting for LTC lock`, `Clock not LTC synchronized`, `LTC reader not connected`) sind **standardmäßig aus**, damit Scrubben/Videoschnitt WARN nicht flutet; **Show LTC unlock warning** einschalten, wenn sie gewünscht sind. Die Lock-LED zeigt immer `LTC LOCK` / `LTC NOT LOCKED`. NTP-Check vergleicht weiterhin die OS-Uhr mit dem NTP-Server, nicht den Timecode. 
- 
-**LBE-1110 Serial:** USB-CDC-virtueller Seriellport eines [Leo-Bodnar-LBE-1110](https://www.leobodnar.com/shop/index.php?main_page=product_info&cPath=120&products_id=374); keine Treiber. Auto wählt ein Leo-Bodnar-Gerät (USB-VID `0x1DD2`) oder einen LBE-1110-/CDC-Port. 
- 
-**Audio Input:** Dekodiert SMPTE-LTC (Biphase-Mark) von einem **lokalen** PortAudio-Capture-Gerät, unabhängig von den Audio Meters (kein Livewire/AES67). Kanal Links oder Rechts (Standard Links). Auf manchen Hosts kann dasselbe Gerät nicht zweimal geöffnet werden — wenn die Meters diesen Eingang schon nutzen, für LTC ein anderes Gerät wählen. 
- 
-Die Lock-LED unten rechts ist grün, wenn die gewählte Quelle eingerastet ist, sonst rot. Daneben: `PTP LOCK` / `PTP NOT LOCKED` / `PTP ERROR`, `NTP LOCK` / `NTP NOT LOCKED`, `LTC LOCK` / `LTC NOT LOCKED` oder `LOCAL`. 
- 
-> **Empfehlung:** Einen lokalen NTP-Server im Studio-Netzwerk verwenden, da `pool.ntp.org` zeitweise unzuverlässig sein kann. 
- 
---- 
  
-### 5.4 Advanced+### 5.5 Advanced
  
  
Line 615: Line 595:
  
  
-### 5.5 Timers+### 5.6 Timers
  
 Für jeden AIR-Timer (Gruppe `Timers`): Für jeden AIR-Timer (Gruppe `Timers`):
Line 641: Line 621:
  
  
-| Einstellung     | Schlüssel          | Standard      | Beschreibung                                                   | +| Einstellung     | Schlüssel          | Standard     | Beschreibung                                                   | 
-| --------------- | ------------------ | ------------- | -------------------------------------------------------------- | +| --------------- | ------------------ | ------------ | -------------------------------------------------------------- | 
-| TOTH Timer Text | `TimerTOTHText`    | `TOTH Timer`  | AIR3-Beschriftung, solange der Top-of-Hour-Countdown aktiv ist | +| TOTH Timer Text | `TimerTOTHText`    | `TOTH Timer` | AIR3-Beschriftung, solange der Top-of-Hour-Countdown aktiv ist | 
-| AIR Min Width   | `TimerAIRMinWidth` | `200`         | Mindestbreite der AIR-Anzeigen (Pixel)                         |+| AIR Min Width   | `TimerAIRMinWidth` | `200`        | Mindestbreite der AIR-Anzeigen (Pixel)                         |
  
  
Line 651: Line 631:
  
  
-### 5.6 Fonts+### 5.7 Fonts
  
 Für jedes UI-Element kann Schriftart, -größe und -stärke individuell gesetzt werden: Für jedes UI-Element kann Schriftart, -größe und -stärke individuell gesetzt werden:
  
  
-| Element      | Gruppe `Fonts`                    | Standard             | +| Element      | Gruppe `Fonts`                    | Standard           | 
-| ------------ | --------------------------------- | -------------------- |+| ------------ | --------------------------------- | ------------------ |
 | LED1–4       | `LED{n}FontName/Size/Weight`      | Roboto, 32pt, Bold | | LED1–4       | `LED{n}FontName/Size/Weight`      | Roboto, 32pt, Bold |
 | AIR1–4       | `AIR{n}FontName/Size/Weight`      | Roboto, 24pt, Bold | | AIR1–4       | `AIR{n}FontName/Size/Weight`      | Roboto, 24pt, Bold |
Line 672: Line 652:
  
  
-### 5.7 About+### 5.8 Time Source
  
 +Die Anzeigeuhr kann der lokalen Systemuhr, einem NTP-Server, einem PTPv2-Master (IEEE 1588-2008) oder SMPTE-LTC folgen (Leo-Bodnar-LBE-1110-USB-Serial **oder** Dekodierung von einem lokalen Audioeingang). **OnAirScreen ändert die Betriebssystem-Uhr nie.** NTP und PTP steuern eine eigene Zeitbasis (`time.monotonic()`); ein Sprung der Systemuhr bewegt die Studio-Uhr nicht. LTC darf springen, stehenbleiben und enthält Frames (`HH:MM:SS:FF`).
  
-| Element            | Beschreibung                                                           | +Datum, Textuhr und AIR3-Top-of-Hour folgen derselben Wandzeit wie die große Uhr, wenn die Quelle Local, NTP oder PTP ist. Bei LTC bleiben sie auf der Systemzeit, weil LTC kein Kalenderdatum hat.
-| ------------------ | ---------------------------------------------------------------------- | +
-| Version            | Aktuelle OnAirScreen-Version                                           | +
-| Distribution       | `OpenSource` oder kommerzielle Distribution                            | +
-| Settings Path      | Pfad zur Konfigurationsdatei auf diesem System                         | +
-| Log Folder         | Ordner mit `onairscreen.log` und Crash-Reports                         | +
-| Open log folder    | Öffnet diesen Ordner im Dateimanager                                   | +
-| Loglevel           | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`, `NONE`                | +
-| Enable Reset       | Checkbox zum Freischalten des Reset-Buttons                            | +
-| Reset all settings | Setzt **alle** Einstellungen auf Standardwerte zurück (unwiderruflich) | +
-| Reboot             | Host-Betriebssystem neu starten (mit Nachfrage)                        | +
-| Shutdown           | Host-Betriebssystem herunterfahren (mit Nachfrage)                     |+
  
 +
 +| Einstellung        | Schlüssel                      | Standard       | Beschreibung                                                                    |
 +| ------------------ | ------------------------------ | -------------- | ------------------------------------------------------------------------------- |
 +| Time Source        | `TimeSource/source`            | `local`        | `local`, `ntp`, `ptp` oder `ltc`                                                |
 +| Enable NTP-Check   | `NTP/ntpcheck`                 | `true`         | Warnung bei Abweichung vom NTP-Server oder wenn der Server nicht erreichbar ist |
 +| NTP Server         | `NTP/ntpcheckserver`           | `pool.ntp.org` | NTP-Server für NTP als Zeitquelle **und** für die optionale NTP-Prüfung         |
 +| PTP Interface      | `TimeSource/ptp_iface`         | *(leer)*       | IPv4-Adresse des PTP-Netzwerkinterfaces (unabhängig von AoIP)                   |
 +| PTP Domain         | `TimeSource/ptp_domain`        | `0`            | IEEE-1588-Domain (0–255)                                                        |
 +| LTC Input          | `TimeSource/ltc_input`         | `serial`       | `serial` (LBE-1110) oder `audio` (lokale PortAudio-Dekodierung)                 |
 +| LTC Serial Port    | `TimeSource/ltc_port`          | *(leer)*       | USB-Serial-Gerät des LBE-1110; leer = Auto                                      |
 +| LTC Audio Device   | `TimeSource/ltc_audio_device`  | *(leer)*       | Lokales Capture-Gerät; leer = System-Default                                    |
 +| LTC Channel        | `TimeSource/ltc_audio_channel` | `0`            | `0` = Links, `1` = Rechts                                                       |
 +| LTC-Unlock-Warnung | `TimeSource/ltc_warn`          | `false`        | WARN-Text bei LTC-Verlust; die LED `LTC NOT LOCKED` bleibt immer aktiv          |
 +
 +
 +**Local System Clock:** Anzeige = Systemuhr. Mit NTP-Check wird die Systemuhr mit dem NTP-Server verglichen (Abweichung > 0,3 s oder Fehler → Warnung, Priorität -1).
 +
 +**NTP Server:** OnAirScreen fragt das Feld NTP Server ab und steuert eine eigene Uhr. Nach dem ersten gültigen Sample wird die OS-Zeit nicht mehr verwendet. Das Feld bleibt editierbar, auch wenn NTP-Check aus ist. Bei NTP-Verlust läuft die letzte Zeit weiter, plus Warnung.
 +
 +**PTPv2 IEEE 1588-2008:** Software-Slave auf Multicast `224.0.1.129` UDP 319/320, Delay-Mechanismus E2E. Typische Genauigkeit im Millisekundenbereich (kein Hardware-Timestamping). Das Interface unabhängig vom AoIP-Interface der Audio Meters wählen. Bei Sync-Verlust: letzte Zeit läuft weiter, plus Warnung. Wenn UDP 319/320 nicht gebunden werden kann (Ports schon belegt), versucht der Slave alle paar Sekunden erneut; Lock-LED und WARN zeigen `PTP ERROR`, bis die Ports frei sind. Details stehen im Log. Unter Linux und Raspberry Pi OS installieren Shop-`.deb`/`.rpm`/SD-Images den Helper `/usr/lib/onairscreen/oas-ptp-bind` für UDP 319/320.
 +
 +**LTC:** Eine Zeitquelle mit zwei Eingängen. Die Framerate wird aus den eingehenden Frames abgeleitet (24 / 25 / 30). Bei LTC-Verlust wird der letzte Timecode gehalten (`LTC NOT LOCKED`). Die großen WARN-Meldungen (`waiting for LTC lock`, `Clock not LTC synchronized`, `LTC reader not connected`) sind **standardmäßig aus**, damit Scrubben/Videoschnitt WARN nicht flutet; **Show LTC unlock warning** einschalten, wenn sie gewünscht sind. Die Lock-LED zeigt immer `LTC LOCK` / `LTC NOT LOCKED`. NTP-Check vergleicht weiterhin die OS-Uhr mit dem NTP-Server, nicht den Timecode.
 +
 +**LBE-1110 Serial:** USB-CDC-virtueller Seriellport eines [Leo-Bodnar-LBE-1110](https://www.leobodnar.com/shop/index.php?main_page=product_info&cPath=120&products_id=374); keine Treiber. Auto wählt ein Leo-Bodnar-Gerät (USB-VID `0x1DD2`) oder einen LBE-1110-/CDC-Port.
 +
 +**Audio Input:** Dekodiert SMPTE-LTC (Biphase-Mark) von einem **lokalen** PortAudio-Capture-Gerät, unabhängig von den Audio Meters (kein Livewire/AES67). Kanal Links oder Rechts (Standard Links). Auf manchen Hosts kann dasselbe Gerät nicht zweimal geöffnet werden — wenn die Meters diesen Eingang schon nutzen, für LTC ein anderes Gerät wählen.
 +
 +Die Lock-LED unten rechts ist grün, wenn die gewählte Quelle eingerastet ist, sonst rot. Daneben: `PTP LOCK` / `PTP NOT LOCKED` / `PTP ERROR`, `NTP LOCK` / `NTP NOT LOCKED`, `LTC LOCK` / `LTC NOT LOCKED` oder `LOCAL`.
 +
 +> **Empfehlung:** Einen lokalen NTP-Server im Studio-Netzwerk verwenden, da `pool.ntp.org` zeitweise unzuverlässig sein kann.
  
 --- ---
Line 693: Line 693:
  
  
-### 5.8 Audio Meters+### 5.9 Audio Meters
  
 Stereo-Pegelanzeige am linken Bildschirmrand: L/R (Sample-Peak, True Peak oder BBC PPM), ein einzelner Programme-LUFS-Balken (EBU R128) oder beides. L/R füllen mit RMS und legen den aktuellen Peak darüber. Programme-LUFS ist ein Balken (Momentary M, Short-term-S-Tick). Integrated I und LRA sind standardmäßig aus und starten mit `LUFSI:START` (Web-UI, MQTT-Home-Assistant-Schalter, Companion, OSC, UDP/HTTP oder Rechtsklick / Lang-Klick). `LUFSI:RESET` startet eine laufende Session neu; ist sie gestoppt, verschwinden I und LRA im Meter. Rechtsklick oder Lang-Klick auf den Main Screen → **Start I+LRA**, **Stop I+LRA** oder **Reset I+LRA**. Konfiguration unter **Settings → Audio Meters**. Stereo-Pegelanzeige am linken Bildschirmrand: L/R (Sample-Peak, True Peak oder BBC PPM), ein einzelner Programme-LUFS-Balken (EBU R128) oder beides. L/R füllen mit RMS und legen den aktuellen Peak darüber. Programme-LUFS ist ein Balken (Momentary M, Short-term-S-Tick). Integrated I und LRA sind standardmäßig aus und starten mit `LUFSI:START` (Web-UI, MQTT-Home-Assistant-Schalter, Companion, OSC, UDP/HTTP oder Rechtsklick / Lang-Klick). `LUFSI:RESET` startet eine laufende Session neu; ist sie gestoppt, verschwinden I und LRA im Meter. Rechtsklick oder Lang-Klick auf den Main Screen → **Start I+LRA**, **Stop I+LRA** oder **Reset I+LRA**. Konfiguration unter **Settings → Audio Meters**.
Line 700: Line 700:
  
  
-| Einstellung           | Schlüssel                    | Standard     | Beschreibung                                      | +| Einstellung                          | Schlüssel                      | Standard   | Beschreibung                                                           | 
-| --------------------- | ---------------------------- | ------------ | ------------------------------------------------- | +| ------------------------------------ | ------------------------------ | ---------- | ---------------------------------------------------------------------- | 
-| Enable Audio Meters   | `Audio/enabled`              | `true`       | Meter-Spalte anzeigen                             | +| Enable Audio Meters                  | `Audio/enabled`                | `true`     | Meter-Spalte anzeigen                                                  | 
-| Audio Source          | `Audio/source`               | `device`     | `device`, `livewire` oder `aes67`                 | +| Audio Source                         | `Audio/source`                 | `device`   | `device`, `livewire` oder `aes67`                                      | 
-| Audio Input           | `Audio/input_device`         | *(leer)*     | PortAudio-Gerätename (bei Source = Local Input)   | +| Audio Input                          | `Audio/input_device`           | *(leer)*   | PortAudio-Gerätename (bei Source = Local Input)                        | 
-| Livewire Channel      | `Audio/livewire_channel`     | `1`          | Livewire-Kanal 1–32767 (auch über Livewire Source) | +| Livewire Channel                     | `Audio/livewire_channel`       | `1`        | Livewire-Kanal 1–32767 (auch über Livewire Source)                     | 
-| AoIP Interface        | `Audio/livewire_iface`       | *(leer)*     | IPv4 für Livewire/AES67-IGMP-Join; leer = Default | +| AoIP Interface                       | `Audio/livewire_iface`         | *(leer)*   | IPv4 für Livewire/AES67-IGMP-Join; leer = Default                      | 
-| AES67 Stream ID       | `Audio/aes67_id`             | *(leer)*     | SDP-Origin-Hash des gewählten Streams             | +| AES67 Stream ID                      | `Audio/aes67_id`               | *(leer)*   | SDP-Origin-Hash des gewählten Streams                                  | 
-| AES67 Address         | `Audio/aes67_addr`           | *(leer)*     | Multicast-Adresse für RTP-Capture                 | +| AES67 Address                        | `Audio/aes67_addr`             | *(leer)*   | Multicast-Adresse für RTP-Capture                                      | 
-| AES67 Port            | `Audio/aes67_port`           | `5004`       | RTP-UDP-Port                                      | +| AES67 Port                           | `Audio/aes67_port`             | `5004`     | RTP-UDP-Port                                                           | 
-| AES67 Name            | `Audio/aes67_name`           | *(leer)*     | Anzeigename aus SDP `s=`                          | +| AES67 Name                           | `Audio/aes67_name`             | *(leer)*   | Anzeigename aus SDP `s=`                                               | 
-| AES67 Codec           | `Audio/aes67_codec`          | `L24`        | `L16` oder `L24`                                  | +| AES67 Codec                          | `Audio/aes67_codec`            | `L24`      | `L16` oder `L24`                                                       | 
-| AES67 Sample Rate     | `Audio/aes67_rate`           | `48000`      | `44100`, `48000` oder `96000`                     | +| AES67 Sample Rate                    | `Audio/aes67_rate`             | `48000`    | `44100`, `48000` oder `96000`                                          | 
-| AES67 Channels        | `Audio/aes67_channels`       | `2`          | Kanalzahl im Stream (Meter nutzt die ersten zwei) | +| AES67 Channels                       | `Audio/aes67_channels`         | `2`        | Kanalzahl im Stream (Meter nutzt die ersten zwei)                      | 
-| AES67 Pasted SDP      | `Audio/aes67_manual`         | `false`      | `true`, wenn der Stream per Paste SDP kam         | +| AES67 Pasted SDP                     | `Audio/aes67_manual`           | `false`    | `true`, wenn der Stream per Paste SDP kam                              | 
-| Meter Layout          | `Audio/layout`               | `both`       | `lr`, `lufs` oder `both`                           | +| Meter Layout                         | `Audio/layout`                 | `both`     | `lr`, `lufs` oder `both`                                               | 
-| Display Unit          | `Audio/unit`                 | `dbtp`       | L/R-Einheit: `dbfs`, `dbtp`, `bbc_ppm` (PPM nur bei `lr`) | +| Display Unit                         | `Audio/unit`                   | `dbtp`     | L/R-Einheit: `dbfs`, `dbtp`, `bbc_ppm` (PPM nur bei `lr`)              | 
-| Display Style         | `Audio/display_style`        | `bargraph`   | `solid` oder `bargraph`                           | +| Display Style                        | `Audio/display_style`          | `bargraph` | `solid` oder `bargraph`                                                | 
-| Meter Width           | `Audio/meter_width`          | `115`        | Gesamtbreite in Pixel (53–201); extra Breite verdickt sichtbare Balken | +| Meter Width                          | `Audio/meter_width`            | `115`      | Gesamtbreite in Pixel (53–201); extra Breite verdickt sichtbare Balken | 
-| LUFS Reference Preset | `Audio/lufs_reference_preset`| `ebu_r128`   | `ebu_r128`, `atsc_a85`, `aes_16`, `aes_18`, `custom` | +| LUFS Reference Preset                | `Audio/lufs_reference_preset`  | `ebu_r128` | `ebu_r128`, `atsc_a85`, `aes_16`, `aes_18`, `custom`                   | 
-| LUFS Reference        | `Audio/lufs_reference`       | `-23.0`      | Zielpegel in LUFS (Peg auf der Skala)             | +| LUFS Reference                       | `Audio/lufs_reference`         | `-23.0`    | Zielpegel in LUFS (Peg auf der Skala)                                  | 
-| Peak Hold             | `Audio/peak_hold`            | `true`       | Peak-Marke halten                                 | +| Peak Hold                            | `Audio/peak_hold`              | `true`     | Peak-Marke halten                                                      | 
-| Peak Hold Seconds     | `Audio/peak_hold_seconds`    | `1.5`        | Haltedauer der Peak-Marke                         | +| Peak Hold Seconds                    | `Audio/peak_hold_seconds`      | `1.5`      | Haltedauer der Peak-Marke                                              | 
-| TooLoud               | `Audio/tooloud`              | `true`       | Aktion bei True-Peak-Überschreitung               | +| TooLoud                              | `Audio/tooloud`                | `true`     | Aktion bei True-Peak-Überschreitung                                    | 
-| TooLoud Text          | `Audio/tooloudtext`          | `TOO LOUD`   | Warntext                                          | +| TooLoud Text                         | `Audio/tooloudtext`            | `TOO LOUD` | Warntext                                                               | 
-| TooLoud Threshold     | `Audio/tooloud_threshold_dbtp` | `-1.0`     | Schwellwert in dBTP                               | +| TooLoud Threshold                    | `Audio/tooloud_threshold_dbtp` | `-1.0`     | Schwellwert in dBTP                                                    | 
-| TooLoud Action        | `Audio/tooloud_action`       | `warning`    | `warning` oder `led`                              | +| TooLoud Action                       | `Audio/tooloud_action`         | `warning`  | `warning` oder `led`                                                   | 
-| TooLoud LED           | `Audio/tooloud_led`          | `1`          | LED 1–4 bei Action = LED                          | +| TooLoud LED                          | `Audio/tooloud_led`            | `1`        | LED 1–4 bei Action = LED                                               | 
-| Enable Silence Detection | `Audio/silence`          | `false`      | Aktuelle Audioquelle auf Stille überwachen      | +| Enable Silence Detection             | `Audio/silence`                | `false`    | Aktuelle Audioquelle auf Stille überwachen                             | 
-| Show WARN in OAS      | `Audio/silence_warn`         | `true`       | Silence-Alarm als WARN auf dem Bildschirm       | +| Show WARN in OAS                     | `Audio/silence_warn`           | `true`     | Silence-Alarm als WARN auf dem Bildschirm                              | 
-| Trigger when Device/Stream is absent | `Audio/silence_on_absent` | `true` | Fehlendes Device/Stream als Stille zählen       | +| Trigger when Device/Stream is absent | `Audio/silence_on_absent`      | `true`     | Fehlendes Device/Stream als Stille zählen                              | 
-| Silence Message       | `Audio/silence_text`         | `SILENCE`    | WARN-Text (nur wenn Show WARN an ist)           | +| Silence Message                      | `Audio/silence_text`           | `SILENCE`  | WARN-Text (nur wenn Show WARN an ist)                                  | 
-| Silence Threshold     | `Audio/silence_threshold_dbfs` | `-50.0`   | Sample-Peak-Schwellwert in dBFS (−90…0)        | +| Silence Threshold                    | `Audio/silence_threshold_dbfs` | `-50.0`    | Sample-Peak-Schwellwert in dBFS (−90…0)                                | 
-| Max. Silence duration | `Audio/silence_duration_s`  | `10.0`       | Sekunden unter dem Schwellwert bis zum Alarm    | +| Max. Silence duration                | `Audio/silence_duration_s`     | `10.0`     | Sekunden unter dem Schwellwert bis zum Alarm                           | 
-| Recovery time         | `Audio/silence_recovery_s`  | `2.0`        | Sekunden über dem Schwellwert bis zum Löschen   | +| Recovery time                        | `Audio/silence_recovery_s`     | `2.0`      | Sekunden über dem Schwellwert bis zum Löschen                          | 
-| HTTP GET URL          | `Audio/silence_http_url`    | *(leer)*     | Optionale URL, einmalig beim Trigger aufgerufen |+| HTTP GET URL                         | `Audio/silence_http_url`       | *(leer)*   | Optionale URL, einmalig beim Trigger aufgerufen                        | 
  
 Silence Detection nutzt **dieselbe Audioquelle** wie die Meter (Local Input, Livewire oder AES67). Der Schwellwert ist immer **Sample-Peak dBFS**, unabhängig von der Meter-Anzeige. Capture läuft weiter, wenn Silence Detection an ist, auch wenn die Meter ausgeblendet sind. Silence Detection nutzt **dieselbe Audioquelle** wie die Meter (Local Input, Livewire oder AES67). Der Schwellwert ist immer **Sample-Peak dBFS**, unabhängig von der Meter-Anzeige. Capture läuft weiter, wenn Silence Detection an ist, auch wenn die Meter ausgeblendet sind.
Line 750: Line 751:
  
 **Lokaler Eingang:** unter macOS Mikrofon-Berechtigung für OnAirScreen. **Lokaler Eingang:** unter macOS Mikrofon-Berechtigung für OnAirScreen.
- 
  
 --- ---
Line 756: Line 756:
  
  
-### 5.9 GPIO+### 5.10 GPIO / MIDI
  
-GPIO legt Kontakte und Livewire-Source-Pins auf dieselben LED- und AIR-Kommandos wie die Netzwerk-API. Einstellen unter **Settings → GPIO**. Innere Reiter (oben): **Raspberry Pi** und **Axia Livewire**. Beide können gleichzeitig aktiv sein.+GPIO legt Kontakte, Livewire-Source-Pins und MIDI-Befehle auf dieselben LED- und AIR-Kommandos wie die Netzwerk-API. Einstellen unter **Settings → GPIO**. Innere Reiter (oben): **Raspberry Pi**, **Axia Livewire**, **MIDI** und **Logic**. Pi, Livewire und MIDI können gleichzeitig aktiv sein. Logic verknüpft On/Off-Pegel aus allen dreien.
  
 #### Raspberry Pi #### Raspberry Pi
Line 766: Line 766:
 Pi-GPIO ist **3,3 V**. Mixer-GPI ist oft 5–24 V oder Open Collector — **immer ein PC817-Isolationsmodul verwenden**. Potenzialfreie Relaiskontakte nach GND dürfen direkt angeschlossen werden (interner Pull-up, Invert an). Pi-GPIO ist **3,3 V**. Mixer-GPI ist oft 5–24 V oder Open Collector — **immer ein PC817-Isolationsmodul verwenden**. Potenzialfreie Relaiskontakte nach GND dürfen direkt angeschlossen werden (interner Pull-up, Invert an).
  
-| Einstellung    | Schlüssel              | Standard | Beschreibung | + 
-| -------------- | ---------------------- | -------- | ------------ | +| Einstellung    | Schlüssel           | Standard                     | Beschreibung                                                          | 
-| Enable GPIO    | `GPIO/enabled`         | `false`  | Konfigurierte BCM-Pins überwachen | +| -------------- | ------------------- | ---------------------------- | --------------------------------------------------------------------- | 
-| Debounce       | `GPIO/debounce_ms`     | `50`     | Prellen kürzer als dieses Intervall ignorieren (ms) | +| Enable GPIO    | `GPIO/enabled`      | `false`                      | Konfigurierte BCM-Pins überwachen                                     | 
-| GPI*n* Enable  | `GPIO/gpiN_enabled`    | GPI1–2 an, 3–8 aus | Diesen Eingang nutzen | +| Debounce       | `GPIO/debounce_ms`  | `50`                         | Prellen kürzer als dieses Intervall ignorieren (ms)                   | 
-| GPI*n* BCM pin | `GPIO/gpiN_pin`        | 17, 27, 5, 6, 12, 13, 16, 22 | Nur sichere BCM-Pins | +| GPI*n* Enable  | `GPIO/gpiN_enabled` | GPI1–2 an, 3–8 aus           | Diesen Eingang nutzen                                                 | 
-| GPI*n* Invert  | `GPIO/gpiN_invert`     | `true`   | An: Kontakt nach GND ist aktiv (Pull-up) | +| GPI*n* Name    | `GPIO/gpiN_name`    | *(leer)*                     | Kurzes Label für Logic-Regeln, z. B. MIC1                             | 
-| GPI*n* Mode    | `GPIO/gpiN_mode`       | `level`  | `level`, `rising`, `falling`, `both` | +| GPI*n* BCM pin | `GPIO/gpiN_pin`     | 17, 27, 5, 6, 12, 13, 16, 22 | Nur sichere BCM-Pins                                                  | 
-| GPI*n* Actions | `GPIO/gpiN_action`     | LED1 / AIR3 | Eine oder mehrere von LED1–4, AIR1–4, AIR3/AIR4 Reset (kommagetrennt) | +| GPI*n* Invert  | `GPIO/gpiN_invert`  | `true`                       | An: Kontakt nach GND ist aktiv (Pull-up)                              | 
-| GPI*n* Command | `GPIO/gpiN_command`    | *(leer)* | Zusätzliche API-Kommandos, getrennt durch Semikolon |+| GPI*n* Mode    | `GPIO/gpiN_mode`    | `level`                      | `level`, `rising`, `falling`, `both`                                  | 
 +| GPI*n* Actions | `GPIO/gpiN_action`  | LED1 / AIR3                  | Eine oder mehrere von LED1–4, AIR1–4, AIR3/AIR4 Reset (kommagetrennt) | 
 +| GPI*n* Command | `GPIO/gpiN_command` | *(leer)*                     | Zusätzliche API-Kommandos, getrennt durch Semikolon                   | 
  
 **Level** (typisch Tally/Fader): geschlossen sendet `LED1:ON` / `AIR3:ON` für jede gewählte Action, offen sendet `OFF`. Custom-Kommandos nur bei geschlossenem Kontakt. **Rising / Falling / Both** senden `TOGGLE` (oder Reset / die Custom-Kommandos) auf dieser Flanke. Ein altes `CUSTOM` im Action-Feld bedeutet weiterhin „nur Custom-Kommandos“. **Level** (typisch Tally/Fader): geschlossen sendet `LED1:ON` / `AIR3:ON` für jede gewählte Action, offen sendet `OFF`. Custom-Kommandos nur bei geschlossenem Kontakt. **Rising / Falling / Both** senden `TOGGLE` (oder Reset / die Custom-Kommandos) auf dieser Flanke. Ein altes `CUSTOM` im Action-Feld bedeutet weiterhin „nur Custom-Kommandos“.
Line 799: Line 802:
 </mermaid> </mermaid>
 <markdown> <markdown>
 +
 +
  
  
Line 813: Line 818:
 </mermaid> </mermaid>
 <markdown> <markdown>
 +
 +
  
  
Line 819: Line 826:
 **Werks-Defaults am Header** (Platine mit USB/Ethernet nach unten; Stift 1 ist bei den meisten Boards die 3,3-V-Ecke am SD-/Power-Ende): **Werks-Defaults am Header** (Platine mit USB/Ethernet nach unten; Stift 1 ist bei den meisten Boards die 3,3-V-Ecke am SD-/Power-Ende):
  
-| OAS-Eingang | BCM | Header-Stift | Typische Nutzung | + 
-| ----------- | --- | ------------ | ---------------- | +| OAS-Eingang | BCM | Header-Stift                 | Typische Nutzung   | 
-| GPI1        | 17  | 11           | ON AIR (LED1)    | +| ----------- | --- | ---------------------------- | ------------------ | 
-| GPI2        | 27  | 13           | Radio-Timer (AIR3) | +| GPI1        | 17  | 11                           | ON AIR (LED1)      | 
-| Masse       | —   | 6, 9, 14, 20, 25, 30, 34, 39 | gemeinsames GND |+| GPI2        | 27  | 13                           | Radio-Timer (AIR3) | 
 +| Masse       | —   | 6, 9, 14, 20, 25, 30, 34, 39 | gemeinsames GND    | 
  
 Sichere BCM-Pins und zugehörige Header-Stifte (diese Werte unter **BCM pin**): Sichere BCM-Pins und zugehörige Header-Stifte (diese Werte unter **BCM pin**):
 +
  
 | BCM | Header | BCM | Header | BCM | Header | | BCM | Header | BCM | Header | BCM | Header |
Line 833: Line 843:
 | 16  | 36     | 17  | 11     | 24  | 18     | | 16  | 36     | 17  | 11     | 24  | 18     |
 | 26  | 37     | 27  | 13     | 25  | 22     | | 26  | 37     | 27  | 13     | 25  | 22     |
 +
  
 **Pinout-Referenzen** (40-poliger Header, BCM-Nummerierung): **Pinout-Referenzen** (40-poliger Header, BCM-Nummerierung):
Line 840: Line 851:
 - Pi 5 Überblick: [Raspberry Pi 5](https://www.raspberrypi.com/documentation/computers/raspberry-pi-5.html) - Pi 5 Überblick: [Raspberry Pi 5](https://www.raspberrypi.com/documentation/computers/raspberry-pi-5.html)
 - Compute-Module-IO-Boards: [Compute Module](https://www.raspberrypi.com/documentation/computers/compute-module.html) - Compute-Module-IO-Boards: [Compute Module](https://www.raspberrypi.com/documentation/computers/compute-module.html)
 +
 +
  
 #### Axia Livewire #### Axia Livewire
Line 852: Line 865:
 Typisches Mikrofon-ON-AIR-Profil: **GPO Pin 1** ist die ON-Lampe (latchend, solange der Kanal ON ist; bei TALK/MUTE oft aus). GPI 1 wäre der ON-Befehl *zur* Konsole — OAS sendet das nicht. Typisches Mikrofon-ON-AIR-Profil: **GPO Pin 1** ist die ON-Lampe (latchend, solange der Kanal ON ist; bei TALK/MUTE oft aus). GPI 1 wäre der ON-Befehl *zur* Konsole — OAS sendet das nicht.
  
-| Einstellung            | Schlüssel              | Standard             | Beschreibung                                      | + 
-| ---------------------- | ---------------------- | -------------------- | ------------------------------------------------- | +| Einstellung          | Schlüssel              | Standard             | Beschreibung                                                          | 
-| Enable Livewire GPIO   | `GPIO/lw_enabled`      | `false`              | Livewire-GPIO folgen (Multicast oder LWRP)        | +| -------------------- | ---------------------- | -------------------- | --------------------------------------------------------------------- | 
-| Mode                   | `GPIO/lw_transport`    | `multicast`          | `multicast` oder `lwrp`                           | +| Enable Livewire GPIO | `GPIO/lw_enabled`      | `false`              | Livewire-GPIO folgen (Multicast oder LWRP)                            | 
-| Host                   | `GPIO/lw_host`         | *(leer)*             | Geräte-IPv4 (LWRP)                                | +| Mode                 | `GPIO/lw_transport`    | `multicast`          | `multicast` oder `lwrp`                                               | 
-| Port                   | `GPIO/lw_port`         | `93`                 | LWRP-TCP-Port                                     | +| Host                 | `GPIO/lw_host`         | *(leer)*             | Geräte-IPv4 (LWRP)                                                    | 
-| Password               | `GPIO/lw_password`     | *(leer)*             | Optionales LWRP-`LOGIN`-Passwort                  | +| Port                 | `GPIO/lw_port`         | `93`                 | LWRP-TCP-Port                                                         | 
-| AoIP-Interface         | `Audio/livewire_iface` | *(leer)*             | IPv4-Interface für IGMP (Multicast-Modus; wie Audio-Meter) | +| Password             | `GPIO/lw_password`     | *(leer)*             | Optionales LWRP-`LOGIN`-Passwort                                      | 
-| Debounce               | `GPIO/lw_debounce_ms`  | `50`                 | Prellen kürzer als dieses Intervall ignorieren (ms) | +| AoIP-Interface       | `Audio/livewire_iface` | *(leer)*             | IPv4-Interface für IGMP (Multicast-Modus; wie Audio-Meter)            | 
-| GPI*n* Enable          | `GPIO/lw_gpiN_enabled` | Zeilen 1–2 an        | Diese Mapping-Zeile nutzen                        | +| Debounce             | `GPIO/lw_debounce_ms`  | `50`                 | Prellen kürzer als dieses Intervall ignorieren (ms)                   | 
-| GPI*n* Channel/Port    | `GPIO/lw_gpiN_channel` | 1, 2, dann Zeile *n* | Livewire-Kanal (Multicast) oder GPIO-Port am Gerät (LWRP), 1–32767 | +| GPI*n* Enable        | `GPIO/lw_gpiN_enabled` | Zeilen 1–2 an        | Diese Mapping-Zeile nutzen                                            | 
-| GPI*n* Direction       | `GPIO/lw_gpiN_dir`     | `gpo`                | `gpo` (von der Konsole) oder `gpi` (zur Konsole)  | +| GPI*n* Name          | `GPIO/lw_gpiN_name`    | *(leer)*             | Kurzes Label für Logic-Regeln, z. B. MIC1                             | 
-| GPI*n* Pin             | `GPIO/lw_gpiN_pin`     | `1`                  | Pin 1–5 auf diesem Kanal/Port                     | +| GPI*n* Channel/Port  | `GPIO/lw_gpiN_channel` | 1, 2, dann Zeile *n* | Livewire-Kanal (Multicast) oder GPIO-Port am Gerät (LWRP), 1–32767    | 
-| GPI*n* Invert          | `GPIO/lw_gpiN_invert`  | `false`              | Aus: Livewire Low (L/l) ist aktiv                 | +| GPI*n* Direction     | `GPIO/lw_gpiN_dir`     | `gpo`                | `gpo` (von der Konsole) oder `gpi` (zur Konsole)                      | 
-| GPI*n* Mode            | `GPIO/lw_gpiN_mode`    | `level`              | `level`, `rising`, `falling`, `both`              | +| GPI*n* Pin           | `GPIO/lw_gpiN_pin`     | `1`                  | Pin 1–5 auf diesem Kanal/Port                                         | 
-| GPI*n* Actions         | `GPIO/lw_gpiN_action`  | LED1 / AIR3          | Eine oder mehrere von LED1–4, AIR1–4, AIR3/AIR4 Reset (kommagetrennt) | +| GPI*n* Invert        | `GPIO/lw_gpiN_invert`  | `false`              | Aus: Livewire Low (L/l) ist aktiv                                     | 
-| GPI*n* Command         | `GPIO/lw_gpiN_command` | *(leer)*             | Zusätzliche API-Kommandos, getrennt durch Semikolon                   |+| GPI*n* Mode          | `GPIO/lw_gpiN_mode`    | `level`              | `level`, `rising`, `falling`, `both`                                  | 
 +| GPI*n* Actions       | `GPIO/lw_gpiN_action`  | LED1 / AIR3          | Eine oder mehrere von LED1–4, AIR1–4, AIR3/AIR4 Reset (kommagetrennt) | 
 +| GPI*n* Command       | `GPIO/lw_gpiN_command` | *(leer)*             | Zusätzliche API-Kommandos, getrennt durch Semikolon                   | 
  
 Werks-Mapping (Master **Enable Livewire GPIO** bleibt aus): Zeile 1 Kanal/Port 1 GPO Pin 1 → LED1, Zeile 2 Kanal/Port 2 GPO Pin 1 → AIR3. Werks-Mapping (Master **Enable Livewire GPIO** bleibt aus): Zeile 1 Kanal/Port 1 GPO Pin 1 → LED1, Zeile 2 Kanal/Port 2 GPO Pin 1 → AIR3.
Line 877: Line 893:
  
 **Level** (typische ON-Lampe): GPO 1 low sendet `LED1:ON`, high sendet `OFF`. Invert bleibt **aus**, außer die Konsolen-Polarität ist umgekehrt. **Level** (typische ON-Lampe): GPO 1 low sendet `LED1:ON`, high sendet `OFF`. Invert bleibt **aus**, außer die Konsolen-Polarität ist umgekehrt.
 +
 +#### MIDI
 +
 +**MIDI** liest ein Eingangs-Interface (Settings → GPIO → MIDI) und legt Note- oder CC-Befehle auf dieselben LED- und AIR-Kommandos. **Learn** wartet bis zu 10 Sekunden auf die nächste Note oder den nächsten CC und füllt Kanal, Typ und Nummer. Clock, Active Sensing und SysEx werden ignoriert.
 +
 +
 +| Einstellung       | Schlüssel               | Standard | Beschreibung                                                                                    |
 +| ----------------- | ----------------------- | -------- | ----------------------------------------------------------------------------------------------- |
 +| Enable MIDI       | `GPIO/midi_enabled`     | `false`  | Am gewählten Interface mithören                                                                 |
 +| Interface         | `GPIO/midi_port`        | *(leer)* | Name des Eingangs. Ein fehlendes Gerät bleibt als „not connected“ stehen                        |
 +| Debounce          | `GPIO/midi_debounce_ms` | `20`     | Oneshot und Toggle fassen einen Burst kürzer als dieses Intervall als einen Druck zusammen (ms) |
 +| MIDI*n* Enable    | `GPIO/midiN_enabled`    | `false`  | Diese Zeile nutzen                                                                              |
 +| MIDI*n* Name      | `GPIO/midiN_name`       | *(leer)* | Kurzes Label für Logic, z. B. PAD                                                               |
 +| MIDI*n* Channel   | `GPIO/midiN_channel`    | `1`      | MIDI-Kanal 1–16                                                                                 |
 +| MIDI*n* Type      | `GPIO/midiN_kind`       | `note`   | `note` oder `cc`                                                                                |
 +| MIDI*n* Number    | `GPIO/midiN_number`     | `0`      | Noten- oder CC-Nummer, 0–127                                                                    |
 +| MIDI*n* Threshold | `GPIO/midiN_threshold`  | `64`     | CC ab diesem Wert ist aktiv                                                                     |
 +| MIDI*n* Behavior  | `GPIO/midiN_behavior`   | `follow` | `follow` (On/Off), `oneshot` oder `toggle`                                                      |
 +| MIDI*n* Invert    | `GPIO/midiN_invert`     | `false`  | On/Off tauscht den Haltepegel. Oneshot sendet OFF statt ON                                      |
 +| MIDI*n* Actions   | `GPIO/midiN_action`     | *(leer)* | LED1–4, AIR1–4, AIR3/AIR4 Reset                                                                 |
 +| MIDI*n* Command   | `GPIO/midiN_command`    | *(leer)* | Zusätzliche API-Kommandos, semikolongetrennt                                                    |
 +
 +
 +**On/Off** hält den Pegel: Note On (Velocity > 0) oder ein CC ab der Schwelle sendet `LED1:ON`, Note Off oder ein CC unter der Schwelle sendet `OFF`. **Oneshot** sendet einmal pro Druck `LED1:ON`, mit Invert `LED1:OFF`. **Toggle** sendet einmal pro Druck `LED1:TOGGLE`. Reset und Custom feuern bei beiden einmal, auch bei invertiertem Oneshot. Beide lösen erneut aus, auch wenn der Controller nie ein Note Off schickt. Ein Regler, der oberhalb der Schwelle weiter CCs sendet, bleibt ein Burst. Zwei eingeschaltete Zeilen mit demselben Kanal, Typ und derselben Nummer feuern beide, und der Tab zeigt eine Warnung. Solange die Einstellungen offen sind, blinkt eine eingeschaltete Zeile, wenn eine Note oder ein CC mit ihrem Kanal, Typ und ihrer Nummer ankommt.
 +
 +**In Logic stehen nur On/Off-Zeilen.** Oneshot und Toggle fehlen im Logic-Menü, auch wenn die Zeile eingeschaltet ist und einen Namen hat, weil sie keinen Haltepegel haben. Jede On/Off-Zeile steht in der Liste, auch wenn Enable aus ist. Dieser ausgeschaltete Eingang zählt in der Regel als aus. On/Off-Zeilen ohne Namen heißen MIDI1 … MIDI8. Mit Namen steht dort `PAD (MIDI1)`. Damit eine MIDI-Zeile in Logic auftaucht, Behavior auf On/Off stellen.
 +
 +#### Logic
 +
 +**Logic** verknüpft Raspberry-Pi-, Livewire- und MIDI-On/Off-Eingänge. Jede Regel hat einen Operator, einen oder mehrere Eingänge und einen oder mehrere Ausgänge. Die Ausgänge folgen dem Gesampegel: ein Kommando geht nur raus, wenn dieses Ergebnis umschlägt. Das Eingangsmenü enthält jeden Pi-Eingang, jeden Livewire-Eingang und jede MIDI-Zeile mit Behavior On/Off. MIDI-Oneshot und MIDI-Toggle fehlen. Eine MIDI-On/Off-Zeile bleibt im Menü, wenn Enable aus ist.
 +
 +
 +| Operator | Ausgänge an                           | Ausgänge aus                            |
 +| -------- | ------------------------------------- | --------------------------------------- |
 +| OR       | irgendein gewählter Eingang ist aktiv | alle gewählten Eingänge sind inaktiv    |
 +| AND      | alle gewählten Eingänge sind aktiv    | irgendein gewählter Eingang ist inaktiv |
 +
 +
 +Beispiel: Pi GPI1 `MIC1` und Pi GPI2 `MIC2` benennen. Regel `OR` mit diesen beiden Eingängen und den Ausgängen LED1 und AIR1 bleibt an, solange ein Mikrofon offen ist, und geht erst aus, wenn beide zu sind.
 +
 +Ausgeschaltete, fehlende oder noch nicht gesehene Eingänge zählen als aus. Eine leere Eingangsliste bleibt aus. Resets und Custom-Kommandos feuern, wenn die Regel wahr wird, nicht wenn sie falsch wird. Direkte Zeilen-Aktionen (einschließlich Flanken) laufen parallel weiter. Steuert dieselbe LED oder derselbe AIR-Timer schon eine Zeile oder eine andere Regel, zeigt die Logic-Zeile eine Warnung.
 +
 +
 +| Einstellung       | Schlüssel             | Standard | Beschreibung                                        |
 +| ----------------- | --------------------- | -------- | --------------------------------------------------- |
 +| Rule *n* Enable   | `GPIO/logicN_enabled` | `false`  | Diese Regel nutzen                                  |
 +| Rule *n* Operator | `GPIO/logicN_op`      | `or`     | `or` oder `and`                                     |
 +| Rule *n* Inputs   | `GPIO/logicN_inputs`  | *(leer)* | `pi:1`, `lw:2`, `midi:3`, kommagetrennt             |
 +| Rule *n* Outputs  | `GPIO/logicN_action`  | *(leer)* | LED1–4, AIR1–4, AIR3/AIR4 Reset                     |
 +| Rule *n* Command  | `GPIO/logicN_command` | *(leer)* | Zusätzliche API-Kommandos, wenn die Regel wahr wird |
 +
 +
 +Acht Regeln. Ein Mikrofon, das beim Start schon offen ist, schaltet eine passende Regel an, sobald der Pegel dieses Eingangs bekannt ist.
  
 --- ---
 +
 +
 +
 +### 5.11 About
 +
 +
 +| Element            | Beschreibung                                                           |
 +| ------------------ | ---------------------------------------------------------------------- |
 +| Version            | Aktuelle OnAirScreen-Version                                           |
 +| Distribution       | `OpenSource` oder kommerzielle Distribution                            |
 +| Settings Path      | Pfad zur Konfigurationsdatei auf diesem System                         |
 +| Log Folder         | Ordner mit `onairscreen.log` und Crash-Reports                         |
 +| Open log folder    | Öffnet diesen Ordner im Dateimanager                                   |
 +| Loglevel           | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`, `NONE`                |
 +| Enable Reset       | Checkbox zum Freischalten des Reset-Buttons                            |
 +| Reset all settings | Setzt **alle** Einstellungen auf Standardwerte zurück (unwiderruflich) |
 +| Reboot             | Host-Betriebssystem neu starten (mit Nachfrage)                        |
 +| Shutdown           | Host-Betriebssystem herunterfahren (mit Nachfrage)                     |
 +
 +
 +---
 +
 +
  
 ## 6. Funktionen im Detail ## 6. Funktionen im Detail
Line 926: Line 1018:
  
  
-| Eingabe            | Bedeutung                          | +| Eingabe                    | Bedeutung                          | 
-| ------------------ | ---------------------------------- |+| -------------------------- | ---------------------------------- |
 | `2:10`, `2,10` oder `2.10` | 2 Minuten 10 Sekunden (Count-Down) | | `2:10`, `2,10` oder `2.10` | 2 Minuten 10 Sekunden (Count-Down) |
-| `30`               | 30 Sekunden (Count-Down)           | +| `30`                       | 30 Sekunden (Count-Down)           | 
-| `0`                | Count-Up-Modus                     |+| `0`                        | Count-Up-Modus                     |
  
  
Line 1007: Line 1099:
  
 ![Analog 24h (kontinuierlicher oder tickender Sekundenzeiger)](https://www.astrastudio.de/wp-content/uploads/2026/09/OAS_Clockfaces_analog_24h.png) ![Analog 24h (kontinuierlicher oder tickender Sekundenzeiger)](https://www.astrastudio.de/wp-content/uploads/2026/09/OAS_Clockfaces_analog_24h.png)
 +
 - **Textuhr:** Sprachliche Zeitanzeige (z. B. „it's a quarter past three") - **Textuhr:** Sprachliche Zeitanzeige (z. B. „it's a quarter past three")
-- **Zeitquelle:** Local, NTP, PTPv2 oder LTC — siehe [5.3 Time Source](#time_source); die OS-Uhr wird nie gesetzt+- **Zeitquelle:** Local, NTP, PTPv2 oder LTC — siehe [5.8 Time Source](#time_source); die OS-Uhr wird nie gesetzt
 - **Lock-LED** unten rechts: grün = eingerastet, rot = nicht eingerastet (`PTP LOCK` / `NTP LOCK` / `LTC LOCK` oder `LOCAL`) - **Lock-LED** unten rechts: grün = eingerastet, rot = nicht eingerastet (`PTP LOCK` / `NTP LOCK` / `LTC LOCK` oder `LOCAL`)
 - **Wetter-Widget:** Optional rechts neben der Uhr (OpenWeatherMap) - **Wetter-Widget:** Optional rechts neben der Uhr (OpenWeatherMap)
Line 1028: Line 1121:
 ### 6.7 GPIO-Eingänge ### 6.7 GPIO-Eingänge
  
-Mixer-GPI (Kontakt) kann LEDs und AIR-Timer über **Raspberry-Pi-GPIO** ansteuern. Axia-Konsolen können dieselben LED- und AIR-Aktionen über **Livewire-GPIO** ansteuern (Multicast-Source-Kanal oder LWRP TCP 93, z. B. Mic-ON-Lampe). Beides kann gleichzeitig laufen. Pi-Verdrahtung, Livewire-Kanal/Port-Mapping und das AoIP-Interface stehen unter [5.9 GPIO](#gpio). Pi-GPIO ist lokale Hardware; Livewire-GPIO ist Multicast oder eine TCP-Sitzung im AoIP-Netz.+Mixer-GPI (Kontakt) kann LEDs und AIR-Timer über **Raspberry-Pi-GPIO** ansteuern. Axia-Konsolen können dieselben LED- und AIR-Aktionen über **Livewire-GPIO** ansteuern (Multicast-Source-Kanal oder LWRP TCP 93, z. B. Mic-ON-Lampe). Ein MIDI-Controller kann sie über Note- und CC-Befehle an einem Eingang ansteuern. Alle drei können gleichzeitig laufen. Pi-Verdrahtung, Livewire-Kanal/Port-Mapping, MIDI-Learn und das AoIP-Interface stehen unter [5.10 GPIO](#510-gpio). Pi-GPIO ist lokale Hardware; Livewire-GPIO ist Multicast oder eine TCP-Sitzung im AoIP-Netz; MIDI ist der gewählte Eingang.
  
 --- ---
Line 1086: Line 1179:
 - Links im Overlay: dieselbe Nearby-Liste, **Add as replica** / **Use as source** und Replicas-/Sources-Raster wie in den Desktop-Settings - Links im Overlay: dieselbe Nearby-Liste, **Add as replica** / **Use as source** und Replicas-/Sources-Raster wie in den Desktop-Settings
 - Audio Meters im Overlay: Dropdowns **Livewire Source** und **AES67 Stream** (Live-Discovery solange das Overlay offen ist) plus Paste SDP - Audio Meters im Overlay: Dropdowns **Livewire Source** und **AES67 Stream** (Live-Discovery solange das Overlay offen ist) plus Paste SDP
 +
  
  
Line 1109: Line 1203:
   "lra": null,   "lra": null,
   "instance": "Studio-1",   "instance": "Studio-1",
-  "version": "1.0.7",+  "version": "1.0.10",
   "distribution": "OpenSource",   "distribution": "OpenSource",
   "link": { "enabled": false, "follow": null, "replicas": [], "peers": 0 }   "link": { "enabled": false, "follow": null, "replicas": [], "peers": 0 }
Line 1146: Line 1240:
  
 Geheimnisse (`updatekey`, MQTT-Passwort, OpenWeatherMap-API-Key) kommen im Klartext zurück, damit das Overlay sie anzeigen kann. Die PIN kommt als `__unchanged__` zurück (gespeichert wird nur der Hash). Diesen Sentinel senden, um die PIN zu behalten; `-` entfernt sie. Änderungen an UDP-/HTTP-Port werden gespeichert, greifen aber erst nach einem App-Neustart. Geheimnisse (`updatekey`, MQTT-Passwort, OpenWeatherMap-API-Key) kommen im Klartext zurück, damit das Overlay sie anzeigen kann. Die PIN kommt als `__unchanged__` zurück (gespeichert wird nur der Hash). Diesen Sentinel senden, um die PIN zu behalten; `-` entfernt sie. Änderungen an UDP-/HTTP-Port werden gespeichert, greifen aber erst nach einem App-Neustart.
- 
  
 ### 7.5 MQTT ### 7.5 MQTT
Line 1153: Line 1246:
  
  
-| Topic            | Payload                 | Funktion              | +| Topic                   | Payload                           | Funktion                    | 
-| ---------------- | ----------------------- | --------------------- | +| ----------------------- | --------------------------------- | --------------------------- | 
-| `led{1-4}/set`   | `ON` / `OFF` / `TOGGLE` | LED schalten          | +| `led{1-4}/set`          | `ON` / `OFF` / `TOGGLE`           | LED schalten                | 
-| `air{1-4}/set`   | `ON` / `OFF` / `TOGGLE` | Timer starten/stoppen | +| `air{1-4}/set`          | `ON` / `OFF` / `TOGGLE`           | Timer starten/stoppen       | 
-| `air{3-4}/reset` | `PRESS`                 | Timer zurücksetzen    | +| `air{3-4}/reset`        | `PRESS`                           | Timer zurücksetzen          | 
-| `air3/toh`       | `ON` / `OFF` / `TOGGLE` | Top-of-Hour           | +| `air3/toh`              | `ON` / `OFF` / `TOGGLE`           | Top-of-Hour                 | 
-| `lufs/integrated/set` | `ON` / `OFF` / `TOGGLE` / `RESET` | I+LRA starten/stoppen/reset | +| `lufs/integrated/set`   | `ON` / `OFF` / `TOGGLE` / `RESET` | I+LRA starten/stoppen/reset | 
-| `lufs/integrated/reset` | `PRESS` | I+LRA zurücksetzen | +| `lufs/integrated/reset` | `PRESS`                           | I+LRA zurücksetzen          | 
-| `text/now/set`   | `TEXT`                  | NOW-Text setzen       | +| `text/now/set`          | `TEXT`                            | NOW-Text setzen             | 
-| `text/next/set`  | `TEXT`                  | NEXT-Text setzen      | +| `text/next/set`         | `TEXT`                            | NEXT-Text setzen            | 
-| `text/warn/set`  | `TEXT`                  | WARN-Text setzen      |+| `text/warn/set`         | `TEXT`                            | WARN-Text setzen            |
  
  
Line 1169: Line 1262:
  
  
-| Topic              | Payload            | +| Topic                        | Payload                         | 
-| ------------------ | ------------------ | +| ---------------------------- | ------------------------------- | 
-| `led{1-4}/state`   | `ON` / `OFF`       | +| `led{1-4}/state`             | `ON` / `OFF`                    | 
-| `air{1-4}/state`   | `ON` / `OFF`       | +| `air{1-4}/state`             | `ON` / `OFF`                    | 
-| `air{1-4}/time`    | Sekunden (Integer) | +| `air{1-4}/time`              | Sekunden (Integer)              | 
-| `air3/toh/state`   | `true` / `false`   | +| `air3/toh/state`             | `true` / `false`                | 
-| `text/{now,next,warn}/state` | Text     | +| `text/{now,next,warn}/state` | Text                            | 
-| `warning/active`  | `true` / `false`   | +| `warning/active`             | `true` / `false`                | 
-| `silence/active`   | `true` / `false`   | +| `silence/active`             | `true` / `false`                | 
-| `lufs/integrated/state` | `ON` / `OFF` | +| `lufs/integrated/state`      | `ON` / `OFF`                    | 
-| `lufs/i`           | I in LUFS (`""` wenn unbekannt) | +| `lufs/i`                     | I in LUFS (`""` wenn unbekannt) | 
-| `lufs/lra`         | LRA in LU (`""` wenn unbekannt) | +| `lufs/lra`                   | LRA in LU (`""` wenn unbekannt) | 
-| `instance/state`   | Instanzname        |+| `instance/state`             | Instanzname                     |
  
  
Line 1199: Line 1292:
  
 Der Home-Assistant-Gerätename lautet `OnAirScreen (Studio-1)`, wenn der Instanzname noch nicht im MQTT Device Name steht. Der Home-Assistant-Gerätename lautet `OnAirScreen (Studio-1)`, wenn der Instanzname noch nicht im MQTT Device Name steht.
- 
- 
  
 ### 7.6 Bitfocus Companion (empfohlen) ### 7.6 Bitfocus Companion (empfohlen)
Line 1217: Line 1308:
 Presets: LED1–4 (Toggle + Farbe), AIR1–4 mit Live-Beschriftung und Zeit auf dem Button (MIC = AIR1), TOTH, Reset AIR3/4, NOW / NEXT / WARN, Silence, Loudness I+LRA, Reset I+LRA. Presets: LED1–4 (Toggle + Farbe), AIR1–4 mit Live-Beschriftung und Zeit auf dem Button (MIC = AIR1), TOTH, Reset AIR3/4, NOW / NEXT / WARN, Silence, Loudness I+LRA, Reset I+LRA.
  
-Variablen wie `$(oas:air1_time)`, `$(oas:lufs_i)` und `$(oas:lra)` und Feedbacks (LED an, AIR läuft, TOTH, Silence, WARN, Loudness I+LRA) kommen aus WebSocket oder Status-Poll. Connection-Label auf `oas` setzen, damit die Beispiele passen. Der Connection-Status zeigt Instanzname und Version, z. B. `Studio-1 · 1.0.7`. Die `HELP.md` des Moduls listet alle Aktionen, Feedbacks und Variablen.+Variablen wie `$(oas:air1_time)`, `$(oas:lufs_i)` und `$(oas:lra)` und Feedbacks (LED an, AIR läuft, TOTH, Silence, WARN, Loudness I+LRA) kommen aus WebSocket oder Status-Poll. Connection-Label auf `oas` setzen, damit die Beispiele passen. Der Connection-Status zeigt Instanzname und Version, z. B. `Studio-1 · 1.0.10`. Die `HELP.md` des Moduls listet alle Aktionen, Feedbacks und Variablen.
  
 Wenn kein eigenes Modul geladen werden kann, bleibt **Generic OSC** als Alternative (nächster Abschnitt). OSC-Status-Push ist langsamer (alle 5 Sekunden) als HTTP-Poll / WebSocket. Wenn kein eigenes Modul geladen werden kann, bleibt **Generic OSC** als Alternative (nächster Abschnitt). OSC-Status-Push ist langsamer (alle 5 Sekunden) als HTTP-Poll / WebSocket.
Line 1228: Line 1319:
  
  
-| Adresse               | Argument                         | Funktion              | +| Adresse                      | Argument                           | Funktion                | 
-| -------------------- | -------------------------------- | --------------------- | +| ---------------------------- | ---------------------------------- | ----------------------- | 
-| `/oas/led{1-4}`      | `i` 0/1, oder leer für Toggle      | LED                   | +| `/oas/led{1-4}`              | `i` 0/1, oder leer für Toggle      | LED                     | 
-| `/oas/air{1-4}`      | `i` 0/1, oder leer für Toggle      | AIR-Timer             | +| `/oas/air{1-4}`              | `i` 0/1, oder leer für Toggle      | AIR-Timer               | 
-| `/oas/air{3-4}/reset` | keines                           | AIR3/AIR4 zurücksetzen | +| `/oas/air{3-4}/reset`        | keines                             | AIR3/AIR4 zurücksetzen  | 
-| `/oas/air3/toh`      | `i` 0/1                          | Top-of-Hour           | +| `/oas/air3/toh`              | `i` 0/1                            | Top-of-Hour             | 
-| `/oas/air3/time`     | `i` Sekunden (weglassen = Abfrage) | AIR3-Zeit setzen      | +| `/oas/air3/time`             | `i` Sekunden (weglassen = Abfrage) | AIR3-Zeit setzen        | 
-| `/oas/text/now`      | `s` Text                         | NOW                   | +| `/oas/text/now`              | `s` Text                           | NOW                     | 
-| `/oas/text/next`     | `s` Text                         | NEXT                  | +| `/oas/text/next`             | `s` Text                           | NEXT                    | 
-| `/oas/text/warn`     | `s` Text                         | WARN                  | +| `/oas/text/warn`             | `s` Text                           | WARN                    | 
-| `/oas/command`       | `s` `COMMAND:VALUE`              | Roh-API-Befehl        | +| `/oas/command`               | `s` `COMMAND:VALUE`                | Roh-API-Befehl          | 
-| `/oas/lufs/integrated` | `i` 0/1, oder leer für Toggle    | I + LRA starten/stoppen | +| `/oas/lufs/integrated`       | `i` 0/1, oder leer für Toggle      | I + LRA starten/stoppen | 
-| `/oas/lufs/integrated/reset` | leer                        | I + LRA zurücksetzen    |+| `/oas/lufs/integrated/reset` | leer                               | I + LRA zurücksetzen    |
  
  
Line 1254: Line 1345:
 python3 utils/oas_osc_send.py /oas/led1 1 python3 utils/oas_osc_send.py /oas/led1 1
 ``` ```
 +
 +
  
 #### Alternative: Generic OSC #### Alternative: Generic OSC
Line 1305: Line 1398:
  
  
-| Befehl                       | Funktion                            | +| Befehl                            | Funktion                                                            | 
-| ---------------------------- | ----------------------------------- | +| --------------------------------- | ------------------------------------------------------------------- | 
-| `LED{1-4}:[ON/OFF/TOGGLE]`   | LED schalten                        | +| `LED{1-4}:[ON/OFF/TOGGLE]`        | LED schalten                                                        | 
-| `NOW:TEXT`                   | NOW-Text setzen                     | +| `NOW:TEXT`                        | NOW-Text setzen                                                     | 
-| `NEXT:TEXT`                  | NEXT-Text setzen                    | +| `NEXT:TEXT`                       | NEXT-Text setzen                                                    | 
-| `WARN:TEXT`                  | Warnung setzen (Priorität 0)        | +| `WARN:TEXT`                       | Warnung setzen (Priorität 0)                                        | 
-| `WARN:1:TEXT`                | Warnung setzen (Priorität Medium)   | +| `WARN:1:TEXT`                     | Warnung setzen (Priorität Medium)                                   | 
-| `WARN:2:TEXT`                | Warnung setzen (Priorität High)     | +| `WARN:2:TEXT`                     | Warnung setzen (Priorität High)                                     | 
-| `WARN:`                      | Warnung Priorität 0 löschen         | +| `WARN:`                           | Warnung Priorität 0 löschen                                         | 
-| `WARN:1:`                    | Warnung Priorität 1 löschen         | +| `WARN:1:`                         | Warnung Priorität 1 löschen                                         | 
-| `WARN:2:`                    | Warnung Priorität 2 löschen         | +| `WARN:2:`                         | Warnung Priorität 2 löschen                                         | 
-| `AIR1:[ON/OFF/TOGGLE]`       | Mikrofon-Timer                      | +| `AIR1:[ON/OFF/TOGGLE]`            | Mikrofon-Timer                                                      | 
-| `AIR2:[ON/OFF/TOGGLE]`       | Telefon-Timer                       | +| `AIR2:[ON/OFF/TOGGLE]`            | Telefon-Timer                                                       | 
-| `AIR3:[ON/OFF/RESET/TOGGLE]` | Radio-Timer                         | +| `AIR3:[ON/OFF/RESET/TOGGLE]`      | Radio-Timer                                                         | 
-| `AIR3TIME:seconds`           | Radio-Timer auf Sekundenwert setzen | +| `AIR3TIME:seconds`                | Radio-Timer auf Sekundenwert setzen                                 | 
-| `AIR3TOH:[ON/OFF/TOGGLE]`    | Top-of-Hour-Countdown               | +| `AIR3TOH:[ON/OFF/TOGGLE]`         | Top-of-Hour-Countdown                                               | 
-| `AIR4:[ON/OFF/RESET/TOGGLE]` | Stream-Timer                        |+| `AIR4:[ON/OFF/RESET/TOGGLE]`      | Stream-Timer                                                        |
 | `LUFSI:[START/STOP/TOGGLE/RESET]` | Programme-I + LRA-Session (Reset: laufend neu, gestoppt ausblenden) | | `LUFSI:[START/STOP/TOGGLE/RESET]` | Programme-I + LRA-Session (Reset: laufend neu, gestoppt ausblenden) |
-| `FULLSCREEN:[ON/OFF/TOGGLE]` | Hauptfenster Vollbild               | +| `FULLSCREEN:[ON/OFF/TOGGLE]`      | Hauptfenster Vollbild                                               | 
-| `CMD:REBOOT`                 | OS-Neustart (HTTP: Web-Settings-PIN, wenn gesetzt) | +| `CMD:REBOOT`                      | OS-Neustart (HTTP: Web-Settings-PIN, wenn gesetzt)                  | 
-| `CMD:SHUTDOWN`               | OS-Herunterfahren (HTTP: Web-Settings-PIN, wenn gesetzt) | +| `CMD:SHUTDOWN`                    | OS-Herunterfahren (HTTP: Web-Settings-PIN, wenn gesetzt)            | 
-| `CMD:QUIT`                   | OnAirScreen beenden                 |+| `CMD:QUIT`                        | OnAirScreen beenden                                                 |
  
  
Line 1338: Line 1431:
  
  
-| Befehl                                          | Beschreibung            | +| Befehl                                          | Beschreibung                                                                                                                                                         | 
-| ----------------------------------------------- | ----------------------- | +| ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 
-| `CONF:General:stationname=TEXT`                 | Stationsname            | +| `CONF:General:stationname=TEXT`                 | Stationsname                                                                                                                                                         | 
-| `CONF:General:instancename=TEXT`              | Instanzname (DNS-Label) | +| `CONF:General:instancename=TEXT`                | Instanzname (DNS-Label)                                                                                                                                              | 
-| `CONF:General:slogan=TEXT`                      | Slogan                  | +| `CONF:General:slogan=TEXT`                      | Slogan                                                                                                                                                               | 
-| `CONF:General:stationcolor=COLOR`               | Stationsfarbe           | +| `CONF:General:stationcolor=COLOR`               | Stationsfarbe                                                                                                                                                        | 
-| `CONF:General:slogancolor=COLOR`                | Sloganfarbe             | +| `CONF:General:slogancolor=COLOR`                | Sloganfarbe                                                                                                                                                          | 
-| `CONF:General:replacenow=[True/False]`          | IP-Ersatz aktivieren    | +| `CONF:General:replacenow=[True/False]`          | IP-Ersatz aktivieren                                                                                                                                                 | 
-| `CONF:General:replacenowtext=TEXT`              | Ersatztext              | +| `CONF:General:replacenowtext=TEXT`              | Ersatztext                                                                                                                                                           | 
-| `CONF:LED[1-4]:used=[True/False]`               | LED aktivieren          | +| `CONF:LED[1-4]:used=[True/False]`               | LED aktivieren                                                                                                                                                       | 
-| `CONF:LED[1-4]:text=TEXT`                       | LED-Text                | +| `CONF:LED[1-4]:text=TEXT`                       | LED-Text                                                                                                                                                             | 
-| `CONF:LED[1-4]:activebgcolor=COLOR`             | LED-Hintergrund aktiv   | +| `CONF:LED[1-4]:activebgcolor=COLOR`             | LED-Hintergrund aktiv                                                                                                                                                | 
-| `CONF:LED[1-4]:activetextcolor=COLOR`           | LED-Text aktiv          | +| `CONF:LED[1-4]:activetextcolor=COLOR`           | LED-Text aktiv                                                                                                                                                       | 
-| `CONF:LED[1-4]:autoflash=[True/False]`          | Autoflash               | +| `CONF:LED[1-4]:autoflash=[True/False]`          | Autoflash                                                                                                                                                            | 
-| `CONF:LED[1-4]:timedflash=[True/False]`         | 20-Sekunden-Flash       |+| `CONF:LED[1-4]:timedflash=[True/False]`         | 20-Sekunden-Flash                                                                                                                                                    |
 | `CONF:Clock:face=FACE`                          | Zifferblatt: `digital`, `analog`, `analog_numbers`, `analog_studio`, `analog_railway`, `analog_24h_smooth`, `analog_24h_ticking` (`analog_24h` ist Alias für Smooth) | | `CONF:Clock:face=FACE`                          | Zifferblatt: `digital`, `analog`, `analog_numbers`, `analog_studio`, `analog_railway`, `analog_24h_smooth`, `analog_24h_ticking` (`analog_24h` ist Alias für Smooth) |
-| `CONF:Clock:digital=[True/False]`               | Digital / klassisch analog (Legacy) | +| `CONF:Clock:digital=[True/False]`               | Digital / klassisch analog (Legacy)                                                                                                                                  | 
-| `CONF:Clock:showseconds=[True/False]`           | Sekunden anzeigen       | +| `CONF:Clock:showseconds=[True/False]`           | Sekunden anzeigen                                                                                                                                                    | 
-| `CONF:Clock:secondsinoneline=[True/False]`      | Sekunden in einer Zeile | +| `CONF:Clock:secondsinoneline=[True/False]`      | Sekunden in einer Zeile                                                                                                                                              | 
-| `CONF:Clock:staticcolon=[True/False]`           | Statischer Doppelpunkt  | +| `CONF:Clock:staticcolon=[True/False]`           | Statischer Doppelpunkt                                                                                                                                               | 
-| `CONF:Clock:digitalhourcolor=COLOR`             | Stundenfarbe            | +| `CONF:Clock:digitalhourcolor=COLOR`             | Stundenfarbe                                                                                                                                                         | 
-| `CONF:Clock:digitalsecondcolor=COLOR`           | Sekundenfarbe           | +| `CONF:Clock:digitalsecondcolor=COLOR`           | Sekundenfarbe                                                                                                                                                        | 
-| `CONF:Clock:digitaldigitcolor=COLOR`            | Ziffernfarbe            | +| `CONF:Clock:digitaldigitcolor=COLOR`            | Ziffernfarbe                                                                                                                                                         | 
-| `CONF:Clock:logopath=PFAD`                      | Logo-Pfad               | +| `CONF:Clock:logopath=PFAD`                      | Logo-Pfad                                                                                                                                                            | 
-| `CONF:Clock:logoupper=[True/False]`             | Logo oben               | +| `CONF:Clock:logoupper=[True/False]`             | Logo oben                                                                                                                                                            | 
-| `CONF:Network:udpport=PORT`                     | UDP-Port                | +| `CONF:Network:udpport=PORT`                     | UDP-Port                                                                                                                                                             | 
-| `CONF:Network:tcpport=PORT`                     | HTTP-Port               | +| `CONF:Network:tcpport=PORT`                     | HTTP-Port                                                                                                                                                            | 
-| `CONF:Audio:enabled=[True/False]`               | Audio-Meter ein/aus     | +| `CONF:Audio:enabled=[True/False]`               | Audio-Meter ein/aus                                                                                                                                                  | 
-| `CONF:Audio:source=[device/livewire/aes67]`     | Audioquelle             | +| `CONF:Audio:source=[device/livewire/aes67]`     | Audioquelle                                                                                                                                                          | 
-| `CONF:Audio:input_device=DEVICE_NAME`           | Lokales Eingabegerät    | +| `CONF:Audio:input_device=DEVICE_NAME`           | Lokales Eingabegerät                                                                                                                                                 | 
-| `CONF:Audio:livewire_channel=N`                 | Livewire-Kanal          | +| `CONF:Audio:livewire_channel=N`                 | Livewire-Kanal                                                                                                                                                       | 
-| `CONF:Audio:livewire_iface=IP_OR_EMPTY`         | AoIP-Interface-IP       | +| `CONF:Audio:livewire_iface=IP_OR_EMPTY`         | AoIP-Interface-IP                                                                                                                                                    | 
-| `CONF:Audio:aes67_id=ORIGIN_HASH`               | AES67-Stream-ID         | +| `CONF:Audio:aes67_id=ORIGIN_HASH`               | AES67-Stream-ID                                                                                                                                                      | 
-| `CONF:Audio:aes67_addr=MULTICAST`               | AES67-Multicast         | +| `CONF:Audio:aes67_addr=MULTICAST`               | AES67-Multicast                                                                                                                                                      | 
-| `CONF:Audio:aes67_port=PORT`                    | AES67-RTP-Port          | +| `CONF:Audio:aes67_port=PORT`                    | AES67-RTP-Port                                                                                                                                                       | 
-| `CONF:Audio:aes67_name=NAME`                    | AES67-Anzeigename       | +| `CONF:Audio:aes67_name=NAME`                    | AES67-Anzeigename                                                                                                                                                    | 
-| `CONF:Audio:aes67_codec=[L16/L24]`              | AES67-Codec             | +| `CONF:Audio:aes67_codec=[L16/L24]`              | AES67-Codec                                                                                                                                                          | 
-| `CONF:Audio:aes67_rate=48000`                   | AES67-Samplerate        | +| `CONF:Audio:aes67_rate=48000`                   | AES67-Samplerate                                                                                                                                                     | 
-| `CONF:Audio:aes67_channels=2`                   | AES67-Kanalzahl         | +| `CONF:Audio:aes67_channels=2`                   | AES67-Kanalzahl                                                                                                                                                      | 
-| `CONF:Audio:aes67_manual=[True/False]`          | AES67 Paste-SDP         | +| `CONF:Audio:aes67_manual=[True/False]`          | AES67 Paste-SDP                                                                                                                                                      | 
-| `CONF:Audio:unit=[dbfs/dbtp/bbc_ppm]`         | L/R-Anzeigeeinheit       | +| `CONF:Audio:unit=[dbfs/dbtp/bbc_ppm]`           | L/R-Anzeigeeinheit                                                                                                                                                   | 
-| `CONF:Audio:layout=[lr/lufs/both]`            | Meter-Layout             | +| `CONF:Audio:layout=[lr/lufs/both]`              | Meter-Layout                                                                                                                                                         | 
-| `CONF:Audio:display_style=[solid/bargraph]`     | Meter-Stil              | +| `CONF:Audio:display_style=[solid/bargraph]`     | Meter-Stil                                                                                                                                                           | 
-| `CONF:Audio:meter_width=79`                     | Meter-Breite (Pixel)    | +| `CONF:Audio:meter_width=79`                     | Meter-Breite (Pixel)                                                                                                                                                 | 
-| `CONF:Audio:lufs_reference_preset=PRESET`       | LUFS-Preset             | +| `CONF:Audio:lufs_reference_preset=PRESET`       | LUFS-Preset                                                                                                                                                          | 
-| `CONF:Audio:lufs_reference=-23.0`               | LUFS-Zielpegel          | +| `CONF:Audio:lufs_reference=-23.0`               | LUFS-Zielpegel                                                                                                                                                       | 
-| `CONF:Audio:peak_hold=[True/False]`             | Peak-Hold ein/aus       | +| `CONF:Audio:peak_hold=[True/False]`             | Peak-Hold ein/aus                                                                                                                                                    | 
-| `CONF:Audio:peak_hold_seconds=1.5`              | Peak-Hold-Dauer         | +| `CONF:Audio:peak_hold_seconds=1.5`              | Peak-Hold-Dauer                                                                                                                                                      | 
-| `CONF:Audio:tooloud=[True/False]`               | TooLoud ein/aus         | +| `CONF:Audio:tooloud=[True/False]`               | TooLoud ein/aus                                                                                                                                                      | 
-| `CONF:Audio:tooloudtext=TEXT`                   | TooLoud-Text            | +| `CONF:Audio:tooloudtext=TEXT`                   | TooLoud-Text                                                                                                                                                         | 
-| `CONF:Audio:tooloud_threshold_dbtp=-1.0`        | TooLoud-Schwellwert     | +| `CONF:Audio:tooloud_threshold_dbtp=-1.0`        | TooLoud-Schwellwert                                                                                                                                                  | 
-| `CONF:Audio:tooloud_action=[warning/led]`       | TooLoud-Aktion          | +| `CONF:Audio:tooloud_action=[warning/led]`       | TooLoud-Aktion                                                                                                                                                       | 
-| `CONF:Audio:tooloud_led=[1/2/3/4]`              | TooLoud-LED             | +| `CONF:Audio:tooloud_led=[1/2/3/4]`              | TooLoud-LED                                                                                                                                                          | 
-| `CONF:Audio:silence=[True/False]`                | Silence Detection      | +| `CONF:Audio:silence=[True/False]`               | Silence Detection                                                                                                                                                    | 
-| `CONF:Audio:silence_warn=[True/False]`          | Silence-WARN ein/aus | +| `CONF:Audio:silence_warn=[True/False]`          | Silence-WARN ein/aus                                                                                                                                                 | 
-| `CONF:Audio:silence_on_absent=[True/False]`      | Absent als Stille     | +| `CONF:Audio:silence_on_absent=[True/False]`     | Absent als Stille                                                                                                                                                    | 
-| `CONF:Audio:silence_text=TEXT`                  | Silence-WARN-Text     | +| `CONF:Audio:silence_text=TEXT`                  | Silence-WARN-Text                                                                                                                                                    | 
-| `CONF:Audio:silence_threshold_dbfs=-50.0`      | Silence-Schwellwert   | +| `CONF:Audio:silence_threshold_dbfs=-50.0`       | Silence-Schwellwert                                                                                                                                                  | 
-| `CONF:Audio:silence_duration_s=10.0`            | Silence-Dauer (s)    | +| `CONF:Audio:silence_duration_s=10.0`            | Silence-Dauer (s)                                                                                                                                                    | 
-| `CONF:Audio:silence_recovery_s=2.0`             | Silence-Recovery (s) | +| `CONF:Audio:silence_recovery_s=2.0`             | Silence-Recovery (s)                                                                                                                                                 | 
-| `CONF:Audio:silence_http_url=URL`                | Silence-HTTP-GET-URL | +| `CONF:Audio:silence_http_url=URL`               | Silence-HTTP-GET-URL                                                                                                                                                 | 
-| `CONF:Timers:TimerAIR[1-4]Enabled=[True/False]` | AIR aktivieren          | +| `CONF:Timers:TimerAIR[1-4]Enabled=[True/False]` | AIR aktivieren                                                                                                                                                       | 
-| `CONF:Timers:TimerAIR[1-4]Text=TEXT`            | AIR-Label               | +| `CONF:Timers:TimerAIR[1-4]Text=TEXT`            | AIR-Label                                                                                                                                                            | 
-| `CONF:Timers:TimerTOTHText=TEXT`                | TOTH-Timer-Label        | +| `CONF:Timers:TimerTOTHText=TEXT`                | TOTH-Timer-Label                                                                                                                                                     | 
-| `CONF:Timers:AIR[1-4]activebgcolor=COLOR`       | AIR-Hintergrund aktiv   | +| `CONF:Timers:AIR[1-4]activebgcolor=COLOR`       | AIR-Hintergrund aktiv                                                                                                                                                | 
-| `CONF:Timers:AIR[1-4]activetextcolor=COLOR`     | AIR-Text aktiv          | +| `CONF:Timers:AIR[1-4]activetextcolor=COLOR`     | AIR-Text aktiv                                                                                                                                                       | 
-| `CONF:Timers:AIR[1-4]iconpath=PFAD`             | AIR-Icon-Pfad           | +| `CONF:Timers:AIR[1-4]iconpath=PFAD`             | AIR-Icon-Pfad                                                                                                                                                        | 
-| `CONF:Timers:TimerAIRMinWidth=PIXEL`            | AIR-Mindestbreite       | +| `CONF:Timers:TimerAIRMinWidth=PIXEL`            | AIR-Mindestbreite                                                                                                                                                    | 
-| `CONF:CONF:APPLY=TRUE`                          | Konfiguration anwenden  |+| `CONF:CONF:APPLY=TRUE`                          | Konfiguration anwenden                                                                                                                                               | 
  
 `CONF:Audio:unit=lufs` wird weiterhin akzeptiert und setzt das Layout auf `lufs` (L/R-Einheit bleibt `dbtp`). `CONF:Audio:unit=lufs` wird weiterhin akzeptiert und setzt das Layout auf `lufs` (L/R-Einheit bleibt `dbtp`).
Line 1447: Line 1541:
  
  
-| Option             | Werte                                           | Beschreibung                                                   | +| Option             | Werte                                           | Beschreibung                                                       | 
-| ------------------ | ----------------------------------------------- | -------------------------------------------------------------- | +| ------------------ | ----------------------------------------------- | ------------------------------------------------------------------ | 
-| `-l`, `--loglevel` | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` | Log-Level überschreiben (wird **nicht** gespeichert)           |+| `-l`, `--loglevel` | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` | Log-Level überschreiben (wird **nicht** gespeichert)               |
 | `--start-time`     | ISO-8601 (`datetime.fromisoformat`)             | Anzeige-Startzeit nur für diesen Lauf (wird **nicht** gespeichert) | | `--start-time`     | ISO-8601 (`datetime.fromisoformat`)             | Anzeige-Startzeit nur für diesen Lauf (wird **nicht** gespeichert) |
  
Line 1479: Line 1573:
  
  
-| Plattform | Log-Ordner                                      | +| Plattform | Log-Ordner                                     | 
-| --------- | ----------------------------------------------- |+| --------- | ---------------------------------------------- |
 | Linux     | `~/.local/share/astrastudio/OnAirScreen/logs/` | | Linux     | `~/.local/share/astrastudio/OnAirScreen/logs/` |
-| macOS     | `~/Library/Logs/OnAirScreen/`                   | +| macOS     | `~/Library/Logs/OnAirScreen/`                  | 
-| Windows   | `%LOCALAPPDATA%\astrastudio\OnAirScreen\logs\`   |+| Windows   | `%LOCALAPPDATA%\astrastudio\OnAirScreen\logs\` |
  
  
Line 1493: Line 1587:
  
 Crash-Dateien werden immer geschrieben, auch wenn das Log-Level `NONE` ist. Den Log-Ordner nur an den Support schicken, nicht öffentlich posten (DEBUG-Logs können Hostnamen oder Befehle enthalten). Nach einem Prozess-Absturz zeigt der nächste Start einen Dialog mit **Open log folder**; er schließt sich nach 30 Sekunden automatisch. Crash-Dateien werden immer geschrieben, auch wenn das Log-Level `NONE` ist. Den Log-Ordner nur an den Support schicken, nicht öffentlich posten (DEBUG-Logs können Hostnamen oder Befehle enthalten). Nach einem Prozess-Absturz zeigt der nächste Start einen Dialog mit **Open log folder**; er schließt sich nach 30 Sekunden automatisch.
- 
  
 --- ---
Line 1524: Line 1617:
 - Pi-GPIO funktioniert nur auf dem Raspberry Pi. Andere Plattformen zeigen auf diesem Unter-Tab „not available“ - Pi-GPIO funktioniert nur auf dem Raspberry Pi. Andere Plattformen zeigen auf diesem Unter-Tab „not available“
 - Status unter **Settings → GPIO → Raspberry Pi** prüfen - Status unter **Settings → GPIO → Raspberry Pi** prüfen
-- Status „gpiozero library not available“: `sudo apt install python3-gpiozero python3-lgpio python3-rpi-lgpio` (auf dem OnAirScreen-Pi-Image bereits enthalten) 
 - PC817-Modul verwenden; niemals 5–24 V vom Mixer direkt auf Pi-Pins - PC817-Modul verwenden; niemals 5–24 V vom Mixer direkt auf Pi-Pins
 - Invert (Standard an für Kontakt nach GND) sowie Level- vs. Flanken-Modus prüfen - Invert (Standard an für Kontakt nach GND) sowie Level- vs. Flanken-Modus prüfen
Line 1616: Line 1708:
  
 Die Reports enthalten keine Settings, MQTT-Passwörter oder API-Keys. `--loglevel DEBUG` nur kurz zum Reproduzieren nutzen, bevor die Logs verschickt werden. Nach einem Absturz erscheint dieser Dialog auch beim nächsten Start (schließt sich nach 30 Sekunden). Die Reports enthalten keine Settings, MQTT-Passwörter oder API-Keys. `--loglevel DEBUG` nur kurz zum Reproduzieren nutzen, bevor die Logs verschickt werden. Nach einem Absturz erscheint dieser Dialog auch beim nächsten Start (schließt sich nach 30 Sekunden).
- 
  
 --- ---
  • onairscreen/manual-de.1789881521.txt.gz
  • Last modified: 01.10.2026 17:43
  • (external edit)