Summary

The INOGENI TOGGLE ROOMS is a USB-C/HDMI conferencing room switcher that routes USB and HDMI sources between a RoomPC and a laptop, with share and display outputs. Control is provided over a unified API accessible via RS-232 serial, telnet (TCP port 23), TCP-to-RS232 tunneling (TCP port 5000), and a REST API (https://<IP>/api/v1/). The serial and REST interfaces share the same command set.

Transport

protocols:
  - tcp
  - serial
  - http
serial:
  baud_rate: 9600  # default; source also lists 19200, 38400, 115200 as configurable
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
addressing:
  # telnet control
  telnet_port: 23
  # TCP-to-RS232 tunnel bridge
  tunnel_port: 5000
  # REST API base URL (self-signed HTTPS)
  base_url: "https://<IP>/api/v1/"
auth:
  # Source: "By default, no authentication is required to perform action using the REST API.
  # Authentication can be enabled through the embedded webpage or the REST API itself."
  type: none  # default; bearer token auth (Authorization: Bearer <token>) optionally enabled via API/config

Traits

traits:
  - routable   # inferred: USB host, display source, share source routing commands present
  - queryable  # inferred: HELP, STATUS, VERSION, and per-command RX query forms present
  - levelable  # inferred: CEC volume up/down, mute toggle present

Actions

# RS232 payload form: "<COMMAND> <ARG1> <ARG2>...<CR><LF>" (space between command and args;
# <CR><LF> terminator required). REST form: GET/POST https://<IP>/api/v1/<cmd>?<arg>=val
# TX = set (args present); RX = query (no args / first arg only). ACK<CR><LF> = success,
# NACK<CR><LF> = failure.

- id: auto_hdmi_cec_pwr
  label: Auto HDMI CEC Power
  kind: action
  command: "AUTOHDMICECPWR {enable}"  # REST: GET/POST autoHdmiCecPwr?enable=
  params:
    - name: enable
      type: integer
      description: "0=OFF, 1=ON"

- id: baudrate
  label: RS232 Baud Rate
  kind: action
  command: "BAUDRATE {baudrate}"  # REST: baudrate?baudrate=
  params:
    - name: baudrate
      type: integer
      description: "0=9600, 1=19200, 2=38400, 3=115200"

- id: btn_lock
  label: Button Lock
  kind: action
  command: "BTNLOCK {lockState}"  # REST: btnLock?btnLock=
  params:
    - name: lockState
      type: integer
      description: "0=Not locked, 1=Locked"

- id: cec_passthrough_en
  label: CEC Passthrough Enable
  kind: action
  command: "CECPASSTHROUGHEN {enable}"  # REST: cecPassthroughEn?enable=
  params:
    - name: enable
      type: integer
      description: "0=OFF, 1=ON (default)"

- id: cec_toggle_mute
  label: CEC Toggle Mute
  kind: action
  command: "CECTOGGLEMUTE"  # REST: cecToggleMute
  params: []

- id: cec_vol_down
  label: CEC Volume Down
  kind: action
  command: "CECVOLDOWN"  # REST: cecVolDown
  params: []

- id: cec_vol_up
  label: CEC Volume Up
  kind: action
  command: "CECVOLUP"  # REST: cecVolUp
  params: []

- id: display_src
  label: Display Source
  kind: action
  command: "DISPLAYSRC {src}"  # REST: displaySrc?displaySrc=
  params:
    - name: src
      type: integer
      description: "0=RoomPC, 1=Laptop USB-C, 2=Laptop HDMI, 3=OFF"

- id: display_sw_mode
  label: Display Switching Mode
  kind: action
  command: "DISPLAYSWMODE {swMode}"  # REST: displaySwMode?displaySwMode=
  params:
    - name: swMode
      type: integer
      description: "0=Automatic (default), 1=Manual, 2=Manual with fallback, 3=HDMI follows USB"

- id: edid
  label: EDID Mode
  kind: action
  command: "EDID {src} {edid}"  # REST: edid?src=&edid=
  params:
    - name: src
      type: integer
      description: "0=RoomPC, 1=Laptop USB-C, 2=Laptop HDMI"
    - name: edid
      type: integer
      description: "0=Passthrough, 1=User EDID, 2=3840x2160p60, 3=3840x2160p50, 4=3840x2160p30, 5=3840x2160p25, 6=1920x1080p60, 7=1920x1080p50, 8=1280x720p60, 9=1280x720p50, 10=5120x2160p30, 11=5120x2160p25"

- id: edid_hdmi_out
  label: EDID HDMI Out (sink report)
  kind: action
  command: "EDIDHDMIOUT {sink} {src}"  # REST: edidHdmiOut?sink=&src=
  params:
    - name: sink
      type: integer
      description: "0=Display, 1=SHARE OUT"
    - name: src
      type: integer
      description: "0=RoomPC, 1=Laptop USB-C, 2=Laptop HDMI"

- id: edid_usr
  label: User EDID
  kind: action
  command: "EDIDUSR {src} {edidUsr256bytes}"  # REST: edidUsr?src=&edidUsr=
  params:
    - name: src
      type: integer
      description: "0=RoomPC, 1=Laptop USB-C, 2=Laptop HDMI"
    - name: edidUsr
      type: string
      description: "256-byte array EDID"

- id: gpi_cfg
  label: GPI Configuration
  kind: action
  command: "GPICFG {gpi} {mode} {function}"  # REST: gpiCfg?gpi=&mode=&function=
  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=BYOM mode control, 2=USB host control, 3=Display video source control, 4=Share output video source control"

- id: hdcp_ctl
  label: HDCP Control
  kind: action
  command: "HDCPCTL {src} {hdcp}"  # REST: hdcpCtl?src=&hdcp=
  params:
    - name: src
      type: integer
      description: "0=RoomPC, 1=Laptop USB-C, 2=Laptop HDMI"
    - name: hdcp
      type: integer
      description: "0=Disabled, 1=HDCP v1.4, 2=HDCP v2.2, 3=Auto"

- id: help
  label: Help
  kind: query
  command: "HELP"  # REST: help
  params: []

- id: host_button
  label: Host Button Trigger
  kind: action
  command: "HOSTBUTTON"  # REST: hostButton
  params: []

- id: host_meeting
  label: Host Meeting
  kind: action
  command: "HOSTMEETING {host}"  # REST: hostMeeting?host=
  params:
    - name: host
      type: integer
      description: "0=RoomPC, 1=Laptop USB-C, 2=Laptop USB-B/HDMI"

- id: hostname
  label: Hostname
  kind: action
  command: "HOSTNAME {hostname}"  # REST: hostname?hostname=
  params:
    - name: hostname
      type: string
      description: "Hostname string, no spaces"

- id: http_en
  label: HTTP Enable
  kind: action
  command: "HTTPEN {enable}"  # REST: httpEn?enable=
  params:
    - name: enable
      type: integer
      description: "0=OFF, 1=ON"

- id: network
  label: Network Settings
  kind: action
  command: "NETWORK {mode} {ip} {netmask} {gateway}"  # REST: network?mode=&ip=&netmask=&gateway=
  params:
    - name: mode
      type: string
      description: "static or dhcp"
    - name: ip
      type: string
      description: "IP address (static mode)"
    - name: netmask
      type: string
      description: "Netmask (static mode)"
    - name: gateway
      type: string
      description: "Gateway (static mode, optional)"

- id: op_mode
  label: Operation Mode
  kind: action
  command: "OPMODE {opMode}"  # REST: opMode?opMode=
  params:
    - name: opMode
      type: integer
      description: "0=RoomPC/BYOD content sharing (default), 1=BYOM, 2=Custom"

- id: prior_display_src
  label: Display Source Priority
  kind: action
  command: "PRIORDISPLAYSRC {src}"  # REST: priorDisplaySrc?priorDisplaySrc=
  params:
    - name: src
      type: integer
      description: "0=RoomPC, 1=Laptop USB-C, 2=Laptop HDMI, 3=Last detected (default)"

- id: prior_host_meeting
  label: Host Meeting Priority
  kind: action
  command: "PRIORHOSTMEETING {host}"  # REST: priorHostMeeting?priorHostMeeting=
  params:
    - name: host
      type: integer
      description: "1=Laptop USB-C, 2=Laptop USB-B/HDMI, 3=Last detected laptop (default)"

- id: prior_share_src
  label: Share Source Priority
  kind: action
  command: "PRIORSHARESRC {src}"  # REST: priorShareSrc?priorShareSrc=
  params:
    - name: src
      type: integer
      description: "0=RoomPC, 1=Laptop USB-C, 2=Laptop HDMI, 3=Last detected (default)"

- id: prior_usb_host
  label: USB Host Priority
  kind: action
  command: "PRIORUSBHOST {host}"  # REST: priorUsbHost?priorUsbHost=
  params:
    - name: host
      type: integer
      description: "0=RoomPC, 1=Laptop USB-C, 2=Laptop USB-B, 3=Last detected host (default)"

- id: reboot
  label: Reboot
  kind: action
  command: "REBOOT"  # REST: reboot
  params: []

- id: rstr
  label: Restore Defaults
  kind: action
  command: "RSTR"  # REST: rstr
  params: []

- id: scaler
  label: Scaler
  kind: action
  command: "SCALER {output} {enable}"  # REST: scaler?output=&enable=
  params:
    - name: output
      type: integer
      description: "0=Display output, 1=Share output"
    - name: enable
      type: integer
      description: "0=OFF, 1=ON"

- id: share_src
  label: Share Source
  kind: action
  command: "SHARESRC {src}"  # REST: shareSrc?shareSrc=
  params:
    - name: src
      type: integer
      description: "0=RoomPC (not in auto mode), 1=Laptop USB-C, 2=Laptop HDMI, 3=OFF"

- id: share_sw_mode
  label: Share Switching Mode
  kind: action
  command: "SHARESWMODE {swMode}"  # REST: shareSwMode?shareSwMode=
  params:
    - name: swMode
      type: integer
      description: "0=Automatic (default), 1=Manual, 2=Manual with fallback, 3=HDMI follows USB"

- id: status
  label: Status
  kind: query
  command: "STATUS"  # REST: status
  params: []

- id: telnet_en
  label: Telnet Enable
  kind: action
  command: "TELNETEN {enable}"  # REST: telnetEn?enable=
  params:
    - name: enable
      type: integer
      description: "0=OFF (default), 1=ON"

- id: tunneling_en
  label: TCP-RS232 Tunneling Enable
  kind: action
  command: "TUNNELINGEN {enable} {baudrate} {dataBits} {stopBits} {parity}"  # REST: tunnelingEn
  params:
    - name: enable
      type: integer
      description: "0=OFF (default), 1=ON"
    - name: baudrate
      type: integer
      description: "0=9600, 1=19200, 2=38400, 3=115200"
    - name: dataBits
      type: integer
      description: "0=7, 1=8, 2=9"
    - name: stopBits
      type: integer
      description: "0=1, 1=2"
    - name: parity
      type: integer
      description: "0=none, 1=even, 2=odd"

- id: usbc_4k60_en
  label: USB-C 4K60 Mode
  kind: action
  command: "USBC4K60EN {mode}"  # REST: usbc4K60En?usbc4K60En=
  params:
    - name: mode
      type: integer
      description: "0=Disable 4K60 (default), 1=Enable 4K60 (disables USB3.0)"

- id: usb_dev_en
  label: USB Device Power Enable
  kind: action
  command: "USBDEVEN {host} {devices}"  # REST: usbDevEn?host=&devices=
  params:
    - name: host
      type: integer
      description: "0=RoomPC, 1=Laptop USB-C, 2=Laptop HDMI, 3=When no host detected"
    - name: devices
      type: integer
      description: "Bitmask (USB1|USB2<<1|USB3<<2); 0-7"

- id: usb_host
  label: USB Host
  kind: action
  command: "USBHOST {host}"  # REST: usbHost?host=
  params:
    - name: host
      type: integer
      description: "0=RoomPC, 1=Laptop USB-C, 2=Laptop USB-B, 3=OFF"

- id: usb_host_sw_mode
  label: USB Host Switching Mode
  kind: action
  command: "USBHOSTSWMODE {swMode}"  # REST: usbHostSwMode?usbHostSwMode=
  params:
    - name: swMode
      type: integer
      description: "0=Automatic (default), 1=Manual, 2=Manual with fallback, 3=USB follows HDMI"

- id: version
  label: Firmware Version
  kind: query
  command: "VERSION"  # REST: version
  params: []

- id: vout
  label: VOUT Level
  kind: action
  command: "VOUT {vout}"  # REST: vout?vout=
  params:
    - name: vout
      type: integer
      description: "0=Controlled by firmware, 1=Logic-low, 2=Logic-high"

- id: telnet_quit
  label: Telnet Quit (disconnect)
  kind: action
  command: "quit"  # telnet-only; asks server for disconnection
  params: []

# REST-only auth/token management endpoints (not part of shared RS232 API)

- id: change_password
  label: Change Password
  kind: action
  command: "POST https://<IP>/api/v1/changePassword"
  params:
    - name: oldPassword
      type: string
    - name: newPassword
      type: string

- id: get_access_token
  label: Get Access Token
  kind: query
  command: "GET https://<IP>/api/v1/accessToken"
  params: []

- id: gen_access_token
  label: Generate/Activate Access Token
  kind: action
  command: "POST https://<IP>/api/v1/accessToken"
  params: []

- id: delete_access_token
  label: Delete/Deactivate Access Token
  kind: action
  command: "DELETE https://<IP>/api/v1/accessToken"
  params: []

- id: access_token_en
  label: Access Token Enable
  kind: action
  command: "GET https://<IP>/api/v1/accessTokenEn?enable="
  params:
    - name: enable
      type: integer
      description: "1=activate, 0=deactivate"

Feedbacks

- id: ack
  type: string
  values: ["ACK"]
  description: "ACK<CR><LF> returned on command success."

- id: nack
  type: string
  values: ["NACK"]
  description: "NACK<CR><LF> returned on command failure."

- id: http_status_code
  type: enum
  values: [200, 400, 401]
  description: "200=success, 400=error, 401=authorization error."

- id: enable_response
  type: string
  description: "ENABLE=<enable> returned by AUTOHDMICECPWR?, CECPASSTHROUGHEN?, HTTPEN?, TELNETEN? RX forms."

- id: baudrate_response
  type: string
  description: "BAUDRATE=<baudrate> returned by BAUDRATE? RX form."

- id: btnlock_response
  type: string
  description: "BTNLOCK=<lockState> returned by BTNLOCK? RX form."

- id: displaysrc_response
  type: string
  description: "DISPLAYSRC=<src> returned by DISPLAYSRC? RX form."

- id: displayswmode_response
  type: string
  description: "DISPLAYSWMODE=<swMode> returned by DISPLAYSWMODE? RX form."

- id: edid_response
  type: string
  description: "EDID=<edid> returned by EDID RX form."

- id: hostname_response
  type: string
  description: "HOSTNAME=<hostname> returned by HOSTNAME? RX form."

- id: hdcp_response
  type: string
  description: "HDCP=<hdcp> returned by HDCPCTL RX form."

- id: opmode_response
  type: string
  description: "OPMODE=<opMode> returned by OPMODE? RX form."

- id: prior_displaysrc_response
  type: string
  description: "PRIORDISPLAYSRC=<src> returned by PRIORDISPLAYSRC? RX form."

- id: prior_host_meeting_response
  type: string
  description: "PRIORHOSTMEETING=<host> returned by PRIORHOSTMEETING? RX form."

- id: prior_share_src_response
  type: string
  description: "PRIORSHARESRC=<src> returned by PRIORSHARESRC? RX form."

- id: prior_usb_host_response
  type: string
  description: "PRIORUSBHOST=<host> returned by PRIORUSBHOST? RX form."

- id: sharesrc_response
  type: string
  description: "SHARESRC=<src> returned by SHARESRC? RX form."

- id: share_sw_mode_response
  type: string
  description: "SHARESWMODE=<swMode> returned by SHARESWMODE? RX form."

- id: scaler_enable_response
  type: string
  description: "ENABLE=<enable> returned by SCALER RX form."

- id: tunneling_response
  type: string
  description: "ENABLE/BAUDRATE/DATABITS/STOPBITS/PARITY lines returned by TUNNELINGEN RX form."

- id: usbhost_response
  type: string
  description: "USBHOST=<host> returned by USBHOST? RX form."

- id: usb_host_sw_mode_response
  type: string
  description: "USBHOSTSWMODE=<swMode> returned by USBHOSTSWMODE? RX form."

- id: usbc4k60en_response
  type: string
  description: "USBC4K60EN=<mode> returned by USBC4K60EN? RX form."

- id: usb_dev_response
  type: string
  description: "DEVICES=<devices> returned by USBDEVEN RX form."

- id: vout_response
  type: string
  description: "VOUT=<vout> returned by VOUT? RX form."

- id: version_response
  type: object
  description: "MAJOR=<Integer>, MINOR=<Integer> lines returned by VERSION."

Variables

# Settable parameters with continuous/enum state, tracked separate from discrete actions.
# All commands here are Get/Set; current state queryable via RX form.
# UNRESOLVED: persistence behavior across reboots not documented per-command.

Events

# Source documents no unsolicited push notifications. Device responds only to queries.
# UNRESOLVED: no event/notification mechanism documented in source.

Macros

# Source documents no explicit multi-step macro sequences.
# UNRESOLVED: no macros documented in source.

Safety

confirmation_required_for:
  - reboot     # device reboot, will interrupt all in-progress routing
  - rstr       # factory restore, wipes password and REST API token
interlocks:
  - "Enabling TCP-to-RS232 tunneling (TUNNELINGEN 1) disables the device's own Serial communication protocol."
  - "Enabling USBC4K60 (USBC4K60EN 1) disables USB 3.0 on USB-C port; USB 2.0 remains active."
  - "EDIDHDMIOUT sets the associated source EDID mode to 'User EDID'."
# UNRESOLVED: power-on sequencing requirements not explicitly documented in source.

Notes

  • All RS232/telnet commands require a space character between the command name and argument, terminated with <CR><LF>.
  • Success response: ACK<CR><LF>. Failure response: NACK<CR><LF>.
  • REST API uses self-signed HTTPS certificates.
  • RS232 terminal block pinout: Pin 1=RX, Pin 2=GND, Pin 3=TX, Pin 4=5V supply (for INOGENI Remote).
  • Default RS232 config: 9600 baud, 8 data bits, 1 stop bit, no parity, no flow control.
  • REST API query form (alternative to JSON body): GET https://<IP>/api/v1/<COMMAND>?<ARG1>=value&<ARG2>=value.
  • Telnet default port: 23. TCP-to-RS232 tunnel default port: 5000.
  • Web interface accessible via mDNS URL toggle-rooms-<last3macbytes>.local (firmware v1.25+).
  • DIP switch SW6: OFF=disable 5V on terminal block, ON=enable 5V (required to power connected remote). SW1–SW5 reserved/future use.

## Provenance

```yaml
source_domains:
  - inogeni.com
source_urls:
  - https://inogeni.com/documents/toggle-rooms/INOGENI-TOGGLE-ROOMS_User-Guide-V1-6.pdf
  - https://inogeni.com/plugin-qsys-toggle-series/
  - https://inogeni.com/plugin-crestron-togglerooms/
retrieved_at: 2026-06-29T22:51:33.893Z
last_checked_at: 2026-06-30T07:10:06.133Z

Verification Summary

verdict: verified
checked_at: 2026-06-30T07:10:06.133Z
matched_actions: 45
action_count: 45
confidence: medium
summary: "All 45 spec actions matched exactly in source with complete bidirectional coverage; all transport parameters verified verbatim. (9 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "device power specifications, fault behavior, firmware compatibility ranges not stated in source"
- "persistence behavior across reboots not documented per-command."
- "no event/notification mechanism documented in source."
- "no macros documented in source."
- "power-on sequencing requirements not explicitly documented in source."
- "device electrical specifications (voltage/current/power) not in source excerpt"
- "fault behavior and error recovery sequences not documented"
- "firmware version compatibility ranges not stated"
- "bearer token format/length beyond alphanumeric+0-9 not specified"

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