Summary

Sennheiser EW-DX EM 2 / EM 2 Dante / EM 4 Dante rack receivers, controlled via Sennheiser Sound Control (SSC) — an OSC-derived protocol using JSON message encoding over UDP/IP. Covers device identity, network configuration, RF channel management (1–4 receiver channels depending on model), audio output levels, metering, transmitter mate telemetry, and subscriptions.

Transport

protocols:
  - udp
  - osc
# SSC = OSC-derived JSON-encoded messages carried in UDP/IP datagrams.
# EW-DX server supports UDP/IP only (no TCP). IPv4 only.
addressing:
  port: 45
  # default UDP port per source; SHOULD be discovered via DNS-SD (_ssc._udp)
discovery:
  type: dns_sd
  service_type: _ssc._udp
auth:
  type: none  # inferred: no auth procedure described in source

Traits

# - levelable   # inferred from gain/frequency/level settable numeric ranges
# - queryable   # inferred from null-argument getter pattern documented throughout
# - muteable    # inferred from rx/mute commands per channel

Actions

# Each action = one documented SSC method address. SSC uses JSON object form
# with property path matching the OSC address. Getter = null argument.
# Dante-exclusive methods apply to EW-DX EM 2 Dante and EW-DX EM 4 Dante only.
# EM 4 Dante-exclusive methods (rx3/rx4, booster) apply to EW-DX EM 4 Dante only.

# ---- /device ----
- id: device_identification_visual
  label: Device Identification Visual
  kind: action
  command: '{"device":{"identification":{"visual":{value}}}}'
  params:
    - name: value
      type: boolean
      description: "true=start, false=stop, null=read status"

- id: device_identity_version
  label: Device Product Version
  kind: query
  command: '{"device":{"identity":{"version":null}}}'
  params: []

- id: device_identity_vendor
  label: Device Vendor
  kind: query
  command: '{"device":{"identity":{"vendor":null}}}'
  params: []

- id: device_identity_serial
  label: Device Serial
  kind: query
  command: '{"device":{"identity":{"serial":null}}}'
  params: []
  notes: "Source: not yet implemented."

- id: device_identity_product
  label: Device Product Label
  kind: query
  command: '{"device":{"identity":{"product":null}}}'
  params: []

- id: device_network_dante_identity_version
  label: Dante SW Version
  kind: query
  command: '{"device":{"network":{"dante":{"identity":{"version":null}}}}}'
  params: []
  notes: "EW-DX EM 2 Dante and EW-DX EM 4 Dante exclusive."

- id: device_network_dante_ipv4_netmask
  label: Dante IPv4 Netmask
  kind: query
  command: '{"device":{"network":{"dante":{"ipv4":{"netmask":null}}}}}'
  params: []
  notes: "Dante exclusive. Array [primary, secondary]."

- id: device_network_dante_ipv4_manual_netmask
  label: Dante Manual IPv4 Netmask
  kind: action
  command: '{"device":{"network":{"dante":{"ipv4":{"manual_netmask":{value}}}}}}'
  params:
    - name: value
      type: array
      description: "Array of strings e.g. [\"255.255.255.0\",\"255.255.255.0\"]"
  notes: "Dante exclusive."

- id: device_network_dante_ipv4_manual_ipaddr
  label: Dante Manual IPv4 Address
  kind: action
  command: '{"device":{"network":{"dante":{"ipv4":{"manual_ipaddr":{value}}}}}}'
  params:
    - name: value
      type: array
      description: "Array of strings e.g. [\"192.168.1.10\",\"192.168.2.10\"]"
  notes: "Dante exclusive."

- id: device_network_dante_ipv4_manual_gateway
  label: Dante Manual IPv4 Gateway
  kind: action
  command: '{"device":{"network":{"dante":{"ipv4":{"manual_gateway":{value}}}}}}'
  params:
    - name: value
      type: array
      description: "Array of strings e.g. [\"192.168.1.1\",\"192.168.2.1\"]"
  notes: "Dante exclusive."

- id: device_network_dante_ipv4_ipaddr
  label: Dante IPv4 Address
  kind: query
  command: '{"device":{"network":{"dante":{"ipv4":{"ipaddr":null}}}}}'
  params: []
  notes: "Dante exclusive."

- id: device_network_dante_ipv4_gateway
  label: Dante IPv4 Gateway
  kind: query
  command: '{"device":{"network":{"dante":{"ipv4":{"gateway":null}}}}}'
  params: []
  notes: "Dante exclusive."

- id: device_network_dante_ipv4_auto
  label: Dante Auto-IP/DHCP
  kind: action
  command: '{"device":{"network":{"dante":{"ipv4":{"auto":{value}}}}}}'
  params:
    - name: value
      type: array
      description: "Booleans [primary, secondary]; true=Auto-IP/DHCP, false=Manual"
  notes: "Dante exclusive."

- id: device_network_dante_macs
  label: Dante MAC Addresses
  kind: query
  command: '{"device":{"network":{"dante":{"macs":null}}}}'
  params: []
  notes: "Dante exclusive."

- id: device_network_dante_interfaces
  label: Dante Interface Names
  kind: query
  command: '{"device":{"network":{"dante":{"interfaces":null}}}}'
  params: []
  notes: "Dante exclusive."

- id: device_network_dante_interface_mapping
  label: Dante Interface Mapping
  kind: action
  command: '{"device":{"network":{"dante":{"interface_mapping":{value}}}}}'
  params:
    - name: value
      type: string
      description: "One of SINGLE_CABLE, SPLIT1, SPLIT2, SPLIT, AUDIO_REDUNDANCY"
  notes: "Dante exclusive."

- id: device_network_ether_macs
  label: Ethernet MAC Addresses
  kind: query
  command: '{"device":{"network":{"ether":{"macs":null}}}}'
  params: []

- id: device_network_ether_interfaces
  label: Ethernet Interfaces
  kind: query
  command: '{"device":{"network":{"ether":{"interfaces":null}}}}'
  params: []

- id: device_network_ipv4_manual_netmask
  label: Manual IPv4 Netmask
  kind: action
  command: '{"device":{"network":{"ipv4":{"manual_netmask":{value}}}}}'
  params:
    - name: value
      type: string
      description: "e.g. \"255.255.255.0\""

- id: device_network_ipv4_manual_ipaddr
  label: Manual IPv4 Address
  kind: action
  command: '{"device":{"network":{"ipv4":{"manual_ipaddr":{value}}}}}'
  params:
    - name: value
      type: string
      description: "e.g. \"192.168.1.203\""

- id: device_network_ipv4_manual_gateway
  label: Manual IPv4 Gateway
  kind: action
  command: '{"device":{"network":{"ipv4":{"manual_gateway":{value}}}}}'
  params:
    - name: value
      type: string
      description: "e.g. \"192.168.1.1\""

- id: device_network_ipv4_netmask
  label: Online IPv4 Netmask
  kind: query
  command: '{"device":{"network":{"ipv4":{"netmask":null}}}}'
  params: []

- id: device_network_ipv4_ipaddr
  label: Online IPv4 Address
  kind: query
  command: '{"device":{"network":{"ipv4":{"ipaddr":null}}}}'
  params: []

- id: device_network_ipv4_interfaces
  label: IPv4 Interface Indices
  kind: query
  command: '{"device":{"network":{"ipv4":{"interfaces":null}}}}'
  params: []

- id: device_network_ipv4_gateway
  label: Online IPv4 Gateway
  kind: query
  command: '{"device":{"network":{"ipv4":{"gateway":null}}}}'
  params: []

- id: device_network_ipv4_auto
  label: IPv4 DHCP/Auto-IP
  kind: action
  command: '{"device":{"network":{"ipv4":{"auto":{value}}}}}'
  params:
    - name: value
      type: boolean
      description: "true=DHCP+ZeroConf, false=manual"

- id: device_network_mdns
  label: mDNS State
  kind: action
  command: '{"device":{"network":{"mdns":{value}}}}'
  params:
    - name: value
      type: boolean
      description: "true/false/null (read)"

- id: device_preset_spacing
  label: Device Preset Spacing
  kind: query
  command: '{"device":{"preset_spacing":null}}'
  params: []
  notes: "kHz, depends on LD mode."

- id: device_time
  label: Device Clock
  kind: query
  command: '{"device":{"time":null}}'
  params: []
  notes: "Seconds since 2000-01-01T00:00:00Z."

- id: device_restore
  label: Device Restore Defaults
  kind: action
  command: '{"device":{"restore":{value}}}'
  params:
    - name: value
      type: string
      description: "FACTORY_DEFAULTS or AUDIO_DEFAULTS"

- id: device_restart
  label: Device Restart
  kind: action
  command: '{"device":{"restart":null}}'
  params: []

- id: device_remote_access
  label: Device Remote Access String
  kind: action
  command: '{"device":{"remote_access":{value}}}'
  params:
    - name: value
      type: string
      description: "Up to 15 chars; cleared after 2 minutes, not persisted."

- id: device_name
  label: Device Name
  kind: action
  command: '{"device":{"name":{value}}}'
  params:
    - name: value
      type: string
      description: "Max length 18."

- id: device_lock
  label: Device Keys Lock
  kind: action
  command: '{"device":{"lock":{value}}}'
  params:
    - name: value
      type: boolean
      description: "true=locked, false=unlocked"

- id: device_location
  label: Device Location
  kind: action
  command: '{"device":{"location":{value}}}'
  params:
    - name: value
      type: string
      description: "Max length 400."

- id: device_link_density_mode
  label: Link Density Mode
  kind: action
  command: '{"device":{"link_density_mode":{value}}}'
  params:
    - name: value
      type: boolean
      description: "true=LD mode on, false=standard. Causes device reboot."

- id: device_language
  label: Device Supported Languages
  kind: query
  command: '{"device":{"language":null}}'
  params: []
  notes: "English only = [\"en_GB\"]."

- id: device_frequency_ranges
  label: Device Frequency Ranges
  kind: query
  command: '{"device":{"frequency_ranges":null}}'
  params: []

- id: device_frequency_code
  label: Device Frequency Code
  kind: query
  command: '{"device":{"frequency_code":null}}'
  params: []

- id: device_encryption
  label: Device Encryption
  kind: action
  command: '{"device":{"encryption":{value}}}'
  params:
    - name: value
      type: boolean
      description: "Activate/deactivate encryption."

- id: device_brightness
  label: Device Display Brightness
  kind: action
  command: '{"device":{"brightness":{value}}}'
  params:
    - name: value
      type: integer
      description: "1..5 maps to 20%..100%."

- id: device_booster
  label: Antenna Booster Power
  kind: action
  command: '{"device":{"booster":{value}}}'
  params:
    - name: value
      type: boolean
      description: "true=On, false=Off"
  notes: "EW-DX EM 4 Dante exclusive."

- id: interface_version
  label: SSC Interface Version
  kind: query
  command: '{"interface":{"version":null}}'
  params: []

# ---- /osc framework ----
- id: osc_state_auth_access
  label: Auth Access
  kind: query
  command: '{"osc":{"state":{"auth":{"access":null}}}}'
  params: []

- id: osc_state_prettyprint
  label: Prettyprint (unsupported)
  kind: query
  command: '{"osc":{"state":{"prettyprint":null}}}'
  params: []
  notes: "Returns false."

- id: osc_state_close
  label: Connection Close
  kind: action
  command: '{"osc":{"state":{"close":null}}}'
  params: []

- id: osc_state_subscribe
  label: Subscribe
  kind: action
  command: '{"osc":{"state":{"subscribe":{params}}}}'
  params:
    - name: params
      type: array
      description: "Array of address trees; optional # object with min/max/count/lifetime."
  notes: "Up to 8 concurrent clients on EM 2."

- id: osc_feature_timetag
  label: Feature timetag (unsupported)
  kind: query
  command: '{"osc":{"feature":{"timetag":null}}}'
  params: []
  notes: "Returns false."

- id: osc_feature_baseaddr
  label: Feature baseaddr (unsupported)
  kind: query
  command: '{"osc":{"feature":{"baseaddr":null}}}'
  params: []
  notes: "Returns false."

- id: osc_feature_subscription
  label: Feature subscription
  kind: query
  command: '{"osc":{"feature":{"subscription":null}}}'
  params: []
  notes: "Returns true."

- id: osc_feature_pattern
  label: Feature pattern
  kind: query
  command: '{"osc":{"feature":{"pattern":null}}}'
  params: []
  notes: "Returns \"*?\"."

- id: osc_limits
  label: Parameter Range Reflection
  kind: query
  command: '{"osc":{"limits":null}}'
  params: []

- id: osc_schema
  label: OSC Schema
  kind: query
  command: '{"osc":{"schema":null}}'
  params: []

- id: osc_version
  label: SSC Protocol Version
  kind: query
  command: '{"osc":{"version":null}}'
  params: []

- id: osc_xid
  label: Transaction ID
  kind: action
  command: '{"osc":{"xid":{value}}}'
  params:
    - name: value
      type: string
      description: "Transaction ID echoed on bundled replies."

- id: osc_ping
  label: SSC Ping
  kind: query
  command: '{"osc":{"ping":null}}'
  params: []

- id: osc_error
  label: SSC Error State
  kind: query
  command: '{"osc":{"error":null}}'
  params: []

# ---- /rx1 ----
- id: rx1_identification_visual
  label: RX1 Identification Visual
  kind: action
  command: '{"rx1":{"identification":{"visual":{value}}}}'
  params:
    - name: value
      type: boolean
      description: "true/false/null"

- id: rx1_presets_user_0
  label: RX1 User Preset Frequencies
  kind: action
  command: '{"rx1":{"presets":{"user":{"0":{value}}}}}'
  params:
    - name: value
      type: array
      description: "Array of frequencies in kHz."

- id: rx1_presets_active
  label: RX1 Active Preset
  kind: action
  command: '{"rx1":{"presets":{"active":{value}}}}'
  params:
    - name: value
      type: string
      description: "Format \"factory:index:channel\" or \"user:index:channel\"."

- id: rx1_sync_settings_trim_ignore
  label: RX1 Sync Trim Ignore
  kind: action
  command: '{"rx1":{"sync_settings":{"trim_ignore":{value}}}}'
  params:
    - name: value
      type: boolean

- id: rx1_sync_settings_trim
  label: RX1 Sync TX Trim
  kind: action
  command: '{"rx1":{"sync_settings":{"trim":{value}}}}'
  params:
    - name: value
      type: number

- id: rx1_sync_settings_name_ignore
  label: RX1 Sync Name Ignore
  kind: action
  command: '{"rx1":{"sync_settings":{"name_ignore":{value}}}}'
  params:
    - name: value
      type: boolean

- id: rx1_sync_settings_mute_config_ts
  label: RX1 Sync TS Mute Config
  kind: action
  command: '{"rx1":{"sync_settings":{"mute_config_ts":{value}}}}'
  params:
    - name: value
      type: string
      description: "af_mute"

- id: rx1_sync_settings_mute_config_ignore
  label: RX1 Sync Mute Config Ignore
  kind: action
  command: '{"rx1":{"sync_settings":{"mute_config_ignore":{value}}}}'
  params:
    - name: value
      type: boolean

- id: rx1_sync_settings_mute_config
  label: RX1 Sync TX Mute Config
  kind: action
  command: '{"rx1":{"sync_settings":{"mute_config":{value}}}}'
  params:
    - name: value
      type: string
      description: "off or rf_mute"

- id: rx1_sync_settings_lowcut_ignore
  label: RX1 Sync Lowcut Ignore
  kind: action
  command: '{"rx1":{"sync_settings":{"lowcut_ignore":{value}}}}'
  params:
    - name: value
      type: boolean

- id: rx1_sync_settings_lowcut
  label: RX1 Sync TX Lowcut
  kind: action
  command: '{"rx1":{"sync_settings":{"lowcut":{value}}}}'
  params:
    - name: value
      type: string
      description: "30 Hz, 60 Hz, 80 Hz, 100 Hz, 120 Hz"

- id: rx1_sync_settings_lock_ignore
  label: RX1 Sync Auto Lock Ignore
  kind: action
  command: '{"rx1":{"sync_settings":{"lock_ignore":{value}}}}'
  params:
    - name: value
      type: boolean

- id: rx1_sync_settings_lock
  label: RX1 Sync TX Autolock
  kind: action
  command: '{"rx1":{"sync_settings":{"lock":{value}}}}'
  params:
    - name: value
      type: boolean

- id: rx1_sync_settings_led_ignore
  label: RX1 Sync LED Ignore
  kind: action
  command: '{"rx1":{"sync_settings":{"led_ignore":{value}}}}'
  params:
    - name: value
      type: boolean

- id: rx1_sync_settings_led
  label: RX1 Sync TX LED
  kind: action
  command: '{"rx1":{"sync_settings":{"led":{value}}}}'
  params:
    - name: value
      type: boolean

- id: rx1_sync_settings_frequency_ignore
  label: RX1 Sync Frequency Ignore
  kind: action
  command: '{"rx1":{"sync_settings":{"frequency_ignore":{value}}}}'
  params:
    - name: value
      type: boolean

- id: rx1_sync_settings_cable_emulation_ignore
  label: RX1 Sync Cable Emulation Ignore
  kind: action
  command: '{"rx1":{"sync_settings":{"cable_emulation_ignore":{value}}}}'
  params:
    - name: value
      type: boolean

- id: rx1_sync_settings_cable_emulation
  label: RX1 Sync TX Cable Emulation
  kind: action
  command: '{"rx1":{"sync_settings":{"cable_emulation":{value}}}}'
  params:
    - name: value
      type: string
      description: "type1 or type2"

- id: rx1_warnings
  label: RX1 Warnings
  kind: query
  command: '{"rx1":{"warnings":null}}'
  params: []
  notes: "Array of [Aes256Error, LowSignal, NoLink, RfPeak, AfPeak]."

- id: rx1_name
  label: RX1 Channel Name
  kind: action
  command: '{"rx1":{"name":{value}}}'
  params:
    - name: value
      type: string
      description: "Max length 8."

- id: rx1_mute
  label: RX1 Audio Output Mute
  kind: action
  command: '{"rx1":{"mute":{value}}}'
  params:
    - name: value
      type: boolean

- id: rx1_mates
  label: RX1 Active Mates
  kind: query
  command: '{"rx1":{"mates":null}}'
  params: []
  notes: "Read-only."

- id: rx1_gain
  label: RX1 Gain
  kind: action
  command: '{"rx1":{"gain":{value}}}'
  params:
    - name: value
      type: integer
      description: "Range -3..42 dB, increment 3 dB."

- id: rx1_frequency
  label: RX1 Carrier Frequency
  kind: action
  command: '{"rx1":{"frequency":{value}}}'
  params:
    - name: value
      type: integer
      description: "kHz; range 470200..1999000, inc 25."

- id: rx1_audio
  label: RX1 Audio Inputs/Outputs
  kind: query
  command: '{"rx1":{"audio":null}}'
  params: []

- id: rx1_restore
  label: RX1 Restore Audio Defaults
  kind: action
  command: '{"rx1":{"restore":{value}}}'
  params:
    - name: value
      type: string
      description: "AUDIO_DEFAULTS"

# ---- /rx2 (mirrors rx1) ----
- id: rx2_identification_visual
  label: RX2 Identification Visual
  kind: action
  command: '{"rx2":{"identification":{"visual":{value}}}}'
  params:
    - {name: value, type: boolean, description: "true/false/null"}

- id: rx2_presets_user_0
  label: RX2 User Preset Frequencies
  kind: action
  command: '{"rx2":{"presets":{"user":{"0":{value}}}}}'
  params:
    - {name: value, type: array, description: "kHz values"}

- id: rx2_presets_active
  label: RX2 Active Preset
  kind: action
  command: '{"rx2":{"presets":{"active":{value}}}}'
  params:
    - {name: value, type: string, description: "\"factory:index:channel\" or \"user:index:channel\""}

- id: rx2_sync_settings_trim_ignore
  label: RX2 Sync Trim Ignore
  kind: action
  command: '{"rx2":{"sync_settings":{"trim_ignore":{value}}}}'
  params: [{name: value, type: boolean}]

- id: rx2_sync_settings_trim
  label: RX2 Sync TX Trim
  kind: action
  command: '{"rx2":{"sync_settings":{"trim":{value}}}}'
  params: [{name: value, type: number}]

- id: rx2_sync_settings_name_ignore
  label: RX2 Sync Name Ignore
  kind: action
  command: '{"rx2":{"sync_settings":{"name_ignore":{value}}}}'
  params: [{name: value, type: boolean}]

- id: rx2_sync_settings_mute_config_ts
  label: RX2 Sync TS Mute Config
  kind: action
  command: '{"rx2":{"sync_settings":{"mute_config_ts":{value}}}}'
  params: [{name: value, type: string, description: "af_mute"}]

- id: rx2_sync_settings_mute_config_ignore
  label: RX2 Sync Mute Config Ignore
  kind: action
  command: '{"rx2":{"sync_settings":{"mute_config_ignore":{value}}}}'
  params: [{name: value, type: boolean}]

- id: rx2_sync_settings_mute_config
  label: RX2 Sync TX Mute Config
  kind: action
  command: '{"rx2":{"sync_settings":{"mute_config":{value}}}}'
  params: [{name: value, type: string, description: "off or rf_mute"}]

- id: rx2_sync_settings_lowcut_ignore
  label: RX2 Sync Lowcut Ignore
  kind: action
  command: '{"rx2":{"sync_settings":{"lowcut_ignore":{value}}}}'
  params: [{name: value, type: boolean}]

- id: rx2_sync_settings_lowcut
  label: RX2 Sync TX Lowcut
  kind: action
  command: '{"rx2":{"sync_settings":{"lowcut":{value}}}}'
  params: [{name: value, type: string, description: "30/60/80/100/120 Hz"}]

- id: rx2_sync_settings_lock_ignore
  label: RX2 Sync Lock Ignore
  kind: action
  command: '{"rx2":{"sync_settings":{"lock_ignore":{value}}}}'
  params: [{name: value, type: boolean}]

- id: rx2_sync_settings_lock
  label: RX2 Sync TX Autolock
  kind: action
  command: '{"rx2":{"sync_settings":{"lock":{value}}}}'
  params: [{name: value, type: boolean}]

- id: rx2_sync_settings_led_ignore
  label: RX2 Sync LED Ignore
  kind: action
  command: '{"rx2":{"sync_settings":{"led_ignore":{value}}}}'
  params: [{name: value, type: boolean}]

- id: rx2_sync_settings_led
  label: RX2 Sync TX LED
  kind: action
  command: '{"rx2":{"sync_settings":{"led":{value}}}}'
  params: [{name: value, type: boolean}]

- id: rx2_sync_settings_frequency_ignore
  label: RX2 Sync Frequency Ignore
  kind: action
  command: '{"rx2":{"sync_settings":{"frequency_ignore":{value}}}}'
  params: [{name: value, type: boolean}]

- id: rx2_sync_settings_cable_emulation_ignore
  label: RX2 Sync Cable Emulation Ignore
  kind: action
  command: '{"rx2":{"sync_settings":{"cable_emulation_ignore":{value}}}}'
  params: [{name: value, type: boolean}]

- id: rx2_sync_settings_cable_emulation
  label: RX2 Sync TX Cable Emulation
  kind: action
  command: '{"rx2":{"sync_settings":{"cable_emulation":{value}}}}'
  params: [{name: value, type: string, description: "type1 or type2"}]

- id: rx2_warnings
  label: RX2 Warnings
  kind: query
  command: '{"rx2":{"warnings":null}}'
  params: []

- id: rx2_name
  label: RX2 Channel Name
  kind: action
  command: '{"rx2":{"name":{value}}}'
  params: [{name: value, type: string, description: "Max length 8."}]

- id: rx2_mute
  label: RX2 Audio Output Mute
  kind: action
  command: '{"rx2":{"mute":{value}}}'
  params: [{name: value, type: boolean}]

- id: rx2_mates
  label: RX2 Active Mates
  kind: query
  command: '{"rx2":{"mates":null}}'
  params: []

- id: rx2_gain
  label: RX2 Gain
  kind: action
  command: '{"rx2":{"gain":{value}}}'
  params: [{name: value, type: integer, description: "-3..42 dB, inc 3 dB"}]

- id: rx2_frequency
  label: RX2 Carrier Frequency
  kind: action
  command: '{"rx2":{"frequency":{value}}}'
  params: [{name: value, type: integer, description: "kHz; 470200..1999000, inc 25"}]

- id: rx2_audio
  label: RX2 Audio Inputs/Outputs
  kind: query
  command: '{"rx2":{"audio":null}}'
  params: []

- id: rx2_restore
  label: RX2 Restore Audio Defaults
  kind: action
  command: '{"rx2":{"restore":{value}}}'
  params: [{name: value, type: string, description: "AUDIO_DEFAULTS"}]

# ---- /rx3 (EW-DX EM 4 Dante exclusive; mirrors rx1) ----
- id: rx3_identification_visual
  label: RX3 Identification Visual
  kind: action
  command: '{"rx3":{"identification":{"visual":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EW-DX EM 4 Dante exclusive."

- id: rx3_presets_user_0
  label: RX3 User Preset Frequencies
  kind: action
  command: '{"rx3":{"presets":{"user":{"0":{value}}}}}'
  params: [{name: value, type: array}]
  notes: "EM 4 Dante exclusive."

- id: rx3_presets_active
  label: RX3 Active Preset
  kind: action
  command: '{"rx3":{"presets":{"active":{value}}}}'
  params: [{name: value, type: string, description: "\"factory:index:channel\" or \"user:index:channel\""}]
  notes: "EM 4 Dante exclusive."

- id: rx3_sync_settings_trim_ignore
  label: RX3 Sync Trim Ignore
  kind: action
  command: '{"rx3":{"sync_settings":{"trim_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx3_sync_settings_trim
  label: RX3 Sync TX Trim
  kind: action
  command: '{"rx3":{"sync_settings":{"trim":{value}}}}'
  params: [{name: value, type: number}]
  notes: "EM 4 Dante exclusive."

- id: rx3_sync_settings_name_ignore
  label: RX3 Sync Name Ignore
  kind: action
  command: '{"rx3":{"sync_settings":{"name_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx3_sync_settings_mute_config_ts
  label: RX3 Sync TS Mute Config
  kind: action
  command: '{"rx3":{"sync_settings":{"mute_config_ts":{value}}}}'
  params: [{name: value, type: string}]
  notes: "EM 4 Dante exclusive."

- id: rx3_sync_settings_mute_config_ignore
  label: RX3 Sync Mute Config Ignore
  kind: action
  command: '{"rx3":{"sync_settings":{"mute_config_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx3_sync_settings_mute_config
  label: RX3 Sync TX Mute Config
  kind: action
  command: '{"rx3":{"sync_settings":{"mute_config":{value}}}}'
  params: [{name: value, type: string, description: "off or rf_mute"}]
  notes: "EM 4 Dante exclusive."

- id: rx3_sync_settings_lowcut_ignore
  label: RX3 Sync Lowcut Ignore
  kind: action
  command: '{"rx3":{"sync_settings":{"lowcut_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx3_sync_settings_lowcut
  label: RX3 Sync TX Lowcut
  kind: action
  command: '{"rx3":{"sync_settings":{"lowcut":{value}}}}'
  params: [{name: value, type: string, description: "30/60/80/100/120 Hz"}]
  notes: "EM 4 Dante exclusive."

- id: rx3_sync_settings_lock_ignore
  label: RX3 Sync Lock Ignore
  kind: action
  command: '{"rx3":{"sync_settings":{"lock_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx3_sync_settings_lock
  label: RX3 Sync TX Autolock
  kind: action
  command: '{"rx3":{"sync_settings":{"lock":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx3_sync_settings_led_ignore
  label: RX3 Sync LED Ignore
  kind: action
  command: '{"rx3":{"sync_settings":{"led_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx3_sync_settings_led
  label: RX3 Sync TX LED
  kind: action
  command: '{"rx3":{"sync_settings":{"led":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx3_sync_settings_frequency_ignore
  label: RX3 Sync Frequency Ignore
  kind: action
  command: '{"rx3":{"sync_settings":{"frequency_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx3_sync_settings_cable_emulation_ignore
  label: RX3 Sync Cable Emulation Ignore
  kind: action
  command: '{"rx3":{"sync_settings":{"cable_emulation_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx3_sync_settings_cable_emulation
  label: RX3 Sync TX Cable Emulation
  kind: action
  command: '{"rx3":{"sync_settings":{"cable_emulation":{value}}}}'
  params: [{name: value, type: string, description: "type1 or type2"}]
  notes: "EM 4 Dante exclusive."

- id: rx3_warnings
  label: RX3 Warnings
  kind: query
  command: '{"rx3":{"warnings":null}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: rx3_name
  label: RX3 Channel Name
  kind: action
  command: '{"rx3":{"name":{value}}}'
  params: [{name: value, type: string, description: "Max length 8."}]
  notes: "EM 4 Dante exclusive."

- id: rx3_mute
  label: RX3 Audio Output Mute
  kind: action
  command: '{"rx3":{"mute":{value}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx3_mates
  label: RX3 Active Mates
  kind: query
  command: '{"rx3":{"mates":null}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: rx3_gain
  label: RX3 Gain
  kind: action
  command: '{"rx3":{"gain":{value}}}'
  params: [{name: value, type: integer, description: "-3..42 dB, inc 3 dB"}]
  notes: "EM 4 Dante exclusive."

- id: rx3_frequency
  label: RX3 Carrier Frequency
  kind: action
  command: '{"rx3":{"frequency":{value}}}'
  params: [{name: value, type: integer, description: "kHz; 470200..1999000, inc 25"}]
  notes: "EM 4 Dante exclusive."

- id: rx3_audio
  label: RX3 Audio Inputs/Outputs
  kind: query
  command: '{"rx3":{"audio":null}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: rx3_restore
  label: RX3 Restore Audio Defaults
  kind: action
  command: '{"rx3":{"restore":{value}}}'
  params: [{name: value, type: string, description: "AUDIO_DEFAULTS"}]
  notes: "EM 4 Dante exclusive."

# ---- /rx4 (EW-DX EM 4 Dante exclusive) ----
- id: rx4_identification_visual
  label: RX4 Identification Visual
  kind: action
  command: '{"rx4":{"identification":{"visual":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx4_presets_user_0
  label: RX4 User Preset Frequencies
  kind: action
  command: '{"rx4":{"presets":{"user":{"0":{value}}}}}'
  params: [{name: value, type: array}]
  notes: "EM 4 Dante exclusive."

- id: rx4_presets_active
  label: RX4 Active Preset
  kind: action
  command: '{"rx4":{"presets":{"active":{value}}}}'
  params: [{name: value, type: string}]
  notes: "EM 4 Dante exclusive."

- id: rx4_sync_settings_trim_ignore
  label: RX4 Sync Trim Ignore
  kind: action
  command: '{"rx4":{"sync_settings":{"trim_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx4_sync_settings_trim
  label: RX4 Sync TX Trim
  kind: action
  command: '{"rx4":{"sync_settings":{"trim":{value}}}}'
  params: [{name: value, type: number}]
  notes: "EM 4 Dante exclusive."

- id: rx4_sync_settings_name_ignore
  label: RX4 Sync Name Ignore
  kind: action
  command: '{"rx4":{"sync_settings":{"name_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx4_sync_settings_mute_config_ts
  label: RX4 Sync TS Mute Config
  kind: action
  command: '{"rx4":{"sync_settings":{"mute_config_ts":{value}}}}'
  params: [{name: value, type: string}]
  notes: "EM 4 Dante exclusive."

- id: rx4_sync_settings_mute_config_ignore
  label: RX4 Sync Mute Config Ignore
  kind: action
  command: '{"rx4":{"sync_settings":{"mute_config_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx4_sync_settings_mute_config
  label: RX4 Sync TX Mute Config
  kind: action
  command: '{"rx4":{"sync_settings":{"mute_config":{value}}}}'
  params: [{name: value, type: string, description: "off or rf_mute"}]
  notes: "EM 4 Dante exclusive."

- id: rx4_sync_settings_lowcut_ignore
  label: RX4 Sync Lowcut Ignore
  kind: action
  command: '{"rx4":{"sync_settings":{"lowcut_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx4_sync_settings_lowcut
  label: RX4 Sync TX Lowcut
  kind: action
  command: '{"rx4":{"sync_settings":{"lowcut":{value}}}}'
  params: [{name: value, type: string, description: "30/60/80/100/120 Hz"}]
  notes: "EM 4 Dante exclusive."

- id: rx4_sync_settings_lock_ignore
  label: RX4 Sync Lock Ignore
  kind: action
  command: '{"rx4":{"sync_settings":{"lock_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx4_sync_settings_lock
  label: RX4 Sync TX Autolock
  kind: action
  command: '{"rx4":{"sync_settings":{"lock":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx4_sync_settings_led_ignore
  label: RX4 Sync LED Ignore
  kind: action
  command: '{"rx4":{"sync_settings":{"led_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx4_sync_settings_led
  label: RX4 Sync TX LED
  kind: action
  command: '{"rx4":{"sync_settings":{"led":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx4_sync_settings_frequency_ignore
  label: RX4 Sync Frequency Ignore
  kind: action
  command: '{"rx4":{"sync_settings":{"frequency_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx4_sync_settings_cable_emulation_ignore
  label: RX4 Sync Cable Emulation Ignore
  kind: action
  command: '{"rx4":{"sync_settings":{"cable_emulation_ignore":{value}}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx4_sync_settings_cable_emulation
  label: RX4 Sync TX Cable Emulation
  kind: action
  command: '{"rx4":{"sync_settings":{"cable_emulation":{value}}}}'
  params: [{name: value, type: string, description: "type1 or type2"}]
  notes: "EM 4 Dante exclusive."

- id: rx4_warnings
  label: RX4 Warnings
  kind: query
  command: '{"rx4":{"warnings":null}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: rx4_name
  label: RX4 Channel Name
  kind: action
  command: '{"rx4":{"name":{value}}}'
  params: [{name: value, type: string, description: "Max length 8."}]
  notes: "EM 4 Dante exclusive."

- id: rx4_mute
  label: RX4 Audio Output Mute
  kind: action
  command: '{"rx4":{"mute":{value}}}'
  params: [{name: value, type: boolean}]
  notes: "EM 4 Dante exclusive."

- id: rx4_mates
  label: RX4 Active Mates
  kind: query
  command: '{"rx4":{"mates":null}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: rx4_gain
  label: RX4 Gain
  kind: action
  command: '{"rx4":{"gain":{value}}}'
  params: [{name: value, type: integer, description: "-3..42 dB, inc 3 dB"}]
  notes: "EM 4 Dante exclusive."

- id: rx4_frequency
  label: RX4 Carrier Frequency
  kind: action
  command: '{"rx4":{"frequency":{value}}}'
  params: [{name: value, type: integer, description: "kHz; 470200..1999000, inc 25"}]
  notes: "EM 4 Dante exclusive."

- id: rx4_audio
  label: RX4 Audio Inputs/Outputs
  kind: query
  command: '{"rx4":{"audio":null}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: rx4_restore
  label: RX4 Restore Audio Defaults
  kind: action
  command: '{"rx4":{"restore":{value}}}'
  params: [{name: value, type: string, description: "AUDIO_DEFAULTS"}]
  notes: "EM 4 Dante exclusive."

# ---- /audio1 ----
- id: audio1_out1_level
  label: AF Out1 Level
  kind: action
  command: '{"audio1":{"out1":{"level":{value}}}}'
  params: [{name: value, type: integer, description: "-24..18 dB, inc 6 dB"}]

- id: audio1_out2_level
  label: AF Out2 Level
  kind: action
  command: '{"audio1":{"out2":{"level":{value}}}}'
  params: [{name: value, type: integer, description: "-24..18 dB, inc 6 dB"}]

- id: audio1_out3_level
  label: AF Out3 Level
  kind: action
  command: '{"audio1":{"out3":{"level":{value}}}}'
  params: [{name: value, type: integer, description: "-24..18 dB, inc 6 dB"}]
  notes: "EM 4 Dante exclusive."

- id: audio1_out4_level
  label: AF Out4 Level
  kind: action
  command: '{"audio1":{"out4":{"level":{value}}}}'
  params: [{name: value, type: integer, description: "-24..18 dB, inc 6 dB"}]
  notes: "EM 4 Dante exclusive."

# ---- /m metering (read-only) ----
- id: m_rx1_rssi
  label: RX1 RSSI
  kind: query
  command: '{"m":{"rx1":{"rssi":null}}}'
  params: []
  notes: "double, -107..0 dBm."

- id: m_rx1_rsqi
  label: RX1 RSQI
  kind: query
  command: '{"m":{"rx1":{"rsqi":null}}}'
  params: []
  notes: "0..100 %."

- id: m_rx1_divi
  label: RX1 Diversity Indicator
  kind: query
  command: '{"m":{"rx1":{"divi":null}}}'
  params: []
  notes: "0=None, 1=Ant A, 2=Ant B."

- id: m_rx1_af
  label: RX1 AF Level
  kind: query
  command: '{"m":{"rx1":{"af":null}}}'
  params: []
  notes: "double, -138.5..0 dBfs, inc 0.1."

- id: m_rx2_rssi
  label: RX2 RSSI
  kind: query
  command: '{"m":{"rx2":{"rssi":null}}}'
  params: []

- id: m_rx2_rsqi
  label: RX2 RSQI
  kind: query
  command: '{"m":{"rx2":{"rsqi":null}}}'
  params: []

- id: m_rx2_divi
  label: RX2 Diversity Indicator
  kind: query
  command: '{"m":{"rx2":{"divi":null}}}'
  params: []

- id: m_rx2_af
  label: RX2 AF Level
  kind: query
  command: '{"m":{"rx2":{"af":null}}}'
  params: []

- id: m_rx3_rssi
  label: RX3 RSSI
  kind: query
  command: '{"m":{"rx3":{"rssi":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: m_rx3_rsqi
  label: RX3 RSQI
  kind: query
  command: '{"m":{"rx3":{"rsqi":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: m_rx3_divi
  label: RX3 Diversity Indicator
  kind: query
  command: '{"m":{"rx3":{"divi":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: m_rx3_af
  label: RX3 AF Level
  kind: query
  command: '{"m":{"rx3":{"af":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: m_rx4_rssi
  label: RX4 RSSI
  kind: query
  command: '{"m":{"rx4":{"rssi":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: m_rx4_rsqi
  label: RX4 RSQI
  kind: query
  command: '{"m":{"rx4":{"rsqi":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: m_rx4_divi
  label: RX4 Diversity Indicator
  kind: query
  command: '{"m":{"rx4":{"divi":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: m_rx4_af
  label: RX4 AF Level
  kind: query
  command: '{"m":{"rx4":{"af":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

# ---- /mates telemetry (read-only; queried via direct null or via subscribe) ----
- id: mates_tx1_battery_type
  label: TX1 Battery Type
  kind: query
  command: '{"mates":{"tx1":{"battery":{"type":null}}}}'
  params: []
  notes: "\"Battery\" or \"Primary Cell\". Error 424 if TX absent."

- id: mates_tx1_battery_lifetime
  label: TX1 Battery Lifetime
  kind: query
  command: '{"mates":{"tx1":{"battery":{"lifetime":null}}}}'
  params: []
  notes: "Minutes."

- id: mates_tx1_battery_gauge
  label: TX1 Battery Gauge
  kind: query
  command: '{"mates":{"tx1":{"battery":{"gauge":null}}}}'
  params: []
  notes: "Percent."

- id: mates_tx1_warnings
  label: TX1 Warnings
  kind: query
  command: '{"mates":{"tx1":{"warnings":null}}}'
  params: []
  notes: "[AfPeak, LowBattery]."

- id: mates_tx1_version
  label: TX1 SW Version
  kind: query
  command: '{"mates":{"tx1":{"version":null}}}'
  params: []

- id: mates_tx1_type
  label: TX1 Type
  kind: query
  command: '{"mates":{"tx1":{"type":null}}}'
  params: []

- id: mates_tx1_trim
  label: TX1 Trim
  kind: query
  command: '{"mates":{"tx1":{"trim":null}}}'
  params: []

- id: mates_tx1_name
  label: TX1 Name
  kind: query
  command: '{"mates":{"tx1":{"name":null}}}'
  params: []

- id: mates_tx1_mute_config_ts
  label: TX1 TS Mute Config
  kind: query
  command: '{"mates":{"tx1":{"mute_config_ts":null}}}'
  params: []

- id: mates_tx1_mute_config
  label: TX1 Mute Config
  kind: query
  command: '{"mates":{"tx1":{"mute_config":null}}}'
  params: []

- id: mates_tx1_mute
  label: TX1 Mute Switch
  kind: query
  command: '{"mates":{"tx1":{"mute":null}}}'
  params: []

- id: mates_tx1_lowcut
  label: TX1 Lowcut
  kind: query
  command: '{"mates":{"tx1":{"lowcut":null}}}'
  params: []

- id: mates_tx1_lock
  label: TX1 Autolock
  kind: query
  command: '{"mates":{"tx1":{"lock":null}}}'
  params: []

- id: mates_tx1_led
  label: TX1 LED
  kind: query
  command: '{"mates":{"tx1":{"led":null}}}'
  params: []

- id: mates_tx1_identification
  label: TX1 Identification
  kind: query
  command: '{"mates":{"tx1":{"identification":null}}}'
  params: []

- id: mates_tx1_capsule
  label: TX1 Capsule
  kind: query
  command: '{"mates":{"tx1":{"capsule":null}}}'
  params: []
  notes: "unknown/KK 205/KK 204/ME 9002/ME 9004/ME 9005/MME 865/MD 9235/MMD 945/MMD 935/MMD 845/MMD 835/MMD 815-1/MMK 965/MMD 42-I."

- id: mates_tx1_cable_emulation
  label: TX1 Cable Emulation
  kind: query
  command: '{"mates":{"tx1":{"cable_emulation":null}}}'
  params: []

- id: mates_tx2_battery_type
  label: TX2 Battery Type
  kind: query
  command: '{"mates":{"tx2":{"battery":{"type":null}}}}'
  params: []

- id: mates_tx2_battery_lifetime
  label: TX2 Battery Lifetime
  kind: query
  command: '{"mates":{"tx2":{"battery":{"lifetime":null}}}}'
  params: []

- id: mates_tx2_battery_gauge
  label: TX2 Battery Gauge
  kind: query
  command: '{"mates":{"tx2":{"battery":{"gauge":null}}}}'
  params: []

- id: mates_tx2_warnings
  label: TX2 Warnings
  kind: query
  command: '{"mates":{"tx2":{"warnings":null}}}'
  params: []

- id: mates_tx2_version
  label: TX2 SW Version
  kind: query
  command: '{"mates":{"tx2":{"version":null}}}'
  params: []

- id: mates_tx2_type
  label: TX2 Type
  kind: query
  command: '{"mates":{"tx2":{"type":null}}}'
  params: []

- id: mates_tx2_trim
  label: TX2 Trim
  kind: query
  command: '{"mates":{"tx2":{"trim":null}}}'
  params: []

- id: mates_tx2_name
  label: TX2 Name
  kind: query
  command: '{"mates":{"tx2":{"name":null}}}'
  params: []

- id: mates_tx2_mute_config_ts
  label: TX2 TS Mute Config
  kind: query
  command: '{"mates":{"tx2":{"mute_config_ts":null}}}'
  params: []

- id: mates_tx2_mute_config
  label: TX2 Mute Config
  kind: query
  command: '{"mates":{"tx2":{"mute_config":null}}}'
  params: []

- id: mates_tx2_mute
  label: TX2 Mute Switch
  kind: query
  command: '{"mates":{"tx2":{"mute":null}}}'
  params: []

- id: mates_tx2_lowcut
  label: TX2 Lowcut
  kind: query
  command: '{"mates":{"tx2":{"lowcut":null}}}'
  params: []

- id: mates_tx2_lock
  label: TX2 Autolock
  kind: query
  command: '{"mates":{"tx2":{"lock":null}}}'
  params: []

- id: mates_tx2_led
  label: TX2 LED
  kind: query
  command: '{"mates":{"tx2":{"led":null}}}'
  params: []

- id: mates_tx2_identification
  label: TX2 Identification
  kind: query
  command: '{"mates":{"tx2":{"identification":null}}}'
  params: []

- id: mates_tx2_capsule
  label: TX2 Capsule
  kind: query
  command: '{"mates":{"tx2":{"capsule":null}}}'
  params: []

- id: mates_tx2_cable_emulation
  label: TX2 Cable Emulation
  kind: query
  command: '{"mates":{"tx2":{"cable_emulation":null}}}'
  params: []

- id: mates_tx3_battery_type
  label: TX3 Battery Type
  kind: query
  command: '{"mates":{"tx3":{"battery":{"type":null}}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_battery_lifetime
  label: TX3 Battery Lifetime
  kind: query
  command: '{"mates":{"tx3":{"battery":{"lifetime":null}}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_battery_gauge
  label: TX3 Battery Gauge
  kind: query
  command: '{"mates":{"tx3":{"battery":{"gauge":null}}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_warnings
  label: TX3 Warnings
  kind: query
  command: '{"mates":{"tx3":{"warnings":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_version
  label: TX3 SW Version
  kind: query
  command: '{"mates":{"tx3":{"version":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_type
  label: TX3 Type
  kind: query
  command: '{"mates":{"tx3":{"type":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_trim
  label: TX3 Trim
  kind: query
  command: '{"mates":{"tx3":{"trim":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_name
  label: TX3 Name
  kind: query
  command: '{"mates":{"tx3":{"name":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_mute_config_ts
  label: TX3 TS Mute Config
  kind: query
  command: '{"mates":{"tx3":{"mute_config_ts":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_mute_config
  label: TX3 Mute Config
  kind: query
  command: '{"mates":{"tx3":{"mute_config":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_mute
  label: TX3 Mute Switch
  kind: query
  command: '{"mates":{"tx3":{"mute":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_lowcut
  label: TX3 Lowcut
  kind: query
  command: '{"mates":{"tx3":{"lowcut":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_lock
  label: TX3 Autolock
  kind: query
  command: '{"mates":{"tx3":{"lock":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_led
  label: TX3 LED
  kind: query
  command: '{"mates":{"tx3":{"led":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_identification
  label: TX3 Identification
  kind: query
  command: '{"mates":{"tx3":{"identification":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_capsule
  label: TX3 Capsule
  kind: query
  command: '{"mates":{"tx3":{"capsule":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx3_cable_emulation
  label: TX3 Cable Emulation
  kind: query
  command: '{"mates":{"tx3":{"cable_emulation":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_battery_type
  label: TX4 Battery Type
  kind: query
  command: '{"mates":{"tx4":{"battery":{"type":null}}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_battery_lifetime
  label: TX4 Battery Lifetime
  kind: query
  command: '{"mates":{"tx4":{"battery":{"lifetime":null}}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_battery_gauge
  label: TX4 Battery Gauge
  kind: query
  command: '{"mates":{"tx4":{"battery":{"gauge":null}}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_warnings
  label: TX4 Warnings
  kind: query
  command: '{"mates":{"tx4":{"warnings":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_version
  label: TX4 SW Version
  kind: query
  command: '{"mates":{"tx4":{"version":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_type
  label: TX4 Type
  kind: query
  command: '{"mates":{"tx4":{"type":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_trim
  label: TX4 Trim
  kind: query
  command: '{"mates":{"tx4":{"trim":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_name
  label: TX4 Name
  kind: query
  command: '{"mates":{"tx4":{"name":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_mute_config_ts
  label: TX4 TS Mute Config
  kind: query
  command: '{"mates":{"tx4":{"mute_config_ts":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_mute_config
  label: TX4 Mute Config
  kind: query
  command: '{"mates":{"tx4":{"mute_config":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_mute
  label: TX4 Mute Switch
  kind: query
  command: '{"mates":{"tx4":{"mute":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_lowcut
  label: TX4 Lowcut
  kind: query
  command: '{"mates":{"tx4":{"lowcut":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_lock
  label: TX4 Autolock
  kind: query
  command: '{"mates":{"tx4":{"lock":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_led
  label: TX4 LED
  kind: query
  command: '{"mates":{"tx4":{"led":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_identification
  label: TX4 Identification
  kind: query
  command: '{"mates":{"tx4":{"identification":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_capsule
  label: TX4 Capsule
  kind: query
  command: '{"mates":{"tx4":{"capsule":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

- id: mates_tx4_cable_emulation
  label: TX4 Cable Emulation
  kind: query
  command: '{"mates":{"tx4":{"cable_emulation":null}}}'
  params: []
  notes: "EM 4 Dante exclusive."

Feedbacks

# SSC queries return JSON method replies; observable states mirrored from Actions.
# Subscription mechanism delivers unsolicited updates (see Events).
- id: device_warning_flags
  type: array
  values: [Aes256Error, LowSignal, NoLink, RfPeak, AfPeak]
  source: /rx1/warnings, /rx2/warnings, /rx3/warnings, /rx4/warnings
- id: tx_warning_flags
  type: array
  values: [AfPeak, LowBattery]
  source: /mates/tx1..tx4/warnings
- id: tx_battery_gauge
  type: number
  source: /mates/tx1..tx4/battery/gauge
- id: rx_rssi
  type: number
  source: /m/rx1..rx4/rssi
- id: rx_af
  type: number
  source: /m/rx1..rx4/af
- id: bay_state  # UNRESOLVED: bay_state documented only under CHG 70N-C chapter; not enumerated for EM.
  type: string
  values: [NORMAL, UPDATE, ERROR, DFU_MODE]

Variables

# Settable numeric/string parameters already represented as parameterized Actions.
# No additional scalar variable bindings documented beyond those Actions.

Events

# SSC subscription notifications: server pushes value-change updates for subscribed
# addresses. Default behaviour = notify on change only; optional min/max/count/lifetime
# parameters control rate and lifetime.
#
# Subscribe via: {"osc":{"state":{"subscribe":[ {"#":{"min":0,"max":0,"count":1000,"lifetime":60}},
#                                              <address_tree> }]}}
#
# Documented push categories:
- id: subscription_notification
  trigger: subscribed address value change
  payload: SSC Method Reply mirroring the subscribed address tree
  notes: "Up to 8 concurrent clients on EM 2."
- id: subscription_terminated
  trigger: lifetime/count expires or connection close
  payload: error code 310 - subscription terminated

Macros

# No multi-step macros documented in source.

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings, interlock procedures, or
# power-on sequencing requirements specific to EW-DX EM. Only behavioural notes:
#   - /device/link_density_mode causes a device reboot
#   - /device/restart restarts the device
#   - /device/restore with FACTORY_DEFAULTS wipes configuration
# These are operational side-effects, not safety interlocks.

Notes

  • SSC = Sennheiser Sound Control; OSC-derived application protocol using JSON encoding instead of binary OSC blobs. One UDP datagram = one SSC message.
  • Setter pattern: {"path":{"leaf":value}}. Getter pattern: same with null argument. Server replies with adapted/actual value.
  • EW-DX EM 2 supports rx1/rx2 + audio1/out1/out2 + mates/tx1/tx2. EW-DX EM 4 Dante adds rx3/rx4, out3/out4, mates/tx3/tx4, /device/booster.
  • Dante variants add /device/network/dante/* subtree.
  • Discovery via DNS-SD/Bonjour service type _ssc._udp; clients SHOULD NOT assume default port 45.
  • Error codes 100–503 defined in source (section 10). Error 424 = "failed dependency" used when TX bodypack is absent.
  • SSC string charset restricted to ASCII 32–126 plus escapes \b \f \r \n \t; no \uXXXX unicode escapes.

Provenance

source_domains:
  - docs.cloud.sennheiser.com
  - assets.sennheiser.com
source_urls:
  - https://docs.cloud.sennheiser.com/en-us/api-docs/api-docs/resources/ew-dx-sound-control-protocol-3-0-x.pdf
  - "https://assets.sennheiser.com/download/assets/EW-DX_Sound_Control_Protocol_03_2023_EN.pdf/69f9d4bee7b611f0ae307aeaa9c3764a?attachment=true"
  - "https://assets.sennheiser.com/download/assets/EW-DX_Sound_Control_Protocol_v2_FW-4.0.x_EN.pdf/9a1f7d8ee7d811f0b5b3768ee8e97aea?attachment=true"
  - "https://assets.sennheiser.com/download/assets/Sennheiser_EW-DX_Crestron_Modules.zip/64bbb61ce7d811f0bce7beb43c66122a?attachment=true"
  - "https://assets.sennheiser.com/download/assets/Sennheiser_EW-DX_Q-SYS_Plugins.zip/5c4e0868e7d811f0bce7beb43c66122a?attachment=true"
retrieved_at: 2026-06-18T01:45:51.827Z
last_checked_at: 2026-06-18T08:02:16.648Z

Verification Summary

verdict: verified
checked_at: 2026-06-18T08:02:16.648Z
matched_actions: 249
action_count: 249
confidence: medium
summary: "All 249 spec action units have exact SSC address-path matches in the source EW-DX EM method list; transport port 45 and DNS-SD discovery explicitly stated. (6 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "source also documents the CHG 70N-C charger (separate product, section 11–14); not enumerated here as compatible_with.models lists only EM receivers."
- "bay_state documented only under CHG 70N-C chapter; not enumerated for EM."
- "source contains no safety warnings, interlock procedures, or"
- "source also documents CHG 70N-C / CHG 70N charger (sections 11–14). That product is out of scope for this EM receiver family spec; a separate spec should be authored if charger control is needed."
- "TCP transport is referenced generically in the SSC framework chapter but the EW-DX server explicitly supports UDP/IP only."
- "exact device voltage / power / current specifications not present in this developer guide."

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0