onairscreen:manual-en

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-en [25.09.2026 18:15] – external edit 127.0.0.1onairscreen:manual-en [27.09.2026 02:22] (current) – external edit 127.0.0.1
Line 2: Line 2:
 # OnAirScreen – User Manual # OnAirScreen – User Manual
  
-**Version:** 1.0.9  +**Version:** 1.0.10  
 **Author:** Sascha Ludwig, [astrastudio.de](http://www.astrastudio.de)   **Author:** Sascha Ludwig, [astrastudio.de](http://www.astrastudio.de)  
 **Project:** [OnAirScreen](https://www.astrastudio.de/en/onairscreen/)   **Project:** [OnAirScreen](https://www.astrastudio.de/en/onairscreen/)  
Line 24: Line 24:
  
 --- ---
 +
 +
  
 ## 1. Overview ## 1. Overview
Line 39: Line 41:
 - **Remote control** via keyboard, mouse (double-click/right-click/long-click), UDP, HTTP, Web UI, MQTT, OSC, SNMP, REST API, and Bitfocus Companion - **Remote control** via keyboard, mouse (double-click/right-click/long-click), UDP, HTTP, Web UI, MQTT, OSC, SNMP, REST API, and Bitfocus Companion
 - **Home Assistant integration** via MQTT Autodiscovery - **Home Assistant integration** via MQTT Autodiscovery
-- **GPIO inputs** on Raspberry Pi (mixer GPI via optocoupler) and **Axia Livewire GPIO** (multicast or LWRP TCP 93, e.g. mic ON lamp)+- **GPIO inputs** on Raspberry Pi (mixer GPI via optocoupler), **Axia Livewire GPIO** (multicast or LWRP TCP 93, e.g. mic ON lamp), and **MIDI** (Note/CC from one interface)
 - **Instance links**: 1→n replicas (full LED/AIR/NOW/NEXT/WARN status) and per-signal mappings (e.g. hallway tallies from several studios) - **Instance links**: 1→n replicas (full LED/AIR/NOW/NEXT/WARN status) and per-signal mappings (e.g. hallway tallies from several studios)
  
Line 47: Line 49:
  
 --- ---
 +
 +
  
 ## 2. Installation and Startup ## 2. Installation and Startup
Line 65: Line 69:
 An older portable `.exe` is **not** removed by the MSI. Delete that copy yourself after installing. An older portable `.exe` is **not** removed by the MSI. Delete that copy yourself after installing.
  
-Windows only syncs internet time about once a week by default, which can show the wrong clock if the time source is **Local**. Shorten the OS sync interval, or use NTP / PTP / LTC in OnAirScreen (see [5.3 Time Source](#53-time-source)).+Windows only syncs internet time about once a week by default, which can show the wrong clock if the time source is **Local**. Shorten the OS sync interval, or use NTP / PTP / LTC in OnAirScreen (see [5.8 Time Source](#time_source)).
  
 ### macOS ### macOS
Line 143: Line 147:
  
 --- ---
 +
 +
  
 ## 3. Main Screen ## 3. Main Screen
Line 170: Line 176:
  
 > **Note:** Status LEDs and AIR timers can be toggled by **left-click**, **keyboard**, or **remote control**. Double-clicking a LED/timer does not toggle fullscreen. > **Note:** Status LEDs and AIR timers can be toggled by **left-click**, **keyboard**, or **remote control**. Double-clicking a LED/timer does not toggle fullscreen.
 +
 +
  
 ### Fullscreen Mode ### Fullscreen Mode
Line 181: Line 189:
  
 --- ---
 +
 +
  
 ## 4. Keyboard Shortcuts (Hotkeys) ## 4. Keyboard Shortcuts (Hotkeys)
  
 > On **macOS**, `Ctrl` is replaced by `Cmd (⌘)`. > On **macOS**, `Ctrl` is replaced by `Cmd (⌘)`.
 +
 +
  
 ### Application ### Application
Line 242: Line 254:
  
 --- ---
 +
 +
  
 ## 5. Settings Dialog ## 5. Settings Dialog
Line 248: Line 262:
  
  
-| Tab              | Content                                                         | +| Tab              | Content                                                                     | 
-| ---------------- | --------------------------------------------------------------- | +| ---------------- | --------------------------------------------------------------------------- | 
-| **General**      | Instance name, station, LEDs, clock, logo, fullscreen start | +| **General**      | Instance name, station, LEDs, clock, logo, fullscreen start                 | 
-| **Updates**      | Update check, update key, hardware activation | +| **Updates**      | Update check, update key, hardware activation                               | 
-| **Network**      | UDP, HTTP, multicast, MQTT, OSC, SNMP                           |+| **Network**      | UDP, HTTP, multicast, MQTT, OSC, SNMP                                       |
 | **Links**        | Discover other OnAirScreens; replicas (1→n full status) and source mappings | | **Links**        | Discover other OnAirScreens; replicas (1→n full status) and source mappings |
-| **Time Source**  | Local / NTP / PTPv2 / LTC clock, NTP check                      | +| **Advanced**     | Formatting, weather                                                         | 
-| **Advanced**     | Formatting, weather                                             | +| **Timers**       | AIR timers 1–4                                                              | 
-| **Timers**       | AIR timers 1–4                                                  | +| **Fonts**        | Fonts for all elements                                                      | 
-| **Fonts**        | Fonts for all elements                                          | +| **Time Source**  | Local / NTP / PTPv2 / LTC clock, NTP check                                  | 
-| **Audio Meters** | Level meters, source, TooLoud, Silence Detection                | +| **Audio Meters** | Level meters, source, TooLoud, Silence Detection                            | 
-| **GPIO**         | Raspberry Pi and Axia Livewire GPIO (parallel)                  | +| **GPIO**         | Raspberry Pi, Axia Livewire, and MIDI inputs (parallel)                     | 
-| **About**        | Version, license info, log level, log folder, reset, host reboot/shutdown | +| **About**        | Version, license info, log level, log folder, reset, host reboot/shutdown   | 
-| **License**      | OASL 1.0 plus third-party notices (PySide6/Qt, fonts, examples) |+| **License**      | OASL 1.0 plus third-party notices (PySide6/Qt, fonts, examples)             | 
 + 
  
  
Line 278: Line 294:
  
 --- ---
 +
 +
  
 ### 5.1 General ### 5.1 General
 +
 +
  
 #### Instance Name #### Instance Name
Line 339: Line 359:
 | Inactive BG Color   | `inactivebgcolor`   | `#222222` | | Inactive BG Color   | `inactivebgcolor`   | `#222222` |
 | Inactive Text Color | `inactivetextcolor` | `#555555` | | Inactive Text Color | `inactivetextcolor` | `#555555` |
 +
 +
  
  
Line 355: Line 377:
  
  
-| Setting               | Key                          | Default          | Description                        | +| Setting               | Key                          | Default   | Description                                                                                                                                       | 
-| --------------------- | ---------------------------- | ---------------- | ---------------------------------- | +| --------------------- | ---------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | 
-| Clock Face            | `Clock/face`                 | `digital`        | `digital`, `analog`, `analog_numbers`, `analog_studio`, `analog_railway`, `analog_24h_smooth`, `analog_24h_ticking` (`analog_24h` aliases smooth) | +| Clock Face            | `Clock/face`                 | `digital` | `digital`, `analog`, `analog_numbers`, `analog_studio`, `analog_railway`, `analog_24h_smooth`, `analog_24h_ticking` (`analog_24h` aliases smooth) | 
-| Digital (legacy)      | `Clock/digital`              | `true`           | Kept in sync with `Clock/face` (`true` = digital) | +| Digital (legacy)      | `Clock/digital`              | `true`    | Kept in sync with `Clock/face` (`true` = digital)                                                                                                 | 
-| Hours LEDs            | `Clock/digitalhourcolor`     | `#3232FF`        | Hour digit color                   | +| Hours LEDs            | `Clock/digitalhourcolor`     | `#3232FF` | Hour digit color                                                                                                                                  | 
-| Seconds LEDs          | `Clock/digitalsecondcolor`   | `#FF9900`        | Seconds color                      | +| Seconds LEDs          | `Clock/digitalsecondcolor`   | `#FF9900` | Seconds color                                                                                                                                     | 
-| Digits LEDs           | `Clock/digitaldigitcolor`    | `#3232FF`        | All digit color                    | +| Digits LEDs           | `Clock/digitaldigitcolor`    | `#3232FF` | All digit color                                                                                                                                   | 
-| Show seconds          | `Clock/showSeconds`          | `false`          | Show seconds                       | +| Show seconds          | `Clock/showSeconds`          | `false`   | Show seconds                                                                                                                                      | 
-| Seconds Layout        | `Clock/showSecondsInOneLine` | `false`          | `separate` or `in one line`        | +| Seconds Layout        | `Clock/showSecondsInOneLine` | `false`   | `separate` or `in one line`                                                                                                                       | 
-| Static colon          | `Clock/staticColon`          | `false`          | Static colon (non-blinking)        | +| Static colon          | `Clock/staticColon`          | `false`   | Static colon (non-blinking)                                                                                                                       | 
-| Use textclock         | `Clock/useTextClock`         | `true`           | Text clock (e.g. "it's 3 o'clock") | +| Use textclock         | `Clock/useTextClock`         | `true`    | Text clock (e.g. "it's 3 o'clock")                                                                                                                | 
-| Replace IPs after 10s | `General/replacenow`         | `false`          | Replace text after IP display      | +| Replace IPs after 10s | `General/replacenow`         | `false`   | Replace text after IP display                                                                                                                     | 
-| Replace with text     | `General/replacenowtext`     | *(empty)*        | Replacement text for NOW line      |+| Replace with text     | `General/replacenowtext`     | *(empty)* | Replacement text for NOW line                                                                                                                     | 
 + 
  
  
Line 373: Line 397:
  
  
-| Setting                          | Key                               | Default | Description                                                                 | +| Setting                         | Key                               | Default | Description                                                      | 
-| -------------------------------- | --------------------------------- | ------- | --------------------------------------------------------------------------- | +| ------------------------------- | --------------------------------- | ------- | ---------------------------------------------------------------- | 
-| Always start in fullscreen mode  | `General/always_start_fullscreen` | `false` | Always open in fullscreen, even if the last session was windowed            |+| Always start in fullscreen mode | `General/always_start_fullscreen` | `false` | Always open in fullscreen, even if the last session was windowed |
  
  
Line 381: Line 405:
  
 ### 5.2 Updates ### 5.2 Updates
 +
 +
  
 #### Update Check (compiled versions) #### Update Check (compiled versions)
Line 395: Line 421:
 > >
 > To use update checking in the paid version, an **Update Key** must be entered. You can find it in the customer portal at [customer.astrastudio.de](https://customer.astrastudio.de) after placing your order. One license covers one PC or one Raspberry Pi. The field is masked; use the slashed-eye icon to show it. > To use update checking in the paid version, an **Update Key** must be entered. You can find it in the customer portal at [customer.astrastudio.de](https://customer.astrastudio.de) after placing your order. One license covers one PC or one Raspberry Pi. The field is masked; use the slashed-eye icon to show it.
 +
 +
  
 #### Activation (paid builds) #### Activation (paid builds)
Line 412: Line 440:
  
 --- ---
 +
 +
  
 ### 5.3 Network ### 5.3 Network
 +
 +
  
 #### UDP / HTTP / Multicast #### UDP / HTTP / Multicast
  
  
-| Setting           | Key                         | Default       | Description                                                                                                                                                                            | +| Setting           | Key                         | Default       | Description                                                                                                                                                                                                                                     | 
-| ----------------- | --------------------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ----------------- | --------------------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 
-| UDP Port          | `Network/udpport`           | `3310`        | Port for UDP commands                                                                                                                                                                  | +| UDP Port          | `Network/udpport`           | `3310`        | Port for UDP commands                                                                                                                                                                                                                           | 
-| HTTP Port         | `Network/httpport`          | `8010`        | Port for HTTP/Web UI                                                                                                                                                                   | +| HTTP Port         | `Network/httpport`          | `8010`        | Port for HTTP/Web UI                                                                                                                                                                                                                            | 
-| Multicast Address | `Network/multicast_address` | `239.194.0.1` | Multicast address for UDP                                                                                                                                                              |+| Multicast Address | `Network/multicast_address` | `239.194.0.1` | Multicast address for UDP                                                                                                                                                                                                                       |
 | Web Settings PIN  | `Network/websettingspin`    | *(empty)*     | Optional PIN for the Web UI settings overlay and for HTTP `CMD:REBOOT` / `CMD:SHUTDOWN` (stored hashed). Empty = no PIN. Leave the field empty to keep the current PIN; enter `-` to remove it. Other Remote Control commands stay unprotected. | | Web Settings PIN  | `Network/websettingspin`    | *(empty)*     | Optional PIN for the Web UI settings overlay and for HTTP `CMD:REBOOT` / `CMD:SHUTDOWN` (stored hashed). Empty = no PIN. Leave the field empty to keep the current PIN; enter `-` to remove it. Other Remote Control commands stay unprotected. |
 +
 +
  
  
Line 458: Line 492:
 #### SNMP #### SNMP
  
-| Setting               | Key                        | Default   | Description                                                              | + 
-| --------------------- | -------------------------- | --------- | ------------------------------------------------------------------------ | +| Setting             | Key                       | Default   | Description                                          | 
-| enable SNMP support   | `SNMP/enablesnmp`          | `false`   | Enable the SNMPv2c/v3 agent                                              | +| ------------------- | ------------------------- | --------- | ---------------------------------------------------- | 
-| SNMP Listen Port      | `SNMP/snmpport`            | `1161`    | UDP port. 161 needs OS privileges                                        | +| enable SNMP support | `SNMP/enablesnmp`         | `false`   | Enable the SNMPv2c/v3 agent                          | 
-| sysContact            | `SNMP/syscontact`          | *(empty)* | MIB-2 sysContact                                                         | +| SNMP Listen Port    | `SNMP/snmpport`           | `1161`    | UDP port. 161 needs OS privileges                    | 
-| sysLocation           | `SNMP/syslocation`         | *(empty)* | MIB-2 sysLocation                                                        | +| sysContact          | `SNMP/syscontact`         | *(empty)* | MIB-2 sysContact                                     | 
-| v2c Read Community    | `SNMP/snmpcommunity`       | `public`  | Empty disables v2c. Masked                                               | +| sysLocation         | `SNMP/syslocation`        | *(empty)* | MIB-2 sysLocation                                    | 
-| v2c Write Community   | `SNMP/snmpwritecommunity`  | *(empty)* | Empty makes v2c read-only. Masked                                        | +| v2c Read Community  | `SNMP/snmpcommunity`      | `public`  | Empty disables v2c. Masked                           | 
-| v3 User               | `SNMP/snmpv3user`          | *(empty)* | Empty disables v3                                                        | +| v2c Write Community | `SNMP/snmpwritecommunity` | *(empty)* | Empty makes v2c read-only. Masked                    | 
-| v3 Auth Password      | `SNMP/snmpv3authpass`      | *(empty)* | SHA-256. Empty = noAuthNoPriv (testing only). Masked                     | +| v3 User             | `SNMP/snmpv3user`         | *(empty)* | Empty disables v3                                    | 
-| v3 Priv Password      | `SNMP/snmpv3privpass`      | *(empty)* | AES-128. Empty = authNoPriv when auth is set. Masked                     | +| v3 Auth Password    | `SNMP/snmpv3authpass`     | *(empty)* | SHA-256. Empty = noAuthNoPriv (testing only). Masked | 
-| enable SNMP traps     | `SNMP/enabletraps`         | `false`   | Send traps to the NMS                                                    | +| v3 Priv Password    | `SNMP/snmpv3privpass`     | *(empty)* | AES-128. Empty = authNoPriv when auth is set. Masked | 
-| Trap Host             | `SNMP/snmptraphost`        | *(empty)* | NMS hostname/IP                                                          | +| enable SNMP traps   | `SNMP/enabletraps`        | `false`   | Send traps to the NMS                                | 
-| Trap Port             | `SNMP/snmptrapport`        | `162`     | NMS trap port                                                            | +| Trap Host           | `SNMP/snmptraphost`       | *(empty)* | NMS hostname/IP                                      | 
-| Trap Version          | `SNMP/snmptrapversion`     | `v2c`     | `v2c` or `v3`                                                            | +| Trap Port           | `SNMP/snmptrapport`       | `162`     | NMS trap port                                        | 
-| Trap Community        | `SNMP/snmptrapcommunity`   | `public`  | Community for v2c traps. Masked                                          | +| Trap Version        | `SNMP/snmptrapversion`    | `v2c`     | `v2c` or `v3`                                        | 
-| trap on silence       | `SNMP/trap_silence`        | `true`    | Trap when silence starts or clears                                       | +| Trap Community      | `SNMP/snmptrapcommunity`  | `public`  | Community for v2c traps. Masked                      | 
-| trap on warning       | `SNMP/trap_warning`        | `true`    | Trap when WARN text changes                                              | +| trap on silence     | `SNMP/trap_silence`       | `true`    | Trap when silence starts or clears                   | 
-| trap on LED change    | `SNMP/trap_leds`           | `false`   | Trap when an LED turns on or off (can be noisy)                          |+| trap on warning     | `SNMP/trap_warning`       | `true`    | Trap when WARN text changes                          | 
 +| trap on LED change  | `SNMP/trap_leds`          | `false`   | Trap when an LED turns on or off (can be noisy)      | 
  
 At least a v2c community or a v3 user must be set, or the agent will not start. Community and v3 passwords are masked. At least a v2c community or a v3 user must be set, or the agent will not start. Community and v3 passwords are masked.
Line 482: Line 518:
 --- ---
  
-### Links+ 
 + 
 +### 5.4 Links
  
 Link several OnAirScreens on the LAN (multicast discovery by **instance name**) or by typing a host and HTTP port. Instance names must be unique; a collision is flagged in Settings and the Web UI, and Apply is rejected. There are no exclusive master/slave roles: any instance can publish replicas **and** subscribe to sources. Link several OnAirScreens on the LAN (multicast discovery by **instance name**) or by typing a host and HTTP port. Instance names must be unique; a collision is flagged in Settings and the Web UI, and Apply is rejected. There are no exclusive master/slave roles: any instance can publish replicas **and** subscribe to sources.
Line 495: Line 533:
  
  
-| Setting | Key | Default | Description | +| Setting                 | Key                     | Default   | Description                                                                                                                                                                                                                                  | 
-| ------- | --- | ------- | ----------- | +| ----------------------- | ----------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 
-| Enable instance linking | `Links/enabled` | `false` | Push replicas and apply mappings. Name discovery for uniqueness always runs. | +| Enable instance linking | `Links/enabled`         | `false`   | Push replicas and apply mappings. Name discovery for uniqueness always runs.                                                                                                                                                                 | 
-| Replica *n* | `Links/replicaN_*` | off | Target instance (dropdown of nearby screens, or type a name). Leave Host empty to resolve the current IP from the name (DHCP-safe). Host is only a fallback when multicast does not reach them, or to pick one machine if the name collides. | +| Replica *n*             | `Links/replicaN_`*      | off       | Target instance (dropdown of nearby screens, or type a name). Leave Host empty to resolve the current IP from the name (DHCP-safe). Host is only a fallback when multicast does not reach them, or to pick one machine if the name collides. | 
-| Map *n* | `Links/mapN_*` | off | Source instance (nearby dropdown per row), signal, local target, invert, custom command. Host empty = discover by name. | +| Map *n*                 | `Links/mapN_`*          | off       | Source instance (nearby dropdown per row), signal, local target, invert, custom command. Host empty = discover by name.                                                                                                                      | 
-| Replica of | `Links/follow_instance` | *(empty)* | Written when another screen adds this one as a replica |+| Replica of              | `Links/follow_instance` | *(empty)* | Written when another screen adds this one as a replica                                                                                                                                                                                       |
  
  
 --- ---
  
-### 5.4 Time Source 
  
-The display clock can follow the local system clock, an NTP server, a PTPv2 (IEEE 1588-2008) master, or SMPTE LTC (Leo Bodnar LBE-1110 USB serial **or** decoded from a local audio input). **OnAirScreen never changes the operating-system clock.** NTP and PTP steer an independent timebase (`time.monotonic()`), so a jump of the system clock does not move the studio clock. LTC may jump, freeze, and includes frames (`HH:MM:SS:FF`). 
- 
-Date, text clock, and AIR3 top-of-hour follow the same wall time as the large clock when the source is Local, NTP, or PTP. With LTC they keep using the system date/time, because LTC has no calendar date. 
- 
- 
-| Setting            | Key                            | Default        | Description                                                               | 
-| ------------------ | ------------------------------ | -------------- | ------------------------------------------------------------------------- | 
-| Time Source        | `TimeSource/source`            | `local`        | `local`, `ntp`, `ptp`, or `ltc`                                           | 
-| Enable NTP-Check   | `NTP/ntpcheck`                 | `true`         | Warning if time diverges from the NTP server or the server is unreachable | 
-| NTP Server         | `NTP/ntpcheckserver`           | `pool.ntp.org` | NTP server for NTP as time source **and** for the optional NTP check      | 
-| PTP Interface      | `TimeSource/ptp_iface`         | *(empty)*      | IPv4 address of the PTP network interface (independent of AoIP)           | 
-| PTP Domain         | `TimeSource/ptp_domain`        | `0`            | IEEE 1588 domain (0–255)                                                  | 
-| LTC Input          | `TimeSource/ltc_input`         | `serial`       | `serial` (LBE-1110) or `audio` (local PortAudio decode)                   | 
-| LTC Serial Port    | `TimeSource/ltc_port`          | *(empty)*      | USB serial device of the LBE-1110; empty = Auto                           | 
-| LTC Audio Device   | `TimeSource/ltc_audio_device`  | *(empty)*      | Local capture device; empty = system default                              | 
-| LTC Channel        | `TimeSource/ltc_audio_channel` | `0`            | `0` = Left, `1` = Right                                                   | 
-| LTC unlock warning | `TimeSource/ltc_warn`          | `false`        | WARN text when LTC drops; the `LTC NOT LOCKED` LED always remains         | 
- 
- 
-**Local System Clock:** The display uses the OS clock. With NTP-Check enabled, the OS clock is compared to the NTP server (deviation > 0.3 s or errors → warning, priority -1). 
- 
-**NTP Server:** OnAirScreen queries the NTP Server field and steers its own clock. The OS time is not used after the first successful sample. The field stays editable even when NTP-Check is off. Loss of NTP: last time keeps running and a warning is shown. 
- 
-**PTPv2 IEEE 1588-2008:** Software slave on multicast `224.0.1.129` UDP 319/320 (event/general), delay mechanism E2E. Typical accuracy is milliseconds (no hardware timestamping). Choose the studio/AoIP VLAN interface independently of the Audio Meters AoIP interface. Loss of Sync: last time keeps running plus warning. If UDP 319/320 cannot be bound (another stack already holds the ports), the slave retries every few seconds; the lock LED and WARN show `PTP ERROR` until the ports are free. Details stay in the log. On Linux and Raspberry Pi OS, shop `.deb`/`.rpm`/SD images install the `/usr/lib/onairscreen/oas-ptp-bind` helper for UDP 319/320. 
- 
-**LTC:** One time source with two inputs. Frame rate is inferred from incoming frames (24 / 25 / 30). Loss of LTC: last timecode is frozen (`LTC NOT LOCKED`). The large WARN messages (`waiting for LTC lock`, `Clock not LTC synchronized`, `LTC reader not connected`) are **off by default** so video scrubbing does not flood WARN; enable **Show LTC unlock warning** if you want them. The lock LED always shows `LTC LOCK` / `LTC NOT LOCKED`. NTP-Check still compares the OS clock to the NTP server, not the timecode. 
- 
-**LBE-1110 Serial:** USB CDC virtual serial port of a [Leo Bodnar LBE-1110](https://www.leobodnar.com/shop/index.php?main_page=product_info&cPath=120&products_id=374); no drivers. Auto selects a Leo Bodnar device (USB VID `0x1DD2`) or an LBE-1110 / CDC port. 
- 
-**Audio Input:** Decodes SMPTE LTC (biphase-mark) from a **local** PortAudio capture device, independent of Audio Meters (not Livewire/AES67). Choose Left or Right (default Left). On some hosts the same device cannot be opened twice — if meters already use that input, pick a different device for LTC. 
- 
-The clock lock LED (bottom right) is green when the selected source is locked and red when it is not. Next to it: `PTP LOCK` / `PTP NOT LOCKED` / `PTP ERROR`, `NTP LOCK` / `NTP NOT LOCKED`, `LTC LOCK` / `LTC NOT LOCKED`, or `LOCAL`. 
- 
-> **Recommendation:** Use a local NTP server on your studio network, as `pool.ntp.org` can be unreliable at times. 
- 
---- 
  
 ### 5.5 Advanced ### 5.5 Advanced
Line 566: Line 567:
 | `MMM` / `MMMM` | Month name (short / long) | | `MMM` / `MMMM` | Month name (short / long) |
 | `yy` / `yyyy`  | Year (2 / 4 digits)       | | `yy` / `yyyy`  | Year (2 / 4 digits)       |
 +
 +
  
  
Line 589: Line 592:
  
 --- ---
 +
 +
  
 ### 5.6 Timers ### 5.6 Timers
Line 623: Line 628:
  
 --- ---
 +
 +
  
 ### 5.7 Fonts ### 5.7 Fonts
Line 643: Line 650:
 --- ---
  
-### 5.8 About 
  
  
-| Element            | Description                                             | +### 5.8 Time Source
-| ------------------ | ------------------------------------------------------- | +
-| Version            | Current OnAirScreen version                             | +
-| Distribution       | `OpenSource` or commercial distribution                 | +
-| Settings Path      | Path to the configuration file on this system           | +
-| Log Folder         | Folder with `onairscreen.log` and crash reports         | +
-| Open log folder    | Opens that folder in the system file manager            | +
-| Loglevel           | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`, `NONE` | +
-| Enable Reset       | Checkbox to enable the reset button                     | +
-| Reset all settings | Resets **all** settings to defaults (cannot be undone)  | +
-| Reboot             | Reboot the host operating system (asks for confirmation) | +
-| Shutdown           | Shut down the host operating system (asks for confirmation) |+
  
 +The display clock can follow the local system clock, an NTP server, a PTPv2 (IEEE 1588-2008) master, or SMPTE LTC (Leo Bodnar LBE-1110 USB serial **or** decoded from a local audio input). **OnAirScreen never changes the operating-system clock.** NTP and PTP steer an independent timebase (`time.monotonic()`), so a jump of the system clock does not move the studio clock. LTC may jump, freeze, and includes frames (`HH:MM:SS:FF`).
 +
 +Date, text clock, and AIR3 top-of-hour follow the same wall time as the large clock when the source is Local, NTP, or PTP. With LTC they keep using the system date/time, because LTC has no calendar date.
 +
 +
 +| Setting            | Key                            | Default        | Description                                                               |
 +| ------------------ | ------------------------------ | -------------- | ------------------------------------------------------------------------- |
 +| Time Source        | `TimeSource/source`            | `local`        | `local`, `ntp`, `ptp`, or `ltc`                                           |
 +| Enable NTP-Check   | `NTP/ntpcheck`                 | `true`         | Warning if time diverges from the NTP server or the server is unreachable |
 +| NTP Server         | `NTP/ntpcheckserver`           | `pool.ntp.org` | NTP server for NTP as time source **and** for the optional NTP check      |
 +| PTP Interface      | `TimeSource/ptp_iface`         | *(empty)*      | IPv4 address of the PTP network interface (independent of AoIP)           |
 +| PTP Domain         | `TimeSource/ptp_domain`        | `0`            | IEEE 1588 domain (0–255)                                                  |
 +| LTC Input          | `TimeSource/ltc_input`         | `serial`       | `serial` (LBE-1110) or `audio` (local PortAudio decode)                   |
 +| LTC Serial Port    | `TimeSource/ltc_port`          | *(empty)*      | USB serial device of the LBE-1110; empty = Auto                           |
 +| LTC Audio Device   | `TimeSource/ltc_audio_device`  | *(empty)*      | Local capture device; empty = system default                              |
 +| LTC Channel        | `TimeSource/ltc_audio_channel` | `0`            | `0` = Left, `1` = Right                                                   |
 +| LTC unlock warning | `TimeSource/ltc_warn`          | `false`        | WARN text when LTC drops; the `LTC NOT LOCKED` LED always remains         |
 +
 +
 +**Local System Clock:** The display uses the OS clock. With NTP-Check enabled, the OS clock is compared to the NTP server (deviation > 0.3 s or errors → warning, priority -1).
 +
 +**NTP Server:** OnAirScreen queries the NTP Server field and steers its own clock. The OS time is not used after the first successful sample. The field stays editable even when NTP-Check is off. Loss of NTP: last time keeps running and a warning is shown.
 +
 +**PTPv2 IEEE 1588-2008:** Software slave on multicast `224.0.1.129` UDP 319/320 (event/general), delay mechanism E2E. Typical accuracy is milliseconds (no hardware timestamping). Choose the studio/AoIP VLAN interface independently of the Audio Meters AoIP interface. Loss of Sync: last time keeps running plus warning. If UDP 319/320 cannot be bound (another stack already holds the ports), the slave retries every few seconds; the lock LED and WARN show `PTP ERROR` until the ports are free. Details stay in the log. On Linux and Raspberry Pi OS, shop `.deb`/`.rpm`/SD images install the `/usr/lib/onairscreen/oas-ptp-bind` helper for UDP 319/320.
 +
 +**LTC:** One time source with two inputs. Frame rate is inferred from incoming frames (24 / 25 / 30). Loss of LTC: last timecode is frozen (`LTC NOT LOCKED`). The large WARN messages (`waiting for LTC lock`, `Clock not LTC synchronized`, `LTC reader not connected`) are **off by default** so video scrubbing does not flood WARN; enable **Show LTC unlock warning** if you want them. The lock LED always shows `LTC LOCK` / `LTC NOT LOCKED`. NTP-Check still compares the OS clock to the NTP server, not the timecode.
 +
 +**LBE-1110 Serial:** USB CDC virtual serial port of a [Leo Bodnar LBE-1110](https://www.leobodnar.com/shop/index.php?main_page=product_info&cPath=120&products_id=374); no drivers. Auto selects a Leo Bodnar device (USB VID `0x1DD2`) or an LBE-1110 / CDC port.
 +
 +**Audio Input:** Decodes SMPTE LTC (biphase-mark) from a **local** PortAudio capture device, independent of Audio Meters (not Livewire/AES67). Choose Left or Right (default Left). On some hosts the same device cannot be opened twice — if meters already use that input, pick a different device for LTC.
 +
 +The clock lock LED (bottom right) is green when the selected source is locked and red when it is not. Next to it: `PTP LOCK` / `PTP NOT LOCKED` / `PTP ERROR`, `NTP LOCK` / `NTP NOT LOCKED`, `LTC LOCK` / `LTC NOT LOCKED`, or `LOCAL`.
 +
 +> **Recommendation:** Use a local NTP server on your studio network, as `pool.ntp.org` can be unreliable at times.
  
 --- ---
 +
 +
  
 ### 5.9 Audio Meters ### 5.9 Audio Meters
Line 723: Line 754:
 --- ---
  
-### 5.10 GPIO 
  
-GPIO maps contacts and Livewire source pins to the same LED and AIR commands as the network API. Configure under **Settings → GPIO**. Inner tabs at the top: **Raspberry Pi**, **Axia Livewire**, and **Logic**. Pi and Livewire can be enabled at the same time. Logic combines inputs from both.+ 
 +### 5.10 GPIO / MIDI 
 + 
 +GPIO maps contacts, Livewire source pins, and MIDI messages to the same LED and AIR commands as the network API. Configure under **Settings → GPIO**. Inner tabs at the top: **Raspberry Pi**, **Axia Livewire**, **MIDI**, and **Logic**. Pi, Livewire, and MIDI can be enabled at the same time. Logic combines On/Off levels from all three.
  
 #### Raspberry Pi #### Raspberry Pi
Line 734: Line 767:
  
  
-| Setting        | Key                 | Default                      | Description                             | +| Setting        | Key                 | Default                      | Description                                                      | 
-| -------------- | ------------------- | ---------------------------- | --------------------------------------- | +| -------------- | ------------------- | ---------------------------- | ---------------------------------------------------------------- | 
-| Enable GPIO    | `GPIO/enabled`      | `false`                      | Watch configured BCM pins               | +| Enable GPIO    | `GPIO/enabled`      | `false`                      | Watch configured BCM pins                                        | 
-| Debounce       | `GPIO/debounce_ms`  | `50`                         | Ignore bounce shorter than this (ms)    | +| Debounce       | `GPIO/debounce_ms`  | `50`                         | Ignore bounce shorter than this (ms)                             | 
-| GPI*n* Enable  | `GPIO/gpiN_enabled` | GPI1–2 on, 3–8 off           | Use this input                          | +| GPI*n* Enable  | `GPIO/gpiN_enabled` | GPI1–2 on, 3–8 off           | Use this input                                                   | 
-| GPI*n* Name    | `GPIO/gpiN_name`    | *(empty)*                    | Short label for Logic rules, e.g. MIC1  | +| GPI*n* Name    | `GPIO/gpiN_name`    | *(empty)*                    | Short label for Logic rules, e.g. MIC1                           | 
-| GPI*n* BCM pin | `GPIO/gpiN_pin`     | 17, 27, 5, 6, 12, 13, 16, 22 | Safe BCM pins only                      | +| GPI*n* BCM pin | `GPIO/gpiN_pin`     | 17, 27, 5, 6, 12, 13, 16, 22 | Safe BCM pins only                                               | 
-| GPI*n* Invert  | `GPIO/gpiN_invert`  | `true`                       | On: contact to GND is active (pull-up)  | +| GPI*n* Invert  | `GPIO/gpiN_invert`  | `true`                       | On: contact to GND is active (pull-up)                           | 
-| GPI*n* Mode    | `GPIO/gpiN_mode`    | `level`                      | `level`, `rising`, `falling`, `both`    |+| GPI*n* Mode    | `GPIO/gpiN_mode`    | `level`                      | `level`, `rising`, `falling`, `both`                             |
 | GPI*n* Actions | `GPIO/gpiN_action`  | LED1 / AIR3                  | One or more of LED1–4, AIR1–4, AIR3/AIR4 Reset (comma-separated) | | GPI*n* Actions | `GPIO/gpiN_action`  | LED1 / AIR3                  | One or more of LED1–4, AIR1–4, AIR3/AIR4 Reset (comma-separated) |
 | GPI*n* Command | `GPIO/gpiN_command` | *(empty)*                    | Extra API commands, separated by semicolon                       | | GPI*n* Command | `GPIO/gpiN_command` | *(empty)*                    | Extra API commands, separated by semicolon                       |
Line 818: Line 851:
 - Pi 5 overview: [Raspberry Pi 5](https://www.raspberrypi.com/documentation/computers/raspberry-pi-5.html) - Pi 5 overview: [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 830: Line 865:
 Typical microphone ON-AIR profile: **GPO pin 1** is the ON lamp (latched while the channel is ON; often off during TALK/MUTE). GPI 1 would be the ON command *to* the console — OAS does not send that. Typical microphone ON-AIR profile: **GPO pin 1** is the ON lamp (latched while the channel is ON; often off during TALK/MUTE). GPI 1 would be the ON command *to* the console — OAS does not send that.
  
-| Setting              | Key                    | Default            | Description                                      | + 
-| -------------------- | ---------------------- | ------------------ | ------------------------------------------------ | +| Setting              | Key                    | Default            | Description                                                             | 
-| Enable Livewire GPIO | `GPIO/lw_enabled`      | `false`            | Follow Livewire GPIO (multicast or LWRP)         | +| -------------------- | ---------------------- | ------------------ | ----------------------------------------------------------------------- | 
-| Mode                 | `GPIO/lw_transport`    | `multicast`        | `multicast` or `lwrp`                            | +| Enable Livewire GPIO | `GPIO/lw_enabled`      | `false`            | Follow Livewire GPIO (multicast or LWRP)                                | 
-| Host                 | `GPIO/lw_host`         | *(empty)*          | Device IPv4 (LWRP)                               | +| Mode                 | `GPIO/lw_transport`    | `multicast`        | `multicast` or `lwrp`                                                   | 
-| Port                 | `GPIO/lw_port`         | `93`               | LWRP TCP port                                    | +| Host                 | `GPIO/lw_host`         | *(empty)*          | Device IPv4 (LWRP)                                                      | 
-| Password             | `GPIO/lw_password`     | *(empty)*          | Optional LWRP `LOGIN` password                   | +| Port                 | `GPIO/lw_port`         | `93`               | LWRP TCP port                                                           | 
-| AoIP interface       | `Audio/livewire_iface` | *(empty)*          | IPv4 interface for IGMP (multicast mode; same as Audio Meters) | +| Password             | `GPIO/lw_password`     | *(empty)*          | Optional LWRP `LOGIN` password                                          | 
-| Debounce             | `GPIO/lw_debounce_ms`  | `50`               | Ignore bounce shorter than this (ms)             | +| AoIP interface       | `Audio/livewire_iface` | *(empty)*          | IPv4 interface for IGMP (multicast mode; same as Audio Meters)          | 
-| GPI*n* Enable        | `GPIO/lw_gpiN_enabled` | rows 1–2 on        | Use this mapping row                             | +| Debounce             | `GPIO/lw_debounce_ms`  | `50`               | Ignore bounce shorter than this (ms)                                    | 
-| GPI*n* Name          | `GPIO/lw_gpiN_name`    | *(empty)*          | Short label for Logic rules, e.g. MIC1           |+| GPI*n* Enable        | `GPIO/lw_gpiN_enabled` | rows 1–2 on        | Use this mapping row                                                    | 
 +| GPI*n* Name          | `GPIO/lw_gpiN_name`    | *(empty)*          | Short label for Logic rules, e.g. MIC1                                  |
 | GPI*n* Channel/Port  | `GPIO/lw_gpiN_channel` | 1, 2, then row *n* | Livewire channel (multicast) or GPIO port on the device (LWRP), 1–32767 | | GPI*n* Channel/Port  | `GPIO/lw_gpiN_channel` | 1, 2, then row *n* | Livewire channel (multicast) or GPIO port on the device (LWRP), 1–32767 |
-| GPI*n* Direction     | `GPIO/lw_gpiN_dir`     | `gpo`              | `gpo` (from console) or `gpi` (to console)       | +| GPI*n* Direction     | `GPIO/lw_gpiN_dir`     | `gpo`              | `gpo` (from console) or `gpi` (to console)                              | 
-| GPI*n* Pin           | `GPIO/lw_gpiN_pin`     | `1`                | Pin 1–5 on that channel/port                     | +| GPI*n* Pin           | `GPIO/lw_gpiN_pin`     | `1`                | Pin 1–5 on that channel/port                                            | 
-| GPI*n* Invert        | `GPIO/lw_gpiN_invert`  | `false`            | Off: Livewire low (L/l) is active                | +| GPI*n* Invert        | `GPIO/lw_gpiN_invert`  | `false`            | Off: Livewire low (L/l) is active                                       | 
-| GPI*n* Mode          | `GPIO/lw_gpiN_mode`    | `level`            | `level`, `rising`, `falling`, `both`             | +| GPI*n* Mode          | `GPIO/lw_gpiN_mode`    | `level`            | `level`, `rising`, `falling`, `both`                                    | 
-| GPI*n* Actions       | `GPIO/lw_gpiN_action`  | LED1 / AIR3        | One or more of LED1–4, AIR1–4, AIR3/AIR4 Reset (comma-separated) | +| GPI*n* Actions       | `GPIO/lw_gpiN_action`  | LED1 / AIR3        | One or more of LED1–4, AIR1–4, AIR3/AIR4 Reset (comma-separated)        | 
-| GPI*n* Command       | `GPIO/lw_gpiN_command` | *(empty)*          | Extra API commands, separated by semicolon                       |+| GPI*n* Command       | `GPIO/lw_gpiN_command` | *(empty)*          | Extra API commands, separated by semicolon                              | 
  
 Factory mapping (master **Enable Livewire GPIO** stays off): row 1 channel/port 1 GPO pin 1 → LED1, row 2 channel/port 2 GPO pin 1 → AIR3. Factory mapping (master **Enable Livewire GPIO** stays off): row 1 channel/port 1 GPO pin 1 → LED1, row 2 channel/port 2 GPO pin 1 → AIR3.
Line 856: Line 893:
  
 **Level** (typical ON lamp): GPO 1 low sends `LED1:ON`, high sends `OFF`. Invert stays **off** unless the console polarity is reversed. **Level** (typical ON lamp): GPO 1 low sends `LED1:ON`, high sends `OFF`. Invert stays **off** unless the console polarity is reversed.
 +
 +#### MIDI
 +
 +**MIDI** reads one input interface (Settings → GPIO → MIDI) and maps Note or CC messages to the same LED and AIR commands. **Learn** waits up to 10 seconds for the next Note or CC and fills channel, type, and number. Clock, Active Sensing, and SysEx are ignored.
 +
 +
 +| Setting           | Key                     | Default   | Description                                                         |
 +| ----------------- | ----------------------- | --------- | ------------------------------------------------------------------- |
 +| Enable MIDI       | `GPIO/midi_enabled`     | `false`   | Listen on the selected interface                                    |
 +| Interface         | `GPIO/midi_port`        | *(empty)* | Input port name. A missing device stays listed as not connected     |
 +| Debounce          | `GPIO/midi_debounce_ms` | `20`      | Oneshot and Toggle treat a burst closer than this as one press (ms) |
 +| MIDI*n* Enable    | `GPIO/midiN_enabled`    | `false`   | Use this row                                                        |
 +| MIDI*n* Name      | `GPIO/midiN_name`       | *(empty)* | Short label for Logic, e.g. PAD                                     |
 +| MIDI*n* Channel   | `GPIO/midiN_channel`    | `1`       | MIDI channel 1–16                                                   |
 +| MIDI*n* Type      | `GPIO/midiN_kind`       | `note`    | `note` or `cc`                                                      |
 +| MIDI*n* Number    | `GPIO/midiN_number`     | `0`       | Note or CC number, 0–127                                            |
 +| MIDI*n* Threshold | `GPIO/midiN_threshold`  | `64`      | CC at or above this is active                                       |
 +| MIDI*n* Behavior  | `GPIO/midiN_behavior`   | `follow`  | `follow` (On/Off), `oneshot`, or `toggle`                           |
 +| MIDI*n* Invert    | `GPIO/midiN_invert`     | `false`   | On/Off swaps the held level. Oneshot sends OFF instead of ON        |
 +| MIDI*n* Actions   | `GPIO/midiN_action`     | *(empty)* | LED1–4, AIR1–4, AIR3/AIR4 Reset                                     |
 +| MIDI*n* Command   | `GPIO/midiN_command`    | *(empty)* | Extra API commands, semicolon-separated                             |
 +
 +
 +**On/Off** holds the level: Note On (velocity > 0) or a CC at the threshold sends `LED1:ON`, Note Off or a CC below the threshold sends `OFF`. **Oneshot** sends `LED1:ON` once per press, or `LED1:OFF` when Invert is on. **Toggle** sends `LED1:TOGGLE` once per press. Reset and custom commands fire once for both, including an inverted Oneshot. Both fire again even when the controller never sends Note Off. A fader that keeps sending CCs above the threshold stays one burst. Two enabled rows on the same channel, type, and number both fire, and the tab shows a warning. While Settings is open, an enabled row flashes when a Note or CC arrives on its channel, type, and number.
 +
 +**Only On/Off rows appear in Logic.** Oneshot and Toggle are missing from the Logic input menu even when the row is enabled and named, because they do not hold a level. Every On/Off row is listed, including rows whose Enable box is off. That disabled input counts as off inside a rule. Unnamed On/Off rows are labeled MIDI1 … MIDI8. A name is shown as `PAD (MIDI1)`. To use a MIDI row in Logic, set Behavior to On/Off.
  
 #### Logic #### Logic
  
-**Logic** combines Raspberry Pi and Livewire inputs. Each rule has one operator, one or more inputs, and one or more outputs. The outputs follow the combined level: a command is sent only when that result changes.+**Logic** combines Raspberry Pi, Livewire, and MIDI On/Off inputs. Each rule has one operator, one or more inputs, and one or more outputs. The outputs follow the combined level: a command is sent only when that result changes. The input menu lists every Pi input, every Livewire input, and every MIDI row set to On/Off. MIDI Oneshot and Toggle rows are left out. A MIDI On/Off row stays in the menu when Enable is off. 
 + 
 + 
 +| Operator | Outputs turn on                | Outputs turn off                 | 
 +| -------- | ------------------------------ | -------------------------------- | 
 +| OR       | any selected input is active   | every selected input is inactive | 
 +| AND      | every selected input is active | any selected input is inactive   |
  
-| Operator | Outputs turn on | Outputs turn off | 
-| -------- | --------------- | ---------------- | 
-| OR       | any selected input is active | every selected input is inactive | 
-| AND      | every selected input is active | any selected input is inactive | 
  
 Example: name Pi GPI1 `MIC1` and Pi GPI2 `MIC2`. Rule `OR` with those two inputs and outputs LED1 and AIR1 stays on while either microphone is open, and turns both off only when both are closed. Example: name Pi GPI1 `MIC1` and Pi GPI2 `MIC2`. Rule `OR` with those two inputs and outputs LED1 and AIR1 stays on while either microphone is open, and turns both off only when both are closed.
Line 870: Line 935:
 Inputs that are disabled, missing, or not yet seen count as off. An empty input list stays off. Resets and custom commands fire when the rule becomes true, not when it becomes false. Direct row actions (including edge modes) keep working beside the rules. If the same LED or AIR timer is also set on a row or on another rule, that Logic row shows a warning. Inputs that are disabled, missing, or not yet seen count as off. An empty input list stays off. Resets and custom commands fire when the rule becomes true, not when it becomes false. Direct row actions (including edge modes) keep working beside the rules. If the same LED or AIR timer is also set on a row or on another rule, that Logic row shows a warning.
  
-| Setting | Key | Default | Description | + 
-| ------- | --- | ------- | ----------- | +| Setting           | Key                   | Default   | Description                                   | 
-| Rule *n* Enable | `GPIO/logicN_enabled` | `false` | Use this rule | +| ----------------- | --------------------- | --------- | --------------------------------------------- | 
-| Rule *n* Operator | `GPIO/logicN_op` | `or` | `or` or `and` | +| Rule *n* Enable   | `GPIO/logicN_enabled` | `false`   | Use this rule                                 | 
-| Rule *n* Inputs | `GPIO/logicN_inputs` | *(empty)* | `pi:1`, `lw:2`, comma-separated | +| Rule *n* Operator | `GPIO/logicN_op`      | `or`      | `or` or `and`                                 | 
-| Rule *n* Outputs | `GPIO/logicN_action` | *(empty)* | LED1–4, AIR1–4, AIR3/AIR4 Reset | +| Rule *n* Inputs   | `GPIO/logicN_inputs`  | *(empty)* | `pi:1`, `lw:2`, `midi:3`, comma-separated     | 
-| Rule *n* Command | `GPIO/logicN_command` | *(empty)* | Extra API commands when the rule becomes true |+| Rule *n* Outputs  | `GPIO/logicN_action`  | *(empty)* | LED1–4, AIR1–4, AIR3/AIR4 Reset               | 
 +| Rule *n* Command  | `GPIO/logicN_command` | *(empty)* | Extra API commands when the rule becomes true | 
  
 Eight rules. A microphone that is already on when OnAirScreen starts turns a matching rule on as soon as that input level is known. Eight rules. A microphone that is already on when OnAirScreen starts turns a matching rule on as soon as that input level is known.
  
 --- ---
 +
 +
 +
 +### 5.11 About
 +
 +
 +| Element            | Description                                                 |
 +| ------------------ | ----------------------------------------------------------- |
 +| Version            | Current OnAirScreen version                                 |
 +| Distribution       | `OpenSource` or commercial distribution                     |
 +| Settings Path      | Path to the configuration file on this system               |
 +| Log Folder         | Folder with `onairscreen.log` and crash reports             |
 +| Open log folder    | Opens that folder in the system file manager                |
 +| Loglevel           | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`, `NONE`     |
 +| Enable Reset       | Checkbox to enable the reset button                         |
 +| Reset all settings | Resets **all** settings to defaults (cannot be undone)      |
 +| Reboot             | Reboot the host operating system (asks for confirmation)    |
 +| Shutdown           | Shut down the host operating system (asks for confirmation) |
 +
 +
 +---
 +
 +
  
 ## 6. Features in Detail ## 6. Features in Detail
 +
 +
  
 ### 6.1 Status LEDs ### 6.1 Status LEDs
Line 892: Line 984:
 - **Autoflash:** Blinks continuously at 500 ms intervals while the LED is on - **Autoflash:** Blinks continuously at 500 ms intervals while the LED is on
 - **20sec flash:** Blinks for 20 seconds, then turns off automatically - **20sec flash:** Blinks for 20 seconds, then turns off automatically
 +
 +
  
 ### 6.2 AIR Timers ### 6.2 AIR Timers
Line 901: Line 995:
 - Simple stopwatch: start/stop, seconds reset to 0 on start - Simple stopwatch: start/stop, seconds reset to 0 on start
 - Control: `M`/`/` (AIR1), `P`/`*` (AIR2), or left-click the timer - Control: `M`/`/` (AIR1), `P`/`*` (AIR2), or left-click the timer
 +
 +
  
 #### AIR3 (Radio Timer) #### AIR3 (Radio Timer)
Line 922: Line 1018:
  
  
-| Input            | Meaning                           | +| Input                    | Meaning                           | 
-| ---------------- | --------------------------------- |+| ------------------------ | --------------------------------- |
 | `2:10`, `2,10` or `2.10` | 2 minutes 10 seconds (count-down) | | `2:10`, `2,10` or `2.10` | 2 minutes 10 seconds (count-down) |
-| `30`             | 30 seconds (count-down)           | +| `30`                     | 30 seconds (count-down)           | 
-| `0`              | Count-up mode                     |+| `0`                      | Count-up mode                     | 
 + 
  
  
Line 933: Line 1031:
 - Like AIR3, but without Top-of-Hour function - Like AIR3, but without Top-of-Hour function
 - Control: `S` or left-click (start/stop), `Alt+S` (reset) - Control: `S` or left-click (start/stop), `Alt+S` (reset)
 +
 +
  
 ### 6.3 Text Lines NOW, NEXT, WARN ### 6.3 Text Lines NOW, NEXT, WARN
Line 968: Line 1068:
 | Priority 2 | `WARN:2:` *(empty text after colon)* | | Priority 2 | `WARN:2:` *(empty text after colon)* |
 | Web UI     | X button next to the warning         | | Web UI     | X button next to the warning         |
 +
 +
  
  
Line 997: Line 1099:
  
 ![Analog 24h clock face (smooth or ticking second hand)](https://www.astrastudio.de/wp-content/uploads/2026/09/OAS_Clockfaces_analog_24h.png) ![Analog 24h clock face (smooth or ticking second hand)](https://www.astrastudio.de/wp-content/uploads/2026/09/OAS_Clockfaces_analog_24h.png)
 +
 - **Text clock:** Spoken time display (e.g. "it's a quarter past three") - **Text clock:** Spoken time display (e.g. "it's a quarter past three")
-- **Time source:** Local, NTP, PTPv2, or LTC — see [5.3 Time Source](#53-time-source); the OS clock is never set+- **Time source:** Local, NTP, PTPv2, or LTC — see [5.8 Time Source](#time_source); the OS clock is never set
 - **Lock LED** bottom right: green = locked, red = not locked (`PTP LOCK` / `NTP LOCK` / `LTC LOCK`, or `LOCAL`) - **Lock LED** bottom right: green = locked, red = not locked (`PTP LOCK` / `NTP LOCK` / `LTC LOCK`, or `LOCAL`)
 - **Weather widget:** Optionally displayed next to the clock (OpenWeatherMap) - **Weather widget:** Optionally displayed next to the clock (OpenWeatherMap)
 +
 +
  
 ### 6.6 System Commands ### 6.6 System Commands
Line 1016: Line 1121:
 ### 6.7 GPIO Inputs ### 6.7 GPIO Inputs
  
-Mixer GPI (contact closure) can drive LEDs and AIR timers through **Raspberry Pi** GPIO. Axia consoles can drive the same LED and AIR actions through **Livewire GPIO** (multicast source channel or LWRP TCP 93, e.g. mic ON lamp). Both can run at the same time. See [5.9 GPIO](#59-gpio) for Pi wiring, Livewire channel/port mapping, and the AoIP interface. Pi GPIO is local hardware; Livewire GPIO is multicast or a TCP session on the AoIP network.+Mixer GPI (contact closure) can drive LEDs and AIR timers through **Raspberry Pi** GPIO. Axia consoles can drive the same LED and AIR actions through **Livewire GPIO** (multicast source channel or LWRP TCP 93, e.g. mic ON lamp). A MIDI controller can drive them from Note and CC messages on one input. All three can run at the same time. See [5.10 GPIO](#510-gpio) for Pi wiring, Livewire channel/port mapping, MIDI Learn, and the AoIP interface. Pi GPIO is local hardware; Livewire GPIO is multicast or a TCP session on the AoIP network; MIDI is the selected input port.
  
 --- ---
 +
 +
  
 ## 7. Remote Control and API ## 7. Remote Control and API
Line 1037: Line 1144:
 echo "CONF:CONF:APPLY=TRUE" > /dev/udp/127.0.0.1/3310 echo "CONF:CONF:APPLY=TRUE" > /dev/udp/127.0.0.1/3310
 ``` ```
 +
 +
  
 ### 7.2 HTTP (Port 8010) ### 7.2 HTTP (Port 8010)
Line 1044: Line 1153:
 curl "http://127.0.0.1:8010/?cmd=NOW:Current%20Song" curl "http://127.0.0.1:8010/?cmd=NOW:Current%20Song"
 ``` ```
 +
 +
  
 ### 7.3 Web UI ### 7.3 Web UI
Line 1068: Line 1179:
 - Links in the overlay: same Nearby list, Add as replica / Use as source, and Replicas / Sources grids as the desktop Settings - Links in the overlay: same Nearby list, Add as replica / Use as source, and Replicas / Sources grids as the desktop Settings
 - Audio Meters in the overlay: Livewire Source and AES67 Stream dropdowns (live discovery while the overlay is open) plus Paste SDP - Audio Meters in the overlay: Livewire Source and AES67 Stream dropdowns (live discovery while the overlay is open) plus Paste SDP
 +
 +
  
 ### 7.4 REST API ### 7.4 REST API
Line 1090: Line 1203:
   "lra": null,   "lra": null,
   "instance": "Studio-1",   "instance": "Studio-1",
-  "version": "1.0.9",+  "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 1195: Line 1308:
 Drag presets for LED1–4 (toggle + colour), AIR1–4 with live caption and time on the button (MIC = AIR1), TOTH, Reset AIR3/4, NOW / NEXT / WARN, Silence, Loudness I+LRA, and Reset I+LRA. Drag presets for LED1–4 (toggle + colour), AIR1–4 with live caption and time on the button (MIC = AIR1), TOTH, Reset AIR3/4, NOW / NEXT / WARN, Silence, Loudness I+LRA, and Reset I+LRA.
  
-Variables such as `$(oas:air1_time)`, `$(oas:lufs_i)`, and `$(oas:lra)` and feedbacks (LED on, AIR running, TOTH, Silence, WARN, Loudness I+LRA) update from WebSocket or the status poll. Set the connection Label to `oas` so those examples match. The connection status shows instance name and version, for example `Studio-1 · 1.0.9`. The module `HELP.md` lists every action, feedback, and variable.+Variables such as `$(oas:air1_time)`, `$(oas:lufs_i)`, and `$(oas:lra)` and feedbacks (LED on, AIR running, TOTH, Silence, WARN, Loudness I+LRA) update from WebSocket or the status poll. Set the connection Label to `oas` so those examples match. The connection status shows instance name and version, for example `Studio-1 · 1.0.10`. The module `HELP.md` lists every action, feedback, and variable.
  
 If you cannot load a custom module, **Generic OSC** remains available (next section). Status push over OSC is slower (every 5 seconds) than the HTTP poll / WebSocket. If you cannot load a custom module, **Generic OSC** remains available (next section). Status push over OSC is slower (every 5 seconds) than the HTTP poll / WebSocket.
Line 1235: Line 1348:
 python3 utils/oas_osc_send.py /oas/led2/state python3 utils/oas_osc_send.py /oas/led2/state
 ``` ```
 +
 +
  
 #### Alternative: Generic OSC #### Alternative: Generic OSC
Line 1280: Line 1395:
  
 ### 7.9 Command Reference ### 7.9 Command Reference
 +
 +
  
 #### Control Commands #### Control Commands
Line 1306: Line 1423:
 | `CMD:SHUTDOWN`                    | OS shutdown (HTTP requires Web Settings PIN when set)                         | | `CMD:SHUTDOWN`                    | OS shutdown (HTTP requires Web Settings PIN when set)                         |
 | `CMD:QUIT`                        | Quit OnAirScreen                                                              | | `CMD:QUIT`                        | Quit OnAirScreen                                                              |
 +
 +
  
  
Line 1315: Line 1434:
  
  
-| Command                                         | Description               | +| Command                                         | Description                                                                                                                                                   | 
-| ----------------------------------------------- | ------------------------- | +| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | 
-| `CONF:General:stationname=TEXT`                 | Station name              | +| `CONF:General:stationname=TEXT`                 | Station name                                                                                                                                                  | 
-| `CONF:General:instancename=TEXT`                | Instance name (DNS label) | +| `CONF:General:instancename=TEXT`                | Instance name (DNS label)                                                                                                                                     | 
-| `CONF:General:slogan=TEXT`                      | Slogan                    | +| `CONF:General:slogan=TEXT`                      | Slogan                                                                                                                                                        | 
-| `CONF:General:stationcolor=COLOR`               | Station color             | +| `CONF:General:stationcolor=COLOR`               | Station color                                                                                                                                                 | 
-| `CONF:General:slogancolor=COLOR`                | Slogan color              | +| `CONF:General:slogancolor=COLOR`                | Slogan color                                                                                                                                                  | 
-| `CONF:General:replacenow=[True/False]`          | Enable IP replacement     | +| `CONF:General:replacenow=[True/False]`          | Enable IP replacement                                                                                                                                         | 
-| `CONF:General:replacenowtext=TEXT`              | Replacement text          | +| `CONF:General:replacenowtext=TEXT`              | Replacement text                                                                                                                                              | 
-| `CONF:LED[1-4]:used=[True/False]`               | Enable LED                | +| `CONF:LED[1-4]:used=[True/False]`               | Enable LED                                                                                                                                                    | 
-| `CONF:LED[1-4]:text=TEXT`                       | LED text                  | +| `CONF:LED[1-4]:text=TEXT`                       | LED text                                                                                                                                                      | 
-| `CONF:LED[1-4]:activebgcolor=COLOR`             | LED active background     | +| `CONF:LED[1-4]:activebgcolor=COLOR`             | LED active background                                                                                                                                         | 
-| `CONF:LED[1-4]:activetextcolor=COLOR`           | LED active text           | +| `CONF:LED[1-4]:activetextcolor=COLOR`           | LED active text                                                                                                                                               | 
-| `CONF:LED[1-4]:autoflash=[True/False]`          | Autoflash                 | +| `CONF:LED[1-4]:autoflash=[True/False]`          | Autoflash                                                                                                                                                     | 
-| `CONF:LED[1-4]:timedflash=[True/False]`         | 20-second flash           |+| `CONF:LED[1-4]:timedflash=[True/False]`         | 20-second flash                                                                                                                                               |
 | `CONF:Clock:face=FACE`                          | Clock face: `digital`, `analog`, `analog_numbers`, `analog_studio`, `analog_railway`, `analog_24h_smooth`, `analog_24h_ticking` (`analog_24h` aliases smooth) | | `CONF:Clock:face=FACE`                          | Clock face: `digital`, `analog`, `analog_numbers`, `analog_studio`, `analog_railway`, `analog_24h_smooth`, `analog_24h_ticking` (`analog_24h` aliases smooth) |
-| `CONF:Clock:digital=[True/False]`               | Digital / classic analog (legacy) | +| `CONF:Clock:digital=[True/False]`               | Digital / classic analog (legacy)                                                                                                                             | 
-| `CONF:Clock:showseconds=[True/False]`           | Show seconds              | +| `CONF:Clock:showseconds=[True/False]`           | Show seconds                                                                                                                                                  | 
-| `CONF:Clock:secondsinoneline=[True/False]`      | Seconds on one line       | +| `CONF:Clock:secondsinoneline=[True/False]`      | Seconds on one line                                                                                                                                           | 
-| `CONF:Clock:staticcolon=[True/False]`           | Static colon              | +| `CONF:Clock:staticcolon=[True/False]`           | Static colon                                                                                                                                                  | 
-| `CONF:Clock:digitalhourcolor=COLOR`             | Hour color                | +| `CONF:Clock:digitalhourcolor=COLOR`             | Hour color                                                                                                                                                    | 
-| `CONF:Clock:digitalsecondcolor=COLOR`           | Seconds color             | +| `CONF:Clock:digitalsecondcolor=COLOR`           | Seconds color                                                                                                                                                 | 
-| `CONF:Clock:digitaldigitcolor=COLOR`            | Digit color               | +| `CONF:Clock:digitaldigitcolor=COLOR`            | Digit color                                                                                                                                                   | 
-| `CONF:Clock:logopath=PATH`                      | Logo path                 | +| `CONF:Clock:logopath=PATH`                      | Logo path                                                                                                                                                     | 
-| `CONF:Clock:logoupper=[True/False]`             | Logo on top               | +| `CONF:Clock:logoupper=[True/False]`             | Logo on top                                                                                                                                                   | 
-| `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 meters on/off       | +| `CONF:Audio:enabled=[True/False]`               | Audio meters on/off                                                                                                                                           | 
-| `CONF:Audio:source=[device/livewire/aes67]`     | Audio source              | +| `CONF:Audio:source=[device/livewire/aes67]`     | Audio source                                                                                                                                                  | 
-| `CONF:Audio:input_device=DEVICE_NAME`           | Local input device        | +| `CONF:Audio:input_device=DEVICE_NAME`           | Local input device                                                                                                                                            | 
-| `CONF:Audio:livewire_channel=N`                 | Livewire channel          | +| `CONF:Audio:livewire_channel=N`                 | Livewire channel                                                                                                                                              | 
-| `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 display name        | +| `CONF:Audio:aes67_name=NAME`                    | AES67 display name                                                                                                                                            | 
-| `CONF:Audio:aes67_codec=[L16/L24]`              | AES67 codec               | +| `CONF:Audio:aes67_codec=[L16/L24]`              | AES67 codec                                                                                                                                                   | 
-| `CONF:Audio:aes67_rate=48000`                   | AES67 sample rate         | +| `CONF:Audio:aes67_rate=48000`                   | AES67 sample rate                                                                                                                                             | 
-| `CONF:Audio:aes67_channels=2`                   | AES67 channel count       | +| `CONF:Audio:aes67_channels=2`                   | AES67 channel count                                                                                                                                           | 
-| `CONF:Audio:aes67_manual=[True/False]`          | AES67 pasted SDP          | +| `CONF:Audio:aes67_manual=[True/False]`          | AES67 pasted SDP                                                                                                                                              | 
-| `CONF:Audio:unit=[dbfs/dbtp/bbc_ppm]`           | L/R display unit          | +| `CONF:Audio:unit=[dbfs/dbtp/bbc_ppm]`           | L/R display unit                                                                                                                                              | 
-| `CONF:Audio:layout=[lr/lufs/both]`              | Meter layout              | +| `CONF:Audio:layout=[lr/lufs/both]`              | Meter layout                                                                                                                                                  | 
-| `CONF:Audio:display_style=[solid/bargraph]`     | Meter style               | +| `CONF:Audio:display_style=[solid/bargraph]`     | Meter style                                                                                                                                                   | 
-| `CONF:Audio:meter_width=79`                     | Meter width (pixels)      | +| `CONF:Audio:meter_width=79`                     | Meter width (pixels)                                                                                                                                          | 
-| `CONF:Audio:lufs_reference_preset=PRESET`       | LUFS preset               | +| `CONF:Audio:lufs_reference_preset=PRESET`       | LUFS preset                                                                                                                                                   | 
-| `CONF:Audio:lufs_reference=-23.0`               | LUFS target               | +| `CONF:Audio:lufs_reference=-23.0`               | LUFS target                                                                                                                                                   | 
-| `CONF:Audio:peak_hold=[True/False]`             | Peak hold on/off          | +| `CONF:Audio:peak_hold=[True/False]`             | Peak hold on/off                                                                                                                                              | 
-| `CONF:Audio:peak_hold_seconds=1.5`              | Peak hold duration        | +| `CONF:Audio:peak_hold_seconds=1.5`              | Peak hold duration                                                                                                                                            | 
-| `CONF:Audio:tooloud=[True/False]`               | TooLoud on/off            | +| `CONF:Audio:tooloud=[True/False]`               | TooLoud on/off                                                                                                                                                | 
-| `CONF:Audio:tooloudtext=TEXT`                   | TooLoud text              | +| `CONF:Audio:tooloudtext=TEXT`                   | TooLoud text                                                                                                                                                  | 
-| `CONF:Audio:tooloud_threshold_dbtp=-1.0`        | TooLoud threshold         | +| `CONF:Audio:tooloud_threshold_dbtp=-1.0`        | TooLoud threshold                                                                                                                                             | 
-| `CONF:Audio:tooloud_action=[warning/led]`       | TooLoud action            | +| `CONF:Audio:tooloud_action=[warning/led]`       | TooLoud action                                                                                                                                                | 
-| `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 on/off       | +| `CONF:Audio:silence_warn=[True/False]`          | Silence WARN on/off                                                                                                                                           | 
-| `CONF:Audio:silence_on_absent=[True/False]`     | Absent as silence         | +| `CONF:Audio:silence_on_absent=[True/False]`     | Absent as silence                                                                                                                                             | 
-| `CONF:Audio:silence_text=TEXT`                  | Silence WARN text         | +| `CONF:Audio:silence_text=TEXT`                  | Silence WARN text                                                                                                                                             | 
-| `CONF:Audio:silence_threshold_dbfs=-50.0`       | Silence threshold         | +| `CONF:Audio:silence_threshold_dbfs=-50.0`       | Silence threshold                                                                                                                                             | 
-| `CONF:Audio:silence_duration_s=10.0`            | Silence duration (s)      | +| `CONF:Audio:silence_duration_s=10.0`            | Silence duration (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]` | Enable AIR                | +| `CONF:Timers:TimerAIR[1-4]Enabled=[True/False]` | Enable AIR                                                                                                                                                    | 
-| `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 active background     | +| `CONF:Timers:AIR[1-4]activebgcolor=COLOR`       | AIR active background                                                                                                                                         | 
-| `CONF:Timers:AIR[1-4]activetextcolor=COLOR`     | AIR active text           | +| `CONF:Timers:AIR[1-4]activetextcolor=COLOR`     | AIR active text                                                                                                                                               | 
-| `CONF:Timers:AIR[1-4]iconpath=PATH`             | AIR icon path             | +| `CONF:Timers:AIR[1-4]iconpath=PATH`             | AIR icon path                                                                                                                                                 | 
-| `CONF:Timers:TimerAIRMinWidth=PIXELS`           | AIR minimum width         | +| `CONF:Timers:TimerAIRMinWidth=PIXELS`           | AIR minimum width                                                                                                                                             | 
-| `CONF:CONF:APPLY=TRUE`                          | Apply configuration       |+| `CONF:CONF:APPLY=TRUE`                          | Apply configuration                                                                                                                                           |
  
  
Line 1391: Line 1510:
  
 --- ---
 +
 +
  
 ## 8. Presets (Profiles) ## 8. Presets (Profiles)
Line 1411: Line 1532:
  
 --- ---
 +
 +
  
 ## 9. Command-Line Options ## 9. Command-Line Options
Line 1421: Line 1544:
  
  
-| Option              | Values                                          | Description                                              | +| Option             | Values                                          | Description                                          | 
-| ------------------- | ----------------------------------------------- | -------------------------------------------------------- | +| ------------------ | ----------------------------------------------- | ---------------------------------------------------- | 
-| `-l`, `--loglevel`  | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` | Override log level (not saved)                           | +| `-l`, `--loglevel` | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` | Override log level (not saved)                       | 
-| `--start-time`      | ISO-8601 (`datetime.fromisoformat`)             | Set display start time for this run only (not saved)     |+| `--start-time`     | ISO-8601 (`datetime.fromisoformat`)             | Set display start time for this run only (not saved) |
  
  
Line 1430: Line 1553:
  
 --- ---
 +
 +
  
 ## 10. Configuration Storage Location ## 10. Configuration Storage Location
Line 1467: Line 1592:
  
 --- ---
 +
 +
  
 ## 11. Troubleshooting ## 11. Troubleshooting
 +
 +
  
 ### OnAirScreen won't start / port in use ### OnAirScreen won't start / port in use
Line 1474: Line 1603:
 - Check if UDP port 3310 or HTTP port 8010 is already in use - Check if UDP port 3310 or HTTP port 8010 is already in use
 - Change ports in **Network** - Change ports in **Network**
 +
 +
  
 ### Remote control not working ### Remote control not working
Line 1480: Line 1611:
 - Use correct IP address and ports - Use correct IP address and ports
 - Test locally with `curl http://127.0.0.1:8010/api/status` - Test locally with `curl http://127.0.0.1:8010/api/status`
 +
 +
  
 ### GPIO not switching LEDs or timers ### GPIO not switching LEDs or timers
Line 1487: Line 1620:
 - Pi GPIO works on Raspberry Pi only. Other platforms show “not available” on that sub-tab - Pi GPIO works on Raspberry Pi only. Other platforms show “not available” on that sub-tab
 - Check **Settings → GPIO → Raspberry Pi** status - Check **Settings → GPIO → Raspberry Pi** status
-- Status "gpiozero library not available": `sudo apt install python3-gpiozero python3-lgpio python3-rpi-lgpio` (already on the OnAirScreen Pi image) 
 - Use a PC817 module; never feed mixer 5–24 V into Pi pins - Use a PC817 module; never feed mixer 5–24 V into Pi pins
 - Confirm Invert (default on for contacts to GND) and Level vs edge mode - Confirm Invert (default on for contacts to GND) and Level vs edge mode
Line 1500: Line 1632:
 - No packets / LED stays off: confirm the console/device is sending GPIO, the channel or port number, and that OAS is on the Livewire network - No packets / LED stays off: confirm the console/device is sending GPIO, the channel or port number, and that OAS is on the Livewire network
 - Mic already ON at OAS start: OAS requests the current state after join/connect; if the LED stays dark, check that the device answers that read (or toggle the channel once) - Mic already ON at OAS start: OAS requests the current state after join/connect; if the LED stays dark, check that the device answers that read (or toggle the channel once)
 +
 +
  
 ### Companion module shows Disconnected ### Companion module shows Disconnected
Line 1506: Line 1640:
 - Confirm `curl http://<OnAirScreen-IP>:8010/api/status` returns JSON - Confirm `curl http://<OnAirScreen-IP>:8010/api/status` returns JSON
 - After `yarn build`, restart Companion so it reloads the local module - After `yarn build`, restart Companion so it reloads the local module
 +
 +
  
 ### Silence Detection does not trigger ### Silence Detection does not trigger
Line 1513: Line 1649:
 - Lower the dBFS threshold or shorten the duration if the residual noise sits above −50 dBFS - Lower the dBFS threshold or shorten the duration if the residual noise sits above −50 dBFS
 - If the device or stream is missing, enable **Trigger silence warning when Device/Stream is absent** - If the device or stream is missing, enable **Trigger silence warning when Device/Stream is absent**
 +
 +
  
 ### MQTT connection fails ### MQTT connection fails
Line 1519: Line 1657:
 - Are credentials correct? - Are credentials correct?
 - Is `enable MQTT support` enabled and saved with **Apply**? - Is `enable MQTT support` enabled and saved with **Apply**?
 +
 +
  
 ### NTP warning appears permanently ### NTP warning appears permanently
Line 1525: Line 1665:
 - If the time source is Local, synchronize system time or switch the time source to NTP/PTP - If the time source is Local, synchronize system time or switch the time source to NTP/PTP
 - Disable NTP check if not needed - Disable NTP check if not needed
 +
 +
  
 ### Weather widget shows nothing ### Weather widget shows nothing
Line 1531: Line 1673:
 - Search the city name with **Find** next to City ID, or enter the ID by hand - Search the city name with **Find** next to City ID, or enter the ID by hand
 - Run **Test API** in settings - Run **Test API** in settings
 +
 +
  
 ### Livewire meters show no levels ### Livewire meters show no levels
Line 1539: Line 1683:
 - UDP port 5004 allowed? - UDP port 5004 allowed?
 - **No names in Livewire Source:** advertisements are `239.192.255.3:4001` and only run while Settings (desktop or Web UI overlay) is open. You can still type the channel number. - **No names in Livewire Source:** advertisements are `239.192.255.3:4001` and only run while Settings (desktop or Web UI overlay) is open. You can still type the channel number.
 +
 +
  
 ### AES67 meters: no streams or no levels ### AES67 meters: no streams or no levels
Line 1544: Line 1690:
 - **No streams in the combo:** AoIP interface, VLAN, and IGMP; SAP is `239.255.255.255:9875` and `224.2.127.254:9875` and only runs while Settings (desktop or Web UI overlay) is open. If the device does not announce, use **Paste SDP**. - **No streams in the combo:** AoIP interface, VLAN, and IGMP; SAP is `239.255.255.255:9875` and `224.2.127.254:9875` and only runs while Settings (desktop or Web UI overlay) is open. If the device does not announce, use **Paste SDP**.
 - **Stream listed, meter silent:** RTP address/port and codec (L16 vs L24). Dante must be in AES67/SAP mode. No PTP is required for metering. - **Stream listed, meter silent:** RTP address/port and codec (L16 vs L24). Dante must be in AES67/SAP mode. No PTP is required for metering.
 +
 +
  
 ### Reset settings ### Reset settings
Line 1551: Line 1699:
 3. Click **Reset all OnAirScreen settings to default** 3. Click **Reset all OnAirScreen settings to default**
 4. Click **Apply** 4. Click **Apply**
 +
 +
  
 ### Sending logs for support ### Sending logs for support
Line 1563: Line 1713:
  
 --- ---
 +
 +
  
 ## Appendix: Event Logging ## Appendix: Event Logging
  • onairscreen/manual-en.1790360158.txt.gz
  • Last modified: 01.10.2026 17:43
  • (external edit)