====== OnAirScreen 1.1.0 — Release Notes ====== **Release date:** October 2026\\ **Previous baseline:** [[onairscreen:release_notes_1.0.0|1.0.0]] ---- ===== Version 1.1.0 ===== OnAirScreen **1.1.0** is the first feature release after **[[onairscreen:release_notes_1.0.0|1.0.0]]**. What **1.0.0** put on one screen — meters, AoIP, clock faces, mixer GPI, Stream Deck — **1.1.0** carries across the studio: other OnAirScreens on the LAN, Axia GPIO and MIDI, combined logic, and SNMP. Shop builds activate a hardware-bound license and can install the update from the dialog. These are the changes shipped after **1.0.0** (the 1.0.1–1.0.15 updates). If you are already on **1.0.15**, the behaviour is the same; **1.1.0** is the version those changes ship under. ---- ===== Highlights at a Glance ===== ^ Area ^ What's new ^ | **Studio Links** | Replicas (1→n status) and mapped sources (hallway tallies) | | **Livewire GPIO** | Follow console GPO/GPI: multicast, or LWRP over TCP 93 | | **MIDI** | Note and CC from one interface, with Learn | | **GPIO Logic** | AND / OR across Raspberry Pi, Livewire, and MIDI On/Off | | **SNMP** | v2c/v3 agent on port 1161, IANA PEN 66873, optional traps | | **License** | One seat per computer; 14 days full use, then restricted mode | | **Updates** | Download, SHA-256 check, install and restart | | **Clock & weather** | Spanish text clock; photographic weather backgrounds | ---- ===== New Features ===== ==== Studio Links ==== Several OnAirScreens on the LAN can follow each other. Configure under **Settings → Links**. Discovery uses the instance name (multicast ''239.194.0.2'' UDP **3311**). There is no exclusive master: one screen can publish replicas and subscribe to sources at the same time. **Replicas** copy the full runtime status to other screens: LED1–4 (state, caption, autoflash/timedflash), AIR1–4 (state, seconds, top-of-hour / countdown), and NOW / NEXT / WARN. Clock, meters, GPIO wiring, network ports, and the instance name stay local. Set 1→n once on the source. You do not walk to each replica. **Sources** map individual signals for a hallway tally, for example ''Studio-1 / LED1 → LED1'' and ''Studio-2 / LED1 → LED2''. Signals are LED1–4, AIR1–4, NOW, NEXT, WARN, silence, or **Follow all**. Invert applies to boolean signals. **Custom** is extra API commands (semicolon-separated) that run when the source is active. Local target **Custom only** runs those commands without driving a local LED, AIR, or text field. * Enable linking with ''Links/enabled'' (default off). Name discovery for uniqueness always runs * Nearby screens are a dropdown per row. Leave Host empty so the current IP is resolved from the instance name (DHCP-safe). A stored host is only a fallback * A screen may have only **one** full Follow. A second replica add returns HTTP 409. Other mappings are allowed for fields the Follow does not occupy * Status is pushed on change. The HTTP poll is only a slow retry * Offline sources keep the last state. Removing a replica clears Follow on the target and leaves the lamps as they are * Host-local WARN text (quit, reboot, shutdown, NTP) stays on that screen * Apply is rejected while another OnAirScreen on the LAN uses the same instance name The Web UI has the same Nearby list, **Add as replica** / **Use as source**, and Replicas / Sources grids. ==== Axia Livewire GPIO ==== Axia consoles can drive the same LED and AIR actions as Raspberry Pi GPIO. OnAirScreen only **reads** GPIO. It does not write GPI back to the console. Available on all platforms, under **Settings → GPIO → Axia Livewire**. Default off. * **Multicast** (default): CMsg2 on ''239.192.255.4''. The mapping column is the Livewire **audio channel**. Pick the same AoIP interface as the Livewire meters (empty = system route). OAS joins UDP 2055 and 2060 and asks for the current pin state, so a microphone that is already ON at start lights the LED * **LWRP (TCP)**: connect to a device (xNode, iPort, console) at **IP:93**. The mapping column is the GPIO **port** on that device, not an audio channel. Optional ''LOGIN'' password. OAS sends ''ADD GPI'' / ''ADD GPO'', queries each watched port, and reconnects if the socket drops Up to eight rows. Each row maps one or more of LED1–4, AIR1–4, AIR3/AIR4 Reset, plus semicolon-separated custom commands. Direction is GPO (from the console) or GPI. Modes: level, rising, falling, or both. Factory rows (master enable stays off): channel/port 1 GPO pin 1 → LED1, channel/port 2 GPO pin 1 → AIR3. A row with no action stays without an action, so the input can feed a Logic rule without also sending the default LED or AIR command. The same multi-action mapping is on Raspberry Pi GPIO. ==== MIDI ==== **Settings → GPIO → MIDI** reads one input and maps Note or CC messages to LEDs and AIR timers. **Learn** waits up to 10 seconds and fills channel, type, and number. Clock, Active Sensing, and SysEx are ignored. Default off. * Behaviours: **On/Off** (held level), **Oneshot** (one command per press), **Toggle** * CC is active at or above the threshold (default 64) * Invert swaps a held On/Off level. An inverted Oneshot sends OFF instead of ON * Enabled rows flash in Settings when a matching Note or CC arrives * Unnamed On/Off rows appear in Logic as MIDI1–MIDI8 * A howto for the RØDECaster Pro II mute / SMART pad is on the wiki: [[onairscreen:rodecaster-pro-ii-led-en|ON AIR LED from a RØDECaster Pro II]] **Only On/Off rows appear in Logic.** Oneshot and Toggle do not hold a level, so they stay out of the Logic input menu. ==== GPIO Logic ==== **Settings → GPIO → Logic** combines Raspberry Pi, Livewire, and MIDI On/Off inputs. Eight rules. Each rule has one operator, one or more inputs, and one or more outputs. A command is sent only when the combined level changes. ^ 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 two microphone inputs ''MIC1'' and ''MIC2''. An OR rule with those inputs and outputs LED1 and AIR1 stays on while either microphone is open, and turns both off only when both are closed. Disabled, missing, or not-yet-seen inputs count as off. Resets and custom commands fire when the rule becomes true, not when it becomes false. Direct row actions 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. Settings reopen the last GPIO sub-tab (Raspberry Pi, Axia Livewire, MIDI, or Logic). ==== SNMP ==== An SNMPv2c/v3 agent for the same status an NMS already walks elsewhere. Enable under **Settings → Network** (default off). Listen port **1161** so the app does not need privileges for UDP 161. MIB: [[onairscreen:mib-en|onairscreen:mib-en]], enterprise OID ''.1.3.6.1.4.1.66873'' (IANA PEN 66873). * **GET / WALK / SET** for LEDs, AIR timers, NOW / NEXT / WARN, silence, and loudness, plus version and instance. SET matches OSC: LED ''0/1/2'' = OFF/ON/TOGGLE, AIR ''0/1/2/3'' = OFF/ON/TOGGLE/RESET, or a raw command * v2c read community defaults to ''public''. An empty write community makes v2c read-only * v3 is USM with SHA-256 and AES-128. Empty user disables v3. noAuthNoPriv is for testing only * Optional traps: silence, WARN text change, LED change ==== License and In-App Updates ==== Shop builds must be activated. One license covers **one PC or one Raspberry Pi**. Self-built source checkouts are not activated this way. * Copy the **License Key** from the [[https://customer.astrastudio.de/|customer portal]] and **Activate** online, or copy the **Hardware ID**, download a license file, and **Import license file**. The Web UI can import a file from disk * A successful activation or import turns **Check for updates** on and saves it. The key is saved without pressing Apply * After one year, renew the activation. The Updates tab says whether this computer can renew online, or must import a new file when the license server is not reachable. The license key stays the same. You do not buy a new key * **Return license** frees the seat. Redeem the return code in the portal, or it is redeemed when this computer is online. A freed seat deactivates that computer on the next check * Without a license, OnAirScreen runs fully for **14 days**. After that, and when a license has expired: no fullscreen, no GPIO, no audio meters, settings are not saved, the window is limited to 1280×800, and the app closes after 15 minutes * The key is checked at startup and every 24 hours, even when update notices are off. A rejected key removes the local license at once. A missing network connection does not * A new version is reported only when **Check for updates** is on **Install and restart** (paid installs): OnAirScreen downloads the package, checks the SHA-256 sum, quits, and lets the system installer finish. Windows shows the MSI. macOS replaces the app folder, so a Finder label on the old app does not stay behind. Linux and Raspberry Pi install the ''.deb'' or ''.rpm'', including an SD-card image, and show a window while apt or dnf is running. The update dialog stays open, shows **Update Available**, a progress bar, and how much of the package has been downloaded, then closes on its own after 20 seconds if you do not install. A source checkout only offers the download. macOS shop builds are signed with an Apple Developer ID and notarized. Gatekeeper no longer blocks the first launch. The Raspberry Pi SD-card image allows passwordless host reboot and shutdown from OnAirScreen. ==== Clock, Weather, and the Main Screen ==== * **Spanish** text clock, for example "Son las 4 menos cuarto". Languages are English, German, Dutch, French, and Spanish (''Formatting/textClockLanguage'') * The English text clock says "a quarter to 1" at 00:45 and 12:45 * Weather widget backgrounds are a photographic set for OpenWeatherMap icons 01d–50n. Labels stay readable on bright photos. The widget shows the searched city, stays on the AIR LED column width, and keeps that city when switching °C / °F / K. On a narrow display the temperature scales down instead of being clipped * **Hotkeys** overlay (''H'', or right-click / long-press → **Hotkeys**). Close with ''H'', ''Esc'', or a click outside. Other hotkeys are blocked while it is open * Right-click menu shows the current version * **Reboot** and **Shutdown** in Settings → About and the Web UI, with confirmation. HTTP ''CMD:REBOOT'' / ''CMD:SHUTDOWN'' require the Web Settings PIN when one is set * ''FULLSCREEN:ON'' / ''OFF'' / ''TOGGLE'' switches the main window from the Web UI and the API * GPIO and Links custom commands use the same pencil editor. The icon is highlighted when a command is set * The application log starts with a Starting OnAirScreen line (version and distribution) ==== Network Interfaces and PTP ==== PTP, AoIP, and Livewire GPIO remember the **interface name**. A new IPv4 address on that interface is used automatically. A former address is not listed as unavailable. On Linux and Raspberry Pi, PTP binds UDP 319/320 through a small helper so the app can run as a desktop user. If the ports are in use or permission is denied, OnAirScreen retries, logs the cause, and the lock LED and WARN show ''PTP ERROR'' until the bind succeeds. A listen port that is already in use (HTTP, WebSocket, UDP, OSC, SNMP) is reported in a dialog. The Network warning names the ports that could not be opened. ---- ===== Bug Fixes ===== ^ Issue ^ Fix ^ | English text clock said "a quarter to 13" at 00:45 and 12:45 | Says "a quarter to 1" | | Weather temperature clipped on a narrow display | Temperature scales down | | Weather widget pushed the clock or showed the station name | Stays on the AIR column; shows the searched city; °C / °F / K keeps that city | | Weather labels unreadable on bright photos | Soft shadow and overlay | | PTP, AoIP, or Livewire kept a former address | The interface name is stored; the current IPv4 is used | | Linux PTP could not bind 319/320 as a desktop user | A helper receives the socket; the log says whether the helper is missing or failed | | A listen port already in use only left a traceback | A dialog names the ports. On macOS the Network warning is no longer an empty window | | SNMP GET for NOW/NEXT/WARN read an empty cache | GET reads the live screen | | SNMP logged an asyncio error on quit | The agent stops cleanly | | Timer dialog rejected ''2:10'' | Accepts ''2:10'', ''2,10'', and ''2.10'', and selects the existing value when opened with Enter | | GPIO row fields stayed active when the row was off | Desktop and Web Settings disable the row unless that input is enabled. Custom command stays disabled unless Action is Custom | | A GPI with no action still sent the default LED or AIR command | An empty action stays empty, so the input can feed Logic only | | Closing the main window while Settings was open left the app running | The app exits | | Web UI Instance Name accepted more than 32 characters | Capped at 32, same as the desktop field | | HTTP stalled for seconds on bind or request logging | No reverse DNS | | Link replicas copied quit, reboot, shutdown, and NTP warnings | Host-local WARN stays on that screen | | Link replicas waited on a 400 ms poll | Runtime status is pushed on change. A stored host is only a fallback if discovery misses the instance name | | Apply accepted an instance name already used on the LAN | Settings and the Web UI reject the collision | | Links layout shoved fields or showed Studio-1 / Studio-2 as the empty placeholder | Nearby dropdowns, wrapping hints, no blank gap, no horizontal scrollbar. Add as replica / Use as source fills the next empty row | | Changing the LUFS reference preset in the Web UI left the old value | The reference value follows the preset | | Web Settings Updates tab rendered empty | The license panel stays when switching tabs | | Returning a license left the computer activated | The next check removes the local license and switches to restricted mode. An invalid key does the same at startup | | After a new activation the window size was wrong | The window keeps the last size that fit the screen | | Update dialog on macOS dropped its buttons or crashed | Download, Install, and Close stay. The dialog no longer crashes when a newer version is available | | Update dialog closed as soon as Install was clicked | It stays open and shows download progress, then OnAirScreen quits so the installer can replace the app | | Windows installer never started | The MSI is launched after the download. The helper is no longer started without a console | | macOS update left the old app folder | The downloaded DMG replaces the app folder | | Web Settings PIN prompt did not take the cursor | The PIN field is focused when the prompt appears | | The empty "no other OnAirScreens" line was unreadable in dark mode | The line stays readable | ---- ===== Under the Hood ===== * Hardware ID is an application-specific keyed hash. Computers activated with the **1.0.8 beta** must be activated again. Activations from **1.0.9** onward stay valid * Web Settings groups GPIO inputs, Logic rules, AIR timers, LEDs, and Audio Meter blocks (Input, Meters, LUFS, Peak Hold, Too Loud, Silence) so the fields that belong together sit in one band. Station, Clock, MQTT, OSC, and SNMP are grouped the same way * The settings chapter in the English and German manuals follows the Settings tab order * Set ''OAS_FORCE_UPDATE'' to offer the newest package again when that version is already installed * ''python-osc'' requirement from 1.0.0 is unchanged (>= 1.10.2) ---- ===== Upgrade Notes ===== * **Settings are preserved.** New features stay off until you enable them: Links, Livewire GPIO, MIDI, Logic rules, SNMP * **Shop builds need a license.** One license covers one PC or one Raspberry Pi. After a year, renew the activation. The license key stays the same; you do not buy a new key. Full use for 14 days without a license, then restricted mode. Activate online or import a license file. Return the license in the app before you move it to another computer * If this computer was activated on the **1.0.8 beta**, activate it again. The hardware ID changed in 1.0.9 * A paid install can use **Install and restart** in the update dialog. Check for updates must be on before a new version is reported. Activation turns that option on * **SNMP** listens on UDP **1161**, not 161. v2c is read-only until you set a write community. Download the MIB from [[onairscreen:mib-en|the wiki]] * **Links** resolve peers by instance name. Rename a screen before you link it if another OnAirScreen already uses that name * **Livewire GPIO** multicast needs the AoIP / Livewire VLAN and IGMP, same as the audio meters. LWRP needs the device reachable on TCP 93 * **Reboot and Shutdown** from the app need a confirmation. On the Raspberry Pi image they do not ask for a system password * macOS: the shop build is signed and notarized. An in-app update replaces the app folder * Manuals: [[onairscreen:manual-en|User Manual (English)]] · [[onairscreen:manual-de|Bedienungsanleitung (Deutsch)]] ---- ===== Thank You ===== OnAirScreen 1.1.0 is for the studios that put 1.0.0 on air and then asked for the next room: another screen in the hallway, the console's own lamp, a MIDI pad, and an update that installs itself. **Happy broadcasting!** — Sascha Ludwig / [[https://www.astrastudio.de/|astrastudio.de]] ---- //OnAirScreen is source-available under OASL 1.0. Official builds are in the [[https://www.astrastudio.de/shop/|shop]]. Support the project via a shop license, [[https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=YCQKC82DLCHMG|PayPal]], [[https://www.buymeacoffee.com/saschaludwig|Buy Me a Coffee]], or [[https://ko-fi.com/L3L8BKHYT|Ko-fi]].//