Summary

INOGENI TOGGLE DOCK 2x1 is a USB-C / USB-B + HDMI KVM-style docking switcher for meeting-room laptops, routing USB host and HDMI display sources between two hosts. Control is exposed over RS-232C (4-pos terminal block), Telnet (TCP 23), a TCP↔RS232 tunnel (TCP 5000), and an HTTPS REST API (/api/v1/). RS232 and REST share one command API; this spec documents that shared API with RS232 payloads verbatim.

Transport

protocols:
  - serial
  - tcp
  - http
serial:
  baud_rate: 9600          # default; also 19200, 38400, 115200 selectable via BAUDRATE cmd
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
addressing:
  # Two TCP services exist:
  port: 23                 # Telnet - uses same serial protocol command set; "quit" disconnects
  # port 5000 = TCP↔RS232 raw tunnel (enabling it DISABLES the serial protocol API)
  base_url: "https://<IP>/api/v1/"   # REST; self-signed certificates
auth:
  type: none  # inferred: source states "By default, no authentication is required" for REST; no login for serial/telnet
  # NOTE: REST supports OPTIONAL bearer token auth (Authorization: Bearer <token>), enabled via config page or API.

Traits

traits:
  - queryable   # inferred: most commands support RX (no-arg) query returning current value
  - routable    # inferred: DISPLAYSRC / USBHOST / HOSTMEETING route USB+HDMI between hosts
  - levelable   # inferred: CECVOLUP / CECVOLDOWN / CECTOGGLEMUTE control display audio

Actions

# RS232 line format: "<MNEMONIC> <arg1> <arg2>...\r\n" (space between name and args; CR+LF terminator).
# TX = with args → applies setting. RX = no args (or first arg only) → returns current value.
# Success → "ACK\r\n", failure → "NACK\r\n". REST equivalent path shown per command.
# Each entry below = one documented API opcode/mnemonic (Get/Set dual unless noted).

- id: autohdmi_cec_pwr
  label: Auto HDMI CEC Power Control
  kind: action
  command: "AUTOHDMICECPWR {enable}<CR><LF>"
  params:
    - name: enable
      type: integer
      description: "0=OFF, 1=ON - auto CEC on/off of connected display based on routed HDMI source"
  notes: REST GET/POST /api/v1/autoHdmiCecPwr?enable=. RX (no arg) returns ENABLE=<enable>.

- id: baudrate
  label: Set RS232 Baud Rate
  kind: action
  command: "BAUDRATE {baudrate}<CR><LF>"
  params:
    - name: baudrate
      type: integer
      description: "0=9600, 1=19200, 2=38400, 3=115200"
  notes: REST /api/v1/baudrate. RX returns BAUDRATE=<baudrate>.

- id: btn_lock
  label: Front Button Lock
  kind: action
  command: "BTNLOCK {lockState}<CR><LF>"
  params:
    - name: lockState
      type: integer
      description: "0=Not locked, 1=Locked"
  notes: REST /api/v1/btnLock. RX returns BTNLOCK=<lockState>.

- id: cec_passthrough_en
  label: CEC Passthrough Enable
  kind: action
  command: "CECPASSTHROUGHEN {enable}<CR><LF>"
  params:
    - name: enable
      type: integer
      description: "0=OFF, 1=ON [default] - pass CEC from source to display"
  notes: REST /api/v1/cecPassthroughEn. RX returns ENABLE=<src>.

- id: cec_toggle_mute
  label: CEC Toggle Mute
  kind: action
  command: "CECTOGGLEMUTE<CR><LF>"
  params: []
  notes: TX-only. REST /api/v1/cecToggleMute. Toggles display mute.

- id: cec_vol_down
  label: CEC Volume Down
  kind: action
  command: "CECVOLDOWN<CR><LF>"
  params: []
  notes: TX-only. REST /api/v1/cecVolDown.

- id: cec_vol_up
  label: CEC Volume Up
  kind: action
  command: "CECVOLUP<CR><LF>"
  params: []
  notes: TX-only. REST /api/v1/cecVolUp.

- id: display_src
  label: Select HDMI Display Source
  kind: action
  command: "DISPLAYSRC {src}<CR><LF>"
  params:
    - name: src
      type: integer
      description: "1=Laptop USB-C, 2=Laptop HDMI, 3=OFF"
  notes: REST /api/v1/displaySrc. RX returns DISPLAYSRC=<src>.

- id: display_sw_mode
  label: HDMI Display Switching Mode
  kind: action
  command: "DISPLAYSWMODE {swMode}<CR><LF>"
  params:
    - name: swMode
      type: integer
      description: "0=Automatic [default], 1=Manual, 2=Manual w/ fallback, 3=HDMI follows USB"
  notes: Requires opMode=Custom. REST /api/v1/displaySwMode. RX returns DISPLAYSWMODE=<host>.

- id: edid
  label: Set EDID Mode
  kind: action
  command: "EDID {src} {edid}<CR><LF>"
  params:
    - name: src
      type: integer
      description: "1=Laptop USB-C, 2=Laptop HDMI"
    - name: edid
      type: integer
      description: "0=Passthrough,1=User EDID,2=3840x2160p60,3=2160p50,4=2160p30,5=2160p25,6=1920x1080p60,7=1080p50,8=1280x720p60,9=720p50,10=5120x2160p30,11=5120x2160p25"
  notes: REST /api/v1/edid. RX returns EDID=<edid>.

- id: edid_hdmi_out
  label: Set EDID From Sink (Report to Source)
  kind: action
  command: "EDIDHDMIOUT {sink} {src}<CR><LF>"
  params:
    - name: sink
      type: integer
      description: "0=Display"
    - name: src
      type: integer
      description: "1=Laptop USB-C, 2=Laptop HDMI"
  notes: Sets source EDID mode to "User EDID". <edidHdmiOut>=256-byte array. REST /api/v1/edidHdmiOut.

- id: edid_usr
  label: Set User EDID (Raw 256 Bytes)
  kind: action
  command: "EDIDUSR {src} {256-byte-array}<CR><LF>"
  params:
    - name: src
      type: integer
      description: "1=Laptop USB-C, 2=Laptop HDMI"
  notes: <edidUsr> = formatted 256-byte array. REST /api/v1/edidUsr.

- id: gpi_cfg
  label: GPI Configuration
  kind: action
  command: "GPICFG {gpi} {mode} {function}<CR><LF>"
  params:
    - name: gpi
      type: integer
      description: "1=GPI1, 2=GPI2"
    - name: mode
      type: integer
      description: "0=Pulse [default], 1=Level"
    - name: function
      type: integer
      description: "0=Disabled,1=Laptop select,2=USB host control,3=Display video source control"
  notes: Pulse=falling-edge trigger; Level=short/open both trigger. REST /api/v1/gpiCfg.

- id: hdcp_ctl
  label: HDCP Setting
  kind: action
  command: "HDCPCTL {src} {hdcp}<CR><LF>"
  params:
    - name: src
      type: integer
      description: "1=Laptop USB-C, 2=Laptop HDMI"
    - name: hdcp
      type: integer
      description: "0=Disabled, 1=HDCP v1.4, 2=HDCP v2.2, 3=Auto"
  notes: REST /api/v1/hdcpCtl. RX returns HDCP=<hdcp>.

- id: help
  label: Help - List Commands
  kind: query
  command: "HELP<CR><LF>"
  params: []
  notes: RX-only. REST /api/v1/help. Returns list of supported commands.

- id: host_button
  label: Emulate Front / INO-Button Press
  kind: action
  command: "HOSTBUTTON<CR><LF>"
  params: []
  notes: TX-only. Same as front button or INO-BUTTON KIT. REST /api/v1/hostButton.

- id: host_meeting
  label: Host Meeting Switch (Momentary)
  kind: action
  command: "HOSTMEETING {host}<CR><LF>"
  params:
    - name: host
      type: integer
      description: "1=Laptop USB-C, 2=Laptop USB-B/HDMI"
  notes: Momentary - preconfigured modes resume on USB/HDMI events. REST /api/v1/hostMeeting. RX returns host=<host>.

- id: hostname
  label: Device Hostname
  kind: action
  command: "HOSTNAME {hostname}<CR><LF>"
  params:
    - name: hostname
      type: string
      description: "Network + USB HID name; no space characters"
  notes: REST /api/v1/hostname. RX returns HOSTNAME=<src>.

- id: http_en
  label: HTTP (REST) Control Enable
  kind: action
  command: "HTTPEN {enable}<CR><LF>"
  params:
    - name: enable
      type: integer
      description: "0=OFF, 1=ON"
  notes: REST /api/v1/httpEn. RX returns ENABLE=<enable>.

- id: network
  label: Network Settings
  kind: action
  command: "NETWORK {mode} {ip} {netmask} {gateway}<CR><LF>"
  params:
    - name: mode
      type: string
      description: "static or dhcp"
    - name: ip
      type: string
      description: "e.g. 192.168.0.20 (required if static)"
    - name: netmask
      type: string
      description: "e.g. 255.255.0.0 (required if static)"
    - name: gateway
      type: string
      description: "e.g. 192.168.0.1 (optional)"
  notes: REST /api/v1/network. RX returns MODE/IP/NETMASK/GATEWAY lines.

- id: op_mode
  label: Operation Mode
  kind: action
  command: "OPMODE {opMode}<CR><LF>"
  params:
    - name: opMode
      type: integer
      description: "1=Auto [default], 2=Custom"
  notes: REST /api/v1/opMode. RX returns OPMODE=<src>.

- id: prior_display_src
  label: Display Source Priority
  kind: action
  command: "PRIORDISPLAYSRC {src}<CR><LF>"
  params:
    - name: src
      type: integer
      description: "1=Laptop USB-C, 2=Laptop HDMI, 3=Last detected [default]"
  notes: Applicable when opMode=Custom and displaySwMode=automatic/manual-fallback. REST /api/v1/priorDisplaySrc.

- id: prior_host_meeting
  label: Host System Priority
  kind: action
  command: "PRIORHOSTMEETING {host}<CR><LF>"
  params:
    - name: host
      type: integer
      description: "1=Laptop USB-C, 2=Laptop USB-B/HDMI, 3=Last detected [default]"
  notes: Applicable when opMode=Auto. REST /api/v1/priorHostMeeting.

- id: prior_usb_host
  label: USB Host Priority
  kind: action
  command: "PRIORUSBHOST {host}<CR><LF>"
  params:
    - name: host
      type: integer
      description: "1=Laptop USB-C, 2=Laptop USB-B, 3=Last detected [default]"
  notes: Applicable when opMode=Custom and usbHostSwMode=automatic/manual-fallback. REST /api/v1/priorUsbHost.

- id: reboot
  label: Reboot Device
  kind: action
  command: "REBOOT<CR><LF>"
  params: []
  notes: TX-only. REST /api/v1/reboot.

- id: rstr
  label: Restore Factory Defaults
  kind: action
  command: "RSTR<CR><LF>"
  params: []
  notes: Resets incl. password + REST token. REST /api/v1/rstr. Source marks RX (returns ACK).

- id: scaler
  label: HDMI Output Scaler
  kind: action
  command: "SCALER {output} {enable}<CR><LF>"
  params:
    - name: output
      type: integer
      description: "0=Display output"
    - name: enable
      type: integer
      description: "0=OFF, 1=ON"
  notes: REST /api/v1/scaler. RX returns ENABLE=<enable>.

- id: status
  label: Device Status
  kind: query
  command: "STATUS<CR><LF>"
  params: []
  notes: RX-only. Returns laptop info, display + output timings. REST /api/v1/status.

- id: telnet_en
  label: Telnet Control Enable
  kind: action
  command: "TELNETEN {enable}<CR><LF>"
  params:
    - name: enable
      type: integer
      description: "0=OFF [default], 1=ON"
  notes: REST /api/v1/telnetEn. RX returns ENABLE=<enable>.

- id: tunneling_en
  label: TCP↔RS232 Tunneling Enable (port 5000)
  kind: action
  command: "TUNNELINGEN {enable} {baudrate} {dataBits} {stopBits} {parity}<CR><LF>"
  params:
    - name: enable
      type: integer
      description: "0=OFF [default], 1=ON"
    - name: baudrate
      type: integer
      description: "0=9600,1=19200,2=38400,3=115200 (optional)"
    - name: dataBits
      type: integer
      description: "0=7,1=8,2=9 (optional)"
    - name: stopBits
      type: integer
      description: "0=1,1=2 (optional)"
    - name: parity
      type: integer
      description: "0=none,1=even,2=odd (optional)"
  notes: Enabling DISABLES device serial-protocol API (raw bridge mode). REST /api/v1/tunnelingEn.

- id: usbc_4k60_en
  label: USB-C 4K60 Mode
  kind: action
  command: "USBC4K60EN {mode}<CR><LF>"
  params:
    - name: mode
      type: integer
      description: "0=Disable 4K60 [default] (USB3.0 + 4K30), 1=Enable 4K60 (USB3.0 disabled, USB2.0 active)"
  notes: REST /api/v1/usbc4K60En. RX returns USBC4K60EN=<mode>.

- id: usb_dev_en
  label: USB Device Port Power Per Host
  kind: action
  command: "USBDEVEN {host} {devices}<CR><LF>"
  params:
    - name: host
      type: integer
      description: "1=Laptop USB-C, 2=Laptop HDMI, 3=When no host detected"
    - name: devices
      type: integer
      description: "Bitmask USB1/USB2/USB3: 0=all OFF,1=USB1,2=USB2,3=USB1+2,4=USB3,5=USB1+3,6=USB2+3,7=all ON"
  notes: REST /api/v1/usbDevEn. RX returns DEVICES=<devices>.

- id: usb_host
  label: Select USB Host
  kind: action
  command: "USBHOST {host}<CR><LF>"
  params:
    - name: host
      type: integer
      description: "1=Laptop USB-C, 2=Laptop USB-B, 3=OFF"
  notes: REST /api/v1/usbHost. RX returns USBHOST=<host>.

- id: usb_host_sw_mode
  label: USB Host Switching Mode
  kind: action
  command: "USBHOSTSWMODE {swMode}<CR><LF>"
  params:
    - name: swMode
      type: integer
      description: "0=Automatic [default],1=Manual,2=Manual w/ fallback,3=USB follows HDMI"
  notes: Requires opMode=Custom. REST /api/v1/usbHostSwMode. RX returns USBHOSTSWMODE=<host>.

- id: version
  label: Firmware Version
  kind: query
  command: "VERSION<CR><LF>"
  params: []
  notes: RX-only. Returns MAJOR=<int> MINOR=<int>. REST /api/v1/version.

- id: vout
  label: VOUT Terminal Level
  kind: action
  command: "VOUT {vout}<CR><LF>"
  params:
    - name: vout
      type: integer
      description: "0=Controlled by firmware,1=Logic-low,2=Logic-high"
  notes: Overrides default BYOM LED drive. REST /api/v1/vout. RX returns VOUT=<vout>.

# --- Transport-specific commands (not part of shared RS232/REST API above) ---

- id: telnet_quit
  label: Telnet Disconnect
  kind: action
  command: "quit"
  params: []
  notes: Telnet-only. Asks server to close the TCP connection.

- id: rest_change_password
  label: REST Change Password
  kind: action
  command: "POST https://<IP>/api/v1/changePassword"
  params:
    - name: oldPassword
      type: string
      description: current password
    - name: newPassword
      type: string
      description: new password
  notes: REST-only. Body JSON {oldPassword,newPassword}. Returns {message}.

- id: rest_access_token_get
  label: REST Get Bearer Token
  kind: query
  command: "GET https://<IP>/api/v1/accessToken"
  params: []
  notes: REST-only. Returns {token, message}. Token = alphanumeric A-Z a-z 0-9.

- id: rest_access_token_post
  label: REST Generate + Activate Bearer Auth
  kind: action
  command: "POST https://<IP>/api/v1/accessToken"
  params: []
  notes: REST-only. Generates random token, activates bearer auth for REST API.

- id: rest_access_token_delete
  label: REST Delete + Deactivate Bearer Token
  kind: action
  command: "DELETE https://<IP>/api/v1/accessToken"
  params: []
  notes: REST-only. Returns {message}.

- id: rest_access_token_en
  label: REST Enable/Disable Access Token
  kind: action
  command: "GET https://<IP>/api/v1/accessTokenEn?enable={enable}"
  params:
    - name: enable
      type: integer
      description: "1=activate, 0=deactivate"
  notes: REST-only. Returns {message}.

Feedbacks

- id: ack
  type: enum
  values: ["ACK"]
  description: Success acknowledgement, "ACK<CR><LF>"

- id: nack
  type: enum
  values: ["NACK"]
  description: Failure acknowledgement, "NACK<CR><LF>"

- id: rest_result
  type: object
  description: REST calls return HTTP 200 (success) / 400 (error) / 401 (auth error) with JSON {message:<string>}; query endpoints additionally return the state field.
# Each Get/Set command also yields an RX response line (e.g. DISPLAYSRC=<src>, USBHOST=<host>) -
# see per-action notes. No unsolicited event stream documented.

Variables

# UNRESOLVED: all settable parameters are expressed as discrete actions above; no separate continuous variable set documented.

Events

# UNRESOLVED: no unsolicited notifications documented in source. Device responds only to requests.

Macros

# UNRESOLVED: no multi-step sequences explicitly documented in source.

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no explicit safety warnings, interlock procedures, or power-on
# sequencing requirements. GPI supported voltage range (0-12V max) and VOUT logic levels are
# electrical specs, not command-level interlocks. REBOOT / RSTR are destructive-ish but carry
# no documented confirmation procedure.

Notes

  • RS232 terminal block pinout (back of device): Pin1=RX, Pin2=GND, Pin3=TX, Pin4=+5V (for INOGENI Remote). SW6 DIP must be ON to enable 5V on terminal block.
  • Command syntax: space between mnemonic and argument(s); terminate every command with <CR><LF>.
  • Shared API: RS232 and REST use the same command names (RS232 = uppercase mnemonic, REST = camelCase path under /api/v1/). REST also accepts args embedded in URL query string: GET /api/v1/<cmd>?<arg>=value.
  • TCP↔RS232 tunnel (port 5000) is mutually exclusive with the serial-protocol API — enabling tunneling disables the documented command set on the serial side.
  • REST uses self-signed HTTPS certificates.
  • opMode=Auto vs Custom governs which switching-mode / priority commands are applicable (see per-action notes and "Operating Modes" in source).
  • "USB follows HDMI" and "HDMI follows USB" cannot be set simultaneously.

Provenance

source_domains:
  - inogeni.com
source_urls:
  - https://inogeni.com/toggle-dock-2x1-user-guide
  - https://inogeni.com/support/software-tools/
retrieved_at: 2026-06-29T22:55:20.427Z
last_checked_at: 2026-06-30T07:10:05.387Z

Verification Summary

verdict: verified
checked_at: 2026-06-30T07:10:05.387Z
matched_actions: 42
action_count: 42
confidence: medium
summary: "All 42 spec actions verified against source table; transport parameters confirmed; comprehensive one-to-one coverage. (9 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "firmware version compatibility not stated in source."
- "GPI/VOUT voltage levels stated electrically but no control-via-command safety interlock documented."
- "all settable parameters are expressed as discrete actions above; no separate continuous variable set documented."
- "no unsolicited notifications documented in source. Device responds only to requests."
- "no multi-step sequences explicitly documented in source."
- "source contains no explicit safety warnings, interlock procedures, or power-on"
- "firmware version compatibility ranges not stated."
- "exact voltage/current/power specs intentionally not populated (Tier 3)."
- "no documented unsolicited event/notification protocol."

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