Summary

TiVo DVR TCP remote control protocol (v1.1). ASCII command set over TCP port 31339 for channel tuning, UI navigation, and simulated remote button presses. No authentication.

Transport

protocols:
  - tcp
addressing:
  port: 31339
auth:
  type: none  # inferred: no auth procedure in source

Traits

# UNRESOLVED: no explicit power on/off commands in source. DVR power is not controlled via this protocol - Network Remote Control must first be enabled via UI. Not adding powerable trait.
# - routable        (input/source switching not present)
# - queryable       (no query commands returning device state)

Actions

- id: forcech
  label: Force Channel Change
  kind: action
  command: "FORCECH {channel}"
  params:
    - name: channel
      type: integer
      description: Channel number 1 to max in lineup
    - name: sub_channel
      type: integer
      description: Sub-channel number (optional)
  notes: Cancels in-progress recording. DVR must be in Live TV.

- id: forcech_sub
  label: Force Channel Change (sub-channel)
  kind: action
  command: "FORCECH {channel} {sub_channel}"
  params:
    - name: channel
      type: integer
      description: Channel number
    - name: sub_channel
      type: integer
      description: Sub-channel number
  notes: Redundant with forcech when sub_channel provided; included for completeness per source syntax listing.

- id: setch
  label: Set Channel
  kind: action
  command: "SETCH {channel}"
  params:
    - name: channel
      type: integer
      description: Channel number 1 to max in lineup
    - name: sub_channel
      type: integer
      description: Sub-channel number (optional)
  notes: Fails if recording in progress. DVR must be in Live TV.

- id: setch_sub
  label: Set Channel (sub-channel)
  kind: action
  command: "SETCH {channel} {sub_channel}"
  params:
    - name: channel
      type: integer
      description: Channel number
    - name: sub_channel
      type: integer
      description: Sub-channel number
  notes: Redundant with setch when sub_channel provided.

- id: ircode
  label: Send IR Code
  kind: action
  command: "IRCODE {code}"
  params:
    - name: code
      type: string
      description: IR code name from Appendix A (e.g. SELECT, UP, DOWN, PLAY, PAUSE)
  notes: Code always processed; effect depends on UI state.

- id: keyboard
  label: Send Keyboard Code
  kind: action
  command: "KEYBOARD {code}"
  params:
    - name: code
      type: string
      description: Keyboard key name from Appendix A (e.g. A-Z, LSHIFT, SPACE)
  notes: Shift modifiers apply to next KEYBOARD command only.

- id: teleport
  label: Teleport to Screen
  kind: action
  command: "TELEPORT {screen}"
  params:
    - name: screen
      type: enum
      values: [TIVO, LIVETV, GUIDE, NOWPLAYING]
      description: Target UI screen
  notes: LIVETV returns LIVETV_READY; other targets return no response. Fails during Guided Setup.

# Appendix A button codes - each code as separate action per source enumeration.
- id: ircode_up
  label: IR Code Up
  kind: action
  command: "IRCODE UP"
  params: []

- id: ircode_down
  label: IR Code Down
  kind: action
  command: "IRCODE DOWN"
  params: []

- id: ircode_left
  label: IR Code Left
  kind: action
  command: "IRCODE LEFT"
  params: []

- id: ircode_right
  label: IR Code Right
  kind: action
  command: "IRCODE RIGHT"
  params: []

- id: ircode_select
  label: IR Code Select
  kind: action
  command: "IRCODE SELECT"
  params: []

- id: ircode_tivo
  label: IR Code TiVo
  kind: action
  command: "IRCODE TIVO"
  params: []

- id: ircode_livetv
  label: IR Code Live TV
  kind: action
  command: "IRCODE LIVETV"
  params: []

- id: ircode_guide
  label: IR Code Guide
  kind: action
  command: "IRCODE GUIDE"
  params: []

- id: ircode_info
  label: IR Code Info
  kind: action
  command: "IRCODE INFO"
  params: []

- id: ircode_exit
  label: IR Code Exit
  kind: action
  command: "IRCODE EXIT"
  params: []

- id: ircode_thumbsup
  label: IR Code Thumbs Up
  kind: action
  command: "IRCODE THUMBSUP"
  params: []

- id: ircode_thumbsdown
  label: IR Code Thumbs Down
  kind: action
  command: "IRCODE THUMBSDOWN"
  params: []

- id: ircode_channelup
  label: IR Code Channel Up
  kind: action
  command: "IRCODE CHANNELUP"
  params: []

- id: ircode_channeldown
  label: IR Code Channel Down
  kind: action
  command: "IRCODE CHANNELDOWN"
  params: []

- id: ircode_mute
  label: IR Code Mute
  kind: action
  command: "IRCODE MUTE"
  params: []

- id: ircode_volumedown
  label: IR Code Volume Down
  kind: action
  command: "IRCODE VOLUMEDOWN"
  params: []

- id: ircode_volumeup
  label: IR Code Volume Up
  kind: action
  command: "IRCODE VOLUMEUP"
  params: []

- id: ircode_tvinput
  label: IR Code TV Input
  kind: action
  command: "IRCODE TVINPUT"
  params: []

- id: ircode_video_mode_fixed_480i
  label: IR Code Video Mode 480i
  kind: action
  command: "IRCODE VIDEO_MODE_FIXED_480i"
  params: []

- id: ircode_video_mode_fixed_480p
  label: IR Code Video Mode 480p
  kind: action
  command: "IRCODE VIDEO_MODE_FIXED_480p"
  params: []

- id: ircode_video_mode_fixed_720p
  label: IR Code Video Mode 720p
  kind: action
  command: "IRCODE VIDEO_MODE_FIXED_720p"
  params: []

- id: ircode_video_mode_fixed_1080i
  label: IR Code Video Mode 1080i
  kind: action
  command: "IRCODE VIDEO_MODE_FIXED_1080i"
  params: []

- id: ircode_video_mode_hybrid
  label: IR Code Video Mode Hybrid
  kind: action
  command: "IRCODE VIDEO_MODE_HYBRID"
  params: []

- id: ircode_video_mode_hybrid_720p
  label: IR Code Video Mode Hybrid 720p
  kind: action
  command: "IRCODE VIDEO_MODE_HYBRID_720p"
  params: []

- id: ircode_video_mode_hybrid_1080i
  label: IR Code Video Mode Hybrid 1080i
  kind: action
  command: "IRCODE VIDEO_MODE_HYBRID_1080i"
  params: []

- id: ircode_video_mode_native
  label: IR Code Video Mode Native
  kind: action
  command: "IRCODE VIDEO_MODE_NATIVE"
  params: []

- id: ircode_cc_on
  label: IR Code CC On
  kind: action
  command: "IRCODE CC_ON"
  params: []

- id: ircode_cc_off
  label: IR Code CC Off
  kind: action
  command: "IRCODE CC_OFF"
  params: []

- id: ircode_options
  label: IR Code Options
  kind: action
  command: "IRCODE OPTIONS"
  params: []

- id: ircode_aspect_correction_full
  label: IR Code Aspect Full
  kind: action
  command: "IRCODE ASPECT_CORRECTION_FULL"
  params: []

- id: ircode_aspect_correction_panel
  label: IR Code Aspect Panel
  kind: action
  command: "IRCODE ASPECT_CORRECTION_PANEL"
  params: []

- id: ircode_aspect_correction_zoom
  label: IR Code Aspect Zoom
  kind: action
  command: "IRCODE ASPECT_CORRECTION_ZOOM"
  params: []

- id: ircode_aspect_correction_wide_zoom
  label: IR Code Aspect Wide Zoom
  kind: action
  command: "IRCODE ASPECT_CORRECTION_WIDE_ZOOM"
  params: []

- id: ircode_play
  label: IR Code Play
  kind: action
  command: "IRCODE PLAY"
  params: []

- id: ircode_forward
  label: IR Code Forward
  kind: action
  command: "IRCODE FORWARD"
  params: []

- id: ircode_reverse
  label: IR Code Reverse
  kind: action
  command: "IRCODE REVERSE"
  params: []

- id: ircode_pause
  label: IR Code Pause
  kind: action
  command: "IRCODE PAUSE"
  params: []

- id: ircode_slow
  label: IR Code Slow
  kind: action
  command: "IRCODE SLOW"
  params: []

- id: ircode_replay
  label: IR Code Replay
  kind: action
  command: "IRCODE REPLAY"
  params: []

- id: ircode_advance
  label: IR Code Advance
  kind: action
  command: "IRCODE ADVANCE"
  params: []

- id: ircode_record
  label: IR Code Record
  kind: action
  command: "IRCODE RECORD"
  params: []

- id: ircode_num0
  label: IR Code 0
  kind: action
  command: "IRCODE NUM0"
  params: []

- id: ircode_num1
  label: IR Code 1
  kind: action
  command: "IRCODE NUM1"
  params: []

- id: ircode_num2
  label: IR Code 2
  kind: action
  command: "IRCODE NUM2"
  params: []

- id: ircode_num3
  label: IR Code 3
  kind: action
  command: "IRCODE NUM3"
  params: []

- id: ircode_num4
  label: IR Code 4
  kind: action
  command: "IRCODE NUM4"
  params: []

- id: ircode_num5
  label: IR Code 5
  kind: action
  command: "IRCODE NUM5"
  params: []

- id: ircode_num6
  label: IR Code 6
  kind: action
  command: "IRCODE NUM6"
  params: []

- id: ircode_num7
  label: IR Code 7
  kind: action
  command: "IRCODE NUM7"
  params: []

- id: ircode_num8
  label: IR Code 8
  kind: action
  command: "IRCODE NUM8"
  params: []

- id: ircode_num9
  label: IR Code 9
  kind: action
  command: "IRCODE NUM9"
  params: []

- id: ircode_enter
  label: IR Code Enter
  kind: action
  command: "IRCODE ENTER"
  params: []

- id: ircode_clear
  label: IR Code Clear
  kind: action
  command: "IRCODE CLEAR"
  params: []

- id: ircode_action_a
  label: IR Code Action A
  kind: action
  command: "IRCODE ACTION_A"
  params: []

- id: ircode_action_b
  label: IR Code Action B
  kind: action
  command: "IRCODE ACTION_B"
  params: []

- id: ircode_action_c
  label: IR Code Action C
  kind: action
  command: "IRCODE ACTION_C"
  params: []

- id: ircode_action_d
  label: IR Code Action D
  kind: action
  command: "IRCODE ACTION_D"
  params: []

Feedbacks

- id: ch_status
  type: object
  description: Channel change status notification (broadcast to all clients on success)
  fields:
    - name: channel
      type: string
      description: 4-digit primary channel
    - name: sub_channel
      type: string
      description: 4-digit sub-channel (may be absent)
    - name: reason
      type: enum
      values: [REMOTE, LOCAL, RECORDING]
      description: Source of channel change

- id: ch_failed
  type: object
  description: Channel change failure (sent only to issuing client)
  fields:
    - name: reason
      type: enum
      values: [NO_LIVE, RECORDING, MISSING_CHANNEL, MALFORMED_CHANNEL, INVALID_CHANNEL]
      description: Failure reason code

- id: livetv_ready
  type: string
  description: Returned after TELEPORT LIVETV succeeds; signals DVR is in live TV mode. Clients must wait for this before issuing SETCH or FORCECH.

- id: missing_teleport_name
  type: string
  description: Returned when TELEPORT issued without required screen parameter

Variables

# UNRESOLVED: source documents no settable parameters beyond command arguments.

Events

# CH_STATUS is broadcast to all open clients on every channel change (including from physical remote or internal recording triggers). Treated as unsolicited notification.
- id: ch_status_broadcast
  description: CH_STATUS channel [sub_channel] reason - emitted to all clients on any channel change
  payload: "CH_STATUS {channel} [{sub_channel}] {reason}"

Macros

# UNRESOLVED: source documents no multi-step macro sequences.

Safety

confirmation_required_for: []
interlocks:
  - description: FORCECH cancels any recording in progress.
    source: "FORCECH section"
  - description: SETCH fails (CH_FAILED RECORDING) if recording is in progress.
    source: "SETCH failure responses"
  - description: TELEPORT fails during Guided Setup.
    source: "TELEPORT section"
  - description: Network Remote Control is disabled by default since TiVo software v9.4; must be explicitly enabled via TiVo Central > Messages & Settings > Settings > Remote, CableCARD & Devices > Network Remote Control.
    source: "Important section"

Notes

  • Protocol version 1.1 per document header.
  • TCP port 31339; ASCII commands terminated by CR (carriage return).
  • Command packets are single lines of uppercase text; command and parameters separated by single spaces.
  • FORCECH and SETCH require DVR to be in Live TV mode — issue TELEPORT LIVETV first and wait for LIVETV_READY before sending channel change.
  • Channel and sub-channel parameters: integers 1 to lineup max; leading zeros optional but allowed; returned values are fixed 4-digit.
  • KEYBOARD LSHIFT/RSHIFT/CAPS affect only the immediately following KEYBOARD command (for LSHIFT/RSHIFT); CAPS toggles persistent mode.
  • IRCODE always processed by DVR but may be ignored or have unexpected effect depending on UI state.
  • KEYBOARD may be ignored or disallowed depending on UI state; can produce unexpected behavior.
  • Requests queue if sent faster than DVR can process; processed in arrival order.
  • Source: "TCP Remote Protocol, version 1.1" — TiVo vendor document.

Provenance

source_domains:
  - github.com
  - yumpu.com
source_urls:
  - https://github.com/wcbonner/WimTiVoServer/raw/master/TiVoDocs/TiVo_TCP_Network_Remote_Control_Protocol.pdf
  - https://www.yumpu.com/en/document/view/42026982/tcp-remote-protocol-version-1-1-tivo
retrieved_at: 2026-04-29T14:57:34.184Z
last_checked_at: 2026-08-28T22:16:52.413Z

Verification Summary

verdict: verified
checked_at: 2026-08-28T22:16:52.413Z
matched_actions: 64
action_count: 64
confidence: medium
summary: "All 64 spec actions map to the 5 wire-level commands (IRCODE, KEYBOARD, SETCH, FORCECH, TELEPORT) in the source, and TCP port 31339 is verified. (6 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "specific DVR model lineup not identified in source. Source references \"TCD channel lineup\" but no specific model number."
- "no explicit power on/off commands in source. DVR power is not controlled via this protocol - Network Remote Control must first be enabled via UI. Not adding powerable trait."
- "source documents no settable parameters beyond command arguments."
- "source documents no multi-step macro sequences."
- "specific DVR model numbers/series not identified in source. Source refers generically to \"TiVo DVR\" and \"TCD channel lineup\" without naming a specific product."
- "firmware version requirements — source only states \"Beginning with version 9.4 of the TiVo software, this feature is turned off by default\" without listing supported firmware versions or minimum version for the protocol itself."

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