Summary
Serial (RS-232C / USB virtual COM) control spec for the Neothings NeoPro 2RU HD audio/video matrix switch family, marketed as the "2nd Generation Universal" platform. Covers audio/video routing across separate signal levels (HD video, digital audio, analog audio, composite video), per-zone volume/bass/treble, muting, 16-slot memory store/recall/edit, setup controls, and two-way query commands. Commands are ASCII wrapped in square brackets; no carriage return required (closing bracket triggers processing).
Transport
protocols:
- serial
serial:
baud_rate: 115200 # source: "115.2k baud"
data_bits: 8
parity: none
stop_bits: 1
flow_control: none
auth:
type: none # inferred: no auth/login procedure described anywhere in source
Traits
traits:
- powerable # inferred: [P,1] / [P,0] power commands documented
- routable # inferred: per-level input->output switching commands documented
- queryable # inferred: [?...] query commands return device state
- levelable # inferred: volume/bass/treble level set commands documented
Actions
# Model-letter prefix `m`: first letter of the specific model name. Per source
# Model reference table (e.g. A=Avalon, B=Borrego+, C=Concord+, D=Delano,
# E=Eureka+, F=Fallbrook, G=Gillespie+, H=Hawthorne, I=Imperial, J=Juneau,
# K=Kingman+, L=Lindbergh+, O=Ontario, Q=Quincy+, R=Riverside+). All commands
# are wrapped in square brackets [ ]; closing bracket triggers processing.
# Numbers are 1 or 2 digits (leading zeros not required). Case insensitive.
# --- Power ---
- id: power_on
label: Power On
kind: action
command: "[P,1]"
params: []
- id: power_off
label: Power Off
kind: action
command: "[P,0]"
params: []
# --- Switching (per Command Type / Mode) ---
# Structure: [mc,i,o,t]. c = Command Type; i = input (0 = disable output zone);
# o = output (0 = all zones / Party Mode); t = transition time seconds (optional).
- id: switch_all_av
label: Switch All A/V Signals
kind: action
command: "[{m}X,{input},{output},{time}]"
params:
- { name: m, type: string, description: "First letter of model name (see Model reference)" }
- { name: input, type: integer, description: "Input number (0 = disable selected output zone)" }
- { name: output, type: integer, description: "Output number (0 = all zones / Party Mode)" }
- { name: time, type: integer, description: "Optional transition time in seconds", optional: true }
- id: switch_hd_video
label: Switch HD Video (YPbPr)
kind: action
command: "[{m}V,{input},{output},{time}]"
params:
- { name: m, type: string, description: "First letter of model name" }
- { name: input, type: integer, description: "Input number (0 = disable output zone)" }
- { name: output, type: integer, description: "Output number (0 = all zones)" }
- { name: time, type: integer, description: "Optional transition time in seconds", optional: true }
- id: switch_digital_audio
label: Switch Digital Audio (SPDIF)
kind: action
command: "[{m}D,{input},{output},{time}]"
params:
- { name: m, type: string, description: "First letter of model name" }
- { name: input, type: integer, description: "Input number (0 = disable output zone)" }
- { name: output, type: integer, description: "Output number (0 = all zones)" }
- { name: time, type: integer, description: "Optional transition time in seconds", optional: true }
- id: switch_analog_audio
label: Switch Analog Audio (L/R)
kind: action
command: "[{m}A,{input},{output},{time}]"
params:
- { name: m, type: string, description: "First letter of model name" }
- { name: input, type: integer, description: "Input number (0 = disable output zone)" }
- { name: output, type: integer, description: "Output number (0 = all zones)" }
- { name: time, type: integer, description: "Optional transition time in seconds", optional: true }
- id: switch_composite_video
label: Switch Composite Video
kind: action
command: "[{m}C,{input},{output},{time}]"
params:
- { name: m, type: string, description: "First letter of model name" }
- { name: input, type: integer, description: "Input number (0 = disable output zone)" }
- { name: output, type: integer, description: "Output number (0 = all zones)" }
- { name: time, type: integer, description: "Optional transition time in seconds", optional: true }
# --- Level set (Volume / Bass / Treble) ---
# For L/B/T: i = value 0-99 (flat = 50). Time param ignored for B & T.
- id: set_volume_level
label: Set Volume Level
kind: action
command: "[{m}L,{level},{output},{time}]"
params:
- { name: m, type: string, description: "First letter of model name" }
- { name: level, type: integer, description: "Volume level 0-99" }
- { name: output, type: integer, description: "Output number (0 = all zones)" }
- { name: time, type: integer, description: "Optional transition time in seconds (smooth fade)", optional: true }
- id: set_bass_level
label: Set Bass Level
kind: action
command: "[{m}B,{level},{output}]"
params:
- { name: m, type: string, description: "First letter of model name" }
- { name: level, type: integer, description: "Bass level 0-99 (50 = flat; >50 boost, <50 attenuate)" }
- { name: output, type: integer, description: "Output number (0 = all zones)" }
- id: set_treble_level
label: Set Treble Level
kind: action
command: "[{m}T,{level},{output}]"
params:
- { name: m, type: string, description: "First letter of model name" }
- { name: level, type: integer, description: "Treble level 0-99 (50 = flat; >50 boost, <50 attenuate)" }
- { name: output, type: integer, description: "Output number (0 = all zones)" }
# --- Volume functions (affect analog audio only) ---
# Structure: [mL,f,n]. f = function mnemonic; n = output number.
- id: absolute_mute
label: Absolute Mute
kind: action
command: "[{m}LM0,{output}]"
params:
- { name: m, type: string, description: "First letter of model name" }
- { name: output, type: integer, description: "Output number (0 = all zones)" }
notes: "Mutes output to volume level 0. Toggle - same command un-mutes. Any volume change also un-mutes."
- id: partial_mute
label: Partial Mute
kind: action
command: "[{m}LMP,{output}]"
params:
- { name: m, type: string, description: "First letter of model name" }
- { name: output, type: integer, description: "Output number (0 = all zones)" }
notes: "Mutes output to 10% of current volume. Toggle - same command un-mutes."
- id: volume_up
label: Volume Up
kind: action
command: "[{m}LU,{output}]"
params:
- { name: m, type: string, description: "First letter of model name" }
- { name: output, type: integer, description: "Output number (0 = all zones)" }
notes: "Increase volume by one step."
- id: volume_down
label: Volume Down
kind: action
command: "[{m}LD,{output}]"
params:
- { name: m, type: string, description: "First letter of model name" }
- { name: output, type: integer, description: "Output number (0 = all zones)" }
notes: "Decrease volume by one step."
# --- Memory (16 locations) ---
# Structure: [M,x,n]. x = function; n = 1-16.
- id: memory_store
label: Memory Store
kind: action
command: "[M,S,{slot}]"
params:
- { name: slot, type: integer, description: "Memory location 1-16" }
notes: "Stores current volume/bass/treble and all input-output combinations."
- id: memory_recall
label: Memory Recall
kind: action
command: "[M,R,{slot}]"
params:
- { name: slot, type: integer, description: "Memory location 1-16" }
- id: memory_view
label: Memory View
kind: query
command: "[M,V,{slot}]"
params:
- { name: slot, type: integer, description: "Memory location 1-16" }
notes: "View memory slot contents via serial."
- id: memory_clear
label: Memory Clear
kind: action
command: "[M,C,{slot}]"
params:
- { name: slot, type: integer, description: "Memory location 1-16" }
- id: memory_edit
label: Memory Edit
kind: action
command: "[M,E,{slot}]"
params:
- { name: slot, type: integer, description: "Memory location 1-16" }
notes: "Invoke memory edit; follow with a group command {[...]} containing switch/volume/tone commands to store (not executed)."
# --- Setup (parameterized by enum value) ---
# Structure: [S,x,n].
- id: set_led
label: Set Front Panel LED
kind: action
command: "[S,L,{state}]"
params:
- { name: state, type: "integer[0,1]", description: "0 = OFF, 1 = ON" }
- id: set_ir_control
label: Set IR Control
kind: action
command: "[S,R,{state}]"
params:
- { name: state, type: "integer[0,1]", description: "0 = IR OFF, 1 = IR ON" }
- id: set_front_panel_buttons
label: Set Front Panel Buttons
kind: action
command: "[S,B,{state}]"
params:
- { name: state, type: "integer[0,1]", description: "0 = OFF, 1 = ON" }
- id: set_verbosity
label: Set Verbosity
kind: action
command: "[S,V,{state}]"
params:
- { name: state, type: "integer[0,1]", description: "0 = OFF (serial-only echo), 1 = ON (echo all)" }
notes: "Default ON. Memory and mute commands always echo serial responses regardless of this setting."
- id: set_display_brightness
label: Set Display Brightness
kind: action
command: "[S,D,{percent}]"
params:
- { name: percent, type: "integer[25,50,75,100]", description: "Brightness percent (25/50/75/100)" }
- id: set_front_panel_sensitivity
label: Set Front Panel Sensitivity
kind: action
command: "[S,S,{level}]"
params:
- { name: level, type: "string[L,M,H]", description: "L = LOW, M = MEDIUM, H = HIGH" }
- id: set_power_up_mode
label: Set Power-Up Mode
kind: action
command: "[S,A,{mode}]"
params:
- { name: mode, type: "integer[0,1]", description: "0 = STANDBY on power up, 1 = ON on power up" }
# --- Queries ([?...]) ---
- id: query_firmware_version
label: Query Firmware Version
kind: query
command: "[?V]"
params: []
- id: query_power_status
label: Query Power Status
kind: query
command: "[?P]"
params: []
- id: query_setup_values
label: Query Setup Values
kind: query
command: "[?S]"
params: []
- id: query_all_matrix_state
label: Query All Matrix State
kind: query
command: "[?{m}]"
params:
- { name: m, type: string, description: "First letter of model name" }
- id: query_hd_video_matrix
label: Query HD Video (YPbPr) Matrix State
kind: query
command: "[?{m}V]"
params:
- { name: m, type: string, description: "First letter of model name" }
- id: query_digital_audio_matrix
label: Query Digital Audio Matrix State
kind: query
command: "[?{m}D]"
params:
- { name: m, type: string, description: "First letter of model name" }
- id: query_analog_audio_matrix
label: Query Analog Audio Matrix State
kind: query
command: "[?{m}A]"
params:
- { name: m, type: string, description: "First letter of model name" }
- id: query_composite_video_matrix
label: Query Composite Video Matrix State
kind: query
command: "[?{m}C]"
params:
- { name: m, type: string, description: "First letter of model name" }
- id: query_volume_levels
label: Query Audio Volume Levels
kind: query
command: "[?{m}L]"
params:
- { name: m, type: string, description: "First letter of model name" }
- id: query_bass_levels
label: Query Bass Levels
kind: query
command: "[?{m}B]"
params:
- { name: m, type: string, description: "First letter of model name" }
- id: query_treble_levels
label: Query Treble Levels
kind: query
command: "[?{m}T]"
params:
- { name: m, type: string, description: "First letter of model name" }
Feedbacks
# Valid-command response: the matrix returns a status echo in curly brackets { }
# reflecting current state pertaining to the command. Format/contents vary by
# command type and model. Responses can be re-sent as commands or used as
# memory-edit input.
- id: command_status_response
type: string
description: "Status echo wrapped in { } returned for each valid command; one response per command inside a group."
- id: error_response
type: enum
values: ["E"]
description: "Echoed bad command plus [E] for invalid parameters / syntax errors."
# UNRESOLVED: exact response string formats per command type not enumerated in
# the refined source (source states contents 'depend on the type of command
# and the model'). Need full CURRENT_CAT5_Int_Guide response tables to populate
# per-command feedback schemas.
Variables
# Discrete settable parameters already enumerated as Actions (volume/bass/treble
# level, setup values). No additional continuous variables documented.
# UNRESOLVED: none additional identified in source.
Events
# No unsolicited notifications documented. The matrix only echoes in response
# to commands (serial does not echo sent characters except on error).
# UNRESOLVED: none - source describes no push/event mechanism.
Macros
# Group command: wrap multiple commands in curly brackets to receive a single
# consolidated response (one response per command type inside the group).
# Also used for memory-edit payload input.
- id: group_command
label: Group Command
kind: macro
command: "{[{cmd1}][{cmd2}][{cmd3}]}"
params:
- { name: cmds, type: string, description: "One or more bracketed commands to batch" }
notes: "Up to 32 commands may be sent without inter-command delay. For >32 commands wait 500 ms before sending."
# Documented paging example macro (verbatim from source):
- id: paging_macro
label: Paging Sequence (documented example)
kind: macro
steps:
- "[M,S,1]" # save current config to memory slot 1
- "{[BA,1,0][BL,99,0]}" # route input 1 to all zones, set all volumes to 99
- "[M,R,1]" # restore saved config
notes: "Model letter shown as B (Borrego+) in source example; substitute target model's first letter."
Safety
confirmation_required_for: []
interlocks:
- id: standby_mode_interlock
description: >
In Standby Mode all outputs are virtually disconnected and volumes set to 0.
Commands from the serial port still execute but are NOT saved - on power-up
the switch reloads the most recent pre-standby state and volume levels.
One-way commands may be sent regardless of matrix state (including Standby).
affects: [all_actions]
- id: ac_input_connect_last
description: "AC 90-240 VAC (50-60 Hz) via IEC320 inlet must be connected LAST, after all I/O cables."
# UNRESOLVED: no formal confirmation-required list or interlock sequence
# beyond the standby note documented in source.
Notes
- Baud is 115200, not 9600. Source explicitly: "115.2k baud, no parity, 8 data, 1 stop. No hardware flow control."
- Serial wired DCE — connect to computer/control system with a straight-through cable (not null-modem). Same cable ships with the switch.
- USB presents as virtual COM port with identical serial settings (115.2k 8N1, no flow). Driver software required.
- No carriage return required — closing
]triggers command processing. Characters outside[ ]are discarded. - Case insensitive — upper/lowercase have identical effect.
- Spaces forbidden inside brackets — they generate
[E]. - Numbers 1 or 2 digits, leading zeros not required.
- Command delay: none required for up to 32 commands; wait 500 ms before sending >32.
- Verbosity default ON — echoes responses to all commands (serial/IR/front panel). OFF restricts echo to serial only. Memory + mute commands always echo serial responses regardless of setting.
- Model-letter prefix is mandatory on all switching/level/volume commands and on the model-scoped queries. See Model reference table in source for the full letter map (A/B/C/D/E/F/G/H/I/J/K/L/O/Q/R for the 15 listed models).
- Legacy protocol: some models support legacy serial codes; legacy manual lives at neoprointegrator.com (now only via Wayback). Not necessary unless replacing an identical model name/config.
- Audio transition time (
tparam) smooths volume changes to minimize "pop". For switching commands it fades volume down, switches, fades back up. For V/D/C commands no fade — delays half the time param then switches. B/T commands ignore the time param entirely.
Provenance
source_domains:
- neoprointegrator.us
source_urls:
- https://neoprointegrator.us/wp-content/uploads/2024/01/DOC42-00027-C-Integrators-Guide.pdf
- https://neoprointegrator.us/support/
retrieved_at: 2026-06-14T18:29:52.397Z
last_checked_at: 2026-06-14T19:39:43.782Z
Verification Summary
verdict: verified
checked_at: 2026-06-14T19:39:43.782Z
matched_actions: 37
action_count: 37
confidence: medium
summary: "All 37 spec actions verified against source with literal command matches; transport parameters fully supported. (13 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "exact \"2nd Generation Universal\" model-name string not found verbatim in the refined source; source is the CURRENT_CAT5_Int_Guide covering the NeoPro 2RU family (Avalon, Borrego+, Concord+, Delano, Eureka+, Fallbrook, Gillespie+, Hawthorne, Imperial, Juneau, Kingman+, Lindbergh+, Ontario, Quincy+, Riverside+). Model-name match needs verification against the original PDF."
- "TCP/IP / network control not documented in this source; only serial/USB-COM"
- "firmware version compatibility range not stated"
- "power/voltage/current specs not extracted (power-relevant rows: AC 90–240 VAC, 50–60 Hz, IEC320) — out of protocol scope"
- "exact response string formats per command type not enumerated in"
- "none additional identified in source."
- "none - source describes no push/event mechanism."
- "no formal confirmation-required list or interlock sequence"
- "exact per-command response string formats (source says contents depend on command type + model) — need full CURRENT_CAT5_Int_Guide response tables"
- "model-name match — \"2nd Generation Universal\" string not found verbatim in refined source; the refined doc covers the NeoPro 2RU family. Verify against the original PDF (CURRENT_CAT5_Int_Guide.pdf via Wayback) that it governs the target device"
- "max input/output counts per model variant — switching params validated only against the specific model's matrix size"
- "TCP/IP / network transport — not described in this source (serial + USB-COM only)"
- "firmware version compatibility range"
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0