Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| onairscreen:manual-de [31.08.2026 22:56] – external edit 127.0.0.1 | onairscreen:manual-de [27.09.2026 02:22] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 2: | Line 2: | ||
| # OnAirScreen – Bedienungsanleitung | # OnAirScreen – Bedienungsanleitung | ||
| - | **Version: | + | **Version: |
| **Autor:** Sascha Ludwig, [astrastudio.de](http:// | **Autor:** Sascha Ludwig, [astrastudio.de](http:// | ||
| - | **Projekt: | + | **Projekt: |
| **English version:** [User Manual](https:// | **English version:** [User Manual](https:// | ||
| Line 11: | Line 11: | ||
| ## Inhaltsverzeichnis | ## Inhaltsverzeichnis | ||
| - | 1. [Überblick](# | + | 1. [Überblick](# |
| - | 2. [Installation und Start](#2-installation-und-start) | + | 2. [Installation und Start](#installation_und_start) |
| - | 3. [Hauptbildschirm](# | + | 3. [Hauptbildschirm](# |
| - | 4. [Tastaturkürzel (Hotkeys)](# | + | 4. [Tastaturkürzel (Hotkeys)](# |
| - | 5. [Einstellungsdialog](# | + | 5. [Einstellungsdialog](# |
| - | 6. [Funktionen im Detail](#6-funktionen-im-detail) | + | 6. [Funktionen im Detail](#funktionen_im_detail) |
| - | 7. [Fernsteuerung und API](#7-fernsteuerung-und-api) | + | 7. [Fernsteuerung und API](#fernsteuerung_und_api) |
| - | 8. [Presets (Profile)](# | + | 8. [Presets (Profile)](# |
| - | 9. [Kommandozeilenoptionen](# | + | 9. [Kommandozeilenoptionen](# |
| - | 10. [Konfigurationsspeicherort](# | + | 10. [Konfigurationsspeicherort](# |
| - | 11. [Fehlerbehebung](# | + | 11. [Fehlerbehebung](# |
| --- | --- | ||
| Line 39: | Line 39: | ||
| - **Textzeilen** NOW, NEXT und WARN (mit Prioritätssystem) | - **Textzeilen** NOW, NEXT und WARN (mit Prioritätssystem) | ||
| - **Wetter-Widget** (OpenWeatherMap) | - **Wetter-Widget** (OpenWeatherMap) | ||
| - | - **Fernsteuerung** per Tastatur, Maus (Doppelklick/ | + | - **Fernsteuerung** per Tastatur, Maus (Doppelklick/ |
| - **Home-Assistant-Integration** via MQTT Autodiscovery | - **Home-Assistant-Integration** via MQTT Autodiscovery | ||
| + | - **GPIO-Eingänge** auf dem Raspberry Pi (Mixer-GPI über Optokoppler), | ||
| + | - **Instanz-Links**: | ||
| Die Anwendung startet standardmäßig im **Vollbildmodus** mit ausgeblendetem Mauszeiger und eignet sich für dedizierte Studio-Monitore, | Die Anwendung startet standardmäßig im **Vollbildmodus** mit ausgeblendetem Mauszeiger und eignet sich für dedizierte Studio-Monitore, | ||
| Line 52: | 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:// | ||
| + | OnAirScreen startet im **Vollbild** mit ausgeblendetem Mauszeiger. Einstellungen: | ||
| - | ### Voraussetzungen | + | ### Windows |
| - | - **Python 3.11+** mit PySide6 | + | 1. `OnAirScreen_*_Win_x64.msi` herunterladen |
| - | - Abhängigkeiten: siehe `requirements.txt` | + | 2. Die MSI doppelklicken und dem Installer folgen. Die rechnerweite Installation braucht Administratorrechte. |
| - | - Netzwerkzugriff für UDP/ | + | 3. OnAirScreen liegt unter `C:\Program Files\OnAirScreen`. |
| + | 4. Start über das **Startmenü** oder das Desktop-Symbol. | ||
| + | Im Startmenü-Ordner liegen außerdem **OAS Send** (Befehlssender) und **OAS Send (no console)**. Einstellungen stehen in der Windows-Registry, | ||
| + | Eine ältere portable `.exe` wird vom MSI **nicht** entfernt. Die Datei nach der Installation selbst löschen. | ||
| - | ### Start aus dem Quellcode | + | 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 | ||
| + | |||
| + | 1. `OnAirScreen_*_macOS.dmg` herunterladen. | ||
| + | 2. Das DMG öffnen und **OnAirScreen.app** nach **Programme** (Applications) ziehen. Nicht direkt | ||
| + | 3. OnAirScreen aus Programme, Launchpad oder Spotlight starten. | ||
| + | |||
| + | 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. | ||
| + | |||
| + | ### Linux (Debian / Ubuntu / Raspberry Pi OS) | ||
| + | |||
| + | Offizielle Builds sind ein `.deb`. Nach der Installation liegt die App in `/ | ||
| + | |||
| + | |||
| + | | Shop-ZIP | ||
| + | | --------------------------- | ------------------------------------ | ----------- | ---------------------- | | ||
| + | | `OnAirScreen_Linux_x64.zip` | `OnAirScreen_*_Linux_x64.deb` | ||
| + | | `OnAirScreen_PiOS_x64.zip` | ||
| + | |||
| + | |||
| + | Prüfen mit `dpkg --print-architecture`. Die beiden Pakete sind nicht austauschbar. | ||
| + | |||
| + | Raspberry Pi: 64-bit-OS auf Zero 2 W, Pi 3 / 4 / 400, CM4, Pi 5 / 500, CM5. Nicht unterstützt: | ||
| + | |||
| + | ZIP entpacken, danach mit **apt** installieren (nicht allein `dpkg -i`), damit PortAudio, OpenGL und Xcb nachgezogen werden. Das `./` vor der Datei ist Pflicht: | ||
| ```bash | ```bash | ||
| - | python start.py | + | unzip OnAirScreen_Linux_x64.zip |
| + | cd ~/ | ||
| + | sudo apt update | ||
| + | sudo apt install ./ | ||
| ``` | ``` | ||
| + | Start über das Anwendungsmenü oder `onairscreen`. Update: neues `.deb` ebenso installieren; | ||
| + | |||
| + | Falls `dpkg -i` Abhängigkeiten vermisst hat: `sudo apt -f install`. | ||
| + | |||
| + | Pakete sind OpenPGP-signiert. Optionale Prüfung: [Package signing (GPG)](https:// | ||
| + | |||
| + | ### Fedora | ||
| + | |||
| + | Das Fedora-RPM wird auf Fedora 44 gebaut (Fedora 44+). Ältere RHEL-, Rocky- oder Alma-Versionen können wegen glibc scheitern. | ||
| + | |||
| + | ```bash | ||
| + | sudo rpm --import https:// | ||
| + | sudo dnf install ./ | ||
| + | ``` | ||
| + | |||
| + | `dnf` zieht PortAudio und weitere Systembibliotheken nach. Signatur prüfen: `rpm -K OnAirScreen_*_Fedora_x64.rpm` (erwartet: `digests signatures OK`). | ||
| + | |||
| + | ### Raspberry-Pi-SD-Karten-Image | ||
| + | |||
| + | Das [SD-Karten-Image](https:// | ||
| + | |||
| + | [Raspberry Pi Imager](https:// | ||
| + | |||
| + | - [macOS](https:// | ||
| + | - [Windows](https:// | ||
| + | - [Ubuntu x86](https:// | ||
| + | |||
| + | 1. microSD-Karte einlegen. | ||
| + | 2. Raspberry Pi Imager starten. | ||
| + | 3. **OS wählen** → **Eigenes Image verwenden** (`Use custom`) → die OnAirScreen-`.img` wählen (nicht die `.zip`). | ||
| + | 4. **Speicher wählen** (bzw. **SD-Karte wählen**) und die Karte auswählen. | ||
| + | 5. **Schreiben**. | ||
| + | Standardbenutzer: | ||
| - | ### Vorkompilierte Versionen | + | Auf dem Desktop: **OnAirScreen**, |
| - | Fertige Binaries für Windows, Linux, macOS und Raspberry Pi sind über [astrastudio.de/shop](https:// | + | Wer bereits |
| ### Erster Start | ### Erster Start | ||
| Line 86: | Line 154: | ||
| Der Hauptbildschirm ist in folgende Bereiche gegliedert: | Der Hauptbildschirm ist in folgende Bereiche gegliedert: | ||
| - |  | | | **Status-LEDs 1–4** | `buttonLED1`–`buttonLED4` | Große farbige Statusanzeigen (ON AIR, PHONE, …) | | ||
| - | | **Audio-Meter** | + | | **Audio-Meter** |
| | **Uhr** | | **Uhr** | ||
| | **Lock-LED** | | **Lock-LED** | ||
| - | | **AIR-Timer 1–4** | + | | **AIR-Timer 1–4** |
| + | | **Datum** | ||
| | **NOW** | | **NOW** | ||
| | **NEXT** | | **NEXT** | ||
| | **WARN** | | **WARN** | ||
| + | | **Textuhr** | ||
| - | > **Hinweis: | + | > **Hinweis: |
| Line 113: | Line 182: | ||
| - Standard: Vollbild mit verstecktem Mauszeiger | - Standard: Vollbild mit verstecktem Mauszeiger | ||
| - | - Umschalten: `F` oder `Ctrl+F` (macOS: `Cmd+F`), **Doppelklick** auf den Hauptbildschirm, oder Rechtsklick → **Toggle Fullscreen** | + | - Umschalten: `F` oder `Ctrl+F` (macOS: `Cmd+F`), **Doppelklick** auf eine leere Fläche des Hauptbildschirms, oder Rechtsklick |
| - | - **Rechtsklick-Menü: | + | - **Rechtsklick-/ |
| - Der Vollbild-Zustand wird in den Einstellungen (`General/ | - Der Vollbild-Zustand wird in den Einstellungen (`General/ | ||
| + | - Einstellungen → General → **Always start in fullscreen mode** (`General/ | ||
| - Im Fenstermodus werden Position und Größe gespeichert (`Window/ | - Im Fenstermodus werden Position und Größe gespeichert (`Window/ | ||
| Line 133: | Line 203: | ||
| | Taste(n) | | Taste(n) | ||
| | --------------------------------- | ------------------------------------------------ | | | --------------------------------- | ------------------------------------------------ | | ||
| + | | `H` | Hotkey-Overlay ein/ | ||
| | `F` / `Ctrl+F` | | `F` / `Ctrl+F` | ||
| | `Ctrl+S` / `Ctrl+, | | `Ctrl+S` / `Ctrl+, | ||
| Line 139: | Line 210: | ||
| + | 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, | ||
| ### Status-LEDs | ### Status-LEDs | ||
| Line 152: | Line 225: | ||
| + | Linksklick auf eine Status-LED schaltet sie ebenso um. | ||
| ### AIR-Timer | ### AIR-Timer | ||
| Line 169: | Line 242: | ||
| + | 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 186: | Line 259: | ||
| ## 5. Einstellungsdialog | ## 5. Einstellungsdialog | ||
| - | Der Einstellungsdialog öffnet sich mit `Ctrl+S` oder `Ctrl+,` (oder Rechtsklick → **Settings**). Ist er bereits offen, kommt das Fenster nach vorne, ohne die Werte neu zu laden. Laufende AIR-Timer (inkl. TOTH) bleiben dabei unverändert. Der Dialog enthält **mehrere Registerkarten** (vertikal links angeordnet): | + | Der Einstellungsdialog öffnet sich mit `Ctrl+S` oder `Ctrl+,` (oder Rechtsklick |
| - | | Register | + | | Register |
| - | | --------------------- | + | | ---------------- | ---------------------------------------------------------------------------- | |
| - | | **General** | + | | **General** |
| - | | **Network** | + | | **Updates** | Update-Prüfung, |
| - | | **Time Source** | + | | **Network** |
| - | | **Advanced** | + | | **Links** | Andere OnAirScreens finden; Replicas (1→n voller Status) und Source-Mappings |
| - | | **Timers** | + | | **Advanced** |
| - | | **Fonts** | + | | **Timers** |
| - | | **Audio Meters** | + | | **Fonts** |
| - | | **About** | + | | **Time Source** |
| - | | **License** | + | | **Audio Meters** | Pegelanzeige, |
| + | | **GPIO** | ||
| + | | **About** | ||
| + | | **License** | ||
| Line 228: | Line 304: | ||
| - | | Einstellung | + | | Einstellung |
| - | | ------------- | ---------------------- | ----------- | ------------ | | + | | ------------- | ---------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | |
| - | | Instance Name | `General/ | + | | Instance Name | `General/ |
| Der Instanzname erscheint in der Web-UI (Titel und Status), in `/ | Der Instanzname erscheint in der Web-UI (Titel und Status), in `/ | ||
| + | |||
| + | **Der Name muss im LAN eindeutig sein.** Kündigt ein anderer OnAirScreen denselben Namen an, zeigen Settings → General, Settings → Links und die Web-UI eine Warnung mit den anderen Hosts. Nearby listet jeden kollidierenden Host extra (`name collision`). Linking rät die IP nicht — Host eintragen oder eine Instanz umbenennen. Apply wird abgelehnt, solange der Name kollidiert. | ||
| #### Stationsname und Slogan | #### Stationsname und Slogan | ||
| Line 299: | Line 377: | ||
| - | | Einstellung | + | | Einstellung |
| - | | --------------------- | ---------------------------- | ---------------- | + | | --------------------- | ---------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | |
| - | | Digital | + | | Clock Face | `Clock/face` | `digital` | `digital`, `analog`, `analog_numbers`, |
| - | | Hours LEDs | `Clock/ | + | | Digital (Legacy) |
| - | | Seconds LEDs | `Clock/ | + | | Hours LEDs | `Clock/ |
| - | | Digits LEDs | `Clock/ | + | | Seconds LEDs | `Clock/ |
| - | | Show seconds | + | | Digits LEDs | `Clock/ |
| - | | Seconds Layout | + | | Show seconds |
| - | | Static colon | `Clock/ | + | | Seconds Layout |
| - | | Use textclock | + | | Static colon | `Clock/ |
| - | | Replace IPs after 10s | `General/ | + | | Use textclock |
| - | | Replace with text | `General/ | + | | Replace IPs after 10s | `General/ |
| + | | Replace with text | `General/ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | #### Anzeige | ||
| + | |||
| + | |||
| + | | Einstellung | ||
| + | | ------------------------------- | --------------------------------- | -------- | ---------------------------------------------------------------------- | | ||
| + | | Always start in fullscreen mode | `General/ | ||
| + | |||
| + | |||
| + | 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/ | ||
| + | ### 5.2 Updates | ||
| Line 327: | 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:// | + | > 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:// |
| + | |||
| + | |||
| + | |||
| + | #### 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, | ||
| + | 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:// | ||
| + | |||
| + | Dieselben Aktionen gibt es in den Web-UI-Einstellungen. | ||
| --- | --- | ||
| - | ### 5.2 Network | + | |
| + | |||
| + | ### 5.3 Network | ||
| Line 338: | Line 450: | ||
| - | | Einstellung | + | | Einstellung |
| - | | ----------------- | --------------------------- | ------------- | ------------------------- | | + | | ----------------- | --------------------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
| - | | UDP Port | `Network/ | + | | UDP Port | `Network/ |
| - | | HTTP Port | `Network/ | + | | HTTP Port | `Network/ |
| - | | Multicast Address | `Network/ | + | | Multicast Address | `Network/ |
| + | | Web Settings PIN | ||
| + | |||
| Line 348: | Line 463: | ||
| - | | Einstellung | + | | Einstellung |
| - | | ------------------- | --------------------- | ------------- | ----------------------------- | | + | | ------------------- | --------------------- | ------------- | ---------------------------- | |
| - | | enable MQTT support | `MQTT/ | + | | enable MQTT support | `MQTT/ |
| | MQTT Server | | MQTT Server | ||
| - | | MQTT Server Port | `MQTT/ | + | | MQTT Server Port | `MQTT/ |
| | MQTT User | `MQTT/ | | MQTT User | `MQTT/ | ||
| - | | MQTT Password | + | | MQTT Password |
| - | | MQTT Device Name | `MQTT/ | + | | MQTT Device Name | `MQTT/ |
| Line 365: | Line 480: | ||
| - | | Einstellung | + | | Einstellung |
| - | | ------------------ | ------------------ | --------- | ----------------------------------------------------------- | | + | | ------------------ | ----------------- | -------- | ----------------------------------------------------- | |
| - | | enable OSC support | + | | enable OSC support | `OSC/ |
| - | | OSC Listen Port | `OSC/ | + | | OSC Listen Port | `OSC/ |
| - | | OSC Send Host | `OSC/ | + | | OSC Send Host | `OSC/ |
| - | | OSC Send Port | `OSC/ | + | | OSC Send Port | `OSC/ |
| Send Host wird nur für unaufgeforderten Status-Push gebraucht (Companion-Button-Feedback). Abfragen antworten immer an den UDP-Absender. | Send Host wird nur für unaufgeforderten Status-Push gebraucht (Companion-Button-Feedback). Abfragen antworten immer an den UDP-Absender. | ||
| - | --- | + | #### SNMP |
| - | ### 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 | + | | Einstellung |
| + | | ------------------- | ------------------------- | -------- | ------------------------------------------------------- | | ||
| + | | enable SNMP support | `SNMP/ | ||
| + | | SNMP Listen Port | `SNMP/ | ||
| + | | sysContact | ||
| + | | sysLocation | ||
| + | | v2c Read Community | ||
| + | | v2c Write Community | `SNMP/ | ||
| + | | v3 User | `SNMP/ | ||
| + | | v3 Auth Password | ||
| + | | v3 Priv Password | ||
| + | | enable SNMP traps | ||
| + | | Trap Host | `SNMP/ | ||
| + | | Trap Port | `SNMP/ | ||
| + | | Trap Version | ||
| + | | Trap Community | ||
| + | | trap on silence | ||
| + | | trap on warning | ||
| + | | trap on LED change | ||
| - | 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. | ||
| + | Mindestens eine v2c-Community oder ein v3-User muss gesetzt sein, sonst startet der Agent nicht. Community- und v3-Passwörter sind maskiert. | ||
| - | | Einstellung | + | --- |
| - | | ---------------- | ---------------------- | -------------- | ------------ | | + | |
| - | | Time Source | + | |
| - | | Enable NTP-Check | `NTP/ | + | |
| - | | NTP Server | + | |
| - | | PTP Interface | + | |
| - | | PTP Domain | + | |
| - | | LTC Input | `TimeSource/ | + | |
| - | | LTC Serial Port | `TimeSource/ | + | |
| - | | LTC Audio Device | `TimeSource/ | + | |
| - | | LTC Channel | + | |
| - | | LTC-Unlock-Warnung | `TimeSource/ | + | |
| - | **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. | + | ### 5.4 Links |
| - | **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. | + | 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/ |
| - | **LTC:** Eine Zeitquelle mit zwei Eingängen. Die Framerate wird aus den eingehenden Frames abgeleitet | + | **Replicas** (dieser Screen ist die Quelle): Instanzen aus der Nearby-Liste hinzufügen. Apply schreibt Follow auf dem Ziel und schickt den kompletten **Runtime**-Status: LED1–4 |
| - | **LBE-1110 Serial:** USB-CDC-virtueller Seriellport eines [Leo-Bodnar-LBE-1110](https://www.leobodnar.com/shop/index.php? | + | **Sources** (dieser Screen ist das Ziel): z. B. `Studio-1 |
| - | **Audio Input:** Dekodiert SMPTE-LTC (Biphase-Mark) | + | Nur **ein** Full-Follow pro Screen. Ist er schon Replica |
| - | Die Lock-LED unten rechts ist grün, wenn die gewählte Quelle eingerastet ist, sonst rot. Daneben: `PTP LOCK` / `PTP NOT LOCKED`, `NTP LOCK` / `NTP NOT LOCKED`, `LTC LOCK` / `LTC NOT LOCKED` | + | Discovery: Multicast `239.194.0.2` UDP **3311** (nicht |
| + | |||
| + | |||
| + | | Einstellung | ||
| + | | ----------------------- | ----------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | ||
| + | | Enable instance linking | `Links/ | ||
| + | | Replica *n* | `Links/replicaN_`* | aus | Ziel-Instanz (Dropdown der Nearby-Screens, | ||
| + | | Map *n* | ||
| + | | Replica of | `Links/ | ||
| - | > **Empfehlung: | ||
| --- | --- | ||
| - | ### 5.4 Advanced | + | |
| + | |||
| + | ### 5.5 Advanced | ||
| Line 454: | Line 583: | ||
| - | Städtenamen neben **City ID** eingeben, **Find** (oder Return) drücken und einen Treffer in der Liste wählen. Die City-ID wird automatisch eingetragen; | + | Städtenamen neben **City ID** eingeben, **Find** (oder Return) drücken und einen Treffer in der Liste wählen. Die City-ID wird automatisch eingetragen; |
| **Test API:** Schaltfläche zum Testen der API-Verbindung mit aktuellen Einstellungen. | **Test API:** Schaltfläche zum Testen der API-Verbindung mit aktuellen Einstellungen. | ||
| Line 466: | Line 595: | ||
| - | ### 5.5 Timers | + | ### 5.6 Timers |
| Für jeden AIR-Timer (Gruppe `Timers`): | Für jeden AIR-Timer (Gruppe `Timers`): | ||
| Line 492: | Line 621: | ||
| - | | Einstellung | + | | Einstellung |
| - | | --------------- | ------------------ | ------------- | -------------------------------------------------------------- | | + | | --------------- | ------------------ | ------------ | -------------------------------------------------------------- | |
| - | | TOTH Timer Text | `TimerTOTHText` | + | | TOTH Timer Text | `TimerTOTHText` |
| - | | AIR Min Width | `TimerAIRMinWidth` | `200` | + | | AIR Min Width | `TimerAIRMinWidth` | `200` | Mindestbreite der AIR-Anzeigen (Pixel) |
| Line 502: | 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 | + | | Element |
| - | | ------------ | --------------------------------- | -------------------- | | + | | ------------ | --------------------------------- | ------------------ | |
| | LED1–4 | | LED1–4 | ||
| | AIR1–4 | | AIR1–4 | ||
| Line 523: | 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()`); | ||
| - | | Element | + | 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 | + | |
| - | | Distribution | + | |
| - | | Settings Path | Pfad zur Konfigurationsdatei | + | |
| - | | Loglevel | + | |
| - | | Enable Reset | Checkbox zum Freischalten des Reset-Buttons | + | |
| - | | Reset all settings | Setzt **alle** Einstellungen auf Standardwerte zurück (unwiderruflich) | | + | |
| + | |||
| + | | Einstellung | ||
| + | | ------------------ | ------------------------------ | -------------- | ------------------------------------------------------------------------------- | | ||
| + | | Time Source | ||
| + | | Enable NTP-Check | ||
| + | | NTP Server | ||
| + | | PTP Interface | ||
| + | | PTP Domain | ||
| + | | LTC Input | `TimeSource/ | ||
| + | | LTC Serial Port | `TimeSource/ | ||
| + | | LTC Audio Device | ||
| + | | LTC Channel | ||
| + | | LTC-Unlock-Warnung | `TimeSource/ | ||
| + | |||
| + | |||
| + | **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: | ||
| + | |||
| + | **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`, | ||
| + | |||
| + | **LBE-1110 Serial:** USB-CDC-virtueller Seriellport eines [Leo-Bodnar-LBE-1110](https:// | ||
| + | |||
| + | **Audio Input:** Dekodiert SMPTE-LTC (Biphase-Mark) von einem **lokalen** PortAudio-Capture-Gerät, | ||
| + | |||
| + | 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: | ||
| --- | --- | ||
| Line 540: | Line 693: | ||
| - | ### 5.8 Audio Meters | + | ### 5.9 Audio Meters |
| - | Stereo-Pegelanzeige am linken Bildschirmrand: | + | Stereo-Pegelanzeige am linken Bildschirmrand: |
| Bestehende Configs mit `Audio/ | Bestehende Configs mit `Audio/ | ||
| - | | Einstellung | + | | Einstellung |
| - | | --------------------- | ---------------------------- | + | | ------------------------------------ | ------------------------------ |
| - | | Enable Audio Meters | + | | Enable Audio Meters |
| - | | Audio Source | + | | Audio Source |
| - | | Audio Input | + | | Audio Input | `Audio/ |
| - | | Livewire Channel | + | | Livewire Channel |
| - | | AoIP Interface | + | | AoIP Interface |
| - | | AES67 Stream ID | + | | AES67 Stream ID | `Audio/ |
| - | | AES67 Address | + | | AES67 Address |
| - | | AES67 Port | `Audio/ | + | | AES67 Port |
| - | | AES67 Name | `Audio/ | + | | AES67 Name |
| - | | AES67 Codec | + | | AES67 Codec | `Audio/ |
| - | | AES67 Sample Rate | + | | AES67 Sample Rate | `Audio/ |
| - | | AES67 Channels | + | | AES67 Channels |
| - | | AES67 Pasted SDP | `Audio/ | + | | AES67 Pasted SDP |
| - | | Meter Layout | + | | Meter Layout |
| - | | Display Unit | `Audio/ | + | | Display Unit |
| - | | Display Style | + | | Display Style | `Audio/ |
| - | | Meter Width | + | | Meter Width | `Audio/ |
| - | | LUFS Reference Preset | `Audio/ | + | | LUFS Reference Preset |
| - | | LUFS Reference | + | | LUFS Reference |
| - | | Peak Hold | + | | Peak Hold | `Audio/ |
| - | | Peak Hold Seconds | + | | Peak Hold Seconds |
| - | | TooLoud | + | | TooLoud |
| - | | TooLoud Text | `Audio/ | + | | TooLoud Text |
| - | | TooLoud Threshold | + | | TooLoud Threshold |
| - | | TooLoud Action | + | | TooLoud Action |
| - | | TooLoud LED | + | | TooLoud LED | `Audio/ |
| - | | Enable Silence Detection | `Audio/ | + | | Enable Silence Detection |
| - | | Show WARN in OAS | `Audio/ | + | | Show WARN in OAS |
| - | | Trigger when Device/ | + | | Trigger when Device/ |
| - | | Silence Message | + | | Silence Message |
| - | | Silence Threshold | + | | Silence Threshold |
| - | | Max. Silence duration | `Audio/ | + | | Max. Silence duration |
| - | | Recovery time | + | | Recovery time | `Audio/ |
| - | | HTTP GET URL | `Audio/ | + | | HTTP GET URL |
| 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 592: | Line 746: | ||
| Das Bildschirm-WARN nutzt Priorität **2** (hoch) und liegt damit über TooLoud (Priorität 1). Das Flag `silence` in API/MQTT ist unabhängig von `texts.warn` und von `warning/ | Das Bildschirm-WARN nutzt Priorität **2** (hoch) und liegt damit über TooLoud (Priorität 1). Das Flag `silence` in API/MQTT ist unabhängig von `texts.warn` und von `warning/ | ||
| - | **Livewire: | + | **Livewire: |
| - | **AES67:** SAP-Discovery lauscht auf `239.255.255.255` und RFC 2974 `224.2.127.254` UDP **9875**, solange der Einstellungsdialog offen ist. Die Stream-Liste aktualisiert sich live **nur wenn Streams dazukommen oder verschwinden** (kein Flackern bei unveränderter Liste). Die Combo hat immer **None** (kein Stream). SAP-Einträge verschwinden, | + | **AES67:** SAP-Discovery lauscht auf `239.255.255.255` und RFC 2974 `224.2.127.254` UDP **9875**, solange der Einstellungsdialog |
| **Lokaler Eingang:** unter macOS Mikrofon-Berechtigung für OnAirScreen. | **Lokaler Eingang:** unter macOS Mikrofon-Berechtigung für OnAirScreen. | ||
| + | |||
| + | --- | ||
| + | |||
| + | |||
| + | |||
| + | ### 5.10 GPIO / MIDI | ||
| + | |||
| + | 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/ | ||
| + | |||
| + | #### Raspberry Pi | ||
| + | |||
| + | Raspberry-Pi-GPIO-Eingänge legen Mixer-GPI-Kontakte. Nur auf dem Raspberry Pi verfügbar; auf anderen Plattformen zeigt dieser Unter-Tab „not available“. | ||
| + | |||
| + | 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 | ||
| + | | -------------- | ------------------- | ---------------------------- | --------------------------------------------------------------------- | | ||
| + | | Enable GPIO | `GPIO/ | ||
| + | | Debounce | ||
| + | | GPI*n* Enable | ||
| + | | GPI*n* Name | `GPIO/ | ||
| + | | GPI*n* BCM pin | `GPIO/ | ||
| + | | GPI*n* Invert | ||
| + | | GPI*n* Mode | `GPIO/ | ||
| + | | GPI*n* Actions | `GPIO/ | ||
| + | | GPI*n* Command | `GPIO/ | ||
| + | |||
| + | |||
| + | **Level** (typisch Tally/ | ||
| + | |||
| + | Werks-Mapping für zwei Mixer-GPI-Leitungen: | ||
| + | |||
| + | Sichere BCM-Pins: `5, 6, 12, 13, 16, 17, 22, 23, 24, 25, 26, 27` (nicht I2C 2/3 oder UART 14/15). | ||
| + | |||
| + | #### Verdrahtung | ||
| + | |||
| + | Der 40-polige GPIO-Header ist derselbe auf Raspberry Pi **3, 4, 400, 5, 500, Zero 2 W** und dem **CM4/ | ||
| + | |||
| + | **PC817-Modul (empfohlen bei Mixer-GPI 5–24 V oder Open Collector): | ||
| + | |||
| + | </ | ||
| + | < | ||
| + | raw | ||
| + | flowchart LR | ||
| + | Mixer[" | ||
| + | Mixer --> | ||
| + | Pc817 --> | ||
| + | Pc817 --> | ||
| + | </ | ||
| + | < | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | Jeder Mixer-GPI besteht aus zwei Adern: `IN1`–`IN8` dieses Kanals und das `GND` der Eingangsseite. Auf der Pi-Seite denselben Kanal `OUT1`–`OUT8` an den BCM-Pin und das `GND` der Ausgangsseite an Pi-GND (GPI1 → IN1/OUT1, GPI2 → IN2/OUT2, …). **Invert** anlassen (aktiv = Pin nach GND gezogen). Beispiel: [Hailege 8-Kanal-PC817-Isolationsmodul](https:// | ||
| + | |||
| + | **Nur trockener Relaiskontakt** (bereits isoliert, keine Spannung am Mixer-GPI): | ||
| + | |||
| + | </ | ||
| + | < | ||
| + | raw | ||
| + | flowchart LR | ||
| + | Relay[" | ||
| + | Relay --> PiGnd[" | ||
| + | </ | ||
| + | < | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | Keine 5 V oder 12/24 V direkt auf einen GPIO-Pin legen. | ||
| + | |||
| + | **Werks-Defaults am Header** (Platine mit USB/ | ||
| + | |||
| + | |||
| + | | OAS-Eingang | BCM | Header-Stift | ||
| + | | ----------- | --- | ---------------------------- | ------------------ | | ||
| + | | GPI1 | 17 | 11 | ON AIR (LED1) | ||
| + | | 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**): | ||
| + | |||
| + | |||
| + | | BCM | Header | BCM | Header | BCM | Header | | ||
| + | | --- | ------ | --- | ------ | --- | ------ | | ||
| + | | 5 | 29 | 12 | 32 | 22 | 15 | | ||
| + | | 6 | 31 | 13 | 33 | 23 | 16 | | ||
| + | | 16 | 36 | 17 | 11 | 24 | 18 | | ||
| + | | 26 | 37 | 27 | 13 | 25 | 22 | | ||
| + | |||
| + | |||
| + | **Pinout-Referenzen** (40-poliger Header, BCM-Nummerierung): | ||
| + | |||
| + | - [Raspberry Pi GPIO and 40-pin header](https:// | ||
| + | - [pinout.xyz](https:// | ||
| + | - Pi 5 Überblick: [Raspberry Pi 5](https:// | ||
| + | - Compute-Module-IO-Boards: | ||
| + | |||
| + | |||
| + | |||
| + | #### Axia Livewire | ||
| + | |||
| + | Axia-Livewire-GPIO folgt Source-Pins (Operator-Mic, | ||
| + | |||
| + | Zwei Modi: | ||
| + | |||
| + | - **Multicast** (Standard): CMsg2 auf `239.192.255.4`. Die Mapping-Spalte **Channel** ist der Livewire-**Audiokanal** dieser Quelle. Der Rechner muss im AoIP-/ | ||
| + | - **LWRP (TCP)**: Verbindung zu einem Gerät (xNode GPIO, iPort, Konsole, …) unter **IP:93**. Die Mapping-Spalte heißt **Port** — GPIO-Port am Gerät, nicht Livewire-Audiokanal. Kein IGMP-Join; der Host muss im Livewire-/ | ||
| + | |||
| + | Typisches Mikrofon-ON-AIR-Profil: | ||
| + | |||
| + | |||
| + | | Einstellung | ||
| + | | -------------------- | ---------------------- | -------------------- | --------------------------------------------------------------------- | | ||
| + | | Enable Livewire GPIO | `GPIO/ | ||
| + | | Mode | `GPIO/ | ||
| + | | Host | `GPIO/ | ||
| + | | Port | `GPIO/ | ||
| + | | Password | ||
| + | | AoIP-Interface | ||
| + | | Debounce | ||
| + | | GPI*n* Enable | ||
| + | | GPI*n* Name | `GPIO/ | ||
| + | | GPI*n* Channel/ | ||
| + | | GPI*n* Direction | ||
| + | | GPI*n* Pin | `GPIO/ | ||
| + | | GPI*n* Invert | ||
| + | | GPI*n* Mode | `GPIO/ | ||
| + | | GPI*n* Actions | ||
| + | | GPI*n* Command | ||
| + | |||
| + | |||
| + | 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. | ||
| + | |||
| + | Multicast ist `239.192.255.4` UDP **2055** (GPIO-Node → Konsole) und **2060** (Konsole → Node). OAS joined beide. Nach dem Join fordert OAS den aktuellen Pin-Zustand an, damit ein Mikrofon, das beim Start schon ON ist, die LED setzt. | ||
| + | |||
| + | **LWRP:** OAS öffnet TCP 93, sendet `LOGIN` (mit Passwort, falls gesetzt), `ADD GPI`, `ADD GPO` und fragt dann jeden beobachteten Port ab, damit ein Mikrofon, das beim Start schon ON ist, die LED setzt. Bei Verbindungsabbruch wird neu verbunden. | ||
| + | |||
| + | **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 | ||
| + | | ----------------- | ----------------------- | -------- | ----------------------------------------------------------------------------------------------- | | ||
| + | | Enable MIDI | `GPIO/ | ||
| + | | Interface | ||
| + | | Debounce | ||
| + | | MIDI*n* Enable | ||
| + | | MIDI*n* Name | `GPIO/ | ||
| + | | MIDI*n* Channel | ||
| + | | MIDI*n* Type | `GPIO/ | ||
| + | | MIDI*n* Number | ||
| + | | MIDI*n* Threshold | `GPIO/ | ||
| + | | MIDI*n* Behavior | ||
| + | | MIDI*n* Invert | ||
| + | | MIDI*n* Actions | ||
| + | | MIDI*n* Command | ||
| + | |||
| + | |||
| + | **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: | ||
| + | |||
| + | **In Logic stehen nur On/ | ||
| + | |||
| + | #### Logic | ||
| + | |||
| + | **Logic** verknüpft Raspberry-Pi-, | ||
| + | |||
| + | |||
| + | | 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, | ||
| + | |||
| + | |||
| + | | Einstellung | ||
| + | | ----------------- | --------------------- | -------- | --------------------------------------------------- | | ||
| + | | Rule *n* Enable | ||
| + | | Rule *n* Operator | `GPIO/ | ||
| + | | Rule *n* Inputs | ||
| + | | Rule *n* Outputs | ||
| + | | Rule *n* Command | ||
| + | |||
| + | |||
| + | 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 | ||
| + | | ------------------ | ---------------------------------------------------------------------- | | ||
| + | | Version | ||
| + | | Distribution | ||
| + | | Settings Path | Pfad zur Konfigurationsdatei auf diesem System | ||
| + | | Log Folder | ||
| + | | Open log folder | ||
| + | | Loglevel | ||
| + | | Enable Reset | Checkbox zum Freischalten des Reset-Buttons | ||
| + | | Reset all settings | Setzt **alle** Einstellungen auf Standardwerte zurück (unwiderruflich) | | ||
| + | | Reboot | ||
| + | | Shutdown | ||
| Line 609: | Line 978: | ||
| ### 6.1 Status-LEDs | ### 6.1 Status-LEDs | ||
| - | Jede LED kann einzeln ein- und ausgeschaltet werden. Im aktiven Zustand werden konfigurierte Vorder- und Hintergrundfarben verwendet; im inaktiven Zustand die gemeinsamen Inaktiv-Farben. | + | Jede LED kann einzeln ein- und ausgeschaltet werden |
| **Blinkmodi: | **Blinkmodi: | ||
| Line 625: | Line 994: | ||
| - Einfache Stoppuhr: Start/ | - Einfache Stoppuhr: Start/ | ||
| - | - Steuerung: `M`/`/` (AIR1), `P`/`*` (AIR2) | + | - Steuerung: `M`/`/` (AIR1), `P`/`*` (AIR2), oder Linksklick auf den Timer |
| Line 636: | Line 1005: | ||
| 2. **Runterzählen (Count-Down): | 2. **Runterzählen (Count-Down): | ||
| 3. **Top-of-Hour (TOH):** Countdown bis zur nächsten vollen Stunde (Format MM:SS, z. B. `22:38`) | 3. **Top-of-Hour (TOH):** Countdown bis zur nächsten vollen Stunde (Format MM:SS, z. B. `22:38`) | ||
| + | |||
| + | Start/ | ||
| **Top-of-Hour-Verhalten: | **Top-of-Hour-Verhalten: | ||
| Line 647: | Line 1018: | ||
| - | | Eingabe | + | | Eingabe |
| - | | ------------------ | ---------------------------------- | | + | | -------------------------- | ---------------------------------- | |
| - | | `2,10` oder `2.10` | 2 Minuten 10 Sekunden (Count-Down) | | + | | `2: |
| - | | `30` | + | | `30` |
| - | | `0` | Count-Up-Modus | + | | `0` | Count-Up-Modus |
| Line 659: | Line 1030: | ||
| - Wie AIR3, aber ohne Top-of-Hour-Funktion | - Wie AIR3, aber ohne Top-of-Hour-Funktion | ||
| - | - Steuerung: `S` (Start/ | + | - Steuerung: `S` oder Linksklick |
| Line 710: | Line 1081: | ||
| - **Digital: | - **Digital: | ||
| - | - **Analog:** Klassisches Zifferblatt | + | - **Analog:** Klassisches Zifferblatt |
| + | - **Analog Numbers:** Klassisches Analog-Face mit 1–12 | ||
| + | - **Analog Studio:** Weißes Zifferblatt, | ||
| + | - **Analog Railway:** Weißes Bahnhofszifferblatt ohne Zahlen, spitze schwarze Zeiger, kontinuierlicher roter Sekundenzeiger mit Ring | ||
| + | - **Analog 24h smooth:** Cremefarbenes Zifferblatt, | ||
| + | - **Analog 24h ticking:** Dasselbe 24h-Zifferblatt mit tickendem Sekundenzeiger | ||
| + | |||
| + | ](https:// | ||
| - **Textuhr: | - **Textuhr: | ||
| - | - **Zeitquelle: | + | - **Zeitquelle: |
| - **Lock-LED** unten rechts: grün = eingerastet, | - **Lock-LED** unten rechts: grün = eingerastet, | ||
| - **Wetter-Widget: | - **Wetter-Widget: | ||
| Line 718: | Line 1107: | ||
| - | ### 6.6 Systembefehle | + | ### 6.6 Systembefehle |
| Line 728: | Line 1117: | ||
| - | > Diese Befehle sind **nicht** über die Einstellungs-UI erreichbar, sondern | + | Reboot und Shutdown gibt es auch unter **Settings → About** und in der Web-UI unter **System**. Beide fragen nach. HTTP `CMD: |
| + | |||
| + | ### 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). Ein MIDI-Controller kann sie über Note- und CC-Befehle an einem Eingang ansteuern. Alle drei können gleichzeitig laufen. Pi-Verdrahtung, | ||
| --- | --- | ||
| Line 736: | Line 1129: | ||
| ## 7. Fernsteuerung und API | ## 7. Fernsteuerung und API | ||
| - | OnAirScreen unterstützt Fernsteuerung über UDP, HTTP, Web-UI, MQTT, OSC, REST-API und Bitfocus Companion. | + | OnAirScreen unterstützt Fernsteuerung über UDP, HTTP, Web-UI, MQTT, OSC, SNMP, REST-API und Bitfocus Companion. |
| ### 7.1 UDP (Port 3310) | ### 7.1 UDP (Port 3310) | ||
| Line 783: | Line 1176: | ||
| - Versions- und Distributionsinformationen | - Versions- und Distributionsinformationen | ||
| - Dauerhaftes Connection-Badge (Live / Polling / Offline) plus Fehler-Modal | - Dauerhaftes Connection-Badge (Live / Polling / Offline) plus Fehler-Modal | ||
| + | - Zahnrad oben rechts: Settings-Overlay für alle editierbaren Einstellungen, | ||
| + | - Links im Overlay: dieselbe Nearby-Liste, | ||
| + | - Audio Meters im Overlay: Dropdowns **Livewire Source** und **AES67 Stream** (Live-Discovery solange das Overlay offen ist) plus Paste SDP | ||
| Line 807: | Line 1203: | ||
| " | " | ||
| " | " | ||
| - | " | + | " |
| - | " | + | " |
| + | " | ||
| } | } | ||
| ``` | ``` | ||
| Line 820: | Line 1217: | ||
| ``` | ``` | ||
| + | **Instanz-Links** (ohne Web-Settings-PIN): | ||
| + | ```bash | ||
| + | curl http:// | ||
| + | curl -X POST http:// | ||
| + | -d ' | ||
| + | curl -X POST http:// | ||
| + | -d ' | ||
| + | ``` | ||
| + | |||
| + | `link` in `/ | ||
| + | |||
| + | **Web-Settings** (optionale PIN über `X-Settings-Token` nach `POST / | ||
| + | |||
| + | ```bash | ||
| + | curl http:// | ||
| + | curl -X POST http:// | ||
| + | curl http:// | ||
| + | curl " | ||
| + | curl -X PUT http:// | ||
| + | ``` | ||
| + | |||
| + | Geheimnisse (`updatekey`, | ||
| ### 7.5 MQTT | ### 7.5 MQTT | ||
| Line 827: | Line 1246: | ||
| - | | Topic | Payload | + | | Topic |
| - | | ---------------- | ----------------------- | --------------------- | | + | | ----------------------- | --------------------------------- | --------------------------- | |
| - | | `led{1-4}/ | + | | `led{1-4}/ |
| - | | `air{1-4}/ | + | | `air{1-4}/ |
| - | | `air{3-4}/ | + | | `air{3-4}/ |
| - | | `air3/ | + | | `air3/ |
| - | | `lufs/ | + | | `lufs/ |
| - | | `lufs/ | + | | `lufs/ |
| - | | `text/ | + | | `text/ |
| - | | `text/ | + | | `text/ |
| - | | `text/ | + | | `text/ |
| Line 843: | Line 1262: | ||
| - | | Topic | Payload | + | | Topic | Payload |
| - | | ------------------ | ------------------ | | + | | ---------------------------- | ------------------------------- | |
| - | | `led{1-4}/ | + | | `led{1-4}/ |
| - | | `air{1-4}/ | + | | `air{1-4}/ |
| - | | `air{1-4}/ | + | | `air{1-4}/ |
| - | | `air3/ | + | | `air3/ |
| - | | `text/ | + | | `text/ |
| - | | `warning/ | + | | `warning/ |
| - | | `silence/ | + | | `silence/ |
| - | | `lufs/ | + | | `lufs/ |
| - | | `lufs/ | + | | `lufs/ |
| - | | `lufs/ | + | | `lufs/ |
| - | | `instance/ | + | | `instance/ |
| Line 873: | Line 1292: | ||
| Der Home-Assistant-Gerätename lautet `OnAirScreen (Studio-1)`, | Der Home-Assistant-Gerätename lautet `OnAirScreen (Studio-1)`, | ||
| - | |||
| - | |||
| ### 7.6 Bitfocus Companion (empfohlen) | ### 7.6 Bitfocus Companion (empfohlen) | ||
| Line 891: | 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: | + | Variablen wie `$(oas: |
| 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 902: | Line 1319: | ||
| - | | Adresse | + | | Adresse |
| - | | -------------------- | -------------------------------- | --------------------- | | + | | ---------------------------- | ---------------------------------- | ----------------------- | |
| - | | `/ | + | | `/ |
| - | | `/ | + | | `/ |
| - | | `/ | + | | `/ |
| - | | `/ | + | | `/ |
| - | | `/ | + | | `/ |
| - | | `/ | + | | `/ |
| - | | `/ | + | | `/ |
| - | | `/ | + | | `/ |
| - | | `/ | + | | `/ |
| - | | `/ | + | | `/ |
| - | | `/ | + | | `/ |
| Line 928: | Line 1345: | ||
| python3 utils/ | python3 utils/ | ||
| ``` | ``` | ||
| + | |||
| + | |||
| #### Alternative: | #### Alternative: | ||
| Line 947: | Line 1366: | ||
| Query-Reply an den Command-Socket nutzt Companion **nicht** (anderer UDP-Port). | Query-Reply an den Command-Socket nutzt Companion **nicht** (anderer UDP-Port). | ||
| + | ### 7.8 SNMP (Port 1161) | ||
| - | ### 7.8 Befehlsreferenz | + | SNMP unter **Settings → Network** einschalten. Der Agent spricht **SNMPv2c** und **SNMPv3** (USM, SHA-256, AES-128). Standard-Port ist **1161** (kein privilegierter Port). 161 ist möglich, braucht auf Linux/macOS aber Rechte. |
| + | |||
| + | Die MIB liegt in `mibs/ | ||
| + | |||
| + | **GET / WALK** (Status wie `/ | ||
| + | |||
| + | **SET** (gleiche Semantik wie OSC): LED-State `0/1/2` = OFF/ | ||
| + | |||
| + | **Traps:** Silence, WARN-Textwechsel, | ||
| + | |||
| + | ```bash | ||
| + | # Status walk (v2c) | ||
| + | snmpwalk -v2c -c public localhost: | ||
| + | |||
| + | # LED1 an | ||
| + | snmpset -v2c -c private localhost: | ||
| + | |||
| + | # Walk mit SNMPv3 authPriv | ||
| + | snmpwalk -v3 -l authPriv -u nms -a SHA-256 -A ' | ||
| + | ``` | ||
| + | |||
| + | Ohne Write-Community (Default) ist v2c nur lesend. noAuthNoPriv ist nur zum Testen gedacht. | ||
| + | |||
| + | ### 7.9 Befehlsreferenz | ||
| Line 955: | Line 1398: | ||
| - | | Befehl | + | | Befehl |
| - | | ---------------------------- | ----------------------------------- | | + | | --------------------------------- | ------------------------------------------------------------------- | |
| - | | `LED{1-4}: | + | | `LED{1-4}: |
| - | | `NOW: | + | | `NOW: |
| - | | `NEXT: | + | | `NEXT: |
| - | | `WARN: | + | | `WARN: |
| - | | `WARN: | + | | `WARN: |
| - | | `WARN: | + | | `WARN: |
| - | | `WARN: | + | | `WARN: |
| - | | `WARN: | + | | `WARN: |
| - | | `WARN: | + | | `WARN: |
| - | | `AIR1: | + | | `AIR1: |
| - | | `AIR2: | + | | `AIR2: |
| - | | `AIR3: | + | | `AIR3: |
| - | | `AIR3TIME: | + | | `AIR3TIME: |
| - | | `AIR3TOH: | + | | `AIR3TOH: |
| - | | `AIR4: | + | | `AIR4: |
| | `LUFSI: | | `LUFSI: | ||
| - | | `CMD: | + | | `FULLSCREEN: |
| - | | `CMD: | + | | `CMD: |
| - | | `CMD: | + | | `CMD: |
| + | | `CMD: | ||
| Line 987: | Line 1431: | ||
| - | | Befehl | + | | Befehl |
| - | | ----------------------------------------------- | ----------------------- | | + | | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| - | | `CONF: | + | | `CONF: |
| + | | `CONF: | ||
| `CONF: | `CONF: | ||
| Line 1091: | Line 1537: | ||
| python start.py --loglevel DEBUG | python start.py --loglevel DEBUG | ||
| python start.py -l WARNING | python start.py -l WARNING | ||
| + | python start.py --start-time 2026-09-14T12: | ||
| ``` | ``` | ||
| - | | Option | + | | Option |
| - | | ------------------ | ----------------------------------------------- | ---------------------------------------------------- | | + | | ------------------ | ----------------------------------------------- | ------------------------------------------------------------------ | |
| - | | `-l`, `--loglevel` | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` | Log-Level überschreiben (wird **nicht** gespeichert) | | + | | `-l`, `--loglevel` | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` | Log-Level überschreiben |
| + | | `--start-time` | ||
| Line 1121: | Line 1569: | ||
| | Windows | | Windows | ||
| + | |||
| + | Logs und Crash-Reports liegen separat. Der genaue Pfad steht im Register **About** unter **Log Folder**: | ||
| + | |||
| + | |||
| + | | Plattform | Log-Ordner | ||
| + | | --------- | ---------------------------------------------- | | ||
| + | | Linux | `~/ | ||
| + | | macOS | `~/ | ||
| + | | Windows | ||
| + | |||
| + | |||
| + | Dateien in diesem Ordner: | ||
| + | |||
| + | - `onairscreen.log` — rotierendes Anwendungs-Log (gleicher Inhalt wie stderr, folgt dem Log-Level) | ||
| + | - `crash-YYYYMMDD-HHMMSS.txt` — ungefangene Python-Exceptions (Traceback, Version, OS; keine Settings oder Passwörter). Nach einem Main-Thread- oder Qt-Fatal-Crash beendet sich die Anwendung; Fehler in Hintergrund-Threads werden nur geloggt. | ||
| + | - `fault.log` — native Abstürze (Segfaults in Qt oder C-Erweiterungen) | ||
| + | |||
| + | Crash-Dateien werden immer geschrieben, | ||
| --- | --- | ||
| Line 1139: | Line 1605: | ||
| ### Fernsteuerung funktioniert nicht | ### Fernsteuerung funktioniert nicht | ||
| - | - Firewall-Regeln für UDP/ | + | - Firewall-Regeln für UDP/ |
| - Korrekte IP-Adresse und Ports verwenden | - Korrekte IP-Adresse und Ports verwenden | ||
| - Mit `curl http:// | - Mit `curl http:// | ||
| + | |||
| + | |||
| + | |||
| + | ### GPIO schaltet LEDs oder Timer nicht | ||
| + | |||
| + | **Raspberry Pi** (Unter-Tab **Raspberry Pi**): | ||
| + | |||
| + | - 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 | ||
| + | - 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 | ||
| + | - GPIO und die jeweilige GPI-Zeile aktivieren, dann Apply | ||
| + | |||
| + | **Axia Livewire** (Unter-Tab **Axia Livewire**): | ||
| + | |||
| + | - Livewire GPIO und die Mapping-Zeile aktivieren, dann Apply | ||
| + | - Typische Mic-ON-Lampe: | ||
| + | - **Multicast: | ||
| + | - **LWRP:** Mode auf **LWRP (TCP)**, Geräte-**Host** (TCP 93). Mapping-**Port** ist der GPIO-Port am Gerät, nicht ein Livewire-Audiokanal. Status „host is empty“ / „LWRP failed“: IP fehlt oder Gerät nicht erreichbar. VLAN gilt weiterhin; IGMP wird nicht genutzt | ||
| + | - Keine Pakete / LED bleibt aus: prüfen, ob Konsole/ | ||
| + | - Mic beim OAS-Start schon ON: OAS fordert nach Join/ | ||
| Line 1192: | Line 1679: | ||
| - Passendes Netzwerk-Interface gewählt (nicht „Default“, | - Passendes Netzwerk-Interface gewählt (nicht „Default“, | ||
| - UDP-Port 5004 freigegeben? | - UDP-Port 5004 freigegeben? | ||
| - | - **Keine Namen unter Livewire Source:** Ads laufen auf `239.192.255.3: | + | - **Keine Namen unter Livewire Source:** Ads laufen auf `239.192.255.3: |
| Line 1198: | Line 1685: | ||
| ### AES67-Meter: | ### AES67-Meter: | ||
| - | - **Keine Streams in der Liste:** AoIP-Interface, | + | - **Keine Streams in der Liste:** AoIP-Interface, |
| - **Stream da, Meter bleibt stumm:** RTP-Adresse/ | - **Stream da, Meter bleibt stumm:** RTP-Adresse/ | ||
| Line 1209: | Line 1696: | ||
| 3. **Reset all OnAirScreen settings to default** klicken | 3. **Reset all OnAirScreen settings to default** klicken | ||
| 4. **Apply** klicken | 4. **Apply** klicken | ||
| + | |||
| + | |||
| + | |||
| + | ### Logs an den Support schicken | ||
| + | |||
| + | Wenn OnAirScreen abstürzt oder sich unerwartet verhält: | ||
| + | |||
| + | 1. **Settings → About** öffnen | ||
| + | 2. **Open log folder** klicken (oder den Pfad unter **Log Folder** kopieren) | ||
| + | 3. `onairscreen.log` und vorhandene `crash-*.txt`-Dateien schicken (plus `fault.log`, | ||
| + | |||
| + | 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). | ||
| --- | --- | ||
| Line 1220: | Line 1719: | ||
| - LED-Änderungen (Quelle: manual, autoflash, timedflash, API) | - LED-Änderungen (Quelle: manual, autoflash, timedflash, API) | ||
| - AIR-Timer Start/ | - AIR-Timer Start/ | ||
| - | - Empfangene Befehle (UDP/ | + | - Empfangene Befehle (UDP/ |
| - Warnungen hinzugefügt/ | - Warnungen hinzugefügt/ | ||
| - Einstellungsänderungen | - Einstellungsänderungen | ||
| - Systemereignisse (Start, Beenden, Neustart) | - Systemereignisse (Start, Beenden, Neustart) | ||
| - | Das Log-Level steuert die Ausgabemenge. Bei Problemen empfiehlt sich temporär `--loglevel DEBUG`. | + | Das Log-Level steuert die Ausgabemenge. Bei Problemen empfiehlt sich temporär `--loglevel DEBUG`. Logs werden zusätzlich nach `onairscreen.log` im Log-Ordner geschrieben (siehe **About**). |
| --- | --- | ||